Merge "browser acceptance tests"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 24 Jun 2014 22:26:16 +0000 (22:26 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 24 Jun 2014 22:26:16 +0000 (22:26 +0000)
1121 files changed:
.travis.yml
HISTORY
RELEASE-NOTES-1.23 [deleted file]
RELEASE-NOTES-1.24
docs/hooks.txt
includes/Article.php [deleted file]
includes/AutoLoader.php
includes/CategoryPage.php [deleted file]
includes/ChangeTags.php
includes/DefaultSettings.php
includes/Defines.php
includes/EditPage.php
includes/GlobalFunctions.php
includes/ImagePage.php [deleted file]
includes/Import.php
includes/Linker.php
includes/MimeMagic.php
includes/OutputPage.php
includes/Preferences.php
includes/PrefixSearch.php
includes/ProtectionForm.php
includes/Revision.php
includes/Sanitizer.php
includes/Setup.php
includes/Skin.php
includes/SkinTemplate.php
includes/Title.php
includes/User.php
includes/WebRequest.php
includes/Wiki.php
includes/WikiCategoryPage.php [deleted file]
includes/WikiFilePage.php [deleted file]
includes/WikiPage.php [deleted file]
includes/actions/Action.php
includes/actions/RenderAction.php
includes/api/ApiBase.php
includes/api/ApiCreateAccount.php
includes/api/ApiEditPage.php
includes/api/ApiExpandTemplates.php
includes/api/ApiFeedContributions.php
includes/api/ApiFeedRecentChanges.php
includes/api/ApiFeedWatchlist.php
includes/api/ApiFormatBase.php
includes/api/ApiFormatXml.php
includes/api/ApiImport.php
includes/api/ApiLogin.php
includes/api/ApiMain.php
includes/api/ApiOpenSearch.php
includes/api/ApiParse.php
includes/api/ApiProtect.php
includes/api/ApiPurge.php
includes/api/ApiQuery.php
includes/api/ApiQueryAllImages.php
includes/api/ApiQueryAllMessages.php
includes/api/ApiQueryAllPages.php
includes/api/ApiQueryAllUsers.php
includes/api/ApiQueryBase.php
includes/api/ApiQueryBlocks.php
includes/api/ApiQueryCategoryMembers.php
includes/api/ApiQueryExtLinksUsage.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryInfo.php
includes/api/ApiQueryLogEvents.php
includes/api/ApiQueryProtectedTitles.php
includes/api/ApiQueryQueryPage.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryRevisions.php
includes/api/ApiQuerySearch.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryUserContributions.php
includes/api/ApiQueryUserInfo.php
includes/api/ApiQueryWatchlist.php
includes/api/ApiResult.php
includes/api/ApiRollback.php
includes/api/ApiUpload.php
includes/cache/MessageCache.php
includes/changes/ChangesList.php
includes/changes/EnhancedChangesList.php
includes/changes/OldChangesList.php
includes/changes/RCCacheEntryFactory.php
includes/changes/RecentChange.php
includes/config/GlobalVarConfig.php
includes/content/AbstractContent.php
includes/content/Content.php
includes/content/WikitextContent.php
includes/context/ContextSource.php
includes/context/DerivativeContext.php
includes/context/IContextSource.php
includes/context/RequestContext.php
includes/db/CloneDatabase.php
includes/db/Database.php
includes/db/DatabaseMysqli.php
includes/db/DatabaseOracle.php
includes/db/DatabasePostgres.php
includes/db/LBFactory.php
includes/db/LBFactoryMulti.php
includes/db/LoadBalancer.php
includes/deferred/SearchUpdate.php
includes/diff/DifferenceEngine.php
includes/filebackend/FSFileBackend.php
includes/filebackend/FileBackendStore.php
includes/filebackend/FileOpBatch.php
includes/filebackend/SwiftFileBackend.php
includes/filerepo/file/File.php
includes/htmlform/HTMLForm.php
includes/installer/Installer.php
includes/installer/LocalSettingsGenerator.php
includes/installer/MysqlUpdater.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteUpdater.php
includes/installer/WebInstaller.php
includes/installer/WebInstallerOutput.php
includes/installer/i18n/bn.json
includes/installer/i18n/br.json
includes/installer/i18n/ce.json
includes/installer/i18n/de.json
includes/installer/i18n/el.json
includes/installer/i18n/es.json
includes/installer/i18n/et.json
includes/installer/i18n/gl.json
includes/installer/i18n/ia.json
includes/installer/i18n/id.json
includes/installer/i18n/ka.json
includes/installer/i18n/lv.json
includes/installer/i18n/ms.json
includes/installer/i18n/nan.json
includes/installer/i18n/ne.json
includes/installer/i18n/nl.json
includes/installer/i18n/pt-br.json
includes/installer/i18n/ro.json
includes/installer/i18n/sr-ec.json
includes/installer/i18n/sr-el.json
includes/installer/i18n/sv.json
includes/installer/i18n/tl.json
includes/installer/i18n/tr.json
includes/installer/i18n/zh-hans.json
includes/jobqueue/JobQueueGroup.php
includes/jobqueue/aggregator/JobQueueAggregatorRedis.php
includes/logging/LogEntry.php
includes/media/MediaHandler.php
includes/media/SVG.php
includes/media/Tiff.php
includes/objectcache/MemcachedClient.php
includes/page/Article.php [new file with mode: 0644]
includes/page/CategoryPage.php [new file with mode: 0644]
includes/page/ImagePage.php [new file with mode: 0644]
includes/page/WikiCategoryPage.php [new file with mode: 0644]
includes/page/WikiFilePage.php [new file with mode: 0644]
includes/page/WikiPage.php [new file with mode: 0644]
includes/parser/Parser.php
includes/parser/ParserDiffTest.php [new file with mode: 0644]
includes/parser/ParserOptions.php
includes/parser/ParserOutput.php
includes/parser/Parser_DiffTest.php [deleted file]
includes/parser/Preprocessor.php
includes/parser/Preprocessor_DOM.php
includes/parser/Preprocessor_Hash.php
includes/poolcounter/PoolCounter.php
includes/poolcounter/PoolCounterWork.php
includes/poolcounter/PoolWorkArticleView.php [new file with mode: 0644]
includes/profiler/Profiler.php
includes/rcfeed/MachineReadableRCFeedFormatter.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderLESSFunctions.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/revisiondelete/RevisionDelete.php
includes/revisiondelete/RevisionDeleteAbstracts.php
includes/search/SearchDatabase.php
includes/search/SearchEngine.php
includes/search/SearchMssql.php
includes/search/SearchMySQL.php
includes/search/SearchPostgres.php
includes/search/SearchResultSet.php
includes/search/SearchSqlite.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/SpecialPage.php
includes/specialpage/SpecialPageFactory.php
includes/specials/SpecialAllMessages.php [new file with mode: 0644]
includes/specials/SpecialAllPages.php [new file with mode: 0644]
includes/specials/SpecialAllmessages.php [deleted file]
includes/specials/SpecialAllpages.php [deleted file]
includes/specials/SpecialContributions.php
includes/specials/SpecialCreateAccount.php
includes/specials/SpecialEditWatchlist.php
includes/specials/SpecialExpandTemplates.php
includes/specials/SpecialLog.php
includes/specials/SpecialMIMEsearch.php
includes/specials/SpecialMergeHistory.php
includes/specials/SpecialMostlinkedtemplates.php
includes/specials/SpecialNewpages.php
includes/specials/SpecialPasswordReset.php
includes/specials/SpecialPrefixindex.php
includes/specials/SpecialRunJobs.php
includes/specials/SpecialSearch.php
includes/specials/SpecialTrackingCategories.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialUserrights.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWatchlist.php
includes/upload/UploadBase.php
includes/utils/IP.php
includes/utils/MWCryptHKDF.php [new file with mode: 0644]
includes/utils/MWCryptRand.php
languages/Language.php
languages/LanguageConverter.php
languages/data/plurals.xml [changed mode: 0755->0644]
languages/i18n/af.json
languages/i18n/am.json
languages/i18n/ang.json
languages/i18n/ar.json
languages/i18n/arc.json
languages/i18n/arz.json
languages/i18n/as.json
languages/i18n/ast.json
languages/i18n/az.json
languages/i18n/azb.json
languages/i18n/bar.json
languages/i18n/bcc.json
languages/i18n/bcl.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/bho.json
languages/i18n/bn.json
languages/i18n/br.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/cdo.json
languages/i18n/ce.json
languages/i18n/ckb.json
languages/i18n/co.json
languages/i18n/crh-cyrl.json
languages/i18n/crh-latn.json
languages/i18n/cs.json
languages/i18n/cu.json
languages/i18n/cy.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/dsb.json
languages/i18n/egl.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fo.json
languages/i18n/fr.json
languages/i18n/frp.json
languages/i18n/frr.json
languages/i18n/gan-hans.json
languages/i18n/gan-hant.json
languages/i18n/gd.json
languages/i18n/gl.json
languages/i18n/gsw.json
languages/i18n/gu.json
languages/i18n/hak.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hif-latn.json
languages/i18n/hr.json
languages/i18n/hrx.json
languages/i18n/hsb.json
languages/i18n/hu.json
languages/i18n/hy.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/ilo.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jv.json
languages/i18n/ka.json
languages/i18n/kab.json
languages/i18n/kiu.json
languages/i18n/kk-cyrl.json
languages/i18n/km.json
languages/i18n/kn.json
languages/i18n/ko.json
languages/i18n/krc.json
languages/i18n/ksh.json
languages/i18n/ku-latn.json
languages/i18n/la.json
languages/i18n/lb.json
languages/i18n/lez.json
languages/i18n/lmo.json
languages/i18n/lrc.json
languages/i18n/lv.json
languages/i18n/mg.json
languages/i18n/min.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mn.json
languages/i18n/mr.json
languages/i18n/ms.json
languages/i18n/mt.json
languages/i18n/myv.json
languages/i18n/nan.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/nds-nl.json
languages/i18n/nds.json
languages/i18n/ne.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/oc.json
languages/i18n/or.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/qu.json
languages/i18n/rm.json
languages/i18n/ro.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/sa.json
languages/i18n/sah.json
languages/i18n/sc.json
languages/i18n/scn.json
languages/i18n/sco.json
languages/i18n/sh.json
languages/i18n/si.json
languages/i18n/sk.json
languages/i18n/sl.json
languages/i18n/so.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/sr.json [deleted file]
languages/i18n/sv.json
languages/i18n/ta.json
languages/i18n/te.json
languages/i18n/th.json
languages/i18n/tl.json
languages/i18n/tr.json
languages/i18n/tt-cyrl.json
languages/i18n/tyv.json
languages/i18n/ug-arab.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/uz.json
languages/i18n/vec.json
languages/i18n/vi.json
languages/i18n/war.json
languages/i18n/wuu.json
languages/i18n/yi.json
languages/i18n/yo.json
languages/i18n/yue.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesAb.php
languages/messages/MessagesAce.php
languages/messages/MessagesAeb.php
languages/messages/MessagesAf.php
languages/messages/MessagesAk.php
languages/messages/MessagesAln.php
languages/messages/MessagesAm.php
languages/messages/MessagesAn.php
languages/messages/MessagesAng.php
languages/messages/MessagesAnp.php
languages/messages/MessagesAr.php
languages/messages/MessagesArc.php
languages/messages/MessagesArn.php
languages/messages/MessagesArq.php
languages/messages/MessagesArz.php
languages/messages/MessagesAs.php
languages/messages/MessagesAst.php
languages/messages/MessagesAv.php
languages/messages/MessagesAvk.php
languages/messages/MessagesAy.php
languages/messages/MessagesAz.php
languages/messages/MessagesAzb.php
languages/messages/MessagesBa.php
languages/messages/MessagesBar.php
languages/messages/MessagesBbc.php
languages/messages/MessagesBbc_latn.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/MessagesBjn.php
languages/messages/MessagesBm.php
languages/messages/MessagesBn.php
languages/messages/MessagesBo.php
languages/messages/MessagesBpy.php
languages/messages/MessagesBqi.php
languages/messages/MessagesBr.php
languages/messages/MessagesBs.php
languages/messages/MessagesBug.php
languages/messages/MessagesBxr.php
languages/messages/MessagesCa.php
languages/messages/MessagesCbk_zam.php
languages/messages/MessagesCdo.php
languages/messages/MessagesCe.php
languages/messages/MessagesCeb.php
languages/messages/MessagesCh.php
languages/messages/MessagesCkb.php
languages/messages/MessagesCo.php
languages/messages/MessagesCrh.php
languages/messages/MessagesCrh_cyrl.php
languages/messages/MessagesCrh_latn.php
languages/messages/MessagesCs.php
languages/messages/MessagesCsb.php
languages/messages/MessagesCu.php
languages/messages/MessagesCv.php
languages/messages/MessagesCy.php
languages/messages/MessagesDa.php
languages/messages/MessagesDe.php
languages/messages/MessagesDe_at.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/MessagesEgl.php
languages/messages/MessagesEl.php
languages/messages/MessagesEml.php
languages/messages/MessagesEn.php
languages/messages/MessagesEn_gb.php
languages/messages/MessagesEn_rtl.php
languages/messages/MessagesEo.php
languages/messages/MessagesEs.php
languages/messages/MessagesEt.php
languages/messages/MessagesEu.php
languages/messages/MessagesExt.php
languages/messages/MessagesFa.php
languages/messages/MessagesFf.php
languages/messages/MessagesFi.php
languages/messages/MessagesFit.php
languages/messages/MessagesFo.php
languages/messages/MessagesFr.php
languages/messages/MessagesFrc.php
languages/messages/MessagesFrp.php
languages/messages/MessagesFrr.php
languages/messages/MessagesFur.php
languages/messages/MessagesFy.php
languages/messages/MessagesGa.php
languages/messages/MessagesGag.php
languages/messages/MessagesGan.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/MessagesGot.php
languages/messages/MessagesGrc.php
languages/messages/MessagesGsw.php
languages/messages/MessagesGu.php
languages/messages/MessagesGv.php
languages/messages/MessagesHak.php
languages/messages/MessagesHaw.php
languages/messages/MessagesHe.php
languages/messages/MessagesHi.php
languages/messages/MessagesHif.php
languages/messages/MessagesHif_latn.php
languages/messages/MessagesHr.php
languages/messages/MessagesHrx.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/MessagesIi.php
languages/messages/MessagesIlo.php
languages/messages/MessagesInh.php
languages/messages/MessagesIo.php
languages/messages/MessagesIs.php
languages/messages/MessagesIt.php
languages/messages/MessagesIu.php
languages/messages/MessagesJa.php
languages/messages/MessagesJut.php
languages/messages/MessagesJv.php
languages/messages/MessagesKa.php
languages/messages/MessagesKaa.php
languages/messages/MessagesKab.php
languages/messages/MessagesKbd.php
languages/messages/MessagesKbd_cyrl.php
languages/messages/MessagesKg.php
languages/messages/MessagesKhw.php
languages/messages/MessagesKiu.php
languages/messages/MessagesKk.php
languages/messages/MessagesKk_arab.php
languages/messages/MessagesKk_cn.php
languages/messages/MessagesKk_cyrl.php
languages/messages/MessagesKk_kz.php
languages/messages/MessagesKk_latn.php
languages/messages/MessagesKk_tr.php
languages/messages/MessagesKl.php
languages/messages/MessagesKm.php
languages/messages/MessagesKn.php
languages/messages/MessagesKo.php
languages/messages/MessagesKo_kp.php
languages/messages/MessagesKoi.php
languages/messages/MessagesKrc.php
languages/messages/MessagesKs.php
languages/messages/MessagesKs_arab.php
languages/messages/MessagesKs_deva.php
languages/messages/MessagesKsh.php
languages/messages/MessagesKu.php
languages/messages/MessagesKu_arab.php
languages/messages/MessagesKu_latn.php
languages/messages/MessagesKv.php
languages/messages/MessagesKw.php
languages/messages/MessagesKy.php
languages/messages/MessagesLa.php
languages/messages/MessagesLad.php
languages/messages/MessagesLb.php
languages/messages/MessagesLbe.php
languages/messages/MessagesLez.php
languages/messages/MessagesLfn.php
languages/messages/MessagesLi.php
languages/messages/MessagesLij.php
languages/messages/MessagesLiv.php
languages/messages/MessagesLmo.php
languages/messages/MessagesLn.php
languages/messages/MessagesLo.php
languages/messages/MessagesLrc.php
languages/messages/MessagesLt.php
languages/messages/MessagesLtg.php
languages/messages/MessagesLv.php
languages/messages/MessagesLzh.php
languages/messages/MessagesLzz.php
languages/messages/MessagesMai.php
languages/messages/MessagesMap_bms.php
languages/messages/MessagesMdf.php
languages/messages/MessagesMg.php
languages/messages/MessagesMhr.php
languages/messages/MessagesMin.php
languages/messages/MessagesMk.php
languages/messages/MessagesMl.php
languages/messages/MessagesMn.php
languages/messages/MessagesMo.php
languages/messages/MessagesMr.php
languages/messages/MessagesMrj.php
languages/messages/MessagesMs.php
languages/messages/MessagesMt.php
languages/messages/MessagesMwl.php
languages/messages/MessagesMy.php
languages/messages/MessagesMyv.php
languages/messages/MessagesMzn.php
languages/messages/MessagesNah.php
languages/messages/MessagesNan.php
languages/messages/MessagesNap.php
languages/messages/MessagesNb.php
languages/messages/MessagesNds.php
languages/messages/MessagesNds_nl.php
languages/messages/MessagesNe.php
languages/messages/MessagesNew.php
languages/messages/MessagesNl.php
languages/messages/MessagesNl_informal.php
languages/messages/MessagesNn.php
languages/messages/MessagesNso.php
languages/messages/MessagesNv.php
languages/messages/MessagesOc.php
languages/messages/MessagesOr.php
languages/messages/MessagesOs.php
languages/messages/MessagesPa.php
languages/messages/MessagesPcd.php
languages/messages/MessagesPdc.php
languages/messages/MessagesPdt.php
languages/messages/MessagesPfl.php
languages/messages/MessagesPi.php
languages/messages/MessagesPl.php
languages/messages/MessagesPms.php
languages/messages/MessagesPnb.php
languages/messages/MessagesPnt.php
languages/messages/MessagesPs.php
languages/messages/MessagesPt.php
languages/messages/MessagesPt_br.php
languages/messages/MessagesQu.php
languages/messages/MessagesQug.php
languages/messages/MessagesRgn.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/MessagesRuq.php
languages/messages/MessagesRuq_cyrl.php
languages/messages/MessagesRuq_latn.php
languages/messages/MessagesSa.php
languages/messages/MessagesSah.php
languages/messages/MessagesSc.php
languages/messages/MessagesScn.php
languages/messages/MessagesSd.php
languages/messages/MessagesSdc.php
languages/messages/MessagesSe.php
languages/messages/MessagesSg.php
languages/messages/MessagesSgs.php
languages/messages/MessagesSh.php
languages/messages/MessagesSi.php
languages/messages/MessagesSk.php
languages/messages/MessagesSl.php
languages/messages/MessagesSli.php
languages/messages/MessagesSq.php
languages/messages/MessagesSr.php
languages/messages/MessagesSr_ec.php
languages/messages/MessagesSr_el.php
languages/messages/MessagesSrn.php
languages/messages/MessagesStq.php
languages/messages/MessagesSu.php
languages/messages/MessagesSv.php
languages/messages/MessagesSw.php
languages/messages/MessagesSzl.php
languages/messages/MessagesTa.php
languages/messages/MessagesTcy.php
languages/messages/MessagesTe.php
languages/messages/MessagesTet.php
languages/messages/MessagesTg.php
languages/messages/MessagesTg_cyrl.php
languages/messages/MessagesTh.php
languages/messages/MessagesTk.php
languages/messages/MessagesTl.php
languages/messages/MessagesTly.php
languages/messages/MessagesTpi.php
languages/messages/MessagesTr.php
languages/messages/MessagesTt.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.php
languages/messages/MessagesUg_arab.php
languages/messages/MessagesUk.php
languages/messages/MessagesUr.php
languages/messages/MessagesUz.php
languages/messages/MessagesVec.php
languages/messages/MessagesVep.php
languages/messages/MessagesVi.php
languages/messages/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/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.php
languages/messages/MessagesZh_cn.php
languages/messages/MessagesZh_hans.php
languages/messages/MessagesZh_hant.php
languages/messages/MessagesZh_hk.php
languages/messages/MessagesZh_mo.php
languages/messages/MessagesZh_my.php
languages/messages/MessagesZh_sg.php
languages/messages/MessagesZh_tw.php
maintenance/archives/patch-uploadstash.sql
maintenance/archives/patch-watchlist-user-notificationtimestamp-index.sql [new file with mode: 0644]
maintenance/convertUserOptions.php
maintenance/deleteEqualMessages.php
maintenance/dev/includes/php.sh
maintenance/dumpLinks.php
maintenance/findHooks.php
maintenance/fixDoubleRedirects.php
maintenance/generateSitemap.php
maintenance/importImages.php
maintenance/language/listVariants.php [new file with mode: 0644]
maintenance/mssql/tables.sql
maintenance/namespaceDupes.php
maintenance/nextJobDB.php
maintenance/postgres/tables.sql
maintenance/rebuildrecentchanges.php
maintenance/tables.sql
resources/Resources.php
resources/lib/jquery.effects/jquery.effects.blind.js [deleted file]
resources/lib/jquery.effects/jquery.effects.bounce.js [deleted file]
resources/lib/jquery.effects/jquery.effects.clip.js [deleted file]
resources/lib/jquery.effects/jquery.effects.core.js [deleted file]
resources/lib/jquery.effects/jquery.effects.drop.js [deleted file]
resources/lib/jquery.effects/jquery.effects.explode.js [deleted file]
resources/lib/jquery.effects/jquery.effects.fade.js [deleted file]
resources/lib/jquery.effects/jquery.effects.fold.js [deleted file]
resources/lib/jquery.effects/jquery.effects.highlight.js [deleted file]
resources/lib/jquery.effects/jquery.effects.pulsate.js [deleted file]
resources/lib/jquery.effects/jquery.effects.scale.js [deleted file]
resources/lib/jquery.effects/jquery.effects.shake.js [deleted file]
resources/lib/jquery.effects/jquery.effects.slide.js [deleted file]
resources/lib/jquery.effects/jquery.effects.transfer.js [deleted file]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ar-DZ.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ar.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-az.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-bg.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-bs.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ca.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-cs.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-cy-GB.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-da.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-de.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-el.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-en-AU.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-en-NZ.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-eo.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-es.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-et.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-eu.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fa.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fi.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fo.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fr-CH.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fr.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-gl.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-he.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-hr.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-hy.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-id.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-is.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-it.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ja.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-kk.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ko.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-lt.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-lv.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ml.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ms.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-nl-BE.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-nl.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-no.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-pl.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-pt-BR.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-pt.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-rm.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ro.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ru.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sk.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sl.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sq.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sr-SR.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sr.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sv.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-th.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-tj.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-tr.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-uk.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-vi.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-zh-CN.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-zh-HK.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-zh-TW.js
resources/lib/jquery.ui/jquery.ui.accordion.js
resources/lib/jquery.ui/jquery.ui.autocomplete.js
resources/lib/jquery.ui/jquery.ui.button.js
resources/lib/jquery.ui/jquery.ui.core.js
resources/lib/jquery.ui/jquery.ui.datepicker.js
resources/lib/jquery.ui/jquery.ui.dialog.js
resources/lib/jquery.ui/jquery.ui.draggable.js
resources/lib/jquery.ui/jquery.ui.droppable.js
resources/lib/jquery.ui/jquery.ui.effect-blind.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.effect-bounce.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.effect-clip.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.effect-drop.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.effect-explode.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.effect-fade.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.effect-fold.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.effect-highlight.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.effect-pulsate.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.effect-scale.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.effect-shake.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.effect-slide.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.effect-transfer.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.effect.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.menu.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.mouse.js
resources/lib/jquery.ui/jquery.ui.position.js
resources/lib/jquery.ui/jquery.ui.progressbar.js
resources/lib/jquery.ui/jquery.ui.resizable.js
resources/lib/jquery.ui/jquery.ui.selectable.js
resources/lib/jquery.ui/jquery.ui.slider.js
resources/lib/jquery.ui/jquery.ui.sortable.js
resources/lib/jquery.ui/jquery.ui.spinner.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.tabs.js
resources/lib/jquery.ui/jquery.ui.tooltip.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.widget.js
resources/lib/jquery.ui/themes/default/images/ui-bg_flat_0_aaaaaa_40x100.png [deleted file]
resources/lib/jquery.ui/themes/default/images/ui-bg_flat_75_ffffff_40x100.png [deleted file]
resources/lib/jquery.ui/themes/default/images/ui-bg_glass_55_fbf9ee_1x400.png [deleted file]
resources/lib/jquery.ui/themes/default/images/ui-bg_glass_65_ffffff_1x400.png [deleted file]
resources/lib/jquery.ui/themes/default/images/ui-bg_glass_75_dadada_1x400.png [deleted file]
resources/lib/jquery.ui/themes/default/images/ui-bg_glass_75_e6e6e6_1x400.png [deleted file]
resources/lib/jquery.ui/themes/default/images/ui-bg_glass_95_fef1ec_1x400.png [deleted file]
resources/lib/jquery.ui/themes/default/images/ui-bg_highlight-soft_75_cccccc_1x100.png [deleted file]
resources/lib/jquery.ui/themes/default/images/ui-icons_222222_256x240.png [deleted file]
resources/lib/jquery.ui/themes/default/images/ui-icons_2e83ff_256x240.png [deleted file]
resources/lib/jquery.ui/themes/default/images/ui-icons_454545_256x240.png [deleted file]
resources/lib/jquery.ui/themes/default/images/ui-icons_888888_256x240.png [deleted file]
resources/lib/jquery.ui/themes/default/images/ui-icons_cd0a0a_256x240.png [deleted file]
resources/lib/jquery.ui/themes/default/jquery.ui.accordion.css [deleted file]
resources/lib/jquery.ui/themes/default/jquery.ui.autocomplete.css [deleted file]
resources/lib/jquery.ui/themes/default/jquery.ui.button.css [deleted file]
resources/lib/jquery.ui/themes/default/jquery.ui.core.css [deleted file]
resources/lib/jquery.ui/themes/default/jquery.ui.datepicker.css [deleted file]
resources/lib/jquery.ui/themes/default/jquery.ui.dialog.css [deleted file]
resources/lib/jquery.ui/themes/default/jquery.ui.progressbar.css [deleted file]
resources/lib/jquery.ui/themes/default/jquery.ui.resizable.css [deleted file]
resources/lib/jquery.ui/themes/default/jquery.ui.selectable.css [deleted file]
resources/lib/jquery.ui/themes/default/jquery.ui.slider.css [deleted file]
resources/lib/jquery.ui/themes/default/jquery.ui.tabs.css [deleted file]
resources/lib/jquery.ui/themes/default/jquery.ui.theme.css [deleted file]
resources/lib/jquery.ui/themes/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png [new file with mode: 0755]
resources/lib/jquery.ui/themes/smoothness/images/ui-bg_flat_75_ffffff_40x100.png [new file with mode: 0755]
resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png [new file with mode: 0755]
resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_65_ffffff_1x400.png [new file with mode: 0755]
resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_75_dadada_1x400.png [new file with mode: 0755]
resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png [new file with mode: 0755]
resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png [new file with mode: 0755]
resources/lib/jquery.ui/themes/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png [new file with mode: 0755]
resources/lib/jquery.ui/themes/smoothness/images/ui-icons_222222_256x240.png [new file with mode: 0755]
resources/lib/jquery.ui/themes/smoothness/images/ui-icons_2e83ff_256x240.png [new file with mode: 0755]
resources/lib/jquery.ui/themes/smoothness/images/ui-icons_454545_256x240.png [new file with mode: 0755]
resources/lib/jquery.ui/themes/smoothness/images/ui-icons_888888_256x240.png [new file with mode: 0755]
resources/lib/jquery.ui/themes/smoothness/images/ui-icons_cd0a0a_256x240.png [new file with mode: 0755]
resources/lib/jquery.ui/themes/smoothness/jquery.ui.accordion.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/smoothness/jquery.ui.autocomplete.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/smoothness/jquery.ui.button.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/smoothness/jquery.ui.core.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/smoothness/jquery.ui.datepicker.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/smoothness/jquery.ui.dialog.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/smoothness/jquery.ui.menu.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/smoothness/jquery.ui.progressbar.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/smoothness/jquery.ui.resizable.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/smoothness/jquery.ui.selectable.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/smoothness/jquery.ui.slider.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/smoothness/jquery.ui.spinner.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/smoothness/jquery.ui.tabs.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/smoothness/jquery.ui.theme.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/smoothness/jquery.ui.tooltip.css [new file with mode: 0644]
resources/lib/jquery/jquery.cycle.all.js [deleted file]
resources/lib/jquery/jquery.jStorage.js
resources/lib/jquery/jquery.migrate.js
resources/lib/oojs-ui/i18n/be.json
resources/lib/oojs-ui/i18n/bs.json
resources/lib/oojs-ui/i18n/ce.json
resources/lib/oojs-ui/i18n/gl.json
resources/lib/oojs-ui/i18n/hr.json
resources/lib/oojs-ui/i18n/hu.json
resources/lib/oojs-ui/i18n/ia.json
resources/lib/oojs-ui/i18n/kn.json
resources/lib/oojs-ui/i18n/min.json
resources/lib/oojs-ui/i18n/ne.json
resources/lib/oojs-ui/i18n/sl.json
resources/lib/oojs-ui/i18n/sr-ec.json
resources/lib/oojs-ui/i18n/sr-el.json
resources/lib/oojs-ui/images/indicators/alert.svg
resources/lib/oojs-ui/images/indicators/arrow-down.png [new file with mode: 0644]
resources/lib/oojs-ui/images/indicators/arrow-down.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/indicators/arrow-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/images/indicators/arrow-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/indicators/arrow-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/images/indicators/arrow-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/indicators/arrow-up.png [new file with mode: 0644]
resources/lib/oojs-ui/images/indicators/arrow-up.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/indicators/down.png [deleted file]
resources/lib/oojs-ui/images/indicators/down.svg [deleted file]
resources/lib/oojs-ui/images/indicators/required.svg
resources/lib/oojs-ui/images/indicators/up.png [deleted file]
resources/lib/oojs-ui/images/indicators/up.svg [deleted file]
resources/lib/oojs-ui/oojs-ui-apex.css
resources/lib/oojs-ui/oojs-ui.css [new file with mode: 0644]
resources/lib/oojs-ui/oojs-ui.js
resources/lib/oojs-ui/oojs-ui.svg.css
resources/src/jquery.ui-themes/vector/jquery.ui.autocomplete.css
resources/src/jquery/jquery.qunit.completenessTest.js
resources/src/jquery/jquery.suggestions.js
resources/src/mediawiki.action/mediawiki.action.history.css [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.history.js
resources/src/mediawiki.less/mediawiki.mixins.less
resources/src/mediawiki.page/mediawiki.page.image.pagination.js
resources/src/mediawiki.page/mediawiki.page.patrol.ajax.js
resources/src/mediawiki.skinning/content.parsoid.less
resources/src/mediawiki.special/mediawiki.special.unwatchedPages.js
resources/src/mediawiki.ui/settings/colors.less
resources/src/mediawiki.ui/vector.less
resources/src/mediawiki/mediawiki.js
resources/src/mediawiki/mediawiki.searchSuggest.js
skins/.gitignore
skins/MonoBook.php [deleted file]
skins/MonoBook/COPYING [new file with mode: 0644]
skins/MonoBook/IE60Fixes.css [new file with mode: 0644]
skins/MonoBook/IE70Fixes.css [new file with mode: 0644]
skins/MonoBook/MonoBook.php [new file with mode: 0644]
skins/MonoBook/MonoBookTemplate.php [new file with mode: 0644]
skins/MonoBook/SkinMonoBook.php [new file with mode: 0644]
skins/MonoBook/audio.png [new file with mode: 0644]
skins/MonoBook/bullet.gif [new file with mode: 0644]
skins/MonoBook/discussionitem_icon.gif [new file with mode: 0644]
skins/MonoBook/document.png [new file with mode: 0644]
skins/MonoBook/external-ltr.png [new file with mode: 0644]
skins/MonoBook/external-rtl.png [new file with mode: 0644]
skins/MonoBook/file_icon.gif [new file with mode: 0644]
skins/MonoBook/headbg.jpg [new file with mode: 0644]
skins/MonoBook/i18n/en.json [new file with mode: 0644]
skins/MonoBook/i18n/qqq.json [new file with mode: 0644]
skins/MonoBook/link_icon.gif [new file with mode: 0644]
skins/MonoBook/lock_icon.gif [new file with mode: 0644]
skins/MonoBook/magnify-clip.png [new file with mode: 0644]
skins/MonoBook/mail_icon.gif [new file with mode: 0644]
skins/MonoBook/main.css [new file with mode: 0644]
skins/MonoBook/news_icon.png [new file with mode: 0644]
skins/MonoBook/required.gif [new file with mode: 0644]
skins/MonoBook/user.gif [new file with mode: 0644]
skins/MonoBook/video.png [new file with mode: 0644]
skins/MonoBook/wiki-indexed.png [new file with mode: 0644]
skins/MonoBook/wiki.png [new file with mode: 0644]
skins/Vector.php [deleted file]
skins/Vector/COPYING [new file with mode: 0644]
skins/Vector/SkinVector.php [new file with mode: 0644]
skins/Vector/Vector.php [new file with mode: 0644]
skins/Vector/VectorTemplate.php [new file with mode: 0644]
skins/Vector/collapsibleTabs.js [new file with mode: 0644]
skins/Vector/components/animations.less [new file with mode: 0644]
skins/Vector/components/common.less [new file with mode: 0644]
skins/Vector/components/externalLinks.less [new file with mode: 0644]
skins/Vector/components/footer.less [new file with mode: 0644]
skins/Vector/components/navigation.less [new file with mode: 0644]
skins/Vector/components/notifications.less [new file with mode: 0644]
skins/Vector/components/personalMenu.less [new file with mode: 0644]
skins/Vector/components/search.less [new file with mode: 0644]
skins/Vector/components/tabs.less [new file with mode: 0644]
skins/Vector/components/watchstar.less [new file with mode: 0644]
skins/Vector/csshover.htc [new file with mode: 0644]
skins/Vector/csshover.min.htc [new file with mode: 0644]
skins/Vector/i18n/en.json [new file with mode: 0644]
skins/Vector/i18n/qqq.json [new file with mode: 0644]
skins/Vector/images/arrow-collapsed-ltr.png [new file with mode: 0644]
skins/Vector/images/arrow-collapsed-ltr.svg [new file with mode: 0644]
skins/Vector/images/arrow-collapsed-rtl.png [new file with mode: 0644]
skins/Vector/images/arrow-collapsed-rtl.svg [new file with mode: 0644]
skins/Vector/images/arrow-down-focus-icon.png [new file with mode: 0644]
skins/Vector/images/arrow-down-focus-icon.svg [new file with mode: 0644]
skins/Vector/images/arrow-down-icon.png [new file with mode: 0644]
skins/Vector/images/arrow-down-icon.svg [new file with mode: 0644]
skins/Vector/images/arrow-expanded.png [new file with mode: 0644]
skins/Vector/images/arrow-expanded.svg [new file with mode: 0644]
skins/Vector/images/bullet-icon.png [new file with mode: 0644]
skins/Vector/images/external-link-ltr-icon.png [new file with mode: 0644]
skins/Vector/images/external-link-ltr-icon.svg [new file with mode: 0644]
skins/Vector/images/external-link-rtl-icon.png [new file with mode: 0644]
skins/Vector/images/external-link-rtl-icon.svg [new file with mode: 0644]
skins/Vector/images/link-icon.png [new file with mode: 0644]
skins/Vector/images/magnify-clip.png [new file with mode: 0644]
skins/Vector/images/page-fade.png [new file with mode: 0644]
skins/Vector/images/portal-break-ltr.png [new file with mode: 0644]
skins/Vector/images/portal-break-rtl.png [new file with mode: 0644]
skins/Vector/images/portal-break.png [new file with mode: 0644]
skins/Vector/images/preferences/break.png [new file with mode: 0644]
skins/Vector/images/preferences/fade.png [new file with mode: 0644]
skins/Vector/images/search-fade.png [new file with mode: 0644]
skins/Vector/images/search-ltr.png [new file with mode: 0644]
skins/Vector/images/search-ltr.svg [new file with mode: 0644]
skins/Vector/images/search-rtl.png [new file with mode: 0644]
skins/Vector/images/search-rtl.svg [new file with mode: 0644]
skins/Vector/images/tab-break.png [new file with mode: 0644]
skins/Vector/images/tab-current-fade.png [new file with mode: 0644]
skins/Vector/images/tab-normal-fade.png [new file with mode: 0644]
skins/Vector/images/unwatch-icon-hl.png [new file with mode: 0644]
skins/Vector/images/unwatch-icon-hl.svg [new file with mode: 0644]
skins/Vector/images/unwatch-icon.png [new file with mode: 0644]
skins/Vector/images/unwatch-icon.svg [new file with mode: 0644]
skins/Vector/images/user-icon.png [new file with mode: 0644]
skins/Vector/images/user-icon.svg [new file with mode: 0644]
skins/Vector/images/watch-icon-hl.png [new file with mode: 0644]
skins/Vector/images/watch-icon-hl.svg [new file with mode: 0644]
skins/Vector/images/watch-icon-loading.png [new file with mode: 0644]
skins/Vector/images/watch-icon-loading.svg [new file with mode: 0644]
skins/Vector/images/watch-icon.png [new file with mode: 0644]
skins/Vector/images/watch-icon.svg [new file with mode: 0644]
skins/Vector/screen-hd.less [new file with mode: 0644]
skins/Vector/screen.less [new file with mode: 0644]
skins/Vector/special.less [new file with mode: 0644]
skins/Vector/special.preferences.less [new file with mode: 0644]
skins/Vector/variables.less [new file with mode: 0644]
skins/Vector/vector.js [new file with mode: 0644]
skins/common/commonPrint.css
skins/monobook/IE60Fixes.css [deleted file]
skins/monobook/IE70Fixes.css [deleted file]
skins/monobook/audio.png [deleted file]
skins/monobook/bullet.gif [deleted file]
skins/monobook/discussionitem_icon.gif [deleted file]
skins/monobook/document.png [deleted file]
skins/monobook/external-ltr.png [deleted file]
skins/monobook/external-rtl.png [deleted file]
skins/monobook/file_icon.gif [deleted file]
skins/monobook/headbg.jpg [deleted file]
skins/monobook/link_icon.gif [deleted file]
skins/monobook/lock_icon.gif [deleted file]
skins/monobook/magnify-clip.png [deleted file]
skins/monobook/mail_icon.gif [deleted file]
skins/monobook/main.css [deleted file]
skins/monobook/news_icon.png [deleted file]
skins/monobook/required.gif [deleted file]
skins/monobook/user.gif [deleted file]
skins/monobook/video.png [deleted file]
skins/monobook/wiki-indexed.png [deleted file]
skins/monobook/wiki.png [deleted file]
skins/vector/collapsibleTabs.js [deleted file]
skins/vector/components/animations.less [deleted file]
skins/vector/components/common.less [deleted file]
skins/vector/components/externalLinks.less [deleted file]
skins/vector/components/footer.less [deleted file]
skins/vector/components/navigation.less [deleted file]
skins/vector/components/notifications.less [deleted file]
skins/vector/components/personalMenu.less [deleted file]
skins/vector/components/search.less [deleted file]
skins/vector/components/tabs.less [deleted file]
skins/vector/components/watchstar.less [deleted file]
skins/vector/csshover.htc [deleted file]
skins/vector/csshover.min.htc [deleted file]
skins/vector/images/arrow-collapsed-ltr.png [deleted file]
skins/vector/images/arrow-collapsed-ltr.svg [deleted file]
skins/vector/images/arrow-collapsed-rtl.png [deleted file]
skins/vector/images/arrow-collapsed-rtl.svg [deleted file]
skins/vector/images/arrow-down-focus-icon.png [deleted file]
skins/vector/images/arrow-down-focus-icon.svg [deleted file]
skins/vector/images/arrow-down-icon.png [deleted file]
skins/vector/images/arrow-down-icon.svg [deleted file]
skins/vector/images/arrow-expanded.png [deleted file]
skins/vector/images/arrow-expanded.svg [deleted file]
skins/vector/images/bullet-icon.png [deleted file]
skins/vector/images/external-link-ltr-icon.png [deleted file]
skins/vector/images/external-link-ltr-icon.svg [deleted file]
skins/vector/images/external-link-rtl-icon.png [deleted file]
skins/vector/images/external-link-rtl-icon.svg [deleted file]
skins/vector/images/link-icon.png [deleted file]
skins/vector/images/magnify-clip.png [deleted file]
skins/vector/images/page-fade.png [deleted file]
skins/vector/images/portal-break-ltr.png [deleted file]
skins/vector/images/portal-break-rtl.png [deleted file]
skins/vector/images/portal-break.png [deleted file]
skins/vector/images/preferences/break.png [deleted file]
skins/vector/images/preferences/fade.png [deleted file]
skins/vector/images/search-fade.png [deleted file]
skins/vector/images/search-ltr.png [deleted file]
skins/vector/images/search-ltr.svg [deleted file]
skins/vector/images/search-rtl.png [deleted file]
skins/vector/images/search-rtl.svg [deleted file]
skins/vector/images/tab-break.png [deleted file]
skins/vector/images/tab-current-fade.png [deleted file]
skins/vector/images/tab-normal-fade.png [deleted file]
skins/vector/images/unwatch-icon-hl.png [deleted file]
skins/vector/images/unwatch-icon-hl.svg [deleted file]
skins/vector/images/unwatch-icon.png [deleted file]
skins/vector/images/unwatch-icon.svg [deleted file]
skins/vector/images/user-icon.png [deleted file]
skins/vector/images/user-icon.svg [deleted file]
skins/vector/images/watch-icon-hl.png [deleted file]
skins/vector/images/watch-icon-hl.svg [deleted file]
skins/vector/images/watch-icon-loading.png [deleted file]
skins/vector/images/watch-icon-loading.svg [deleted file]
skins/vector/images/watch-icon.png [deleted file]
skins/vector/images/watch-icon.svg [deleted file]
skins/vector/screen-hd.less [deleted file]
skins/vector/screen.less [deleted file]
skins/vector/special.less [deleted file]
skins/vector/special.preferences.less [deleted file]
skins/vector/variables.less [deleted file]
skins/vector/vector.js [deleted file]
tests/frontend/Gruntfile.js
tests/parser/parserTest.inc
tests/parser/parserTests.txt
tests/phpunit/ResourceLoaderTestCase.php
tests/phpunit/data/filerepo/video.png [new file with mode: 0644]
tests/phpunit/data/filerepo/wiki.png [new file with mode: 0644]
tests/phpunit/data/media/Bishzilla_blink.gif [new file with mode: 0644]
tests/phpunit/data/media/Portrait.png [deleted file]
tests/phpunit/data/media/README
tests/phpunit/data/media/Soccer_ball_animated.svg [new file with mode: 0644]
tests/phpunit/data/parser/LoremIpsum.djvu [new file with mode: 0644]
tests/phpunit/data/parser/headbg.jpg [new file with mode: 0644]
tests/phpunit/data/parser/wiki.png [new file with mode: 0644]
tests/phpunit/data/upload/headbg.jpg [new file with mode: 0644]
tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php
tests/phpunit/includes/ImportTest.php [new file with mode: 0644]
tests/phpunit/includes/LinkerTest.php
tests/phpunit/includes/StatusTest.php
tests/phpunit/includes/TimeAdjustTest.php
tests/phpunit/includes/WikiPageTest.php
tests/phpunit/includes/api/ApiMainTest.php
tests/phpunit/includes/filerepo/StoreBatchTest.php
tests/phpunit/includes/filerepo/files/FileTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/CSSMinTest.php
tests/phpunit/includes/media/MediaWikiMediaTestCase.php
tests/phpunit/includes/media/SVGMetadataExtractorTest.php
tests/phpunit/includes/parser/NewParserTest.php
tests/phpunit/includes/parser/ParserOutputTest.php
tests/phpunit/includes/poolcounter/PoolCounterTest.php [new file with mode: 0644]
tests/phpunit/includes/resourceloader/ResourceLoaderModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderStartupModuleTest.php
tests/phpunit/includes/specials/SpecialMIMESearchTest.php [new file with mode: 0644]
tests/phpunit/includes/utils/IPTest.php
tests/phpunit/includes/utils/MWCryptHKDFTest.php [new file with mode: 0644]
tests/phpunit/suites/UploadFromUrlTestSuite.php
tests/qunit/data/load.mock.php
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
tests/testHelpers.inc

index e0a45a1..64075f1 100644 (file)
@@ -9,18 +9,7 @@
 language: php
 
 php:
-  - hhvm
-  - 5.3
-  - 5.4
-  - 5.5
-  - 5.6
-
-matrix:
-  allow_failures:
-    - php: 5.3
-    - php: 5.4
-    - php: 5.5
-    - php: 5.6
+  - hhvm-nightly
 
 services:
   - mysql
@@ -33,16 +22,12 @@ branches:
 
 before_install:
   - sudo apt-get install -qq djvulibre-bin tidy
+  - composer self-update --quiet --no-interaction
 
 before_script:
-  # Initialise submodules, in case we're testing a Wikimedia production branch.
-  - git submodule update --init --recursive
-  # Travis CI's HHVM environment provides PHPUnit as a phar file, but
-  # MediaWiki's test suite only works if individual PHPUnit files are
-  # actual files on disk (bug 58881).
-  - composer require 'phpunit/phpunit=3.7.*' --prefer-source
+  - composer install --prefer-source --quiet --no-interaction
   - >
-      php maintenance/install.php testwiki admin
+      php maintenance/install.php traviswiki admin
       --pass travis
       --dbname traviswiki
       --dbuser travis
@@ -50,14 +35,12 @@ before_script:
       --scriptpath "/w"
 
 script:
-  - >
-      if [ "$TRAVIS_PHP_VERSION" = "hhvm" ];
-      then
-        hhvm --php \
-        -d include_path=".$(printf ':%s' vendor/phpunit/*)" \
-        -d date.timezone="Etc/UTC" \
-        tests/phpunit/phpunit.php
-      else
-        php tests/phpunit/phpunit.php \
-        --with-phpunitdir ./vendor/phpunit/phpunit
-      fi
+  - php tests/phpunit/phpunit.php
+
+notifications:
+  irc:
+    channels:
+      - "chat.freenode.net#mediawiki-core"
+    on_success: change
+    on_failure: change
+    skip_join: true
diff --git a/HISTORY b/HISTORY
index 12532db..8ba1a4b 100644 (file)
--- a/HISTORY
+++ b/HISTORY
@@ -1,5 +1,474 @@
 Change notes from older releases. For current info see RELEASE-NOTES-1.24.
 
+== MediaWiki 1.23 ==
+
+=== Configuration changes in 1.23 ===
+* (bug 13250) Restored method for clearing a watchlist in web UI
+  so that users with large watchlists don't have to perform
+  contortions to clear them.
+* When $wgJobRunRate is higher than zero, jobs are now executed via an
+  asynchronous HTTP request to a MediaWiki entry point. This may require
+  increasing the number of server worker threads. $wgRunJobsAsync has been
+  added to disable this feature if needed, falling back to executing the job
+  on the same process but making the execution synchronously.
+* $wgDebugLogGroups values may be set to an associative array with a
+  'destination' key specifying the log destination. The array may also contain
+  a 'sample' key with a positive integer value N indicating that the log group
+  should be sampled by dispatching one in every N messages on average. The
+  sampling is random.
+* In addition to the current exception log format, MediaWiki now serializes
+  exception metadata to JSON and logs it to the 'exception-json' log group.
+  This makes MediaWiki easier to integrate with log aggregation and analysis
+  tools.
+* $wgSquidServersNoPurge now supports the use of Classless Inter-Domain
+  Routing (CIDR) notation to specify contiguous blocks of IPv4 and/or IPv6
+  addresses that should be trusted to provide X-Forwarded-For headers.
+* Preferences 'watchcreations', 'watchdefault', 'enotifwatchlistpages' ("Add
+  pages I create and files I upload to my watchlist", "Add pages and files I
+  edit to my watchlist", "Email me when a page or file on my watchlist is
+  changed") are now enabled by default. In addition new user accounts' personal
+  and talk pages are now watched by them by default.
+* $wgLBFactoryConf: Class names have had underscores removed. The configuration
+  should be updated if LBFactory_Simple or LBFactory_Multi is configured.
+* $wgPasswordSenderName has been removed and is no longer functional. To set a
+  custom mailer name, the system message 'emailsender' should be modified
+  (default: "{{SITENAME}}").
+* (bug 63269) Email notifications were not correctly handling the
+  [[MediaWiki:Helppage]] message being set to a full URL (the default).
+  If you customized [[MediaWiki:Enotif body]] (the text of email notifications),
+  you'll need to edit it locally to include the URL via the new variable
+  $HELPPAGE instead of the parser functions fullurl and canonicalurl; otherwise
+  you don't have to do anything.
+* $wgDBAhandler was removed as the only class using it was also removed
+* The 'max threads' setting was removed from $wgDBservers.
+* Support for AdminSettings.php has been completely removed. All configuration
+  belongs in LocalSettings.php.
+* $wgSkipSkin, which has been replaceable by $wgSkipSkins since 2005 (r9249), is
+  now formally deprecated.
+* Removed deprecated $wgDisabledActions as it is hardly used anywhere.
+* $wgRateLimitLog has been deprecated and replaced by
+  $wgDebugLogGroup['ratelimit'].
+* $wgLocalInterwikis is an array containing multiple local interwiki prefixes
+  (interwiki prefixes that point back to the current wiki). This effectively
+  allows more than one value of $wgLocalInterwiki to be specified and
+  understood by the parser. The value of $wgLocalInterwiki is automatically
+  prepended to the start of this array.
+* $wgQueryPages has been removed. Query Pages should be added to by using the
+  wgQueryPages hook.
+* $wgHttpOnlyBlacklist has been removed.
+* $wgLicenseTerms has been removed as it was unused.
+* $wgProfileOnly is now deprecated; set the log file in
+  $wgDebugLogGroups['profileoutput'] to replace it.
+* $wgMaxBacklinksInvalidate was removed; use $wgJobBackoffThrottling instead
+* Deprecated ResourceLoaderGetStartupModules hook.
+
+=== New features in 1.23 ===
+* ResourceLoader can utilize the Web Storage API to cache modules client-side.
+  Compared to the browser cache, caching in Web Storage allows ResourceLoader
+  to be more granular about evicting stale modules from the cache while
+  retaining the ability to retrieve multiple modules in a single HTTP request.
+  This capability can be enabled by setting $wgResourceLoaderStorageEnabled to
+  true. This feature is currently considered experimental and should only be
+  enabled with care.
+* (bug 6092) Add expensive parser functions {{REVISIONID:}}, {{REVISIONUSER:}}
+  and {{REVISIONTIMESTAMP:}} (with friends).
+* Add "wgRelevantUserName" to mw.config containing the current
+  Skin::getRelevantUser value.
+* (bug 56033) Add content model to the page information.
+* Added Article::MissingArticleConditions hook to give extensions a chance to
+  hide their (unrelated) log entries.
+* Added LonelyPagesQuery hook to let extensions modify the query used to
+  generate Special:LonelyPages.
+* Added $wgOpenSearchDefaultLimit defining the default number of entries to show
+  on action=opensearch API call.
+* For namespaces with $wgNamespaceProtection (including the MediaWiki
+  namespace), the "protect" tab will be shown only if there are restriction
+  levels available that would restrict editing beyond what
+  $wgNamespaceProtection already applies. The protection form will offer only
+  those protection levels.
+* Added $wgAPIFormatModules, allowing extensions to add additional output
+  formatting modules for the API.
+* (bug 47812) The MediaWiki:Group-user.{css,js} pages can now be used to add
+  custom CSS or JavaScript enabled only for registered users.
+* (bug 52005) Special pages RecentChanges, RecentChangesLinked and Watchlist
+  now include a legend describing the symbols used in lists of changes.
+* Improved the accessibility of the tabs in Special:Preferences.
+* Added ApiBeforeMain hook, roughly equivalent to the BeforeInitialize hook:
+  it's called after everything is set up but before any major processing
+  happens.
+* The jquery.client module now performs a component-wise version comparison in
+  its #test method when strings are used in the browser map: version '1.10' is
+  now correctly considered larger than '1.2'. Using numbers in the version map
+  is not affected.
+* All API modules now support an assert parameter, which can either be
+  'user' or 'bot'. The API will throw an error if the user is not logged
+  in (user) or does not have the 'bot' userright (bot). Based off of the
+  AssertEdit extension by Steve Sanbeg.
+* [[Special:Diff]] was added, allowing users to create internal links to
+  revision comparison pages using syntax such as [[Special:Diff/12345]],
+  [[Special:Diff/12345/prev]] or [[Special:Diff/12345/98765]].
+* New user accounts' personal and talk pages are now watched by them by default.
+* Added SkinTemplateGetLanguageLink hook to allow changing the html of language
+  links.
+* Added MessageCache::get hook as a new way to customize messages across
+  multiple sites.
+* Added jquery.throttle-debounce ResourceLoader module to limit the number of
+  callbacks for frequently occurring events.
+* Special:ProtectedPages shows now a table. The timestamp, the reason and
+  the protecting user is also shown.
+* Added experimental support for using Microsoft SQL Server as the database
+  backend.
+** Added new Microsoft SQL Server-specific configuration variable
+   $wgDBWindowsAuthentication, which makes the web server authenticate against
+   the database server using Integrated Windows Authentication instead of
+   $wgDBuser/$wgDBpassword.
+* HTMLForm 'select', 'selectandother', 'selectorother', 'multiselect', and
+  'radio' fields can now use message keys as labels via the 'options-messages'
+  parameter, which overrides the 'options' parameter.
+* Admins can expire users users passwords manually, or on a schedule using the
+  $wgPasswordExpirationDays configuration setting.
+* Add new hook SendWatchlistEmailNotification, this will be used to determine
+  whether to send a watchlist email notification.
+* (bug 42026) Special:Contributions now includes an option to filter page
+  creations, similar to the topOnly option.
+* Add mediawiki.ui.button styling to all pages so wiki content can use styled
+  buttons.
+* Special:UserLogin/signup now does AJAX checks for invalid and taken usernames,
+  displaying the error live.
+* Added BaseTemplateAfterPortlet hook to allow injecting html after portlets in skins.
+* Support has been added for a JSON based localisation file format. The
+  installer has been updated to use it.
+* Changes to content typography (colors, line-height etc.). See
+  https://www.mediawiki.org/wiki/Typography_refresh for further information.
+* The Vector skin's visual treatment of external links has been simplified to a
+  single icon (from nine). This should not affect local rules unless they were
+  re-using these icons, which have now been deleted.
+* ResourceLoader: mw.loader.using() now implements a Promise interface.
+* Add new hook ChangesListInitRows accessed via ChangesList::initChangesListRows.
+  If called by the ChangesList consumer this gives extensions a chance to batch
+  process the result set prior to rendering.
+* A PoolCounterRedis class was added which can be make use of in $wgPoolCounterConf.
+  This requires at least one Redis 2.6+ server.
+* $wgProfileToDatabase was removed. Set $wgProfiler to ProfilerSimpleDB
+  in StartProfiler.php instead of using this.
+* (bug 63444) Made it possible to change the indent string (default: 4 spaces)
+  used by FormatJson::encode().
+
+=== Bug fixes in 1.23 ===
+* (bug 41759) The "updated since last visit" markers (on history pages, recent
+  changes and watchlist) and the talk page message indicator are now correctly
+  updated when the user is viewing old revisions of pages, instead of always
+  acting as if the latest revision was being viewed.
+* (bug 56443) Special:ConfirmEmail no longer shows a "Mail a confirmation code"
+  when the email address is already confirmed. Also, consistently use
+  "confirmed", rather than "authenticated", when messaging whether or not the
+  user has confirmed an email address.
+* (bug 19415) action=render no longer shows section edit links. This affects
+  behavior of several other features where (bogus) section edit links will
+  disappear, such as file description pages loaded via $wgUseInstantCommons or
+  pages transcluded cross-wiki via $wgEnableScaryTranscluding.
+* (bug 56912) Show correct link color on cached result of Special:DeadendPages.
+* Classes TitleListDependency and TitleDependency have been removed, as they
+  have been found unused in core and extensions for a long time.
+* (bug 57098) SpecialPasswordReset now obeys returnto parameter
+* (bug 37812) ResourceLoader will notice when a module's definition changes and
+  recompile it accordingly.
+* (bug 57201) SpecialRecentChangesFilters hook is now executed for feeds.
+* (bug 58640) Fixed a compatibility issue with PCRE 8.34 that caused pages
+  to appear blank or with missing text.
+* (bug 56931) Updated the plural rules to CLDR 24. They are in new format
+  which is detailed in UTS 35 Rev 33. The PHP parser and evaluator as well as
+  the JavaScript evaluator were updated to support the new format. Plural rules
+  for some languages have changed, most notably Russian. Affected software
+  messages have been updated and marked for review at translatewiki.net.
+* (bug 23542) imagelinks now stores both the redirect and target (as
+  templatelinks does).
+* (bug 58167) The web installer no longer throws an exception when PHP is
+  compiled without support for MySQL yet with support for another DBMS.
+* (bug 56199) Raw option of parser functions must now match complete word,
+  to take effect.
+* (bug 60543) Special:PrefixIndex forgot stripprefix=1 for "Next page" link
+* (bug 29762) Undoing an already-undone edit will now display an appropriate
+  message instead of leading the user to make a null edit.
+* (bug 52659) mediawiki.notification: Notification area remained visible when
+  empty and thus was stealing pointer events from links on the page.
+* (bug 26811) When a DBUnexpectedError occurs, DB server hostnames are now
+  hidden unless $wgShowExceptionDetails is true, and $wgShowDBErrorBacktrace
+  no longer applies in such cases.
+* (bug 60960) Avoid doing file_exist() checks on data: URIs, as they cause
+  warnings to be printed on Windows due to large path length.
+* (bug 48084) Fixed a bug in the installer that could cause $wgLogo to hold
+  the wrong path to the placeholder logo (skins/common/images/wiki.png).
+* (bug 64289) jquery.textSelection: Don't throw errors on empty collections.
+
+=== Web API changes in 1.23 ===
+* (bug 54884) action=parse&prop=categories now indicates hidden and missing
+  categories.
+* action=query&meta=filerepoinfo now returns additional information for each
+  repo.
+* action=parse&prop=languageshtml was deprecated in 1.18 and will be removed in
+  MediaWiki 1.24.
+* action=parse now has disabletoc flag to disable table of contents in output.
+* (bug 25702) list=allcategories, list=allimages, list=alllinks, list=allpages,
+  list=deletedrevs and list=filearchive did not handle case-sensitivity
+  properly for all parameters.
+* ApiQueryBase::titlePartToKey allows an extra parameter that indicates the
+  namespace in order to properly capitalize the title part.
+* (bug 57874) action=feedcontributions no longer has one item more than limit.
+* All API modules now support an assert parameter. See the new features section
+  for more details.
+* Added prop=contributors to fetch the list of contributors to the page.
+* The following API modules will now return entries where fields have been
+  revision-deleted: list=deletedrevs, list=filearchive, list=recentchanges,
+  list=watchlist. "hidden" indicators will be included, in the same style as is
+  already done for prop=revisions.
+* The following API modules will now return the content of revision-deleted
+  fields, in addition to the "hidden" indicators, if the querying user has the
+  necessary rights: list=logevents, list=usercontribs, prop=imageinfo,
+  prop=revisions.
+* The above modules, where applicable, will now return entries filtered by
+  revision-deleted fields if the querying user has the necessary rights. For
+  example, prop=revisions with rvuser or rvexcludeuser will no longer skip
+  revisions where the user was revision-deleted if the current user has the
+  deletedhistory right.
+* The 'hideuser' right, used when blocking, is no longer necessary or
+  sufficient for seeing contributions with revision-deleted in
+  list=usercontribs.
+* list=watchlist now uses the querying user's rights rather than the wlowner's
+  rights when checking whether wlprop=patrol is allowed.
+* (bug 32151) ApiWatch now has pageset capabilities (titles/pageids/generators).
+  Title parameter is now deprecated.
+* (bug 23005) Added action=revisiondelete.
+* Added siprop=restrictions to API action=query&meta=siteinfo for querying
+  possible page restriction (protection) levels and types.
+* Added prop 'limitreportdata' and 'limitreporthtml' to action=parse.
+* (bug 58627) Provide language names on action=parse&prop=langlinks.
+* Deprecated llurl= in favour of llprop=url for action=query&prop=langlinks.
+* Added llprop=langname and llprop=autonym for action=query&prop=langlinks.
+* prop=redirects is added, to return redirects to the pages in the query.
+* list=allredirects is added, to list all redirects pointing to a namespace.
+* (bug 42026) Added ucshow={new,!new,top,!top} to list=usercontribs.
+  Also added newonly to action=feedcontributions.
+* (bug 42026) Deprecated uctoponly in favor of ucshow=top.
+* list=search no longer has a "srredirects" parameter. Redirects are now
+  included in all searches.
+* Added list=prefixsearch that works like action=opensearch but can be used as
+  a generator.
+* (bug 24782) Various modules will now use unique continuation parameters.
+* (bug 63249) Cache RecentChanges Atom feed in varnish for 15 seconds.
+
+=== Languages updated in 1.23 ===
+
+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.
+
+* Support was added for Algerian Spoken Arabic (arq).
+* Support was added for Riograndenser Hunsrückisch (hrx).
+* Support was added for Northern Luri (lrc).
+
+=== Other changes in 1.23 ===
+* The rc_type field in the recentchanges table has been superseded by a new
+  rc_source field.  The rc_source field is a string representation of the
+  change type where rc_type was a numeric constant.  This field is not yet
+  queried but will be in a future release.
+** Utilize update.php to create and populate this new field.  On larger wikis
+   which do not wish to update recentchanges table in one large update please
+   review the SQL and comments in maintenance/archives/patch-rc_source.sql.
+** The rc_type field of recentchanges will be deprecated in a future release.
+* The global variable $wgArticle has been removed after a lengthy deprecation.
+* The global functions addButton and insertTags (for mw.toolbar.addButton and
+  mw.toolbar.insertTags) now emits mw.log.warn when accessed.
+* The ExpandTemplates extension has been moved into MediaWiki core.
+* (bug 52812) Removed "Disable search suggestions" from Preference.
+* (bug 52809) Removed "Disable browser page caching" from Preference.
+* Three new modules intended for use by custom skins were added:
+  'mediawiki.skinning.elements', 'mediawiki.skinning.content', and
+  'mediawiki.skinning.interface', representing three levels of standard
+  MediaWiki styling. Previously skin creators wishing to use them had to refer
+  to the file names of appropriate files directly, which is now discouraged.
+* The modules 'skins.vector' and 'skins.monobook' have been renamed to
+  'skins.vector.styles' and 'skins.monobook.styles', respectively,
+  and their definition was changed not to include the common*.css files;
+  the two skins now load the 'mediawiki.skinning.interface' module instead.
+* A page_links_updated field has been added to the page table.
+* SpecialPage::getTitle has been deprecated in favor of
+  SpecialPage::getPageTitle.
+* BREAKING CHANGE: Two potentially backwards-incompatible changes have been made
+  to the 'SpecialWatchlistQuery' hook's last parameter (array $values) to make
+  the hook more consistent with the 'SpecialRecentChangesQuery' one:
+** Several array keys have been renamed: hideMinor → hideminor,
+   hideBots → hidebots, hideAnons → hideanons, hideLiu → hideliu,
+   hidePatrolled → hidepatrolled, hideOwn → hidemyself.
+** The parameter value is now a FormOptions object, not a plain array (array
+   access operators should continue to work, as it implements the ArrayAccess
+   interface).
+* Option to mark hooks as deprecated has been added.
+* (bug 52811) Preference "Enable section editing via [edit] links" was removed.
+* (bug 52813) Preference "Show table of contents (for pages with more than
+  3 headings)" was removed.
+* (bug 52810) Preference "Justify paragraphs" was removed.
+* OutputPage::showErrorPage raises a notice if arguments are incoherent.
+* Thumbnails that keep failing to render in thumb.php will be rate-limited
+  againt further render attempts for 1 hour. $wgAttemptFailureEpoch can be
+  altered to reset all rate-limited thumbnails at once.
+* (bug 56572) Builds of the OOjs and OOjs UI libraries are now available.
+* mw.loader.go and mw.loader.version have been removed.
+* (bug 52815) Preference "Enable simplified search bar (Vector skin only)"
+  was removed.
+* A user_password_expires column has been added to the user table. The User
+  object expects this column to exist. Use update.php to create this new field.
+* The jquery.delayedBind ResourceLoader module was deprecated in favor of the
+  jquery.throttle-debounce module. It will be removed in MediaWiki 1.24.
+* mw.user.bucket has been deprecated.
+* On Special:PrefixIndex, a table#mw-prefixindex-list-table was changed to
+  table.mw-prefixindex-list-table to avoid duplicate ids when the special page
+  is transcluded.
+* (bug 62198) window.$j has been deprecated.
+* Preference "Disable link title conversion" was removed.
+* SpecialRecentChanges no longer includes any functionality for generating feeds
+  - it has been factored out to ApiFeedRecentChanges. Old URLs redirect to new
+  ones.
+* RecentChange::mExtra['lang'] is no longer set and should no longer be used.
+  Extensions should read from other configuration variables, including
+  $wgLocalInterwikis, to identify the current wiki.
+* Sections in the parser test framework have been renamed and the old
+  section names are deprecated.  Please use "!!wikitext" and "!!html"
+  (or "!!html/php") instead of "!!input" and "!!result".  This allows
+  us to extend parser tests to accommodate additional input/output
+  pairs, such as "!!html/parsoid" (for the output of the Parsoid
+  parser, where it differs from the PHP parser).
+* Special:Search no longer has an "include redirects" option on the advanced
+  tab. Redirects are now included in all searches.
+* mediawiki.api.category's getCategories() 'async' parameter was deprecated.
+* The locations of resources have been split between upstream libraries, now in
+  resources/lib/, local libaries in resources/src/, and local forks of upstream
+  libraries, also in resources/src/.
+* BREAKING CHANGE: The automatically-generated function closure with which
+  ResourceLoader wraps all modules' JavaScript code now binds the identifier
+  names 'jQuery' and '$' to the jQuery object of the version of jQuery that is
+  bundled with MediaWiki. If you bind these names to other objects in global
+  scope (like Zepto.js or document.querySelectorAll, for example) you will need
+  to use different names to or re-bind them at the top of each
+  ResourceLoader-loaded module.
+* (bug 52342) Preference "Remember my login" was removed.
+* The skin autodiscovery mechanism has been deprecated and will be removed in
+  MediaWiki 1.25. See https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery
+  for migration guide for creators and users of custom skins that relied on it.
+
+==== Removed classes ====
+* FakeMemCachedClient (deprecated in 1.18)
+* RdfMetaData (unused)
+* TitleDependency (unused)
+* TitleListDependency (unused)
+* WikiError (deprecated in 1.17)
+* WikiXmlError (deprecated in 1.17)
+* WikiErrorMsg (deprecated in 1.17)
+
+==== Renamed classes ====
+* CdbReader_DBA to CdbReaderDBA
+* CdbReader_PHP to CdbReaderPHP
+* CdbWriter_DBA to CdbWriterDBA
+* CdbWriter_PHP to CdbWriterPHP
+* DiffOp_Add to DiffOpAdd
+* DiffOp_Change to DiffOpChange
+* DiffOp_Copy to DiffOpCopy
+* DiffOp_Delete to DiffOpDelete
+* HWLDF_WordAccumulator to HWLDFWordAccumulator
+* LBFactory_Fake to LBFactoryFake
+* LBFactory_Multi to LBFactoryMulti
+* LBFactory_Simple to LBFactorySimple
+* LBFactory_Single to LBFactorySingle
+* LCStore_Accel to LCStoreAccel
+* LCStore_CDB to LCStoreCDB
+* LCStore_DB to LCStoreDB
+* LCStore_Null to LCStoreNull
+* LoadBalancer_Single to LoadBalancerSingle
+* LoadMonitor_MySQL to LoadMonitorMySQL
+* LoadMonitor_Null to LoadMonitorNull
+* LocalisationCache_BulkLoad to LocalisationCacheBulkLoad
+* csvStatsOutput to CsvStatsOutput
+* extensionLanguages to ExtensionLanguages
+* languages to Languages
+* statsOutput to StatsOutput
+* textStatsOutput to TextStatsOutput
+* wikiStatsOutput to WikiStatsOutput
+
+==== Removed methods ====
+* ApiBase::getValidNamespaces() (deprecated in 1.17)
+* ApiMain::setCachePrivate() (deprecated in 1.17)
+* ApiMain::setVaryCookie (deprecated in 1.17)
+* Article::doRedirect() (deprecated in 1.18)
+* Article::doUnwatch() (deprecated in 1.18)
+* Article::doWatch() (deprecated in 1.18)
+* Article::forUpdate() (deprecated in 1.18)
+* Article::markpatrolled() (deprecated in 1.18)
+* Article::unwatch() (deprecated in 1.18)
+* Article::watch() (deprecated in 1.18)
+* Block::clear() (deprecated in 1.18)
+* Block::decodeExpiry() (deprecated in 1.18)
+* Block::encodeExpiry() (deprecated in 1.18)
+* Block::forUpdate() (deprecated in 1.18)
+* Block::infinity() (deprecated in 1.18)
+* Block::load() (deprecated in 1.18)
+* Block::newFromDB() (deprecated in 1.18)
+* Block::normaliseRange() (deprecated in 1.18)
+* Block::parseExpiryInput() (deprecated in 1.18)
+* CategoryViewer::addSubcategory() (deprecated in 1.17)
+* EditPage::spamPage() (deprecated since 1.17)
+* Exif::getFormattedData() (deprecated in 1.18)
+* Exif::makeFormattedData() (deprecated in 1.18)
+* in_string (deprecated in 1.21)
+* Language::convertLinkToAllVariants() (deprecated in 1.17)
+* LanguageConverter::convertLinkToAllVariants() (deprecated in 1.17)
+* Linker::makeBrokenLink() (deprecated in 1.16)
+* Linker::makeBrokenLinkObj() (deprecated in 1.16)
+* Linker::makeColouredLinkObj() (deprecated in 1.16)
+* Linker::makeSizeLinkObj() (deprecated in 1.17)
+* MediaWiki::articleFromTitle() (deprecated in 1.18)
+* ParserOptions::getkin() (deprecated 1.18)
+* ProfilerSimple::getCpuTime (deprecated in 1.20)
+* Revision::revText() (deprecated in 1.17)
+* SkinTemplate::jstext() (deprecated in 1.21)
+* SpecialPage::__call() (deprecated in 1.17)
+* SpecialPage::executePath() (deprecated in 1.18)
+* SpecialPage::exists() (deprecated in 1.18)
+* SpecialPage::file() (deprecated in 1.18)
+* SpecialPage::func() (deprecated in 1.18)
+* SpecialPage::getGroup() (deprecated in 1.18)
+* SpecialPage::getPage() (deprecated in 1.18)
+* SpecialPage::getPageByAlias() (deprecated in 1.18)
+* SpecialPage::getLocalNameFor() (deprecated in 1.18)
+* SpecialPage::getRegularPages() (deprecated in 1.18)
+* SpecialPage::getRestrictedPages() (deprecated in 1.18)
+* SpecialPage::getTitleForAlias() (deprecated in 1.18)
+* SpecialPage::getUsablePages() (deprecated in 1.18)
+* SpecialPage::includable() (deprecated in 1.18)
+* SpecialPage::init()
+* SpecialPage::initAliasList() (deprecated in 1.18)
+* SpecialPage::initList() (deprecated in 1.18)
+* SpecialPage::name() (deprecated in 1.18)
+* SpecialPage::removePage() (deprecated in 1.18)
+* SpecialPage::resolveAlias() (deprecated in 1.18)
+* SpecialPage::resolveAliasWithSubpage() (deprecated in 1.18)
+* SpecialPage::restriction() (deprecated in 1.18)
+* SpecialPage::setGroup() (deprecated in 1.18)
+* SpecialRecentChanges::feedSetup()
+* SpecialRevisionDelete::extractBitField() (deprecated in 1.22)
+* User::getPageRenderingHash() (deprecated in 1.17)
+* WebRequest::getFileSize() (deprecated in 1.17)
+* WebRequest::isPathInfoBad() (deprecated in 1.17)
+* wfGenerateToken (deprecated in 1.20)
+* wfStreamFile (deprecated in 1.19)
+* wfUILang (deprecated in 1.18)
+* WikiPage::createUpdates() (deprecated in 1.18)
+* WikiPage::quickEdit() (deprecated in 1.18)
+* WikiPage::useParserCache() (deprecated in 1.18)
+* WikiPage::viewUpdates() (deprecated in 1.18)
+
+==== Removed globals ====
+* $wgBetterDirectionality (deprecated in 1.18)
+
 == MediaWiki 1.22 ==
 
 === Configuration changes in 1.22 ===
diff --git a/RELEASE-NOTES-1.23 b/RELEASE-NOTES-1.23
deleted file mode 100644 (file)
index baf69c5..0000000
+++ /dev/null
@@ -1,539 +0,0 @@
-Security reminder: MediaWiki does not require PHP's register_globals. If you
-have it on, turn it '''off''' if you can.
-
-== MediaWiki 1.23 ==
-
-THIS IS NOT A RELEASE YET
-
-MediaWiki 1.23 is an alpha-quality branch and is not recommended for use in
-production.
-
-=== Configuration changes in 1.23 ===
-* (bug 13250) Restored method for clearing a watchlist in web UI
-  so that users with large watchlists don't have to perform
-  contortions to clear them.
-* When $wgJobRunRate is higher that zero, jobs are now executed via an
-  asynchronous HTTP request to a MediaWiki entry point. This may require
-  increasing the number of server worker threads. $wgRunJobsAsync has been
-  added to disable this feature if needed, falling back to executing the job
-  on the same process but making the execution synchronously.
-* $wgDebugLogGroups values may be set to an associative array with a
-  'destination' key specifying the log destination. The array may also contain
-  a 'sample' key with a positive integer value N indicating that the log group
-  should be sampled by dispatching one in every N messages on average. The
-  sampling is random.
-* In addition to the current exception log format, MediaWiki now serializes
-  exception metadata to JSON and logs it to the 'exception-json' log group.
-  This makes MediaWiki easier to integrate with log aggregation and analysis
-  tools.
-* $wgSquidServersNoPurge now supports the use of Classless Inter-Domain
-  Routing (CIDR) notation to specify contiguous blocks of IPv4 and/or IPv6
-  addresses that should be trusted to provide X-Forwarded-For headers.
-* Preferences 'watchcreations', 'watchdefault', 'enotifwatchlistpages' ("Add
-  pages I create and files I upload to my watchlist", "Add pages and files I
-  edit to my watchlist", "Email me when a page or file on my watchlist is
-  changed") are now enabled by default. In addition new user accounts' personal
-  and talk pages are now watched by them by default.
-* $wgLBFactoryConf: Class names have had underscores removed. The configuration
-  should be updated if LBFactory_Simple or LBFactory_Multi is configured.
-* $wgPasswordSenderName has been removed and is no longer functional. To set a
-  custom mailer name, the system message 'emailsender' should be modified
-  (default: "{{SITENAME}}").
-* (bug 63269) Email notifications were not correctly handling the
-  [[MediaWiki:Helppage]] message being set to a full URL (the default).
-  If you customized [[MediaWiki:Enotif body]] (the text of email notifications),
-  you'll need to edit it locally to include the URL via the new variable
-  $HELPPAGE instead of the parser functions fullurl and canonicalurl; otherwise
-  you don't have to do anything.
-* $wgDBAhandler was removed as the only class using it was also removed
-* The 'max threads' setting was removed from $wgDBservers.
-* Support for AdminSettings.php has been completely removed. All configuration
-  belongs in LocalSettings.php.
-* $wgSkipSkin, which has been replaceable by $wgSkipSkins since 2005 (r9249), is
-  now formally deprecated.
-* Removed deprecated $wgDisabledActions as it is hardly used anywhere.
-* $wgRateLimitLog has been deprecated and replaced by
-  $wgDebugLogGroup['ratelimit'].
-* $wgLocalInterwikis is an array containing multiple local interwiki prefixes
-  (interwiki prefixes that point back to the current wiki). This effectively
-  allows more than one value of $wgLocalInterwiki to be specified and
-  understood by the parser. The value of $wgLocalInterwiki is automatically
-  prepended to the start of this array.
-* $wgQueryPages has been removed. Query Pages should be added to by using the
-  wgQueryPages hook.
-* $wgHttpOnlyBlacklist has been removed.
-* $wgLicenseTerms has been removed as it was unused.
-* $wgProfileOnly is now deprecated; set the log file in
-  $wgDebugLogGroups['profileoutput'] to replace it.
-* $wgMaxBacklinksInvalidate was removed; use $wgJobBackoffThrottling instead
-* Deprecated ResourceLoaderGetStartupModules hook.
-
-=== New features in 1.23 ===
-* ResourceLoader can utilize the Web Storage API to cache modules client-side.
-  Compared to the browser cache, caching in Web Storage allows ResourceLoader
-  to be more granular about evicting stale modules from the cache while
-  retaining the ability to retrieve multiple modules in a single HTTP request.
-  This capability can be enabled by setting $wgResourceLoaderStorageEnabled to
-  true. This feature is currently considered experimental and should only be
-  enabled with care.
-* (bug 6092) Add expensive parser functions {{REVISIONID:}}, {{REVISIONUSER:}}
-  and {{REVISIONTIMESTAMP:}} (with friends).
-* Add "wgRelevantUserName" to mw.config containing the current
-  Skin::getRelevantUser value.
-* (bug 56033) Add content model to the page information.
-* Added Article::MissingArticleConditions hook to give extensions a chance to
-  hide their (unrelated) log entries.
-* Added LonelyPagesQuery hook to let extensions modify the query used to
-  generate Special:LonelyPages.
-* Added $wgOpenSearchDefaultLimit defining the default number of entries to show
-  on action=opensearch API call.
-* For namespaces with $wgNamespaceProtection (including the MediaWiki
-  namespace), the "protect" tab will be shown only if there are restriction
-  levels available that would restrict editing beyond what
-  $wgNamespaceProtection already applies. The protection form will offer only
-  those protection levels.
-* Added $wgAPIFormatModules, allowing extensions to add additional output
-  formatting modules for the API.
-* (bug 47812) The MediaWiki:Group-user.{css,js} pages can now be used to add
-  custom CSS or JavaScript enabled only for registered users.
-* (bug 52005) Special pages RecentChanges, RecentChangesLinked and Watchlist
-  now include a legend describing the symbols used in lists of changes.
-* Improved the accessibility of the tabs in Special:Preferences.
-* Added ApiBeforeMain hook, roughly equivalent to the BeforeInitialize hook:
-  it's called after everything is set up but before any major processing
-  happens.
-* The jquery.client module now performs a component-wise version comparison in
-  its #test method when strings are used in the browser map: version '1.10' is
-  now correctly considered larger than '1.2'. Using numbers in the version map
-  is not affected.
-* All API modules now support an assert parameter, which can either be
-  'user' or 'bot'. The API will throw an error if the user is not logged
-  in (user) or does not have the 'bot' userright (bot). Based off of the
-  AssertEdit extension by Steve Sanbeg.
-* [[Special:Diff]] was added, allowing users to create internal links to
-  revision comparison pages using syntax such as [[Special:Diff/12345]],
-  [[Special:Diff/12345/prev]] or [[Special:Diff/12345/98765]].
-* New user accounts' personal and talk pages are now watched by them by default.
-* Added SkinTemplateGetLanguageLink hook to allow changing the html of language
-  links.
-* Added MessageCache::get hook as a new way to customize messages across
-  multiple sites.
-* Added jquery.throttle-debounce ResourceLoader module to limit the number of
-  callbacks for frequently occurring events.
-* Special:ProtectedPages shows now a table. The timestamp, the reason and
-  the protecting user is also shown.
-* Added experimental support for using Microsoft SQL Server as the database
-  backend.
-** Added new Microsoft SQL Server-specific configuration variable
-   $wgDBWindowsAuthentication, which makes the web server authenticate against
-   the database server using Integrated Windows Authentication instead of
-   $wgDBuser/$wgDBpassword.
-* HTMLForm 'select', 'selectandother', 'selectorother', 'multiselect', and
-  'radio' fields can now use message keys as labels via the 'options-messages'
-  parameter, which overrides the 'options' parameter.
-* Admins can expire users users passwords manually, or on a schedule using the
-  $wgPasswordExpirationDays configuration setting.
-* Add new hook SendWatchlistEmailNotification, this will be used to determine
-  whether to send a watchlist email notification.
-* (bug 42026) Special:Contributions now includes an option to filter page
-  creations, similar to the topOnly option.
-* Add mediawiki.ui.button styling to all pages so wiki content can use styled
-  buttons.
-* Special:UserLogin/signup now does AJAX checks for invalid and taken usernames,
-  displaying the error live.
-* Added BaseTemplateAfterPortlet hook to allow injecting html after portlets in skins.
-* Support has been added for a JSON based localisation file format. The
-  installer has been updated to use it.
-* Changes to content typography (colors, line-height etc.). See
-  https://www.mediawiki.org/wiki/Typography_refresh for further information.
-* The Vector skin's visual treatment of external links has been simplified to a
-  single icon (from nine). This should not affect local rules unless they were
-  re-using these icons, which have now been deleted.
-* ResourceLoader: mw.loader.using() now implements a Promise interface.
-* Add new hook ChangesListInitRows accessed via ChangesList::initChangesListRows.
-  If called by the ChangesList consumer this gives extensions a chance to batch
-  process the result set prior to rendering.
-* A PoolCounterRedis class was added which can be make use of in $wgPoolCounterConf.
-  This requires at least one Redis 2.6+ server.
-* $wgProfileToDatabase was removed. Set $wgProfiler to ProfilerSimpleDB
-  in StartProfiler.php instead of using this.
-* (bug 63444) Made it possible to change the indent string (default: 4 spaces)
-  used by FormatJson::encode().
-
-=== Bug fixes in 1.23 ===
-* (bug 41759) The "updated since last visit" markers (on history pages, recent
-  changes and watchlist) and the talk page message indicator are now correctly
-  updated when the user is viewing old revisions of pages, instead of always
-  acting as if the latest revision was being viewed.
-* (bug 56443) Special:ConfirmEmail no longer shows a "Mail a confirmation code"
-  when the email address is already confirmed. Also, consistently use
-  "confirmed", rather than "authenticated", when messaging whether or not the
-  user has confirmed an email address.
-* (bug 19415) action=render no longer shows section edit links. This affects
-  behavior of several other features where (bogus) section edit links will
-  disappear, such as file description pages loaded via $wgUseInstantCommons or
-  pages transcluded cross-wiki via $wgEnableScaryTranscluding.
-* (bug 56912) Show correct link color on cached result of Special:DeadendPages.
-* Classes TitleListDependency and TitleDependency have been removed, as they
-  have been found unused in core and extensions for a long time.
-* (bug 57098) SpecialPasswordReset now obeys returnto parameter
-* (bug 37812) ResourceLoader will notice when a module's definition changes and
-  recompile it accordingly.
-* (bug 57201) SpecialRecentChangesFilters hook is now executed for feeds.
-* (bug 58640) Fixed a compatibility issue with PCRE 8.34 that caused pages
-  to appear blank or with missing text.
-* (bug 56931) Updated the plural rules to CLDR 24. They are in new format
-  which is detailed in UTS 35 Rev 33. The PHP parser and evaluator as well as
-  the JavaScript evaluator were updated to support the new format. Plural rules
-  for some languages have changed, most notably Russian. Affected software
-  messages have been updated and marked for review at translatewiki.net.
-* (bug 23542) imagelinks now stores both the redirect and target (as
-  templatelinks does).
-* (bug 58167) The web installer no longer throws an exception when PHP is
-  compiled without support for MySQL yet with support for another DBMS.
-* (bug 56199) Raw option of parser functions must now match complete word,
-  to take effect.
-* (bug 60543) Special:PrefixIndex forgot stripprefix=1 for "Next page" link
-* (bug 29762) Undoing an already-undone edit will now display an appropriate
-  message instead of leading the user to make a null edit.
-* (bug 52659) mediawiki.notification: Notification area remained visible when
-  empty and thus was stealing pointer events from links on the page.
-* (bug 26811) When a DBUnexpectedError occurs, DB server hostnames are now
-  hidden unless $wgShowExceptionDetails is true, and $wgShowDBErrorBacktrace
-  no longer applies in such cases.
-* (bug 60960) Avoid doing file_exist() checks on data: URIs, as they cause
-  warnings to be printed on Windows due to large path length.
-* (bug 48084) Fixed a bug in the installer that could cause $wgLogo to hold
-  the wrong path to the placeholder logo (skins/common/images/wiki.png).
-* (bug 64289) jquery.textSelection: Don't throw errors on empty collections.
-
-=== Web API changes in 1.23 ===
-* (bug 54884) action=parse&prop=categories now indicates hidden and missing
-  categories.
-* action=query&meta=filerepoinfo now returns additional information for each
-  repo.
-* action=parse&prop=languageshtml was deprecated in 1.18 and will be removed in
-  MediaWiki 1.24.
-* action=parse now has disabletoc flag to disable table of contents in output.
-* (bug 25702) list=allcategories, list=allimages, list=alllinks, list=allpages,
-  list=deletedrevs and list=filearchive did not handle case-sensitivity
-  properly for all parameters.
-* ApiQueryBase::titlePartToKey allows an extra parameter that indicates the
-  namespace in order to properly capitalize the title part.
-* (bug 57874) action=feedcontributions no longer has one item more than limit.
-* All API modules now support an assert parameter. See the new features section
-  for more details.
-* Added prop=contributors to fetch the list of contributors to the page.
-* The following API modules will now return entries where fields have been
-  revision-deleted: list=deletedrevs, list=filearchive, list=recentchanges,
-  list=watchlist. "hidden" indicators will be included, in the same style as is
-  already done for prop=revisions.
-* The following API modules will now return the content of revision-deleted
-  fields, in addition to the "hidden" indicators, if the querying user has the
-  necessary rights: list=logevents, list=usercontribs, prop=imageinfo,
-  prop=revisions.
-* The above modules, where applicable, will now return entries filtered by
-  revision-deleted fields if the querying user has the necessary rights. For
-  example, prop=revisions with rvuser or rvexcludeuser will no longer skip
-  revisions where the user was revision-deleted if the current user has the
-  deletedhistory right.
-* The 'hideuser' right, used when blocking, is no longer necessary or
-  sufficient for seeing contributions with revision-deleted in
-  list=usercontribs.
-* list=watchlist now uses the querying user's rights rather than the wlowner's
-  rights when checking whether wlprop=patrol is allowed.
-* (bug 32151) ApiWatch now has pageset capabilities (titles/pageids/generators).
-  Title parameter is now deprecated.
-* (bug 23005) Added action=revisiondelete.
-* Added siprop=restrictions to API action=query&meta=siteinfo for querying
-  possible page restriction (protection) levels and types.
-* Added prop 'limitreportdata' and 'limitreporthtml' to action=parse.
-* (bug 58627) Provide language names on action=parse&prop=langlinks.
-* Deprecated llurl= in favour of llprop=url for action=query&prop=langlinks.
-* Added llprop=langname and llprop=autonym for action=query&prop=langlinks.
-* prop=redirects is added, to return redirects to the pages in the query.
-* list=allredirects is added, to list all redirects pointing to a namespace.
-* (bug 42026) Added ucshow={new,!new,top,!top} to list=usercontribs.
-  Also added newonly to action=feedcontributions.
-* (bug 42026) Deprecated uctoponly in favor of ucshow=top.
-* list=search no longer has a "srredirects" parameter. Redirects are now
-  included in all searches.
-* Added list=prefixsearch that works like action=opensearch but can be used as
-  a generator.
-* (bug 24782) Various modules will now use unique continuation parameters.
-* (bug 63249) Cache RecentChanges Atom feed in varnish for 15 seconds.
-
-=== Languages updated in 1.23 ===
-
-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.
-
-* Support was added for Algerian Spoken Arabic (arq).
-* Support was added for Riograndenser Hunsrückisch (hrx).
-* Support was added for Northern Luri (lrc).
-
-=== Other changes in 1.23 ===
-* The rc_type field in the recentchanges table has been superseded by a new
-  rc_source field.  The rc_source field is a string representation of the
-  change type where rc_type was a numeric constant.  This field is not yet
-  queried but will be in a future point release of 1.22.
-** Utilize update.php to create and populate this new field.  On larger wiki's
-   which do not wish to update recentchanges table in one large update please
-   review the sql and comments in maintenance/archives/patch-rc_source.sql.
-** The rc_type field of recentchanges will be deprecated in a future point
-   release.
-* The global variable $wgArticle has been removed after a lengthy deprecation.
-* The global functions addButton and insertTags (for mw.toolbar.addButton and
-  mw.toolbar.insertTags) now emits mw.log.warn when accessed.
-* The ExpandTemplates extension has been moved into MediaWiki core.
-* (bug 52812) Removed "Disable search suggestions" from Preference.
-* (bug 52809) Removed "Disable browser page caching" from Preference.
-* Three new modules intended for use by custom skins were added:
-  'mediawiki.skinning.elements', 'mediawiki.skinning.content', and
-  'mediawiki.skinning.interface', representing three levels of standard
-  MediaWiki styling. Previously skin creators wishing to use them had to refer
-  to the file names of appropriate files directly, which is now discouraged.
-* The modules 'skins.vector' and 'skins.monobook' have been renamed to
-  'skins.vector.styles' and 'skins.monobook.styles', respectively,
-  and their definition was changed not to include the common*.css files;
-  the two skins now load the 'mediawiki.skinning.interface' module instead.
-* A page_links_updated field has been added to the page table.
-* SpecialPage::getTitle has been deprecated in favor of
-  SpecialPage::getPageTitle.
-* BREAKING CHANGE: Two potentially backwards-incompatible changes have been made
-  to the 'SpecialWatchlistQuery' hook's last parameter (array $values) to make
-  the hook more consistent with the 'SpecialRecentChangesQuery' one:
-** Several array keys have been renamed: hideMinor → hideminor,
-   hideBots → hidebots, hideAnons → hideanons, hideLiu → hideliu,
-   hidePatrolled → hidepatrolled, hideOwn → hidemyself.
-** The parameter value is now a FormOptions object, not a plain array (array
-   access operators should continue to work, as it implements the ArrayAccess
-   interface).
-* Option to mark hooks as deprecated has been added.
-* (bug 52811) Preference "Enable section editing via [edit] links" was removed.
-* (bug 52813) Preference "Show table of contents (for pages with more than
-  3 headings)" was removed.
-* (bug 52810) Preference "Justify paragraphs" was removed.
-* OutputPage::showErrorPage raises a notice if arguments are incoherent.
-* Thumbnails that keep failing to render in thumb.php will be rate-limited
-  againt further render attempts for 1 hour. $wgAttemptFailureEpoch can be
-  altered to reset all rate-limited thumbnails at once.
-* (bug 56572) Builds of the OOjs and OOjs UI libraries are now available.
-* mw.loader.go and mw.loader.version have been removed.
-* (bug 52815) Preference "Enable simplified search bar (Vector skin only)"
-  was removed.
-* A user_password_expires column has been added to the user table. The User
-  object expects this column to exist. Use update.php to create this new field.
-* The jquery.delayedBind ResourceLoader module was deprecated in favor of the
-  jquery.throttle-debounce module. It will be removed in MediaWiki 1.24.
-* mw.user.bucket has been deprecated.
-* On Special:PrefixIndex, a table#mw-prefixindex-list-table was changed to
-  table.mw-prefixindex-list-table to avoid duplicate ids when the special page
-  is transcluded.
-* (bug 62198) window.$j has been deprecated.
-* Preference "Disable link title conversion" was removed.
-* SpecialRecentChanges no longer includes any functionality for generating feeds
-  - it has been factored out to ApiFeedRecentChanges. Old URLs redirect to new
-  ones.
-* RecentChange::mExtra['lang'] is no longer set and should no longer be used.
-  Extensions should read from other configuration variables, including
-  $wgLocalInterwikis, to identify the current wiki.
-* Sections in the parser test framework have been renamed and the old
-  section names are deprecated.  Please use "!!wikitext" and "!!html"
-  (or "!!html/php") instead of "!!input" and "!!result".  This allows
-  us to extend parser tests to accommodate additional input/output
-  pairs, such as "!!html/parsoid" (for the output of the Parsoid
-  parser, where it differs from the PHP parser).
-* Special:Search no longer has an "include redirects" option on the advanced
-  tab. Redirects are now included in all searches.
-* mediawiki.api.category's getCategories() 'async' parameter was deprecated.
-* The locations of resources have been split between upstream libraries, now in
-  resources/lib/, local libaries in resources/src/, and local forks of upstream
-  libraries, also in resources/src/.
-* BREAKING CHANGE: The automatically-generated function closure with which
-  ResourceLoader wraps all modules' JavaScript code now binds the identifier
-  names 'jQuery' and '$' to the jQuery object of the version of jQuery that is
-  bundled with MediaWiki. If you bind these names to other objects in global
-  scope (like Zepto.js or document.querySelectorAll, for example) you will need
-  to use different names to or re-bind them at the top of each
-  ResourceLoader-loaded module.
-* (bug 52342) Preference "Remember my login" was removed.
-
-==== Removed classes ====
-* FakeMemCachedClient (deprecated in 1.18)
-* RdfMetaData (unused)
-* TitleDependency (unused)
-* TitleListDependency (unused)
-* WikiError (deprecated in 1.17)
-* WikiXmlError (deprecated in 1.17)
-* WikiErrorMsg (deprecated in 1.17)
-
-==== Renamed classes ====
-* CdbReader_DBA to CdbReaderDBA
-* CdbReader_PHP to CdbReaderPHP
-* CdbWriter_DBA to CdbWriterDBA
-* CdbWriter_PHP to CdbWriterPHP
-* DiffOp_Add to DiffOpAdd
-* DiffOp_Change to DiffOpChange
-* DiffOp_Copy to DiffOpCopy
-* DiffOp_Delete to DiffOpDelete
-* HWLDF_WordAccumulator to HWLDFWordAccumulator
-* LBFactory_Fake to LBFactoryFake
-* LBFactory_Multi to LBFactoryMulti
-* LBFactory_Simple to LBFactorySimple
-* LBFactory_Single to LBFactorySingle
-* LCStore_Accel to LCStoreAccel
-* LCStore_CDB to LCStoreCDB
-* LCStore_DB to LCStoreDB
-* LCStore_Null to LCStoreNull
-* LoadBalancer_Single to LoadBalancerSingle
-* LoadMonitor_MySQL to LoadMonitorMySQL
-* LoadMonitor_Null to LoadMonitorNull
-* LocalisationCache_BulkLoad to LocalisationCacheBulkLoad
-* csvStatsOutput to CsvStatsOutput
-* extensionLanguages to ExtensionLanguages
-* languages to Languages
-* statsOutput to StatsOutput
-* textStatsOutput to TextStatsOutput
-* wikiStatsOutput to WikiStatsOutput
-
-==== Removed methods ====
-* ApiBase::getValidNamespaces() (deprecated in 1.17)
-* ApiMain::setCachePrivate() (deprecated in 1.17)
-* ApiMain::setVaryCookie (deprecated in 1.17)
-* Article::doRedirect() (deprecated in 1.18)
-* Article::doUnwatch() (deprecated in 1.18)
-* Article::doWatch() (deprecated in 1.18)
-* Article::forUpdate() (deprecated in 1.18)
-* Article::markpatrolled() (deprecated in 1.18)
-* Article::unwatch() (deprecated in 1.18)
-* Article::watch() (deprecated in 1.18)
-* Block::clear() (deprecated in 1.18)
-* Block::decodeExpiry() (deprecated in 1.18)
-* Block::encodeExpiry() (deprecated in 1.18)
-* Block::forUpdate() (deprecated in 1.18)
-* Block::infinity() (deprecated in 1.18)
-* Block::load() (deprecated in 1.18)
-* Block::newFromDB() (deprecated in 1.18)
-* Block::normaliseRange() (deprecated in 1.18)
-* Block::parseExpiryInput() (deprecated in 1.18)
-* CategoryViewer::addSubcategory() (deprecated in 1.17)
-* EditPage::spamPage() (deprecated since 1.17)
-* Exif::getFormattedData() (deprecated in 1.18)
-* Exif::makeFormattedData() (deprecated in 1.18)
-* in_string (deprecated in 1.21)
-* Language::convertLinkToAllVariants() (deprecated in 1.17)
-* LanguageConverter::convertLinkToAllVariants() (deprecated in 1.17)
-* Linker::makeBrokenLink() (deprecated in 1.16)
-* Linker::makeBrokenLinkObj() (deprecated in 1.16)
-* Linker::makeColouredLinkObj() (deprecated in 1.16)
-* Linker::makeSizeLinkObj() (deprecated in 1.17)
-* MediaWiki::articleFromTitle() (deprecated in 1.18)
-* ParserOptions::getkin() (deprecated 1.18)
-* ProfilerSimple::getCpuTime (deprecated in 1.20)
-* Revision::revText() (deprecated in 1.17)
-* SkinTemplate::jstext() (deprecated in 1.21)
-* SpecialPage::__call() (deprecated in 1.17)
-* SpecialPage::executePath() (deprecated in 1.18)
-* SpecialPage::exists() (deprecated in 1.18)
-* SpecialPage::file() (deprecated in 1.18)
-* SpecialPage::func() (deprecated in 1.18)
-* SpecialPage::getGroup() (deprecated in 1.18)
-* SpecialPage::getPage() (deprecated in 1.18)
-* SpecialPage::getPageByAlias() (deprecated in 1.18)
-* SpecialPage::getLocalNameFor() (deprecated in 1.18)
-* SpecialPage::getRegularPages() (deprecated in 1.18)
-* SpecialPage::getRestrictedPages() (deprecated in 1.18)
-* SpecialPage::getTitleForAlias() (deprecated in 1.18)
-* SpecialPage::getUsablePages() (deprecated in 1.18)
-* SpecialPage::includable() (deprecated in 1.18)
-* SpecialPage::init()
-* SpecialPage::initAliasList() (deprecated in 1.18)
-* SpecialPage::initList() (deprecated in 1.18)
-* SpecialPage::name() (deprecated in 1.18)
-* SpecialPage::removePage() (deprecated in 1.18)
-* SpecialPage::resolveAlias() (deprecated in 1.18)
-* SpecialPage::resolveAliasWithSubpage() (deprecated in 1.18)
-* SpecialPage::restriction() (deprecated in 1.18)
-* SpecialPage::setGroup() (deprecated in 1.18)
-* SpecialRecentChanges::feedSetup()
-* SpecialRevisionDelete::extractBitField() (deprecated in 1.22)
-* User::getPageRenderingHash() (deprecated in 1.17)
-* WebRequest::getFileSize() (deprecated in 1.17)
-* WebRequest::isPathInfoBad() (deprecated in 1.17)
-* wfGenerateToken (deprecated in 1.20)
-* wfStreamFile (deprecated in 1.19)
-* wfUILang (deprecated in 1.18)
-* WikiPage::createUpdates() (deprecated in 1.18)
-* WikiPage::quickEdit() (deprecated in 1.18)
-* WikiPage::useParserCache() (deprecated in 1.18)
-* WikiPage::viewUpdates() (deprecated in 1.18)
-
-==== Removed globals ====
-* $wgBetterDirectionality (deprecated in 1.18)
-
-== Compatibility ==
-
-MediaWiki 1.23 requires PHP 5.3.2 or later.
-
-MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but
-support for them is somewhat less mature. There is experimental support for
-Oracle and Microsoft SQL Server.
-
-The supported versions are:
-
-* MySQL 5.0.2 or later
-* PostgreSQL 8.3 or later
-* SQLite 3.3.7 or later
-* Oracle 9.0.1 or later
-* Microsoft SQL Server 2005 (9.00.1399)
-
-== Upgrading ==
-
-1.23 has several database changes since 1.22, and will not work without schema
-updates. Note that due to changes to some very large tables like the revision
-table, the schema update may take quite long (minutes on a medium sized site,
-many hours on a large site).
-
-If upgrading from before 1.11, and you are using a wiki as a commons
-repository, make sure that it is updated as well. Otherwise, errors may arise
-due to database schema changes.
-
-If upgrading from before 1.7, you may want to run refreshLinks.php to ensure
-new database fields are filled with data.
-
-If you are upgrading from MediaWiki 1.4.x or earlier, you should upgrade to
-1.5 first. The upgrade script maintenance/upgrade1_5.php has been removed
-with MediaWiki 1.21.
-
-Don't forget to always back up your database before upgrading!
-
-See the file UPGRADE for more detailed upgrade instructions.
-
-For notes on 1.22.x and older releases, see HISTORY.
-
-== Online documentation ==
-
-Documentation for both end-users and site administrators is available on
-MediaWiki.org, and is covered under the GNU Free Documentation License (except
-for pages that explicitly state that their contents are in the public domain):
-
-       https://www.mediawiki.org/wiki/Documentation
-
-== Mailing list ==
-
-A mailing list is available for MediaWiki user support and discussion:
-
-       https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
-
-A low-traffic announcements-only list is also available:
-
-       https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
-
-It's highly recommended that you sign up for one of these lists if you're
-going to run a public MediaWiki, so you can be notified of security fixes.
-
-== IRC help ==
-
-There's usually someone online in #mediawiki on irc.freenode.net.
index 12deb92..8793fc9 100644 (file)
@@ -14,6 +14,17 @@ production.
 * Introduced $wgPagePropsHaveSortkey as a backwards-compatibility switch,
   for using the old schema of the page_props table, in case the respective
   schema update was not applied.
+* $wgSearchEverythingOnlyLoggedIn was removed as the 'searcheverything'
+  user option was removed. Use $wgNamespacesToBeSearchedDefault instead or
+  if you used to have $wgDefaultUserOptions['searcheverything'] = 1.
+* $wgMasterWaitTimeout has been deprecated.
+* $wgDBClusterTimeout has been removed.
+* $wgProxyKey has been removed. It is no longer used by MediaWiki core.
+  Ensure $wgSecretKey is set in LocalSettings.php.
+* $wgExtraInterlanguageLinkPrefixes is a new configuration variable that
+  contains an array of interwiki prefixes that should be treated as language
+  prefixes (i.e. turned into interlanguage links when $wgInterwikiMagic is set
+  to true).
 
 === New features in 1.24 ===
 * Added a new hook, "WhatLinksHereProps", to allow extensions to annotate
@@ -30,23 +41,57 @@ production.
 * Added a new hook, "SidebarBeforeOutput", to allow to edit the structure of
   the sidebar just before its display.
 * (bug 49156) Added the mediawiki.cookie ResourceLoader module, which wraps
-  jQuery.cookie so that getting/setting a cookie is syntactically and functionally
-  similar to using the WebRequest#getCookie/WebResponse#setcookie methods.
-* (bug 44740) jQuery upgraded from 1.8.3 to 1.11.1.
+  jquery.cookie so that getting/setting a cookie is syntactically and
+  functionally similar to using the WebRequest::getCookie() and
+  WebResponse::setcookie() methods.
+* (bug 44740) jQuery upgraded from 1.8.3 to 1.11.1. A new configuration option,
+  $wgIncludejQueryMigrate, also loads the jQuery Migrate hack to let extensions
+  and gadgets use the long-deprecated functions that were removed in jQuery 1.9.
+  This option is turned off by default, and will be removed in MediaWiki 1.25.
+* (bug 47076) jQuery UI upgraded from 1.8.24 to 1.9.2.
 * Changes to content typography (fonts, etc.). See
   https://www.mediawiki.org/wiki/Typography_refresh for further information.
 * WikitextContent will now render redirects with the expected "redirect"
   header, rather than as an ordered list. Code calling Article::viewRedirect
   can probably be changed to no longer special-case redirects.
-* (bug 63903) Thumbnails without an explicit size specification are
-  now resized to a square bounding box. This gives better results for
-  non-landscape thumbnails.
+* Header font set to a serif font stack. See
+  https://www.mediawiki.org/wiki/Typography_refresh for further information.
+* (bug 65567) Added a new hook, "BeforeHttpsRedirect", to allow cancellation of
+  the HTTP to HTTPS redirect due to forceHTTPS cookie, userRequires, etc. This
+  is only for page views, since this hook doesn't affect UserLogin, OAuth,
+  CentralAuth, etc. ATTENTION: This hook is likely to be removed soon due to
+  overall design of the system.
+* (bug 17367) It is now possible to add pages to your watchlist from
+  Special:UnwatchedPages without reloading the special page.
+* New methods setVolatile and isVolatile are added to PPFrame, so that
+  extensions such as Cite.php can mark that their output is volatile and
+  shouldn't be cached.
+* (bug 52817) Advanced search options are now saved on the search page itself,
+  rather than in a dedicated pane in the preferences panel.
+* (bug 44591) The dropdown actions menu (little triangle next to page tabs) in
+  the Vector skin has gained a label that should make it more discoverable.
+* MWCryptHKDF added for fast, cryptographically secure random number generation
+  that won't deplete openssl's entropy pool.
+* ResourceLoader: File modules can now provide a skip function that uses an
+  inline feature test to bypass loading of the module.
+* (bug 20210) Special pages may now provide autocompletion of their subpage
+  names in search suggestions. Right now the only useful implementation is in
+  Special:Log, but more are to come.
+* Special:MostLinkedTemplates is no longer limited to transclusions from the
+  Template namespace.
+* Skins can now use 'remoteSkinPath' when defining ResourceLoader modules.
+  This works the same as 'remoteExtPath' but is relative to the skins/ folder
+  instead of the extensions/ folder.
+* Extensions and skins may now use 'namemsg' in $wgExtensionCredits in addition
+  to 'name', to allow for the name to be localizable. 'name' should still be
+  specified for backwards-compatibility and to define the path Special:Version
+  uses to find extension license information.
 
 === Bug fixes in 1.24 ===
 * (bug 49116) Footer copyright notice is now always displayed in user language
   rather than content language (same as copyright notice for editing interface).
 * (bug 62258) A bug was fixed in File::getUnscaledThumb when a height
-  restriction was present in the parameters.  Images with both the "frame"
+  restriction was present in the parameters. Images with both the "frame"
   option and a size specification set will now always ignore the provided
   size and display an unscaled image, as the documentation has always
   claimed it would.
@@ -62,6 +107,8 @@ production.
 * (bug 52587) Maintenance script deleteBatch.php no longer follows redirects
   in the file namespace and delete the file on the target page. It will still
   however delete the redirect page.
+* (bug 22683) {{msgnw:}} and other uses of PPFrame::RECOVER_ORIG will correctly
+  recover the original code of extension tags.
 
 === Web API changes in 1.24 ===
 * action=parse API now supports prop=modules, which provides the list of
@@ -78,6 +125,10 @@ production.
   specified.
 * action=logevents has a new parameter, lenamespace, to allow filtering by
   namespace.
+* action=expandtemplates has a new parameter, prop, and a new output format.
+  The old format is still used if prop isn't provided, but this is deprecated.
+* meta=userinfo can now return the count of unread pages on the watchlist.
+* list=watchlist can now filter by unread status.
 
 === Languages updated in 1.24 ===
 
@@ -102,6 +153,29 @@ changes to languages because of Bugzilla reports.
   core to their own respective repositories. See also
   https://www.mediawiki.org/wiki/Skin:Modern and
   https://www.mediawiki.org/wiki/Skin:CologneBlue.
+* BREAKING CHANGE: Skins built for MediaWiki 1.15 and earlier that do not use
+  the "headelement" template key are no longer supported. Setting
+  $useHeadElement = false; is no longer supported and will not cause old keys
+  like "headlinks", "skinnameclass", etc. to be defined.
+* The deprecated 'SpecialVersionExtensionTypes' hook was removed.
+* (bug 63891) Add 'X-Robots-Tag: noindex' header in action=render pages.
+* SpecialPage no longer supports the syntax for invoking wfSpecial*() functions.
+  Special pages should subclass SpecialPage and implement the execute() method.
+* (bug 63755) The deprecated constants RC_MOVE and RC_MOVE_OVER_REDIRECT were
+  removed.
+* Special:MostLinkedTemplates has been renamed to Special:MostTranscludedPages.
+* The skin autodiscovery mechanism has been deprecated and will be removed in
+  MediaWiki 1.25. See https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery
+  for migration guide for creators and users of custom skins that relied on it.
+* ResourceLoaderFileModule#getAllStyleFiles now returns all style files and all
+  skin style files used by the module.
+* Removed getLang() from IContextSource and subclasses. (deprecated since 1.19)
+* Removed setLang() from subclasses of IContextSource. (deprecated since 1.19)
+* Removed WebRequest::escapeAppendQuery(). (deprecated since 1.20)
+* Removed info(), purge(), revert() and rollback() from the Article class; they
+  have since become subclasses of the Action class. (deprecated since 1.19)
+* SearchEngineReplacePrefixesComplete hook was removed.
+* Removed HTMLForm::addJS(). (deprecated since 1.18)
 
 ==== Renamed classes ====
 * CLDRPluralRuleConverter_Expression to CLDRPluralRuleConverterExpression
@@ -110,6 +184,7 @@ changes to languages because of Bugzilla reports.
 * CLDRPluralRuleEvaluator_Range to CLDRPluralRuleEvaluatorRange
 * CSSJanus_Tokenizer to CSSJanusTokenizer
 * MediaWiki_I18N to MediaWikiI18N
+* Parser_DiffTest to ParserDiffTest
 * RevDel_ArchiveItem to RevDelArchiveItem
 * RevDel_ArchiveList to RevDelArchiveList
 * RevDel_ArchivedFileItem to RevDelArchivedFileItem
@@ -182,7 +257,7 @@ Don't forget to always back up your database before upgrading!
 
 See the file UPGRADE for more detailed upgrade instructions.
 
-For notes on 1.22.x and older releases, see HISTORY.
+For notes on 1.23.x and older releases, see HISTORY.
 
 == Online documentation ==
 
index e1c9ec6..8d7e654 100644 (file)
@@ -728,6 +728,13 @@ $mediaWiki: Mediawiki object
 &$out: OutputPage object
 &$skin: Skin object
 
+'BeforeHttpsRedirect': Prior to forcing HTTP->HTTPS redirect. Gives a chance to
+override how the redirect is output by modifying, or by returning false, and
+letting standard HTTP rendering take place.
+ATTENTION: This hook is likely to be removed soon due to overall design of the system.
+$context: IContextSource object
+&$redirect: string URL, modifiable
+
 'BeforePageRedirect': Prior to sending an HTTP redirect. Gives a chance to
 override how the redirect is output by modifying, or by returning false and
 taking over the output.
@@ -1034,11 +1041,11 @@ yourself. Alternatively, modifying $error and returning true will cause the
 contents of $error to be echoed at the top of the edit form as wikitext.
 Return true without altering $error to allow the edit to proceed.
 
-'EditPage::showReadOnlyForm:initial: similar to EditPage::showEditForm:initial
-but for the readonly 'view source' variant of the edit form.
+'EditPage::showReadOnlyForm:initial': similar to EditPage::showEditForm:initial
+but for the read-only 'view source' variant of the edit form.
 $editor: EditPage instance (object)
 &$out: an OutputPage instance to write to
-return value is ignored (should alway return true)
+return value is ignored (should always return true)
 
 'EditPage::showStandardInputs:options': allows injection of form fields into
 the editOptions area
@@ -2032,6 +2039,16 @@ $oldtext : the text of the article before editing
 $subject : subject of the new section
 &$text : text of the new section
 
+'PostLoginRedirect': Modify the post login redirect behavior.
+Occurs after signing up or logging in, allows for interception of redirect.
+&$returnTo: The page name to return to, as a string
+&$returnToQuery: array of url parameters, mapping parameter names to values
+&$type: type of login redirect as string;
+  error: display a return to link ignoring $wgRedirectOnLogin
+  signup: display a return to link using $wgRedirectOnLogin if needed
+  success: display a return to link using $wgRedirectOnLogin if needed
+  successredirect: send an HTTP redirect using $wgRedirectOnLogin if needed
+
 'PreferencesGetLegend': Override the text used for the <legend> of a
 preferences section.
 $form: the PreferencesForm object. This is a ContextSource as well
@@ -2078,7 +2095,7 @@ $article: the page the form is shown for
 $out: OutputPage object
 
 'RawPageViewBeforeOutput': Right before the text is blown out in action=raw.
-&$obj: RawPage object
+&$obj: RawAction object
 &$text: The text that's going to be the output
 
 'RecentChange_save': Called at the end of RecentChange::save().
@@ -2165,12 +2182,6 @@ searches.
 $term : Search term string
 &$title : Current Title object that is being returned (null if none found).
 
-'SearchEngineReplacePrefixesComplete': Run after SearchEngine::replacePrefixes().
-$searchEngine : The SearchEngine object. Users of this hooks will be interested
-in the $searchEngine->namespaces array.
-$query : Original query.
-&$parsed : Resultant query with the prefixes stripped.
-
 'SearchResultInitFromTitle': Set the revision used when displaying a page in
 search results.
 $title : Current Title object being displayed in search results.
@@ -2179,6 +2190,14 @@ $title : Current Title object being displayed in search results.
 'SearchableNamespaces': An option to modify which namespaces are searchable.
 &$arr : Array of namespaces ($nsId => $name) which will be used.
 
+'SelfLinkBegin': Called before a link to the current article is displayed to
+allow the display of the link to be customized.
+$nt: the Title object
+&$html: html to display for the link
+&$trail: optional text to display before $html
+&$prefix: optional text to display after $html
+&$ret: the value to return if your hook returns false
+
 'SetupAfterCache': Called in Setup.php, after cache objects are set
 
 'ShowMissingArticle': Called when generating the output for a non-existent page.
@@ -2501,11 +2520,6 @@ $term: string of search term
 Special:Upload.
 $form: The SpecialUpload object
 
-'SpecialVersionExtensionTypes': Called when generating the extensions credits,
-use this to change the tables headers. Deprecated since MediaWiki 1.17, use the
-ExtensionTypes hook instead.
-$extTypes: associative array of extensions types
-
 'SpecialVersionVersionUrl': Called when building the URL for Special:Version.
 $wgVersion: Current $wgVersion for you to use
 &$versionUrl: Raw url to link to (eg: release notes)
diff --git a/includes/Article.php b/includes/Article.php
deleted file mode 100644 (file)
index 09d843d..0000000
+++ /dev/null
@@ -1,2133 +0,0 @@
-<?php
-/**
- * User interface for page actions.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * Class for viewing MediaWiki article and history.
- *
- * This maintains WikiPage functions for backwards compatibility.
- *
- * @todo Move and rewrite code to an Action class
- *
- * See design.txt for an overview.
- * Note: edit user interface and cache support functions have been
- * moved to separate EditPage and HTMLFileCache classes.
- *
- * @internal documentation reviewed 15 Mar 2010
- */
-class Article implements Page {
-       /** @var IContextSource The context this Article is executed in */
-       protected $mContext;
-
-       /** @var WikiPage The WikiPage object of this instance */
-       protected $mPage;
-
-       /** @var ParserOptions ParserOptions object for $wgUser articles */
-       public $mParserOptions;
-
-       /**
-        * @var string Text of the revision we are working on
-        * @todo BC cruft
-        */
-       public $mContent;
-
-       /**
-        * @var Content Content of the revision we are working on
-        * @since 1.21
-        */
-       protected $mContentObject;
-
-       /** @var bool Is the content ($mContent) already loaded? */
-       protected $mContentLoaded = false;
-
-       /** @var int|null The oldid of the article that is to be shown, 0 for the current revision */
-       protected $mOldId;
-
-       /** @var Title Title from which we were redirected here */
-       protected $mRedirectedFrom = null;
-
-       /** @var string|bool URL to redirect to or false if none */
-       protected $mRedirectUrl = false;
-
-       /** @var int Revision ID of revision we are working on */
-       protected $mRevIdFetched = 0;
-
-       /** @var Revision Revision we are working on */
-       protected $mRevision = null;
-
-       /** @var ParserOutput */
-       public $mParserOutput;
-
-       /**
-        * Constructor and clear the article
-        * @param Title $title Reference to a Title object.
-        * @param int $oldId Revision ID, null to fetch from request, zero for current
-        */
-       public function __construct( Title $title, $oldId = null ) {
-               $this->mOldId = $oldId;
-               $this->mPage = $this->newPage( $title );
-       }
-
-       /**
-        * @param Title $title
-        * @return WikiPage
-        */
-       protected function newPage( Title $title ) {
-               return new WikiPage( $title );
-       }
-
-       /**
-        * Constructor from a page id
-        * @param int $id Article ID to load
-        * @return Article|null
-        */
-       public static function newFromID( $id ) {
-               $t = Title::newFromID( $id );
-               # @todo FIXME: Doesn't inherit right
-               return $t == null ? null : new self( $t );
-               # return $t == null ? null : new static( $t ); // PHP 5.3
-       }
-
-       /**
-        * Create an Article object of the appropriate class for the given page.
-        *
-        * @param Title $title
-        * @param IContextSource $context
-        * @return Article
-        */
-       public static function newFromTitle( $title, IContextSource $context ) {
-               if ( NS_MEDIA == $title->getNamespace() ) {
-                       // FIXME: where should this go?
-                       $title = Title::makeTitle( NS_FILE, $title->getDBkey() );
-               }
-
-               $page = null;
-               wfRunHooks( 'ArticleFromTitle', array( &$title, &$page, $context ) );
-               if ( !$page ) {
-                       switch ( $title->getNamespace() ) {
-                               case NS_FILE:
-                                       $page = new ImagePage( $title );
-                                       break;
-                               case NS_CATEGORY:
-                                       $page = new CategoryPage( $title );
-                                       break;
-                               default:
-                                       $page = new Article( $title );
-                       }
-               }
-               $page->setContext( $context );
-
-               return $page;
-       }
-
-       /**
-        * Create an Article object of the appropriate class for the given page.
-        *
-        * @param WikiPage $page
-        * @param IContextSource $context
-        * @return Article
-        */
-       public static function newFromWikiPage( WikiPage $page, IContextSource $context ) {
-               $article = self::newFromTitle( $page->getTitle(), $context );
-               $article->mPage = $page; // override to keep process cached vars
-               return $article;
-       }
-
-       /**
-        * Tell the page view functions that this view was redirected
-        * from another page on the wiki.
-        * @param Title $from
-        */
-       public function setRedirectedFrom( Title $from ) {
-               $this->mRedirectedFrom = $from;
-       }
-
-       /**
-        * Get the title object of the article
-        *
-        * @return Title Title object of this page
-        */
-       public function getTitle() {
-               return $this->mPage->getTitle();
-       }
-
-       /**
-        * Get the WikiPage object of this instance
-        *
-        * @since 1.19
-        * @return WikiPage
-        */
-       public function getPage() {
-               return $this->mPage;
-       }
-
-       /**
-        * Clear the object
-        */
-       public function clear() {
-               $this->mContentLoaded = false;
-
-               $this->mRedirectedFrom = null; # Title object if set
-               $this->mRevIdFetched = 0;
-               $this->mRedirectUrl = false;
-
-               $this->mPage->clear();
-       }
-
-       /**
-        * 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.
-        *
-        * @deprecated since 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 ) {
-                       # If this is a MediaWiki:x message, then load the messages
-                       # and return the message value for x.
-                       if ( $this->getTitle()->getNamespace() == NS_MEDIAWIKI ) {
-                               $text = $this->getTitle()->getDefaultMessageText();
-                               if ( $text === false ) {
-                                       $text = '';
-                               }
-
-                               $content = ContentHandler::makeContent( $text, $this->getTitle() );
-                       } else {
-                               $message = $this->getContext()->getUser()->isLoggedIn() ? 'noarticletext' : 'noarticletextanon';
-                               $content = new MessageContent( $message, null, 'parsemag' );
-                       }
-               } else {
-                       $this->fetchContentObject();
-                       $content = $this->mContentObject;
-               }
-
-               wfProfileOut( __METHOD__ );
-               return $content;
-       }
-
-       /**
-        * @return int The oldid of the article that is to be shown, 0 for the current revision
-        */
-       public function getOldID() {
-               if ( is_null( $this->mOldId ) ) {
-                       $this->mOldId = $this->getOldIDFromRequest();
-               }
-
-               return $this->mOldId;
-       }
-
-       /**
-        * Sets $this->mRedirectUrl to a correct URL if the query parameters are incorrect
-        *
-        * @return int The old id for the request
-        */
-       public function getOldIDFromRequest() {
-               $this->mRedirectUrl = false;
-
-               $request = $this->getContext()->getRequest();
-               $oldid = $request->getIntOrNull( 'oldid' );
-
-               if ( $oldid === null ) {
-                       return 0;
-               }
-
-               if ( $oldid !== 0 ) {
-                       # Load the given revision and check whether the page is another one.
-                       # In that case, update this instance to reflect the change.
-                       if ( $oldid === $this->mPage->getLatest() ) {
-                               $this->mRevision = $this->mPage->getRevision();
-                       } else {
-                               $this->mRevision = Revision::newFromId( $oldid );
-                               if ( $this->mRevision !== null ) {
-                                       // Revision title doesn't match the page title given?
-                                       if ( $this->mPage->getID() != $this->mRevision->getPage() ) {
-                                               $function = array( get_class( $this->mPage ), 'newFromID' );
-                                               $this->mPage = call_user_func( $function, $this->mRevision->getPage() );
-                                       }
-                               }
-                       }
-               }
-
-               if ( $request->getVal( 'direction' ) == 'next' ) {
-                       $nextid = $this->getTitle()->getNextRevisionID( $oldid );
-                       if ( $nextid ) {
-                               $oldid = $nextid;
-                               $this->mRevision = null;
-                       } else {
-                               $this->mRedirectUrl = $this->getTitle()->getFullURL( 'redirect=no' );
-                       }
-               } elseif ( $request->getVal( 'direction' ) == 'prev' ) {
-                       $previd = $this->getTitle()->getPreviousRevisionID( $oldid );
-                       if ( $previd ) {
-                               $oldid = $previd;
-                               $this->mRevision = null;
-                       }
-               }
-
-               return $oldid;
-       }
-
-       /**
-        * Load the revision (including text) into this object
-        *
-        * @deprecated since 1.19; use fetchContent()
-        */
-       function loadContent() {
-               wfDeprecated( __METHOD__, '1.19' );
-               $this->fetchContent();
-       }
-
-       /**
-        * 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 string|bool String containing article contents, or false if null
-        * @deprecated since 1.21, use WikiPage::getContent() instead
-        */
-       function fetchContent() { #BC cruft!
-               ContentHandler::deprecated( __METHOD__, '1.21' );
-
-               if ( $this->mContentLoaded && $this->mContent ) {
-                       return $this->mContent;
-               }
-
-               wfProfileIn( __METHOD__ );
-
-               $content = $this->fetchContentObject();
-
-               if ( !$content ) {
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-
-               // @todo Get rid of mContent everywhere!
-               $this->mContent = ContentHandler::getContentText( $content );
-               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|bool
-        *
-        * @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.
-               //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()
-                       if ( !$this->mRevision ) {
-                               $this->mRevision = Revision::newFromId( $oldid );
-                               if ( !$this->mRevision ) {
-                                       wfDebug( __METHOD__ . " failed to retrieve specified revision, id $oldid\n" );
-                                       wfProfileOut( __METHOD__ );
-                                       return false;
-                               }
-                       }
-               } else {
-                       if ( !$this->mPage->getLatest() ) {
-                               wfDebug( __METHOD__ . " failed to find page data for title " .
-                                       $this->getTitle()->getPrefixedText() . "\n" );
-                               wfProfileOut( __METHOD__ );
-                               return false;
-                       }
-
-                       $this->mRevision = $this->mPage->getRevision();
-
-                       if ( !$this->mRevision ) {
-                               wfDebug( __METHOD__ . " failed to retrieve current page, rev_id " .
-                                       $this->mPage->getLatest() . "\n" );
-                               wfProfileOut( __METHOD__ );
-                               return false;
-                       }
-               }
-
-               // @todo FIXME: Horrible, horrible! This content-loading interface just plain sucks.
-               // We should instead work with the Revision object when we need it...
-               // Loads if user is allowed
-               $this->mContentObject = $this->mRevision->getContent(
-                       Revision::FOR_THIS_USER,
-                       $this->getContext()->getUser()
-               );
-               $this->mRevIdFetched = $this->mRevision->getId();
-
-               wfRunHooks( 'ArticleAfterFetchContentObject', array( &$this, &$this->mContentObject ) );
-
-               wfProfileOut( __METHOD__ );
-
-               return $this->mContentObject;
-       }
-
-       /**
-        * Returns true if the currently-referenced revision is the current edit
-        * to this page (and it exists).
-        * @return bool
-        */
-       public function isCurrent() {
-               # If no oldid, this is the current version.
-               if ( $this->getOldID() == 0 ) {
-                       return true;
-               }
-
-               return $this->mPage->exists() && $this->mRevision && $this->mRevision->isCurrent();
-       }
-
-       /**
-        * Get the fetched Revision object depending on request parameters or null
-        * on failure.
-        *
-        * @since 1.19
-        * @return Revision|null
-        */
-       public function getRevisionFetched() {
-               $this->fetchContentObject();
-
-               return $this->mRevision;
-       }
-
-       /**
-        * Use this to fetch the rev ID used on page views
-        *
-        * @return int Revision ID of last article revision
-        */
-       public function getRevIdFetched() {
-               if ( $this->mRevIdFetched ) {
-                       return $this->mRevIdFetched;
-               } else {
-                       return $this->mPage->getLatest();
-               }
-       }
-
-       /**
-        * This is the default action of the index.php entry point: just view the
-        * page of the given title.
-        */
-       public function view() {
-               global $wgUseFileCache, $wgUseETag, $wgDebugToolbar;
-
-               wfProfileIn( __METHOD__ );
-
-               # Get variables from query string
-               # As side effect this will load the revision and update the title
-               # in a revision ID is passed in the request, so this should remain
-               # the first call of this method even if $oldid is used way below.
-               $oldid = $this->getOldID();
-
-               $user = $this->getContext()->getUser();
-               # Another whitelist check in case getOldID() is altering the title
-               $permErrors = $this->getTitle()->getUserPermissionsErrors( 'read', $user );
-               if ( count( $permErrors ) ) {
-                       wfDebug( __METHOD__ . ": denied on secondary read check\n" );
-                       wfProfileOut( __METHOD__ );
-                       throw new PermissionsError( 'read', $permErrors );
-               }
-
-               $outputPage = $this->getContext()->getOutput();
-               # getOldID() may as well want us to redirect somewhere else
-               if ( $this->mRedirectUrl ) {
-                       $outputPage->redirect( $this->mRedirectUrl );
-                       wfDebug( __METHOD__ . ": redirecting due to oldid\n" );
-                       wfProfileOut( __METHOD__ );
-
-                       return;
-               }
-
-               # If we got diff in the query, we want to see a diff page instead of the article.
-               if ( $this->getContext()->getRequest()->getCheck( 'diff' ) ) {
-                       wfDebug( __METHOD__ . ": showing diff page\n" );
-                       $this->showDiffPage();
-                       wfProfileOut( __METHOD__ );
-
-                       return;
-               }
-
-               # Set page title (may be overridden by DISPLAYTITLE)
-               $outputPage->setPageTitle( $this->getTitle()->getPrefixedText() );
-
-               $outputPage->setArticleFlag( true );
-               # Allow frames by default
-               $outputPage->allowClickjacking();
-
-               $parserCache = ParserCache::singleton();
-
-               $parserOptions = $this->getParserOptions();
-               # Render printable version, use printable version cache
-               if ( $outputPage->isPrintable() ) {
-                       $parserOptions->setIsPrintable( true );
-                       $parserOptions->setEditSection( false );
-               } elseif ( !$this->isCurrent() || !$this->getTitle()->quickUserCan( 'edit', $user ) ) {
-                       $parserOptions->setEditSection( false );
-               }
-
-               # Try client and file cache
-               if ( !$wgDebugToolbar && $oldid === 0 && $this->mPage->checkTouched() ) {
-                       if ( $wgUseETag ) {
-                               $outputPage->setETag( $parserCache->getETag( $this, $parserOptions ) );
-                       }
-
-                       # Is it client cached?
-                       if ( $outputPage->checkLastModified( $this->mPage->getTouched() ) ) {
-                               wfDebug( __METHOD__ . ": done 304\n" );
-                               wfProfileOut( __METHOD__ );
-
-                               return;
-                       # Try file cache
-                       } elseif ( $wgUseFileCache && $this->tryFileCache() ) {
-                               wfDebug( __METHOD__ . ": done file cache\n" );
-                               # tell wgOut that output is taken care of
-                               $outputPage->disable();
-                               $this->mPage->doViewUpdates( $user, $oldid );
-                               wfProfileOut( __METHOD__ );
-
-                               return;
-                       }
-               }
-
-               # Should the parser cache be used?
-               $useParserCache = $this->mPage->isParserCacheUsed( $parserOptions, $oldid );
-               wfDebug( 'Article::view using parser cache: ' . ( $useParserCache ? 'yes' : 'no' ) . "\n" );
-               if ( $user->getStubThreshold() ) {
-                       wfIncrStats( 'pcache_miss_stub' );
-               }
-
-               $this->showRedirectedFromHeader();
-               $this->showNamespaceHeader();
-
-               # Iterate through the possible ways of constructing the output text.
-               # Keep going until $outputDone is set, or we run out of things to do.
-               $pass = 0;
-               $outputDone = false;
-               $this->mParserOutput = false;
-
-               while ( !$outputDone && ++$pass ) {
-                       switch ( $pass ) {
-                               case 1:
-                                       wfRunHooks( 'ArticleViewHeader', array( &$this, &$outputDone, &$useParserCache ) );
-                                       break;
-                               case 2:
-                                       # Early abort if the page doesn't exist
-                                       if ( !$this->mPage->exists() ) {
-                                               wfDebug( __METHOD__ . ": showing missing article\n" );
-                                               $this->showMissingArticle();
-                                               $this->mPage->doViewUpdates( $user );
-                                               wfProfileOut( __METHOD__ );
-                                               return;
-                                       }
-
-                                       # Try the parser cache
-                                       if ( $useParserCache ) {
-                                               $this->mParserOutput = $parserCache->get( $this, $parserOptions );
-
-                                               if ( $this->mParserOutput !== false ) {
-                                                       if ( $oldid ) {
-                                                               wfDebug( __METHOD__ . ": showing parser cache contents for current rev permalink\n" );
-                                                               $this->setOldSubtitle( $oldid );
-                                                       } else {
-                                                               wfDebug( __METHOD__ . ": showing parser cache contents\n" );
-                                                       }
-                                                       $outputPage->addParserOutput( $this->mParserOutput );
-                                                       # Ensure that UI elements requiring revision ID have
-                                                       # the correct version information.
-                                                       $outputPage->setRevisionId( $this->mPage->getLatest() );
-                                                       # Preload timestamp to avoid a DB hit
-                                                       $cachedTimestamp = $this->mParserOutput->getTimestamp();
-                                                       if ( $cachedTimestamp !== null ) {
-                                                               $outputPage->setRevisionTimestamp( $cachedTimestamp );
-                                                               $this->mPage->setTimestamp( $cachedTimestamp );
-                                                       }
-                                                       $outputDone = true;
-                                               }
-                                       }
-                                       break;
-                               case 3:
-                                       # This will set $this->mRevision if needed
-                                       $this->fetchContentObject();
-
-                                       # Are we looking at an old revision
-                                       if ( $oldid && $this->mRevision ) {
-                                               $this->setOldSubtitle( $oldid );
-
-                                               if ( !$this->showDeletedRevisionHeader() ) {
-                                                       wfDebug( __METHOD__ . ": cannot view deleted revision\n" );
-                                                       wfProfileOut( __METHOD__ );
-                                                       return;
-                                               }
-                                       }
-
-                                       # Ensure that UI elements requiring revision ID have
-                                       # the correct version information.
-                                       $outputPage->setRevisionId( $this->getRevIdFetched() );
-                                       # Preload timestamp to avoid a DB hit
-                                       $outputPage->setRevisionTimestamp( $this->getTimestamp() );
-
-                                       # Pages containing custom CSS or JavaScript get special treatment
-                                       if ( $this->getTitle()->isCssOrJsPage() || $this->getTitle()->isCssJsSubpage() ) {
-                                               wfDebug( __METHOD__ . ": showing CSS/JS source\n" );
-                                               $this->showCssOrJsPage();
-                                               $outputDone = true;
-                                       } 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;
-                                       }
-                                       break;
-                               case 4:
-                                       # Run the parse, protected by a pool counter
-                                       wfDebug( __METHOD__ . ": doing uncached parse\n" );
-
-                                       $content = $this->getContentObject();
-                                       $poolArticleView = new PoolWorkArticleView( $this->getPage(), $parserOptions,
-                                               $this->getRevIdFetched(), $useParserCache, $content );
-
-                                       if ( !$poolArticleView->execute() ) {
-                                               $error = $poolArticleView->getError();
-                                               if ( $error ) {
-                                                       $outputPage->clearHTML(); // for release() errors
-                                                       $outputPage->enableClientCache( false );
-                                                       $outputPage->setRobotPolicy( 'noindex,nofollow' );
-
-                                                       $errortext = $error->getWikiText( false, 'view-pool-error' );
-                                                       $outputPage->addWikiText( '<div class="errorbox">' . $errortext . '</div>' );
-                                               }
-                                               # Connection or timeout error
-                                               wfProfileOut( __METHOD__ );
-                                               return;
-                                       }
-
-                                       $this->mParserOutput = $poolArticleView->getParserOutput();
-                                       $outputPage->addParserOutput( $this->mParserOutput );
-                                       if ( $content->getRedirectTarget() ) {
-                                               $outputPage->addSubtitle( wfMessage( 'redirectpagesub' )->parse() );
-                                       }
-
-                                       # Don't cache a dirty ParserOutput object
-                                       if ( $poolArticleView->getIsDirty() ) {
-                                               $outputPage->setSquidMaxage( 0 );
-                                               $outputPage->addHTML( "<!-- parser cache is expired, " .
-                                                       "sending anyway due to pool overload-->\n" );
-                                       }
-
-                                       $outputDone = true;
-                                       break;
-                               # Should be unreachable, but just in case...
-                               default:
-                                       break 2;
-                       }
-               }
-
-               # Get the ParserOutput actually *displayed* here.
-               # Note that $this->mParserOutput is the *current* version output.
-               $pOutput = ( $outputDone instanceof ParserOutput )
-                       ? $outputDone // object fetched by hook
-                       : $this->mParserOutput;
-
-               # Adjust title for main page & pages with displaytitle
-               if ( $pOutput ) {
-                       $this->adjustDisplayTitle( $pOutput );
-               }
-
-               # For the main page, overwrite the <title> element with the con-
-               # tents of 'pagetitle-view-mainpage' instead of the default (if
-               # that's not empty).
-               # This message always exists because it is in the i18n files
-               if ( $this->getTitle()->isMainPage() ) {
-                       $msg = wfMessage( 'pagetitle-view-mainpage' )->inContentLanguage();
-                       if ( !$msg->isDisabled() ) {
-                               $outputPage->setHTMLTitle( $msg->title( $this->getTitle() )->text() );
-                       }
-               }
-
-               # Check for any __NOINDEX__ tags on the page using $pOutput
-               $policy = $this->getRobotPolicy( 'view', $pOutput );
-               $outputPage->setIndexPolicy( $policy['index'] );
-               $outputPage->setFollowPolicy( $policy['follow'] );
-
-               $this->showViewFooter();
-               $this->mPage->doViewUpdates( $user, $oldid );
-
-               $outputPage->addModules( 'mediawiki.action.view.postEdit' );
-
-               wfProfileOut( __METHOD__ );
-       }
-
-       /**
-        * Adjust title for pages with displaytitle, -{T|}- or language conversion
-        * @param ParserOutput $pOutput
-        */
-       public function adjustDisplayTitle( ParserOutput $pOutput ) {
-               # Adjust the title if it was set by displaytitle, -{T|}- or language conversion
-               $titleText = $pOutput->getTitleText();
-               if ( strval( $titleText ) !== '' ) {
-                       $this->getContext()->getOutput()->setPageTitle( $titleText );
-               }
-       }
-
-       /**
-        * 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();
-               $user = $this->getContext()->getUser();
-               $diff = $request->getVal( 'diff' );
-               $rcid = $request->getVal( 'rcid' );
-               $diffOnly = $request->getBool( 'diffonly', $user->getOption( 'diffonly' ) );
-               $purge = $request->getVal( 'action' ) == 'purge';
-               $unhide = $request->getInt( 'unhide' ) == 1;
-               $oldid = $this->getOldID();
-
-               $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 );
-
-               // Run view updates for the newer revision being diffed (and shown
-               // below the diff if not $diffOnly).
-               list( $old, $new ) = $de->mapDiffPrevNext( $oldid, $diff );
-               // New can be false, convert it to 0 - this conveniently means the latest revision
-               $this->mPage->doViewUpdates( $user, (int)$new );
-       }
-
-       /**
-        * Show a page view for a page formatted as CSS or JavaScript. To be called by
-        * Article::view() only.
-        *
-        * This exists mostly to serve the deprecated ShowRawCssJs hook (used to customize these views).
-        * It has been replaced by the ContentGetParserOutput hook, which lets you do the same but with
-        * more flexibility.
-        *
-        * @param bool $showCacheHint Whether to show a message telling the user
-        *   to clear the browser cache (default: true).
-        */
-       protected function showCssOrJsPage( $showCacheHint = true ) {
-               $outputPage = $this->getContext()->getOutput();
-
-               if ( $showCacheHint ) {
-                       $dir = $this->getContext()->getLanguage()->getDir();
-                       $lang = $this->getContext()->getLanguage()->getCode();
-
-                       $outputPage->wrapWikiMsg(
-                               "<div id='mw-clearyourcache' lang='$lang' dir='$dir' class='mw-content-$dir'>\n$1\n</div>",
-                               'clearyourcache'
-                       );
-               }
-
-               $this->fetchContentObject();
-
-               if ( $this->mContentObject ) {
-                       // Give hooks a chance to customise the output
-                       if ( ContentHandler::runLegacyHooks(
-                               'ShowRawCssJs',
-                               array( $this->mContentObject, $this->getTitle(), $outputPage ) )
-                       ) {
-                               $po = $this->mContentObject->getParserOutput( $this->getTitle() );
-                               $outputPage->addHTML( $po->getText() );
-                       }
-               }
-       }
-
-       /**
-        * Get the robot policy to be used for the current view
-        * @param string $action The action= GET parameter
-        * @param ParserOutput|null $pOutput
-        * @return array The policy that should be set
-        * @todo: actions other than 'view'
-        */
-       public function getRobotPolicy( $action, $pOutput = null ) {
-               global $wgArticleRobotPolicies, $wgNamespaceRobotPolicies, $wgDefaultRobotPolicy;
-
-               $ns = $this->getTitle()->getNamespace();
-
-               # Don't index user and user talk pages for blocked users (bug 11443)
-               if ( ( $ns == NS_USER || $ns == NS_USER_TALK ) && !$this->getTitle()->isSubpage() ) {
-                       $specificTarget = null;
-                       $vagueTarget = null;
-                       $titleText = $this->getTitle()->getText();
-                       if ( IP::isValid( $titleText ) ) {
-                               $vagueTarget = $titleText;
-                       } else {
-                               $specificTarget = $titleText;
-                       }
-                       if ( Block::newFromTarget( $specificTarget, $vagueTarget ) instanceof Block ) {
-                               return array(
-                                       'index' => 'noindex',
-                                       'follow' => 'nofollow'
-                               );
-                       }
-               }
-
-               if ( $this->mPage->getID() === 0 || $this->getOldID() ) {
-                       # Non-articles (special pages etc), and old revisions
-                       return array(
-                               'index' => 'noindex',
-                               'follow' => 'nofollow'
-                       );
-               } elseif ( $this->getContext()->getOutput()->isPrintable() ) {
-                       # Discourage indexing of printable versions, but encourage following
-                       return array(
-                               'index' => 'noindex',
-                               'follow' => 'follow'
-                       );
-               } elseif ( $this->getContext()->getRequest()->getInt( 'curid' ) ) {
-                       # For ?curid=x urls, disallow indexing
-                       return array(
-                               'index' => 'noindex',
-                               'follow' => 'follow'
-                       );
-               }
-
-               # Otherwise, construct the policy based on the various config variables.
-               $policy = self::formatRobotPolicy( $wgDefaultRobotPolicy );
-
-               if ( isset( $wgNamespaceRobotPolicies[$ns] ) ) {
-                       # Honour customised robot policies for this namespace
-                       $policy = array_merge(
-                               $policy,
-                               self::formatRobotPolicy( $wgNamespaceRobotPolicies[$ns] )
-                       );
-               }
-               if ( $this->getTitle()->canUseNoindex() && is_object( $pOutput ) && $pOutput->getIndexPolicy() ) {
-                       # __INDEX__ and __NOINDEX__ magic words, if allowed. Incorporates
-                       # a final sanity check that we have really got the parser output.
-                       $policy = array_merge(
-                               $policy,
-                               array( 'index' => $pOutput->getIndexPolicy() )
-                       );
-               }
-
-               if ( isset( $wgArticleRobotPolicies[$this->getTitle()->getPrefixedText()] ) ) {
-                       # (bug 14900) site config can override user-defined __INDEX__ or __NOINDEX__
-                       $policy = array_merge(
-                               $policy,
-                               self::formatRobotPolicy( $wgArticleRobotPolicies[$this->getTitle()->getPrefixedText()] )
-                       );
-               }
-
-               return $policy;
-       }
-
-       /**
-        * Converts a String robot policy into an associative array, to allow
-        * merging of several policies using array_merge().
-        * @param array|string $policy Returns empty array on null/false/'', transparent
-        *   to already-converted arrays, converts string.
-        * @return array 'index' => \<indexpolicy\>, 'follow' => \<followpolicy\>
-        */
-       public static function formatRobotPolicy( $policy ) {
-               if ( is_array( $policy ) ) {
-                       return $policy;
-               } elseif ( !$policy ) {
-                       return array();
-               }
-
-               $policy = explode( ',', $policy );
-               $policy = array_map( 'trim', $policy );
-
-               $arr = array();
-               foreach ( $policy as $var ) {
-                       if ( in_array( $var, array( 'index', 'noindex' ) ) ) {
-                               $arr['index'] = $var;
-                       } elseif ( in_array( $var, array( 'follow', 'nofollow' ) ) ) {
-                               $arr['follow'] = $var;
-                       }
-               }
-
-               return $arr;
-       }
-
-       /**
-        * If this request is a redirect view, send "redirected from" subtitle to
-        * the output. Returns true if the header was needed, false if this is not
-        * a redirect view. Handles both local and remote redirects.
-        *
-        * @return bool
-        */
-       public function showRedirectedFromHeader() {
-               global $wgRedirectSources;
-               $outputPage = $this->getContext()->getOutput();
-
-               $rdfrom = $this->getContext()->getRequest()->getVal( 'rdfrom' );
-
-               if ( isset( $this->mRedirectedFrom ) ) {
-                       // This is an internally redirected page view.
-                       // We'll need a backlink to the source page for navigation.
-                       if ( wfRunHooks( 'ArticleViewRedirect', array( &$this ) ) ) {
-                               $redir = Linker::linkKnown(
-                                       $this->mRedirectedFrom,
-                                       null,
-                                       array(),
-                                       array( 'redirect' => 'no' )
-                               );
-
-                               $outputPage->addSubtitle( wfMessage( 'redirectedfrom' )->rawParams( $redir ) );
-
-                               // Set the fragment if one was specified in the redirect
-                               if ( $this->getTitle()->hasFragment() ) {
-                                       $outputPage->addJsConfigVars( 'wgRedirectToFragment', $this->getTitle()->getFragmentForURL() );
-                                       $outputPage->addModules( 'mediawiki.action.view.redirectToFragment' );
-                               }
-
-                               // Add a <link rel="canonical"> tag
-                               $outputPage->setCanonicalUrl( $this->getTitle()->getLocalURL() );
-
-                               // Tell the output object that the user arrived at this article through a redirect
-                               $outputPage->setRedirectedFrom( $this->mRedirectedFrom );
-
-                               return true;
-                       }
-               } elseif ( $rdfrom ) {
-                       // This is an externally redirected view, from some other wiki.
-                       // If it was reported from a trusted site, supply a backlink.
-                       if ( $wgRedirectSources && preg_match( $wgRedirectSources, $rdfrom ) ) {
-                               $redir = Linker::makeExternalLink( $rdfrom, $rdfrom );
-                               $outputPage->addSubtitle( wfMessage( 'redirectedfrom' )->rawParams( $redir ) );
-
-                               return true;
-                       }
-               }
-
-               return false;
-       }
-
-       /**
-        * Show a header specific to the namespace currently being viewed, like
-        * [[MediaWiki:Talkpagetext]]. For Article::view().
-        */
-       public function showNamespaceHeader() {
-               if ( $this->getTitle()->isTalkPage() ) {
-                       if ( !wfMessage( 'talkpageheader' )->isDisabled() ) {
-                               $this->getContext()->getOutput()->wrapWikiMsg(
-                                       "<div class=\"mw-talkpageheader\">\n$1\n</div>",
-                                       array( 'talkpageheader' )
-                               );
-                       }
-               }
-       }
-
-       /**
-        * Show the footer section of an ordinary page view
-        */
-       public function showViewFooter() {
-               # check if we're displaying a [[User talk:x.x.x.x]] anonymous talk page
-               if ( $this->getTitle()->getNamespace() == NS_USER_TALK
-                       && IP::isValid( $this->getTitle()->getText() )
-               ) {
-                       $this->getContext()->getOutput()->addWikiMsg( 'anontalkpagetext' );
-               }
-
-               // Show a footer allowing the user to patrol the shown revision or page if possible
-               $patrolFooterShown = $this->showPatrolFooter();
-
-               wfRunHooks( 'ArticleViewFooter', array( $this, $patrolFooterShown ) );
-       }
-
-       /**
-        * If patrol is possible, output a patrol UI box. This is called from the
-        * footer section of ordinary page views. If patrol is not possible or not
-        * desired, does nothing.
-        * Side effect: When the patrol link is build, this method will call
-        * OutputPage::preventClickjacking() and load mediawiki.page.patrol.ajax.
-        *
-        * @return bool
-        */
-       public function showPatrolFooter() {
-               global $wgUseNPPatrol, $wgUseRCPatrol, $wgEnableAPI, $wgEnableWriteAPI;
-
-               $outputPage = $this->getContext()->getOutput();
-               $user = $this->getContext()->getUser();
-               $cache = wfGetMainCache();
-               $rc = false;
-
-               if ( !$this->getTitle()->quickUserCan( 'patrol', $user )
-                       || !( $wgUseRCPatrol || $wgUseNPPatrol )
-               ) {
-                       // Patrolling is disabled or the user isn't allowed to
-                       return false;
-               }
-
-               wfProfileIn( __METHOD__ );
-
-               // New page patrol: Get the timestamp of the oldest revison which
-               // the revision table holds for the given page. Then we look
-               // whether it's within the RC lifespan and if it is, we try
-               // to get the recentchanges row belonging to that entry
-               // (with rc_new = 1).
-
-               // Check for cached results
-               if ( $cache->get( wfMemcKey( 'NotPatrollablePage', $this->getTitle()->getArticleID() ) ) ) {
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-
-               if ( $this->mRevision
-                       && !RecentChange::isInRCLifespan( $this->mRevision->getTimestamp(), 21600 )
-               ) {
-                       // The current revision is already older than what could be in the RC table
-                       // 6h tolerance because the RC might not be cleaned out regularly
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-
-               $dbr = wfGetDB( DB_SLAVE );
-               $oldestRevisionTimestamp = $dbr->selectField(
-                       'revision',
-                       'MIN( rev_timestamp )',
-                       array( 'rev_page' => $this->getTitle()->getArticleID() ),
-                       __METHOD__
-               );
-
-               if ( $oldestRevisionTimestamp
-                       && RecentChange::isInRCLifespan( $oldestRevisionTimestamp, 21600 )
-               ) {
-                       // 6h tolerance because the RC might not be cleaned out regularly
-                       $rc = RecentChange::newFromConds(
-                               array(
-                                       'rc_new' => 1,
-                                       'rc_timestamp' => $oldestRevisionTimestamp,
-                                       'rc_namespace' => $this->getTitle()->getNamespace(),
-                                       'rc_cur_id' => $this->getTitle()->getArticleID(),
-                                       'rc_patrolled' => 0
-                               ),
-                               __METHOD__,
-                               array( 'USE INDEX' => 'new_name_timestamp' )
-                       );
-               }
-
-               if ( !$rc ) {
-                       // No RC entry around
-
-                       // Cache the information we gathered above in case we can't patrol
-                       // Don't cache in case we can patrol as this could change
-                       $cache->set( wfMemcKey( 'NotPatrollablePage', $this->getTitle()->getArticleID() ), '1' );
-
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-
-               if ( $rc->getPerformer()->getName() == $user->getName() ) {
-                       // Don't show a patrol link for own creations. If the user could
-                       // patrol them, they already would be patrolled
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-
-               $rcid = $rc->getAttribute( 'rc_id' );
-
-               $token = $user->getEditToken( $rcid );
-
-               $outputPage->preventClickjacking();
-               if ( $wgEnableAPI && $wgEnableWriteAPI && $user->isAllowed( 'writeapi' ) ) {
-                       $outputPage->addModules( 'mediawiki.page.patrol.ajax' );
-               }
-
-               $link = Linker::linkKnown(
-                       $this->getTitle(),
-                       wfMessage( 'markaspatrolledtext' )->escaped(),
-                       array(),
-                       array(
-                               'action' => 'markpatrolled',
-                               'rcid' => $rcid,
-                               'token' => $token,
-                       )
-               );
-
-               $outputPage->addHTML(
-                       "<div class='patrollink'>" .
-                               wfMessage( 'markaspatrolledlink' )->rawParams( $link )->escaped() .
-                       '</div>'
-               );
-
-               wfProfileOut( __METHOD__ );
-               return true;
-       }
-
-       /**
-        * Show the error text for a missing article. For articles in the MediaWiki
-        * namespace, show the default message text. To be called from Article::view().
-        */
-       public function showMissingArticle() {
-               global $wgSend404Code;
-               $outputPage = $this->getContext()->getOutput();
-               // Whether the page is a root user page of an existing user (but not a subpage)
-               $validUserPage = false;
-
-               # Show info in user (talk) namespace. Does the user exist? Is he blocked?
-               if ( $this->getTitle()->getNamespace() == NS_USER
-                       || $this->getTitle()->getNamespace() == NS_USER_TALK
-               ) {
-                       $parts = explode( '/', $this->getTitle()->getText() );
-                       $rootPart = $parts[0];
-                       $user = User::newFromName( $rootPart, false /* allow IP users*/ );
-                       $ip = User::isIP( $rootPart );
-
-                       if ( !( $user && $user->isLoggedIn() ) && !$ip ) { # User does not exist
-                               $outputPage->wrapWikiMsg( "<div class=\"mw-userpage-userdoesnotexist error\">\n\$1\n</div>",
-                                       array( 'userpage-userdoesnotexist-view', wfEscapeWikiText( $rootPart ) ) );
-                       } elseif ( $user->isBlocked() ) { # Show log extract if the user is currently blocked
-                               LogEventsList::showLogExtract(
-                                       $outputPage,
-                                       'block',
-                                       $user->getUserPage(),
-                                       '',
-                                       array(
-                                               'lim' => 1,
-                                               'showIfEmpty' => false,
-                                               'msgKey' => array(
-                                                       'blocked-notice-logextract',
-                                                       $user->getName() # Support GENDER in notice
-                                               )
-                                       )
-                               );
-                               $validUserPage = !$this->getTitle()->isSubpage();
-                       } else {
-                               $validUserPage = !$this->getTitle()->isSubpage();
-                       }
-               }
-
-               wfRunHooks( 'ShowMissingArticle', array( $this ) );
-
-               // Give extensions a chance to hide their (unrelated) log entries
-               $logTypes = array( 'delete', 'move' );
-               $conds = array( "log_action != 'revision'" );
-               wfRunHooks( 'Article::MissingArticleConditions', array( &$conds, $logTypes ) );
-
-               # Show delete and move logs
-               LogEventsList::showLogExtract( $outputPage, $logTypes, $this->getTitle(), '',
-                       array( 'lim' => 10,
-                               'conds' => $conds,
-                               'showIfEmpty' => false,
-                               'msgKey' => array( 'moveddeleted-notice' ) )
-               );
-
-               if ( !$this->mPage->hasViewableContent() && $wgSend404Code && !$validUserPage ) {
-                       // If there's no backing content, send a 404 Not Found
-                       // for better machine handling of broken links.
-                       $this->getContext()->getRequest()->response()->header( "HTTP/1.1 404 Not Found" );
-               }
-
-               if ( $validUserPage ) {
-                       // Also apply the robot policy for nonexisting user pages (as those aren't served as 404)
-                       $policy = $this->getRobotPolicy( 'view' );
-                       $outputPage->setIndexPolicy( $policy['index'] );
-                       $outputPage->setFollowPolicy( $policy['follow'] );
-               }
-
-               $hookResult = wfRunHooks( 'BeforeDisplayNoArticleText', array( $this ) );
-
-               if ( ! $hookResult ) {
-                       return;
-               }
-
-               # Show error message
-               $oldid = $this->getOldID();
-               if ( $oldid ) {
-                       $text = wfMessage( 'missing-revision', $oldid )->plain();
-               } elseif ( $this->getTitle()->getNamespace() === NS_MEDIAWIKI ) {
-                       // Use the default message text
-                       $text = $this->getTitle()->getDefaultMessageText();
-               } elseif ( $this->getTitle()->quickUserCan( 'create', $this->getContext()->getUser() )
-                       && $this->getTitle()->quickUserCan( 'edit', $this->getContext()->getUser() )
-               ) {
-                       $message = $this->getContext()->getUser()->isLoggedIn() ? 'noarticletext' : 'noarticletextanon';
-                       $text = wfMessage( $message )->plain();
-               } else {
-                       $text = wfMessage( 'noarticletext-nopermission' )->plain();
-               }
-               $text = "<div class='noarticletext'>\n$text\n</div>";
-
-               $outputPage->addWikiText( $text );
-       }
-
-       /**
-        * If the revision requested for view is deleted, check permissions.
-        * Send either an error message or a warning header to the output.
-        *
-        * @return bool true if the view is allowed, false if not.
-        */
-       public function showDeletedRevisionHeader() {
-               if ( !$this->mRevision->isDeleted( Revision::DELETED_TEXT ) ) {
-                       // Not deleted
-                       return true;
-               }
-
-               $outputPage = $this->getContext()->getOutput();
-               $user = $this->getContext()->getUser();
-               // If the user is not allowed to see it...
-               if ( !$this->mRevision->userCan( Revision::DELETED_TEXT, $user ) ) {
-                       $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
-                               'rev-deleted-text-permission' );
-
-                       return false;
-               // If the user needs to confirm that they want to see it...
-               } elseif ( $this->getContext()->getRequest()->getInt( 'unhide' ) != 1 ) {
-                       # Give explanation and add a link to view the revision...
-                       $oldid = intval( $this->getOldID() );
-                       $link = $this->getTitle()->getFullURL( "oldid={$oldid}&unhide=1" );
-                       $msg = $this->mRevision->isDeleted( Revision::DELETED_RESTRICTED ) ?
-                               'rev-suppressed-text-unhide' : 'rev-deleted-text-unhide';
-                       $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
-                               array( $msg, $link ) );
-
-                       return false;
-               // We are allowed to see...
-               } else {
-                       $msg = $this->mRevision->isDeleted( Revision::DELETED_RESTRICTED ) ?
-                               'rev-suppressed-text-view' : 'rev-deleted-text-view';
-                       $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", $msg );
-
-                       return true;
-               }
-       }
-
-       /**
-        * Generate the navigation links when browsing through an article revisions
-        * It shows the information as:
-        *   Revision as of \<date\>; view current revision
-        *   \<- Previous version | Next Version -\>
-        *
-        * @param int $oldid Revision ID of this article revision
-        */
-       public function setOldSubtitle( $oldid = 0 ) {
-               if ( !wfRunHooks( 'DisplayOldSubtitle', array( &$this, &$oldid ) ) ) {
-                       return;
-               }
-
-               $unhide = $this->getContext()->getRequest()->getInt( 'unhide' ) == 1;
-
-               # Cascade unhide param in links for easy deletion browsing
-               $extraParams = array();
-               if ( $unhide ) {
-                       $extraParams['unhide'] = 1;
-               }
-
-               if ( $this->mRevision && $this->mRevision->getId() === $oldid ) {
-                       $revision = $this->mRevision;
-               } else {
-                       $revision = Revision::newFromId( $oldid );
-               }
-
-               $timestamp = $revision->getTimestamp();
-
-               $current = ( $oldid == $this->mPage->getLatest() );
-               $language = $this->getContext()->getLanguage();
-               $user = $this->getContext()->getUser();
-
-               $td = $language->userTimeAndDate( $timestamp, $user );
-               $tddate = $language->userDate( $timestamp, $user );
-               $tdtime = $language->userTime( $timestamp, $user );
-
-               # Show user links if allowed to see them. If hidden, then show them only if requested...
-               $userlinks = Linker::revUserTools( $revision, !$unhide );
-
-               $infomsg = $current && !wfMessage( 'revision-info-current' )->isDisabled()
-                       ? 'revision-info-current'
-                       : 'revision-info';
-
-               $outputPage = $this->getContext()->getOutput();
-               $outputPage->addSubtitle( "<div id=\"mw-{$infomsg}\">" . wfMessage( $infomsg,
-                       $td )->rawParams( $userlinks )->params( $revision->getID(), $tddate,
-                       $tdtime, $revision->getUser() )->parse() . "</div>" );
-
-               $lnk = $current
-                       ? wfMessage( 'currentrevisionlink' )->escaped()
-                       : Linker::linkKnown(
-                               $this->getTitle(),
-                               wfMessage( 'currentrevisionlink' )->escaped(),
-                               array(),
-                               $extraParams
-                       );
-               $curdiff = $current
-                       ? wfMessage( 'diff' )->escaped()
-                       : Linker::linkKnown(
-                               $this->getTitle(),
-                               wfMessage( 'diff' )->escaped(),
-                               array(),
-                               array(
-                                       'diff' => 'cur',
-                                       'oldid' => $oldid
-                               ) + $extraParams
-                       );
-               $prev = $this->getTitle()->getPreviousRevisionID( $oldid );
-               $prevlink = $prev
-                       ? Linker::linkKnown(
-                               $this->getTitle(),
-                               wfMessage( 'previousrevision' )->escaped(),
-                               array(),
-                               array(
-                                       'direction' => 'prev',
-                                       'oldid' => $oldid
-                               ) + $extraParams
-                       )
-                       : wfMessage( 'previousrevision' )->escaped();
-               $prevdiff = $prev
-                       ? Linker::linkKnown(
-                               $this->getTitle(),
-                               wfMessage( 'diff' )->escaped(),
-                               array(),
-                               array(
-                                       'diff' => 'prev',
-                                       'oldid' => $oldid
-                               ) + $extraParams
-                       )
-                       : wfMessage( 'diff' )->escaped();
-               $nextlink = $current
-                       ? wfMessage( 'nextrevision' )->escaped()
-                       : Linker::linkKnown(
-                               $this->getTitle(),
-                               wfMessage( 'nextrevision' )->escaped(),
-                               array(),
-                               array(
-                                       'direction' => 'next',
-                                       'oldid' => $oldid
-                               ) + $extraParams
-                       );
-               $nextdiff = $current
-                       ? wfMessage( 'diff' )->escaped()
-                       : Linker::linkKnown(
-                               $this->getTitle(),
-                               wfMessage( 'diff' )->escaped(),
-                               array(),
-                               array(
-                                       'diff' => 'next',
-                                       'oldid' => $oldid
-                               ) + $extraParams
-                       );
-
-               $cdel = Linker::getRevDeleteLink( $user, $revision, $this->getTitle() );
-               if ( $cdel !== '' ) {
-                       $cdel .= ' ';
-               }
-
-               $outputPage->addSubtitle( "<div id=\"mw-revision-nav\">" . $cdel .
-                       wfMessage( 'revision-nav' )->rawParams(
-                               $prevdiff, $prevlink, $lnk, $curdiff, $nextlink, $nextdiff
-                       )->escaped() . "</div>" );
-       }
-
-       /**
-        * Return the HTML for the top of a redirect page
-        *
-        * Chances are you should just be using the ParserOutput from
-        * WikitextContent::getParserOutput instead of calling this for redirects.
-        *
-        * @param Title|array $target Destination(s) to redirect
-        * @param bool $appendSubtitle [optional]
-        * @param bool $forceKnown Should the image be shown as a bluelink regardless of existence?
-        * @return string Containing HMTL with redirect link
-        */
-       public function viewRedirect( $target, $appendSubtitle = true, $forceKnown = false ) {
-               $lang = $this->getTitle()->getPageLanguage();
-               if ( $appendSubtitle ) {
-                       $out = $this->getContext()->getOutput();
-                       $out->addSubtitle( wfMessage( 'redirectpagesub' )->parse() );
-               }
-               return static::getRedirectHeaderHtml( $lang, $target, $forceKnown );
-       }
-
-       /**
-        * Return the HTML for the top of a redirect page
-        *
-        * Chances are you should just be using the ParserOutput from
-        * WikitextContent::getParserOutput instead of calling this for redirects.
-        *
-        * @since 1.23
-        * @param Language $lang
-        * @param Title|array $target Destination(s) to redirect
-        * @param bool $forceKnown Should the image be shown as a bluelink regardless of existence?
-        * @return string Containing HMTL with redirect link
-        */
-       public static function getRedirectHeaderHtml( Language $lang, $target, $forceKnown = false ) {
-               global $wgStylePath;
-
-               if ( !is_array( $target ) ) {
-                       $target = array( $target );
-               }
-
-               $imageDir = $lang->getDir();
-
-               // the loop prepends the arrow image before the link, so the first case needs to be outside
-
-               /** @var $title Title */
-               $title = array_shift( $target );
-
-               if ( $forceKnown ) {
-                       $link = Linker::linkKnown( $title, htmlspecialchars( $title->getFullText() ) );
-               } else {
-                       $link = Linker::link( $title, htmlspecialchars( $title->getFullText() ) );
-               }
-
-               $nextRedirect = $wgStylePath . '/common/images/nextredirect' . $imageDir . '.png';
-               $alt = $lang->isRTL() ? '←' : '→';
-
-               // Automatically append redirect=no to each link, since most of them are
-               // redirect pages themselves.
-               /** @var Title $rt */
-               foreach ( $target as $rt ) {
-                       $link .= Html::element( 'img', array( 'src' => $nextRedirect, 'alt' => $alt ) );
-                       if ( $forceKnown ) {
-                               $link .= Linker::linkKnown(
-                                       $rt,
-                                       htmlspecialchars( $rt->getFullText(),
-                                       array(),
-                                       array( 'redirect' => 'no' )
-                               )
-                               );
-                       } else {
-                               $link .= Linker::link(
-                                       $rt,
-                                       htmlspecialchars( $rt->getFullText() ),
-                                       array(),
-                                       array( 'redirect' => 'no' )
-                               );
-                       }
-               }
-
-               $imageUrl = $wgStylePath . '/common/images/redirect' . $imageDir . '.png';
-               return '<div class="redirectMsg">' .
-                       Html::element( 'img', array( 'src' => $imageUrl, 'alt' => '#REDIRECT' ) ) .
-                       '<span class="redirectText">' . $link . '</span></div>';
-       }
-
-       /**
-        * Handle action=render
-        */
-       public function render() {
-               $this->getContext()->getOutput()->setArticleBodyOnly( true );
-               $this->getContext()->getOutput()->enableSectionEditLinks( false );
-               $this->view();
-       }
-
-       /**
-        * action=protect handler
-        */
-       public function protect() {
-               $form = new ProtectionForm( $this );
-               $form->execute();
-       }
-
-       /**
-        * action=unprotect handler (alias)
-        */
-       public function unprotect() {
-               $this->protect();
-       }
-
-       /**
-        * UI entry point for page deletion
-        */
-       public function delete() {
-               # This code desperately needs to be totally rewritten
-
-               $title = $this->getTitle();
-               $user = $this->getContext()->getUser();
-
-               # Check permissions
-               $permission_errors = $title->getUserPermissionsErrors( 'delete', $user );
-               if ( count( $permission_errors ) ) {
-                       throw new PermissionsError( 'delete', $permission_errors );
-               }
-
-               # Read-only check...
-               if ( wfReadOnly() ) {
-                       throw new ReadOnlyError;
-               }
-
-               # Better double-check that it hasn't been deleted yet!
-               $this->mPage->loadPageData( 'fromdbmaster' );
-               if ( !$this->mPage->exists() ) {
-                       $deleteLogPage = new LogPage( 'delete' );
-                       $outputPage = $this->getContext()->getOutput();
-                       $outputPage->setPageTitle( wfMessage( 'cannotdelete-title', $title->getPrefixedText() ) );
-                       $outputPage->wrapWikiMsg( "<div class=\"error mw-error-cannotdelete\">\n$1\n</div>",
-                                       array( 'cannotdelete', wfEscapeWikiText( $title->getPrefixedText() ) )
-                               );
-                       $outputPage->addHTML(
-                               Xml::element( 'h2', null, $deleteLogPage->getName()->text() )
-                       );
-                       LogEventsList::showLogExtract(
-                               $outputPage,
-                               'delete',
-                               $title
-                       );
-
-                       return;
-               }
-
-               $request = $this->getContext()->getRequest();
-               $deleteReasonList = $request->getText( 'wpDeleteReasonList', 'other' );
-               $deleteReason = $request->getText( 'wpReason' );
-
-               if ( $deleteReasonList == 'other' ) {
-                       $reason = $deleteReason;
-               } elseif ( $deleteReason != '' ) {
-                       // Entry from drop down menu + additional comment
-                       $colonseparator = wfMessage( 'colon-separator' )->inContentLanguage()->text();
-                       $reason = $deleteReasonList . $colonseparator . $deleteReason;
-               } else {
-                       $reason = $deleteReasonList;
-               }
-
-               if ( $request->wasPosted() && $user->matchEditToken( $request->getVal( 'wpEditToken' ),
-                       array( 'delete', $this->getTitle()->getPrefixedText() ) )
-               ) {
-                       # Flag to hide all contents of the archived revisions
-                       $suppress = $request->getVal( 'wpSuppress' ) && $user->isAllowed( 'suppressrevision' );
-
-                       $this->doDelete( $reason, $suppress );
-
-                       WatchAction::doWatchOrUnwatch( $request->getCheck( 'wpWatch' ), $title, $user );
-
-                       return;
-               }
-
-               // Generate deletion reason
-               $hasHistory = false;
-               if ( !$reason ) {
-                       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
-               if ( $hasHistory ) {
-                       $revisions = $this->mTitle->estimateRevisionCount();
-                       // @todo FIXME: i18n issue/patchwork message
-                       $this->getContext()->getOutput()->addHTML( '<strong class="mw-delete-warning-revisions">' .
-                               wfMessage( 'historywarning' )->numParams( $revisions )->parse() .
-                               wfMessage( 'word-separator' )->plain() . Linker::linkKnown( $title,
-                                       wfMessage( 'history' )->escaped(),
-                                       array( 'rel' => 'archives' ),
-                                       array( 'action' => 'history' ) ) .
-                               '</strong>'
-                       );
-
-                       if ( $this->mTitle->isBigDeletion() ) {
-                               global $wgDeleteRevisionsLimit;
-                               $this->getContext()->getOutput()->wrapWikiMsg( "<div class='error'>\n$1\n</div>\n",
-                                       array(
-                                               'delete-warning-toobig',
-                                               $this->getContext()->getLanguage()->formatNum( $wgDeleteRevisionsLimit )
-                                       )
-                               );
-                       }
-               }
-
-               $this->confirmDelete( $reason );
-       }
-
-       /**
-        * Output deletion confirmation dialog
-        * @todo FIXME: Move to another file?
-        * @param string $reason Prefilled reason
-        */
-       public function confirmDelete( $reason ) {
-               wfDebug( "Article::confirmDelete\n" );
-
-               $outputPage = $this->getContext()->getOutput();
-               $outputPage->setPageTitle( wfMessage( 'delete-confirm', $this->getTitle()->getPrefixedText() ) );
-               $outputPage->addBacklinkSubtitle( $this->getTitle() );
-               $outputPage->setRobotPolicy( 'noindex,nofollow' );
-               $backlinkCache = $this->getTitle()->getBacklinkCache();
-               if ( $backlinkCache->hasLinks( 'pagelinks' ) || $backlinkCache->hasLinks( 'templatelinks' ) ) {
-                       $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
-                               'deleting-backlinks-warning' );
-               }
-               $outputPage->addWikiMsg( 'confirmdeletetext' );
-
-               wfRunHooks( 'ArticleConfirmDelete', array( $this, $outputPage, &$reason ) );
-
-               $user = $this->getContext()->getUser();
-
-               if ( $user->isAllowed( 'suppressrevision' ) ) {
-                       $suppress = "<tr id=\"wpDeleteSuppressRow\">
-                                       <td></td>
-                                       <td class='mw-input'><strong>" .
-                                               Xml::checkLabel( wfMessage( 'revdelete-suppress' )->text(),
-                                                       'wpSuppress', 'wpSuppress', false, array( 'tabindex' => '4' ) ) .
-                                       "</strong></td>
-                               </tr>";
-               } else {
-                       $suppress = '';
-               }
-               $checkWatch = $user->getBoolOption( 'watchdeletion' ) || $user->isWatched( $this->getTitle() );
-
-               $form = Xml::openElement( 'form', array( 'method' => 'post',
-                       'action' => $this->getTitle()->getLocalURL( 'action=delete' ), 'id' => 'deleteconfirm' ) ) .
-                       Xml::openElement( 'fieldset', array( 'id' => 'mw-delete-table' ) ) .
-                       Xml::tags( 'legend', null, wfMessage( 'delete-legend' )->escaped() ) .
-                       Xml::openElement( 'table', array( 'id' => 'mw-deleteconfirm-table' ) ) .
-                       "<tr id=\"wpDeleteReasonListRow\">
-                               <td class='mw-label'>" .
-                                       Xml::label( wfMessage( 'deletecomment' )->text(), 'wpDeleteReasonList' ) .
-                               "</td>
-                               <td class='mw-input'>" .
-                                       Xml::listDropDown(
-                                               'wpDeleteReasonList',
-                                               wfMessage( 'deletereason-dropdown' )->inContentLanguage()->text(),
-                                               wfMessage( 'deletereasonotherlist' )->inContentLanguage()->text(),
-                                               '',
-                                               'wpReasonDropDown',
-                                               1
-                                       ) .
-                               "</td>
-                       </tr>
-                       <tr id=\"wpDeleteReasonRow\">
-                               <td class='mw-label'>" .
-                                       Xml::label( wfMessage( 'deleteotherreason' )->text(), 'wpReason' ) .
-                               "</td>
-                               <td class='mw-input'>" .
-                               Html::input( 'wpReason', $reason, 'text', array(
-                                       'size' => '60',
-                                       'maxlength' => '255',
-                                       'tabindex' => '2',
-                                       'id' => 'wpReason',
-                                       'autofocus'
-                               ) ) .
-                               "</td>
-                       </tr>";
-
-               # Disallow watching if user is not logged in
-               if ( $user->isLoggedIn() ) {
-                       $form .= "
-                       <tr>
-                               <td></td>
-                               <td class='mw-input'>" .
-                                       Xml::checkLabel( wfMessage( 'watchthis' )->text(),
-                                               'wpWatch', 'wpWatch', $checkWatch, array( 'tabindex' => '3' ) ) .
-                               "</td>
-                       </tr>";
-               }
-
-               $form .= "
-                       $suppress
-                       <tr>
-                               <td></td>
-                               <td class='mw-submit'>" .
-                                       Xml::submitButton( wfMessage( 'deletepage' )->text(),
-                                               array( 'name' => 'wpConfirmB', 'id' => 'wpConfirmB', 'tabindex' => '5' ) ) .
-                               "</td>
-                       </tr>" .
-                       Xml::closeElement( 'table' ) .
-                       Xml::closeElement( 'fieldset' ) .
-                       Html::hidden(
-                               'wpEditToken',
-                               $user->getEditToken( array( 'delete', $this->getTitle()->getPrefixedText() ) )
-                       ) .
-                       Xml::closeElement( 'form' );
-
-                       if ( $user->isAllowed( 'editinterface' ) ) {
-                               $title = Title::makeTitle( NS_MEDIAWIKI, 'Deletereason-dropdown' );
-                               $link = Linker::link(
-                                       $title,
-                                       wfMessage( 'delete-edit-reasonlist' )->escaped(),
-                                       array(),
-                                       array( 'action' => 'edit' )
-                               );
-                               $form .= '<p class="mw-delete-editreasons">' . $link . '</p>';
-                       }
-
-               $outputPage->addHTML( $form );
-
-               $deleteLogPage = new LogPage( 'delete' );
-               $outputPage->addHTML( Xml::element( 'h2', null, $deleteLogPage->getName()->text() ) );
-               LogEventsList::showLogExtract( $outputPage, 'delete',
-                       $this->getTitle()
-               );
-       }
-
-       /**
-        * Perform a deletion and output success or failure messages
-        * @param string $reason
-        * @param bool $suppress
-        */
-       public function doDelete( $reason, $suppress = false ) {
-               $error = '';
-               $outputPage = $this->getContext()->getOutput();
-               $status = $this->mPage->doDeleteArticleReal( $reason, $suppress, 0, true, $error );
-
-               if ( $status->isGood() ) {
-                       $deleted = $this->getTitle()->getPrefixedText();
-
-                       $outputPage->setPageTitle( wfMessage( 'actioncomplete' ) );
-                       $outputPage->setRobotPolicy( 'noindex,nofollow' );
-
-                       $loglink = '[[Special:Log/delete|' . wfMessage( 'deletionlog' )->text() . ']]';
-
-                       $outputPage->addWikiMsg( 'deletedtext', wfEscapeWikiText( $deleted ), $loglink );
-                       $outputPage->returnToMain( false );
-               } else {
-                       $outputPage->setPageTitle(
-                               wfMessage( 'cannotdelete-title',
-                                       $this->getTitle()->getPrefixedText() )
-                       );
-
-                       if ( $error == '' ) {
-                               $outputPage->addWikiText(
-                                       "<div class=\"error mw-error-cannotdelete\">\n" . $status->getWikiText() . "\n</div>"
-                               );
-                               $deleteLogPage = new LogPage( 'delete' );
-                               $outputPage->addHTML( Xml::element( 'h2', null, $deleteLogPage->getName()->text() ) );
-
-                               LogEventsList::showLogExtract(
-                                       $outputPage,
-                                       'delete',
-                                       $this->getTitle()
-                               );
-                       } else {
-                               $outputPage->addHTML( $error );
-                       }
-               }
-       }
-
-       /* Caching functions */
-
-       /**
-        * checkLastModified returns true if it has taken care of all
-        * output to the client that is necessary for this request.
-        * (that is, it has sent a cached version of the page)
-        *
-        * @return bool true if cached version send, false otherwise
-        */
-       protected function tryFileCache() {
-               static $called = false;
-
-               if ( $called ) {
-                       wfDebug( "Article::tryFileCache(): called twice!?\n" );
-                       return false;
-               }
-
-               $called = true;
-               if ( $this->isFileCacheable() ) {
-                       $cache = HTMLFileCache::newFromTitle( $this->getTitle(), 'view' );
-                       if ( $cache->isCacheGood( $this->mPage->getTouched() ) ) {
-                               wfDebug( "Article::tryFileCache(): about to load file\n" );
-                               $cache->loadFromFileCache( $this->getContext() );
-                               return true;
-                       } else {
-                               wfDebug( "Article::tryFileCache(): starting buffer\n" );
-                               ob_start( array( &$cache, 'saveToFileCache' ) );
-                       }
-               } else {
-                       wfDebug( "Article::tryFileCache(): not cacheable\n" );
-               }
-
-               return false;
-       }
-
-       /**
-        * Check if the page can be cached
-        * @return bool
-        */
-       public function isFileCacheable() {
-               $cacheable = false;
-
-               if ( HTMLFileCache::useFileCache( $this->getContext() ) ) {
-                       $cacheable = $this->mPage->getID()
-                               && !$this->mRedirectedFrom && !$this->getTitle()->isRedirect();
-                       // Extension may have reason to disable file caching on some pages.
-                       if ( $cacheable ) {
-                               $cacheable = wfRunHooks( 'IsFileCacheable', array( &$this ) );
-                       }
-               }
-
-               return $cacheable;
-       }
-
-       /**#@-*/
-
-       /**
-        * Lightweight method to get the parser output for a page, checking the parser cache
-        * and so on. Doesn't consider most of the stuff that WikiPage::view is forced to
-        * consider, so it's not appropriate to use there.
-        *
-        * @since 1.16 (r52326) for LiquidThreads
-        *
-        * @param int|null $oldid Revision ID or null
-        * @param User $user The relevant user
-        * @return ParserOutput|bool ParserOutput or false if the given revision 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 {
-                       $parserOptions = $this->mPage->makeParserOptions( $user );
-               }
-
-               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
-        */
-       public function getParserOptions() {
-               if ( !$this->mParserOptions ) {
-                       $this->mParserOptions = $this->mPage->makeParserOptions( $this->getContext() );
-               }
-               // Clone to allow modifications of the return value without affecting cache
-               return clone $this->mParserOptions;
-       }
-
-       /**
-        * Sets the context this Article is executed in
-        *
-        * @param IContextSource $context
-        * @since 1.18
-        */
-       public function setContext( $context ) {
-               $this->mContext = $context;
-       }
-
-       /**
-        * Gets the context this Article is executed in
-        *
-        * @return IContextSource
-        * @since 1.18
-        */
-       public function getContext() {
-               if ( $this->mContext instanceof IContextSource ) {
-                       return $this->mContext;
-               } else {
-                       wfDebug( __METHOD__ . " called and \$mContext is null. " .
-                               "Return RequestContext::getMain(); for sanity\n" );
-                       return RequestContext::getMain();
-               }
-       }
-
-       /**
-        * Info about this page
-        * @deprecated since 1.19
-        */
-       public function info() {
-               wfDeprecated( __METHOD__, '1.19' );
-               Action::factory( 'info', $this )->show();
-       }
-
-       /**
-        * Handle action=purge
-        * @deprecated since 1.19
-        * @return Action|bool|null false if the action is disabled, null if it is not recognised
-        */
-       public function purge() {
-               return Action::factory( 'purge', $this )->show();
-       }
-
-       /**
-        * Handle action=revert
-        * @deprecated since 1.19
-        */
-       public function revert() {
-               wfDeprecated( __METHOD__, '1.19' );
-               Action::factory( 'revert', $this )->show();
-       }
-
-       /**
-        * Handle action=rollback
-        * @deprecated since 1.19
-        */
-       public function rollback() {
-               wfDeprecated( __METHOD__, '1.19' );
-               Action::factory( 'rollback', $this )->show();
-       }
-
-       /**
-        * Use PHP's magic __get handler to handle accessing of
-        * raw WikiPage fields for backwards compatibility.
-        *
-        * @param string $fname Field name
-        */
-       public function __get( $fname ) {
-               if ( property_exists( $this->mPage, $fname ) ) {
-                       #wfWarn( "Access to raw $fname field " . __CLASS__ );
-                       return $this->mPage->$fname;
-               }
-               trigger_error( 'Inaccessible property via __get(): ' . $fname, E_USER_NOTICE );
-       }
-
-       /**
-        * Use PHP's magic __set handler to handle setting of
-        * raw WikiPage fields for backwards compatibility.
-        *
-        * @param string $fname Field name
-        * @param mixed $fvalue New value
-        */
-       public function __set( $fname, $fvalue ) {
-               if ( property_exists( $this->mPage, $fname ) ) {
-                       #wfWarn( "Access to raw $fname field of " . __CLASS__ );
-                       $this->mPage->$fname = $fvalue;
-               // Note: extensions may want to toss on new fields
-               } elseif ( !in_array( $fname, array( 'mContext', 'mPage' ) ) ) {
-                       $this->mPage->$fname = $fvalue;
-               } else {
-                       trigger_error( 'Inaccessible property via __set(): ' . $fname, E_USER_NOTICE );
-               }
-       }
-
-       /**
-        * Use PHP's magic __call handler to transform instance calls to
-        * WikiPage functions for backwards compatibility.
-        *
-        * @param string $fname Name of called method
-        * @param array $args Arguments to the method
-        * @return mixed
-        */
-       public function __call( $fname, $args ) {
-               if ( is_callable( array( $this->mPage, $fname ) ) ) {
-                       #wfWarn( "Call to " . __CLASS__ . "::$fname; please use WikiPage instead" );
-                       return call_user_func_array( array( $this->mPage, $fname ), $args );
-               }
-               trigger_error( 'Inaccessible function via __call(): ' . $fname, E_USER_ERROR );
-       }
-
-       // ****** B/C functions to work-around PHP silliness with __call and references ****** //
-
-       /**
-        * @param array $limit
-        * @param array $expiry
-        * @param bool $cascade
-        * @param string $reason
-        * @param User $user
-        * @return Status
-        */
-       public function doUpdateRestrictions( array $limit, array $expiry, &$cascade,
-               $reason, User $user
-       ) {
-               return $this->mPage->doUpdateRestrictions( $limit, $expiry, $cascade, $reason, $user );
-       }
-
-       /**
-        * @param array $limit
-        * @param string $reason
-        * @param int $cascade
-        * @param array $expiry
-        * @return bool
-        */
-       public function updateRestrictions( $limit = array(), $reason = '',
-               &$cascade = 0, $expiry = array()
-       ) {
-               return $this->mPage->doUpdateRestrictions(
-                       $limit,
-                       $expiry,
-                       $cascade,
-                       $reason,
-                       $this->getContext()->getUser()
-               );
-       }
-
-       /**
-        * @param string $reason
-        * @param bool $suppress
-        * @param int $id
-        * @param bool $commit
-        * @param string $error
-        * @return bool
-        */
-       public function doDeleteArticle( $reason, $suppress = false, $id = 0,
-               $commit = true, &$error = ''
-       ) {
-               return $this->mPage->doDeleteArticle( $reason, $suppress, $id, $commit, $error );
-       }
-
-       /**
-        * @param string $fromP
-        * @param string $summary
-        * @param string $token
-        * @param bool $bot
-        * @param array $resultDetails
-        * @param User|null $user
-        * @return array
-        */
-       public function doRollback( $fromP, $summary, $token, $bot, &$resultDetails, User $user = null ) {
-               $user = is_null( $user ) ? $this->getContext()->getUser() : $user;
-               return $this->mPage->doRollback( $fromP, $summary, $token, $bot, $resultDetails, $user );
-       }
-
-       /**
-        * @param string $fromP
-        * @param string $summary
-        * @param bool $bot
-        * @param array $resultDetails
-        * @param User|null $guser
-        * @return array
-        */
-       public function commitRollback( $fromP, $summary, $bot, &$resultDetails, User $guser = null ) {
-               $guser = is_null( $guser ) ? $this->getContext()->getUser() : $guser;
-               return $this->mPage->commitRollback( $fromP, $summary, $bot, $resultDetails, $guser );
-       }
-
-       /**
-        * @param bool $hasHistory
-        * @return mixed
-        */
-       public function generateReason( &$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 ) ****** //
-
-       /**
-        * @return array
-        */
-       public static function selectFields() {
-               return WikiPage::selectFields();
-       }
-
-       /**
-        * @param Title $title
-        */
-       public static function onArticleCreate( $title ) {
-               WikiPage::onArticleCreate( $title );
-       }
-
-       /**
-        * @param Title $title
-        */
-       public static function onArticleDelete( $title ) {
-               WikiPage::onArticleDelete( $title );
-       }
-
-       /**
-        * @param Title $title
-        */
-       public static function onArticleEdit( $title ) {
-               WikiPage::onArticleEdit( $title );
-       }
-
-       /**
-        * @param string $oldtext
-        * @param string $newtext
-        * @param int $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 69f0e2f..3ac4722 100644 (file)
@@ -32,7 +32,6 @@ $wgAutoloadLocalClasses = array(
        'AjaxDispatcher' => 'includes/AjaxDispatcher.php',
        'AjaxResponse' => 'includes/AjaxResponse.php',
        'AlphabeticPager' => 'includes/Pager.php',
-       'Article' => 'includes/Article.php',
        'AtomFeed' => 'includes/Feed.php',
        'AuthPlugin' => 'includes/AuthPlugin.php',
        'AuthPluginUser' => 'includes/AuthPlugin.php',
@@ -42,7 +41,6 @@ $wgAutoloadLocalClasses = array(
        'CacheHelper' => 'includes/CacheHelper.php',
        'Category' => 'includes/Category.php',
        'Categoryfinder' => 'includes/Categoryfinder.php',
-       'CategoryPage' => 'includes/CategoryPage.php',
        'CategoryViewer' => 'includes/CategoryViewer.php',
        'ChangesFeed' => 'includes/ChangesFeed.php',
        'ChangeTags' => 'includes/ChangeTags.php',
@@ -112,9 +110,6 @@ $wgAutoloadLocalClasses = array(
        'ICacheHelper' => 'includes/CacheHelper.php',
        'IcuCollation' => 'includes/Collation.php',
        'IdentityCollation' => 'includes/Collation.php',
-       'ImageHistoryList' => 'includes/ImagePage.php',
-       'ImageHistoryPseudoPager' => 'includes/ImagePage.php',
-       'ImagePage' => 'includes/ImagePage.php',
        'ImageQueryPage' => 'includes/ImageQueryPage.php',
        'ImportStreamSource' => 'includes/Import.php',
        'ImportStringSource' => 'includes/Import.php',
@@ -145,7 +140,6 @@ $wgAutoloadLocalClasses = array(
        'MWInit' => 'includes/Init.php',
        'MWNamespace' => 'includes/Namespace.php',
        'OutputPage' => 'includes/OutputPage.php',
-       'Page' => 'includes/WikiPage.php',
        'PageQueryPage' => 'includes/PageQueryPage.php',
        'Pager' => 'includes/Pager.php',
        'PasswordError' => 'includes/User.php',
@@ -157,7 +151,7 @@ $wgAutoloadLocalClasses = array(
        'PoolCounterRedis' => 'includes/poolcounter/PoolCounterRedis.php',
        'PoolCounterWork' => 'includes/poolcounter/PoolCounterWork.php',
        'PoolCounterWorkViaCallback' => 'includes/poolcounter/PoolCounterWork.php',
-       'PoolWorkArticleView' => 'includes/WikiPage.php',
+       'PoolWorkArticleView' => 'includes/poolcounter/PoolWorkArticleView.php',
        'Preferences' => 'includes/Preferences.php',
        'PreferencesForm' => 'includes/Preferences.php',
        'PrefixSearch' => 'includes/PrefixSearch.php',
@@ -207,11 +201,8 @@ $wgAutoloadLocalClasses = array(
        'WebRequest' => 'includes/WebRequest.php',
        'WebRequestUpload' => 'includes/WebRequest.php',
        'WebResponse' => 'includes/WebResponse.php',
-       'WikiCategoryPage' => 'includes/WikiCategoryPage.php',
        'WikiExporter' => 'includes/Export.php',
-       'WikiFilePage' => 'includes/WikiFilePage.php',
        'WikiImporter' => 'includes/Import.php',
-       'WikiPage' => 'includes/WikiPage.php',
        'WikiRevision' => 'includes/Import.php',
        'WikiMap' => 'includes/WikiMap.php',
        'WikiReference' => 'includes/WikiMap.php',
@@ -796,6 +787,17 @@ $wgAutoloadLocalClasses = array(
        'WinCacheBagOStuff' => 'includes/objectcache/WinCacheBagOStuff.php',
        'XCacheBagOStuff' => 'includes/objectcache/XCacheBagOStuff.php',
 
+       # includes/page
+       'Article' => 'includes/page/Article.php',
+       'CategoryPage' => 'includes/page/CategoryPage.php',
+       'ImageHistoryList' => 'includes/page/ImagePage.php',
+       'ImageHistoryPseudoPager' => 'includes/page/ImagePage.php',
+       'ImagePage' => 'includes/page/ImagePage.php',
+       'Page' => 'includes/page/WikiPage.php',
+       'WikiCategoryPage' => 'includes/page/WikiCategoryPage.php',
+       'WikiFilePage' => 'includes/page/WikiFilePage.php',
+       'WikiPage' => 'includes/page/WikiPage.php',
+
        # includes/parser
        'CacheTime' => 'includes/parser/CacheTime.php',
        'CoreParserFunctions' => 'includes/parser/CoreParserFunctions.php',
@@ -828,7 +830,7 @@ $wgAutoloadLocalClasses = array(
        'ParserCache' => 'includes/parser/ParserCache.php',
        'ParserOptions' => 'includes/parser/ParserOptions.php',
        'ParserOutput' => 'includes/parser/ParserOutput.php',
-       'Parser_DiffTest' => 'includes/parser/Parser_DiffTest.php',
+       'ParserDiffTest' => 'includes/parser/ParserDiffTest.php',
        'Preprocessor' => 'includes/parser/Preprocessor.php',
        'Preprocessor_DOM' => 'includes/parser/Preprocessor_DOM.php',
        'Preprocessor_Hash' => 'includes/parser/Preprocessor_Hash.php',
@@ -909,7 +911,6 @@ $wgAutoloadLocalClasses = array(
        'SearchPostgres' => 'includes/search/SearchPostgres.php',
        'SearchResult' => 'includes/search/SearchResult.php',
        'SearchResultSet' => 'includes/search/SearchResultSet.php',
-       'SearchResultTooMany' => 'includes/search/SearchEngine.php',
        'SearchSqlite' => 'includes/search/SearchSqlite.php',
        'SqlSearchResultSet' => 'includes/search/SearchResultSet.php',
 
@@ -936,7 +937,7 @@ $wgAutoloadLocalClasses = array(
 
        # includes/specials
        'ActiveUsersPager' => 'includes/specials/SpecialActiveusers.php',
-       'AllmessagesTablePager' => 'includes/specials/SpecialAllmessages.php',
+       'AllMessagesTablePager' => 'includes/specials/SpecialAllMessages.php',
        'AncientPagesPage' => 'includes/specials/SpecialAncientpages.php',
        'BlockListPager' => 'includes/specials/SpecialBlockList.php',
        'BrokenRedirectsPage' => 'includes/specials/SpecialBrokenRedirects.php',
@@ -980,9 +981,9 @@ $wgAutoloadLocalClasses = array(
        'RandomPage' => 'includes/specials/SpecialRandompage.php',
        'ShortPagesPage' => 'includes/specials/SpecialShortpages.php',
        'SpecialActiveUsers' => 'includes/specials/SpecialActiveusers.php',
-       'SpecialAllmessages' => 'includes/specials/SpecialAllmessages.php',
+       'SpecialAllMessages' => 'includes/specials/SpecialAllMessages.php',
        'SpecialAllMyUploads' => 'includes/specials/SpecialMyRedirectPages.php',
-       'SpecialAllpages' => 'includes/specials/SpecialAllpages.php',
+       'SpecialAllPages' => 'includes/specials/SpecialAllPages.php',
        'SpecialBlankpage' => 'includes/specials/SpecialBlankpage.php',
        'SpecialBlock' => 'includes/specials/SpecialBlock.php',
        'SpecialBlockList' => 'includes/specials/SpecialBlockList.php',
@@ -1113,6 +1114,7 @@ $wgAutoloadLocalClasses = array(
        'HashtableReplacer' => 'includes/utils/StringUtils.php',
        'IP' => 'includes/utils/IP.php',
        'MWCryptRand' => 'includes/utils/MWCryptRand.php',
+       'MWCryptHKDF' => 'includes/utils/MWCryptHKDF.php',
        'MWFunction' => 'includes/utils/MWFunction.php',
        'RegexlikeReplacer' => 'includes/utils/StringUtils.php',
        'ReplacementArray' => 'includes/utils/StringUtils.php',
@@ -1177,12 +1179,6 @@ $wgAutoloadLocalClasses = array(
        # mw-config
        'InstallerOverrides' => 'mw-config/overrides.php',
        'MyLocalSettingsGenerator' => 'mw-config/overrides.php',
-
-       # skins
-       'MonoBookTemplate' => 'skins/MonoBook.php',
-       'SkinMonoBook' => 'skins/MonoBook.php',
-       'SkinVector' => 'skins/Vector.php',
-       'VectorTemplate' => 'skins/Vector.php',
 );
 
 class AutoLoader {
diff --git a/includes/CategoryPage.php b/includes/CategoryPage.php
deleted file mode 100644 (file)
index 9abc6a8..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-<?php
-/**
- * Special handling for category description pages.
- * Modelled after ImagePage.php.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * Special handling for category description pages, showing pages,
- * subcategories and file that belong to the category
- */
-class CategoryPage extends Article {
-       # Subclasses can change this to override the viewer class.
-       protected $mCategoryViewerClass = 'CategoryViewer';
-
-       /**
-        * @param Title $title
-        * @return WikiCategoryPage
-        */
-       protected function newPage( Title $title ) {
-               // Overload mPage with a category-specific page
-               return new WikiCategoryPage( $title );
-       }
-
-       /**
-        * Constructor from a page id
-        * @param int $id Article ID to load
-        * @return CategoryPage|null
-        */
-       public static function newFromID( $id ) {
-               $t = Title::newFromID( $id );
-               # @todo FIXME: Doesn't inherit right
-               return $t == null ? null : new self( $t );
-               # return $t == null ? null : new static( $t ); // PHP 5.3
-       }
-
-       function view() {
-               $request = $this->getContext()->getRequest();
-               $diff = $request->getVal( 'diff' );
-               $diffOnly = $request->getBool( 'diffonly',
-                       $this->getContext()->getUser()->getOption( 'diffonly' ) );
-
-               if ( $diff !== null && $diffOnly ) {
-                       parent::view();
-                       return;
-               }
-
-               if ( !wfRunHooks( 'CategoryPageView', array( &$this ) ) ) {
-                       return;
-               }
-
-               $title = $this->getTitle();
-               if ( NS_CATEGORY == $title->getNamespace() ) {
-                       $this->openShowCategory();
-               }
-
-               parent::view();
-
-               if ( NS_CATEGORY == $title->getNamespace() ) {
-                       $this->closeShowCategory();
-               }
-       }
-
-       function openShowCategory() {
-               # For overloading
-       }
-
-       function closeShowCategory() {
-               // Use these as defaults for back compat --catrope
-               $request = $this->getContext()->getRequest();
-               $oldFrom = $request->getVal( 'from' );
-               $oldUntil = $request->getVal( 'until' );
-
-               $reqArray = $request->getValues();
-
-               $from = $until = array();
-               foreach ( array( 'page', 'subcat', 'file' ) as $type ) {
-                       $from[$type] = $request->getVal( "{$type}from", $oldFrom );
-                       $until[$type] = $request->getVal( "{$type}until", $oldUntil );
-
-                       // Do not want old-style from/until propagating in nav links.
-                       if ( !isset( $reqArray["{$type}from"] ) && isset( $reqArray["from"] ) ) {
-                               $reqArray["{$type}from"] = $reqArray["from"];
-                       }
-                       if ( !isset( $reqArray["{$type}to"] ) && isset( $reqArray["to"] ) ) {
-                               $reqArray["{$type}to"] = $reqArray["to"];
-                       }
-               }
-
-               unset( $reqArray["from"] );
-               unset( $reqArray["to"] );
-
-               $viewer = new $this->mCategoryViewerClass(
-                       $this->getContext()->getTitle(),
-                       $this->getContext(),
-                       $from,
-                       $until,
-                       $reqArray
-               );
-               $this->getContext()->getOutput()->addHTML( $viewer->getHTML() );
-       }
-}
index d3dd51a..28db8a1 100644 (file)
@@ -101,21 +101,20 @@ class ChangeTags {
                                'specified when adding a tag to a change!' );
                }
 
-               $dbr = wfGetDB( DB_SLAVE );
+               $dbw = wfGetDB( DB_MASTER );
 
                // Might as well look for rcids and so on.
                if ( !$rc_id ) {
                        // Info might be out of date, somewhat fractionally, on slave.
-                       $dbr = wfGetDB( DB_MASTER );
                        if ( $log_id ) {
-                               $rc_id = $dbr->selectField(
+                               $rc_id = $dbw->selectField(
                                        'recentchanges',
                                        'rc_id',
                                        array( 'rc_logid' => $log_id ),
                                        __METHOD__
                                );
                        } elseif ( $rev_id ) {
-                               $rc_id = $dbr->selectField(
+                               $rc_id = $dbw->selectField(
                                        'recentchanges',
                                        'rc_id',
                                        array( 'rc_this_oldid' => $rev_id ),
@@ -124,14 +123,13 @@ class ChangeTags {
                        }
                } elseif ( !$log_id && !$rev_id ) {
                        // Info might be out of date, somewhat fractionally, on slave.
-                       $dbr = wfGetDB( DB_MASTER );
-                       $log_id = $dbr->selectField(
+                       $log_id = $dbw->selectField(
                                'recentchanges',
                                'rc_logid',
                                array( 'rc_id' => $rc_id ),
                                __METHOD__
                        );
-                       $rev_id = $dbr->selectField(
+                       $rev_id = $dbw->selectField(
                                'recentchanges',
                                'rc_this_oldid',
                                array( 'rc_id' => $rc_id ),
@@ -146,7 +144,9 @@ class ChangeTags {
                );
 
                ## Update the summary row.
-               $prevTags = $dbr->selectField( 'tag_summary', 'ts_tags', $tsConds, __METHOD__ );
+               // $prevTags can be out of date on slaves, especially when addTags is called consecutively,
+               // causing loss of tags added recently in tag_summary table.
+               $prevTags = $dbw->selectField( 'tag_summary', 'ts_tags', $tsConds, __METHOD__ );
                $prevTags = $prevTags ? $prevTags : '';
                $prevTags = array_filter( explode( ',', $prevTags ) );
                $newTags = array_unique( array_merge( $prevTags, $tags ) );
@@ -158,7 +158,6 @@ class ChangeTags {
                        return false;
                }
 
-               $dbw = wfGetDB( DB_MASTER );
                $dbw->replace(
                        'tag_summary',
                        array( 'ts_rev_id', 'ts_rc_id', 'ts_log_id' ),
index 16c0187..5d09869 100644 (file)
@@ -1281,7 +1281,7 @@ $wgDjvuTxt = null;
  * Path of the djvutoxml executable
  * This works like djvudump except much, much slower as of version 3.5.
  *
- * For now we  recommend you use djvudump instead. The djvuxml output is
+ * For now we recommend you use djvudump instead. The djvuxml output is
  * probably more stable, so we'll switch back to it as soon as they fix
  * the efficiency problem.
  * http://sourceforge.net/tracker/index.php?func=detail&aid=1704049&group_id=32953&atid=406583
@@ -1295,7 +1295,7 @@ $wgDjvuToXML = null;
 
 /**
  * Shell command for the DJVU post processor
- * Default: pnmtopng, since ddjvu generates ppm output
+ * Default: pnmtojpeg, since ddjvu generates ppm output
  * Set this to false to output the ppm file directly.
  */
 $wgDjvuPostProcessor = 'pnmtojpeg';
@@ -1710,6 +1710,7 @@ $wgLBFactoryConf = array( 'class' => 'LBFactorySimple' );
 
 /**
  * How long to wait for a slave to catch up to the master
+ * @deprecated since 1.24
  */
 $wgMasterWaitTimeout = 10;
 
@@ -1738,11 +1739,6 @@ $wgDBerrorLog = false;
  */
 $wgDBerrorLogTZ = false;
 
-/**
- * When to give an error message
- */
-$wgDBClusterTimeout = 10;
-
 /**
  * Scale load balancer polling time so that under overload conditions, the
  * database server receives a SHOW STATUS query at an average interval of this
@@ -2508,6 +2504,21 @@ $wgInterwikiMagic = true;
  */
 $wgHideInterlanguageLinks = false;
 
+/**
+ * List of additional interwiki prefixes that should be treated as
+ * interlanguage links (i.e. placed in the sidebar).
+ * Notes:
+ * - This will not do anything unless the prefixes are defined in the interwiki
+ *   map.
+ * - The display text for these custom interlanguage links will be fetched from
+ *   the system message "interlanguage-link-xyz" where xyz is the prefix in
+ *   this array.
+ * - A friendly name for each site, used for tooltip text, may optionally be
+ *   placed in the system message "interlanguage-link-sitename-xyz" where xyz is
+ *   the prefix in this array.
+ */
+$wgExtraInterlanguageLinkPrefixes = array();
+
 /**
  * List of language names or overrides for default names in Names.php
  */
@@ -3221,6 +3232,15 @@ $wgResourceLoaderMinifierMaxLineLength = 1000;
  */
 $wgIncludeLegacyJavaScript = true;
 
+/**
+ * Whether to include the jQuery Migrate library, which lets legacy JS that
+ * requires jQuery 1.8.x to work and breaks with 1.9.x+.
+ *
+ * @since 1.24
+ * @deprecated since 1.24, to be removed in 1.25
+ */
+$wgIncludejQueryMigrate = false;
+
 /**
  * Whether to preload the mediawiki.util module as blocking module in the top
  * queue.
@@ -4817,11 +4837,6 @@ $wgSecretKey = false;
  */
 $wgProxyList = array();
 
-/**
- * @deprecated since 1.14
- */
-$wgProxyKey = false;
-
 /** @} */ # end of proxy scanner settings
 
 /************************************************************************//**
@@ -5322,14 +5337,6 @@ $wgNamespacesToBeSearchedDefault = array(
        NS_MAIN => true,
 );
 
-/**
- * If set to true the 'searcheverything' preference will be effective only for
- * logged-in users.
- * Useful for big wikis to maintain different search profiles for anonymous and
- * logged-in users.
- */
-$wgSearchEverythingOnlyLoggedIn = false;
-
 /**
  * Disable the internal MySQL-based search, to allow it to be
  * implemented by an extension instead.
@@ -5640,13 +5647,6 @@ $wgRCEngines = array(
        'udp' => 'UDPRCFeedEngine',
 );
 
-/**
- * Enable user search in Special:Newpages
- * This is really a temporary hack around an index install bug on some Wikipedias.
- * Kill it once fixed.
- */
-$wgEnableNewpagesUserFilter = true;
-
 /**
  * Use RC Patrolling to check for vandalism
  */
@@ -5780,24 +5780,42 @@ $wgUnwatchedPageThreshold = false;
  * To register a new one:
  * @code
  * $wgRecentChangesFlags['flag'] => array(
+ *   // message for the letter displayed next to rows on changes lists
  *   'letter' => 'letter-msg',
- *   'title' => 'tooltip-msg'
+ *   // message for the tooltip of the letter
+ *   'title' => 'tooltip-msg',
+ *   // optional (defaults to 'tooltip-msg'), message to use in the legend box
+ *   'legend' => 'legend-msg',
+ *   // optional (defaults to 'flag'), CSS class to put on changes lists rows
+ *   'class' => 'css-class',
  * );
  * @endcode
  *
- * Optional 'class' allows to set a css class different than the flag name.
- *
  * @since 1.22
  */
 $wgRecentChangesFlags = array(
-       'newpage' => array( 'letter' => 'newpageletter',
-               'title' => 'recentchanges-label-newpage' ),
-       'minor' => array( 'letter' => 'minoreditletter',
-               'title' => 'recentchanges-label-minor', 'class' => 'minoredit' ),
-       'bot' => array( 'letter' => 'boteditletter',
-               'title' => 'recentchanges-label-bot', 'class' => 'botedit' ),
-       'unpatrolled' => array( 'letter' => 'unpatrolledletter',
-               'title' => 'recentchanges-label-unpatrolled' ),
+       'newpage' => array(
+               'letter' => 'newpageletter',
+               'title' => 'recentchanges-label-newpage',
+               'legend' => 'recentchanges-legend-newpage',
+       ),
+       'minor' => array(
+               'letter' => 'minoreditletter',
+               'title' => 'recentchanges-label-minor',
+               'legend' => 'recentchanges-legend-minor',
+               'class' => 'minoredit',
+       ),
+       'bot' => array(
+               'letter' => 'boteditletter',
+               'title' => 'recentchanges-label-bot',
+               'legend' => 'recentchanges-legend-bot',
+               'class' => 'botedit',
+       ),
+       'unpatrolled' => array(
+               'letter' => 'unpatrolledletter',
+               'title' => 'recentchanges-label-unpatrolled',
+               'legend' => 'recentchanges-legend-unpatrolled',
+       ),
 );
 
 /** @} */ # end RC/watchlist }
@@ -6065,6 +6083,7 @@ $wgAutoloadAttemptLowercase = true;
  * $wgExtensionCredits[$type][] = array(
  *     'path' => __FILE__,
  *     'name' => 'Example extension',
+ *     'namemsg' => 'exampleextension-name',
  *     'author' => array(
  *         'Foo Barstein',
  *     ),
@@ -6080,7 +6099,18 @@ $wgAutoloadAttemptLowercase = true;
  * view said file. When the 'license-name' key is specified, this file is
  * interpreted as wikitext.
  *
- * - $type: One of 'specialpage', 'parserhook', 'variable', 'media' or 'other'.
+ * - $type: One of 'specialpage', 'parserhook', 'variable', 'media', 'antispam',
+ *    'skin', 'api', or 'other', or any additional types as specified through the
+ *    ExtensionTypes hook as used in SpecialVersion::getExtensionTypes().
+ *
+ * - name: Name of extension as an inline string instead of localizable message.
+ *    Do not omit this even if 'namemsg' is provided, as it is used to override
+ *    the path Special:Version uses to find extension's license info, and is
+ *    required for backwards-compatibility with MediaWiki 1.23 and older.
+ *
+ * - namemsg (since MW 1.24): A message key for a message containing the
+ *    extension's name, if the name is localizable. (For example, skin names
+ *    usually are.)
  *
  * - author: A string or an array of strings. Authors can be linked using
  *    the regular wikitext link syntax. To have an internationalized version of
@@ -6088,9 +6118,9 @@ $wgAutoloadAttemptLowercase = true;
  *    for instance "[http://example ...]".
  *
  * - descriptionmsg: A message key or an an array with message key and parameters:
- *    `'descriptionmsg' => array( 'exampleextension-desc', param1, param2, ... ),`
+ *    `'descriptionmsg' => 'exampleextension-desc',`
  *
- * - description: Description of extension as inline string instead of
+ * - description: Description of extension as an inline string instead of
  *    localizable message (omit in favour of 'descriptionmsg').
  *
  * - license-name: Short name of the license (used as label for the link), such
@@ -7073,6 +7103,16 @@ $wgPagePropsHaveSortkey = true;
  */
 $wgHttpsPort = 443;
 
+/**
+ * Secret and algorithm for hmac-based key derivation function (fast,
+ * cryptographically secure random numbers).
+ * This should be set in LocalSettings.php, otherwise wgSecretKey will
+ * be used.
+ * @since 1.24
+ */
+$wgHKDFSecret = false;
+$wgHKDFAlgorithm = 'sha256';
+
 /**
  * For really cool vim folding this needs to be at the end:
  * vim: foldmarker=@{,@} foldmethod=marker
index 19801ec..ce4ede3 100644 (file)
@@ -177,9 +177,7 @@ define( 'MW_DATE_ISO', 'ISO 8601' );
  */
 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 );
 /**@}*/
 
index ca11f16..480671a 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Page edition user interface.
+ * User interface for page editing.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -797,9 +797,13 @@ class EditPage {
                                // suhosin.request.max_value_length (d'oh)
                                $this->incompleteForm = true;
                        } else {
-                               // edittime should be one of our last fields; if it's missing,
-                               // the submission probably broke somewhere in the middle.
-                               $this->incompleteForm = is_null( $this->edittime );
+                               // If we receive the last parameter of the request, we can fairly
+                               // claim the POST request has not been truncated.
+
+                               // TODO: softened the check for cutover.  Once we determine
+                               // that it is safe, we should complete the transition by
+                               // removing the "edittime" clause.
+                               $this->incompleteForm = ( !$request->getVal( 'wpUltimateParam' ) && is_null( $this->edittime ) );
                        }
                        if ( $this->incompleteForm ) {
                                # If the form is incomplete, force to preview.
@@ -2302,7 +2306,7 @@ class EditPage {
                        if ( $title instanceof Title && $title->exists() && $title->userCan( 'read' ) ) {
                                global $wgOut;
                                // Added using template syntax, to take <noinclude>'s into account.
-                               $wgOut->addWikiTextTitleTidy( '{{:' . $title->getFullText() . '}}', $this->mTitle );
+                               $wgOut->addWikiTextTitleTidy( '<div class="mw-editintro">{{:' . $title->getFullText() . '}}</div>', $this->mTitle );
                                return true;
                        }
                }
@@ -2584,6 +2588,9 @@ class EditPage {
                        }
                }
 
+               // Marker for detecting truncated form data.  This must be the last
+               // parameter sent in order to be of use, so do not move me.
+               $wgOut->addHTML( Html::hidden( 'wpUltimateParam', true ) );
                $wgOut->addHTML( $this->editFormTextBottom . "\n</form>\n" );
 
                if ( !$wgUser->getOption( 'previewontop' ) ) {
@@ -3548,7 +3555,7 @@ HTML
 
                        $previewHTML = $parserOutput->getText();
                        $this->mParserOutput = $parserOutput;
-                       $wgOut->addParserOutputNoText( $parserOutput );
+                       $wgOut->addParserOutputMetadata( $parserOutput );
 
                        if ( count( $parserOutput->getWarnings() ) ) {
                                $note .= "\n\n" . implode( "\n\n", $parserOutput->getWarnings() );
index 9cbb9d6..ce5f8a3 100644 (file)
@@ -104,6 +104,53 @@ if ( !function_exists( 'gzdecode' ) ) {
                return gzinflate( substr( $data, 10, -8 ) );
        }
 }
+
+// hash_equals function only exists in PHP >= 5.6.0
+if ( !function_exists( 'hash_equals' ) ) {
+       /**
+        * Check whether a user-provided string is equal to a fixed-length secret without
+        * revealing bytes of the secret through timing differences.
+        *
+        * This timing guarantee -- that a partial match takes the same time as a complete
+        * mismatch -- is why this function is used in some security-sensitive parts of the code.
+        * For example, it shouldn't be possible to guess an HMAC signature one byte at a time.
+        *
+        * Longer explanation: http://www.emerose.com/timing-attacks-explained
+        *
+        * @codeCoverageIgnore
+        * @param string $known_string Fixed-length secret to compare against
+        * @param string $user_string User-provided string
+        * @return bool True if the strings are the same, false otherwise
+        */
+       function hash_equals( $known_string, $user_string ) {
+               // Strict type checking as in PHP's native implementation
+               if ( !is_string( $known_string ) ) {
+                       trigger_error( 'hash_equals(): Expected known_string to be a string, ' .
+                               gettype( $known_string ) . ' given', E_USER_WARNING );
+
+                       return false;
+               }
+
+               if ( !is_string( $user_string ) ) {
+                       trigger_error( 'hash_equals(): Expected user_string to be a string, ' .
+                               gettype( $user_string ) . ' given', E_USER_WARNING );
+
+                       return false;
+               }
+
+               // Note that we do one thing PHP doesn't: try to avoid leaking information about
+               // relative lengths of $known_string and $user_string, and of multiple $known_strings.
+               // However, lengths may still inevitably leak through, for example, CPU cache misses.
+               $known_string_len = strlen( $known_string );
+               $user_string_len = strlen( $user_string );
+               $result = $known_string_len ^ $user_string_len;
+               for ( $i = 0; $i < $user_string_len; $i++ ) {
+                       $result |= ord( $known_string[$i % $known_string_len] ) ^ ord( $user_string[$i] );
+               }
+
+               return ( $result === 0 );
+       }
+}
 /// @endcond
 
 /**
@@ -3021,7 +3068,7 @@ function wfShellExec( $cmd, &$retval = null, $environ = array(),
  * @param array $environ optional environment variables which should be
  *   added to the executed command environment.
  * @param array $limits Optional array with limits(filesize, memory, time, walltime)
- *   this overwrites the global wgShellMax* limits.
+ *   this overwrites the global wgMaxShell* limits.
  * @return string Collected stdout and stderr as a string
  */
 function wfShellExecWithStderr( $cmd, &$retval = null, $environ = array(), $limits = array() ) {
@@ -4174,5 +4221,5 @@ function wfIsTrustedProxy( $ip ) {
  * @since 1.23 Supports CIDR ranges in $wgSquidServersNoPurge
  */
 function wfIsConfiguredProxy( $ip ) {
-       return IP::isTrustedProxy( $ip );
+       return IP::isConfiguredProxy( $ip );
 }
diff --git a/includes/ImagePage.php b/includes/ImagePage.php
deleted file mode 100644 (file)
index 5f385ac..0000000
+++ /dev/null
@@ -1,1567 +0,0 @@
-<?php
-/**
- * Special handling for file description 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
- *
- * @file
- */
-
-/**
- * Class for viewing MediaWiki file description pages
- *
- * @ingroup Media
- */
-class ImagePage extends Article {
-       /** @var File */
-       private $displayImg;
-
-       /** @var FileRepo */
-       private $repo;
-
-       /** @var bool */
-       private $fileLoaded;
-
-       /** @var bool */
-       protected $mExtraDescription = false;
-
-       /**
-        * @param Title $title
-        * @return WikiFilePage
-        */
-       protected function newPage( Title $title ) {
-               // Overload mPage with a file-specific page
-               return new WikiFilePage( $title );
-       }
-
-       /**
-        * Constructor from a page id
-        * @param int $id Article ID to load
-        * @return ImagePage|null
-        */
-       public static function newFromID( $id ) {
-               $t = Title::newFromID( $id );
-               # @todo FIXME: Doesn't inherit right
-               return $t == null ? null : new self( $t );
-               # return $t == null ? null : new static( $t ); // PHP 5.3
-       }
-
-       /**
-        * @param File $file
-        * @return void
-        */
-       public function setFile( $file ) {
-               $this->mPage->setFile( $file );
-               $this->displayImg = $file;
-               $this->fileLoaded = true;
-       }
-
-       protected function loadFile() {
-               if ( $this->fileLoaded ) {
-                       return;
-               }
-               $this->fileLoaded = true;
-
-               $this->displayImg = $img = false;
-               wfRunHooks( 'ImagePageFindFile', array( $this, &$img, &$this->displayImg ) );
-               if ( !$img ) { // not set by hook?
-                       $img = wfFindFile( $this->getTitle() );
-                       if ( !$img ) {
-                               $img = wfLocalFile( $this->getTitle() );
-                       }
-               }
-               $this->mPage->setFile( $img );
-               if ( !$this->displayImg ) { // not set by hook?
-                       $this->displayImg = $img;
-               }
-               $this->repo = $img->getRepo();
-       }
-
-       /**
-        * Handler for action=render
-        * Include body text only; none of the image extras
-        */
-       public function render() {
-               $this->getContext()->getOutput()->setArticleBodyOnly( true );
-               parent::view();
-       }
-
-       public function view() {
-               global $wgShowEXIF;
-
-               $out = $this->getContext()->getOutput();
-               $request = $this->getContext()->getRequest();
-               $diff = $request->getVal( 'diff' );
-               $diffOnly = $request->getBool(
-                       'diffonly',
-                       $this->getContext()->getUser()->getOption( 'diffonly' )
-               );
-
-               if ( $this->getTitle()->getNamespace() != NS_FILE || ( $diff !== null && $diffOnly ) ) {
-                       parent::view();
-                       return;
-               }
-
-               $this->loadFile();
-
-               if ( $this->getTitle()->getNamespace() == NS_FILE && $this->mPage->getFile()->getRedirected() ) {
-                       if ( $this->getTitle()->getDBkey() == $this->mPage->getFile()->getName() || $diff !== null ) {
-                               // mTitle is the same as the redirect target so ask Article
-                               // to perform the redirect for us.
-                               $request->setVal( 'diffonly', 'true' );
-                               parent::view();
-                               return;
-                       } else {
-                               // mTitle is not the same as the redirect target so it is
-                               // probably the redirect page itself. Fake the redirect symbol
-                               $out->setPageTitle( $this->getTitle()->getPrefixedText() );
-                               $out->addHTML( $this->viewRedirect(
-                                       Title::makeTitle( NS_FILE, $this->mPage->getFile()->getName() ),
-                                       /* $appendSubtitle */ true,
-                                       /* $forceKnown */ true )
-                               );
-                               $this->mPage->doViewUpdates( $this->getContext()->getUser(), $this->getOldID() );
-                               return;
-                       }
-               }
-
-               if ( $wgShowEXIF && $this->displayImg->exists() ) {
-                       // @todo FIXME: Bad interface, see note on MediaHandler::formatMetadata().
-                       $formattedMetadata = $this->displayImg->formatMetadata();
-                       $showmeta = $formattedMetadata !== false;
-               } else {
-                       $showmeta = false;
-               }
-
-               if ( !$diff && $this->displayImg->exists() ) {
-                       $out->addHTML( $this->showTOC( $showmeta ) );
-               }
-
-               if ( !$diff ) {
-                       $this->openShowImage();
-               }
-
-               # No need to display noarticletext, we use our own message, output in openShowImage()
-               if ( $this->mPage->getID() ) {
-                       # NS_FILE is in the user language, but this section (the actual wikitext)
-                       # should be in page content language
-                       $pageLang = $this->getTitle()->getPageViewLanguage();
-                       $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
-                       $out->setArticleFlag( true );
-                       $out->setPageTitle( $this->getTitle()->getPrefixedText() );
-                       $this->mPage->doViewUpdates( $this->getContext()->getUser(), $this->getOldID() );
-               }
-
-               # Show shared description, if needed
-               if ( $this->mExtraDescription ) {
-                       $fol = wfMessage( 'shareddescriptionfollows' );
-                       if ( !$fol->isDisabled() ) {
-                               $out->addWikiText( $fol->plain() );
-                       }
-                       $out->addHTML( '<div id="shared-image-desc">' . $this->mExtraDescription . "</div>\n" );
-               }
-
-               $this->closeShowImage();
-               $this->imageHistory();
-               // TODO: Cleanup the following
-
-               $out->addHTML( Xml::element( 'h2',
-                       array( 'id' => 'filelinks' ),
-                       wfMessage( 'imagelinks' )->text() ) . "\n" );
-               $this->imageDupes();
-               # @todo FIXME: For some freaky reason, we can't redirect to foreign images.
-               # Yet we return metadata about the target. Definitely an issue in the FileRepo
-               $this->imageLinks();
-
-               # Allow extensions to add something after the image links
-               $html = '';
-               wfRunHooks( 'ImagePageAfterImageLinks', array( $this, &$html ) );
-               if ( $html ) {
-                       $out->addHTML( $html );
-               }
-
-               if ( $showmeta ) {
-                       $out->addHTML( Xml::element(
-                               'h2',
-                               array( 'id' => 'metadata' ),
-                               wfMessage( 'metadata' )->text() ) . "\n" );
-                       $out->addWikiText( $this->makeMetadataTable( $formattedMetadata ) );
-                       $out->addModules( array( 'mediawiki.action.view.metadata' ) );
-               }
-
-               // Add remote Filepage.css
-               if ( !$this->repo->isLocal() ) {
-                       $css = $this->repo->getDescriptionStylesheetUrl();
-                       if ( $css ) {
-                               $out->addStyle( $css );
-                       }
-               }
-               // always show the local local Filepage.css, bug 29277
-               $out->addModuleStyles( 'filepage' );
-       }
-
-       /**
-        * @return File
-        */
-       public function getDisplayedFile() {
-               $this->loadFile();
-               return $this->displayImg;
-       }
-
-       /**
-        * Create the TOC
-        *
-        * @param bool $metadata Whether or not to show the metadata link
-        * @return string
-        */
-       protected function showTOC( $metadata ) {
-               $r = array(
-                       '<li><a href="#file">' . wfMessage( 'file-anchor-link' )->escaped() . '</a></li>',
-                       '<li><a href="#filehistory">' . wfMessage( 'filehist' )->escaped() . '</a></li>',
-                       '<li><a href="#filelinks">' . wfMessage( 'imagelinks' )->escaped() . '</a></li>',
-               );
-               if ( $metadata ) {
-                       $r[] = '<li><a href="#metadata">' . wfMessage( 'metadata' )->escaped() . '</a></li>';
-               }
-
-               wfRunHooks( 'ImagePageShowTOC', array( $this, &$r ) );
-
-               return '<ul id="filetoc">' . implode( "\n", $r ) . '</ul>';
-       }
-
-       /**
-        * Make a table with metadata to be shown in the output page.
-        *
-        * @todo FIXME: Bad interface, see note on MediaHandler::formatMetadata().
-        *
-        * @param array $metadata The array containing the Exif data
-        * @return string The metadata table. This is treated as Wikitext (!)
-        */
-       protected function makeMetadataTable( $metadata ) {
-               $r = "<div class=\"mw-imagepage-section-metadata\">";
-               $r .= wfMessage( 'metadata-help' )->plain();
-               $r .= "<table id=\"mw_metadata\" class=\"mw_metadata\">\n";
-               foreach ( $metadata as $type => $stuff ) {
-                       foreach ( $stuff as $v ) {
-                               # @todo FIXME: Why is this using escapeId for a class?!
-                               $class = Sanitizer::escapeId( $v['id'] );
-                               if ( $type == 'collapsed' ) {
-                                       // Handled by mediawiki.action.view.metadata module
-                                       // and skins/common/shared.css.
-                                       $class .= ' collapsable';
-                               }
-                               $r .= "<tr class=\"$class\">\n";
-                               $r .= "<th>{$v['name']}</th>\n";
-                               $r .= "<td>{$v['value']}</td>\n</tr>";
-                       }
-               }
-               $r .= "</table>\n</div>\n";
-               return $r;
-       }
-
-       /**
-        * Overloading Article's getContentObject method.
-        *
-        * Omit noarticletext if sharedupload; text will be fetched from the
-        * shared upload server if possible.
-        * @return string
-        */
-       public function getContentObject() {
-               $this->loadFile();
-               if ( $this->mPage->getFile() && !$this->mPage->getFile()->isLocal() && 0 == $this->getID() ) {
-                       return null;
-               }
-               return parent::getContentObject();
-       }
-
-       protected function openShowImage() {
-               global $wgImageLimits, $wgEnableUploads, $wgSend404Code;
-
-               $this->loadFile();
-               $out = $this->getContext()->getOutput();
-               $user = $this->getContext()->getUser();
-               $lang = $this->getContext()->getLanguage();
-               $dirmark = $lang->getDirMarkEntity();
-               $request = $this->getContext()->getRequest();
-
-               $max = $this->getImageLimitsFromOption( $user, 'imagesize' );
-               $maxWidth = $max[0];
-               $maxHeight = $max[1];
-
-               if ( $this->displayImg->exists() ) {
-                       # image
-                       $page = $request->getIntOrNull( 'page' );
-                       if ( is_null( $page ) ) {
-                               $params = array();
-                               $page = 1;
-                       } else {
-                               $params = array( 'page' => $page );
-                       }
-
-                       $renderLang = $request->getVal( 'lang' );
-                       if ( !is_null( $renderLang ) ) {
-                               $handler = $this->displayImg->getHandler();
-                               if ( $handler && $handler->validateParam( 'lang', $renderLang ) ) {
-                                       $params['lang'] = $renderLang;
-                               } else {
-                                       $renderLang = null;
-                               }
-                       }
-
-                       $width_orig = $this->displayImg->getWidth( $page );
-                       $width = $width_orig;
-                       $height_orig = $this->displayImg->getHeight( $page );
-                       $height = $height_orig;
-
-                       $filename = wfEscapeWikiText( $this->displayImg->getName() );
-                       $linktext = $filename;
-
-                       wfRunHooks( 'ImageOpenShowImageInlineBefore', array( &$this, &$out ) );
-
-                       if ( $this->displayImg->allowInlineDisplay() ) {
-                               # image
-
-                               # "Download high res version" link below the image
-                               # $msgsize = wfMessage( 'file-info-size', $width_orig, $height_orig,
-                               #   Linker::formatSize( $this->displayImg->getSize() ), $mime )->escaped();
-                               # We'll show a thumbnail of this image
-                               if ( $width > $maxWidth || $height > $maxHeight ) {
-                                       # Calculate the thumbnail size.
-                                       # First case, the limiting factor is the width, not the height.
-                                       /** @todo // FIXME: Possible division by 0. bug 36911 */
-                                       if ( $width / $height >= $maxWidth / $maxHeight ) {
-                                               /** @todo // FIXME: Possible division by 0. bug 36911 */
-                                               $height = round( $height * $maxWidth / $width );
-                                               $width = $maxWidth;
-                                               # Note that $height <= $maxHeight now.
-                                       } else {
-                                               /** @todo // FIXME: Possible division by 0. bug 36911 */
-                                               $newwidth = floor( $width * $maxHeight / $height );
-                                               /** @todo // FIXME: Possible division by 0. bug 36911 */
-                                               $height = round( $height * $newwidth / $width );
-                                               $width = $newwidth;
-                                               # Note that $height <= $maxHeight now, but might not be identical
-                                               # because of rounding.
-                                       }
-                                       $linktext = wfMessage( 'show-big-image' )->escaped();
-                                       if ( $this->displayImg->getRepo()->canTransformVia404() ) {
-                                               $thumbSizes = $wgImageLimits;
-                                               // Also include the full sized resolution in the list, so
-                                               // that users know they can get it. This will link to the
-                                               // original file asset if mustRender() === false. In the case
-                                               // that we mustRender, some users have indicated that they would
-                                               // find it useful to have the full size image in the rendered
-                                               // image format.
-                                               $thumbSizes[] = array( $width_orig, $height_orig );
-                                       } else {
-                                               # Creating thumb links triggers thumbnail generation.
-                                               # Just generate the thumb for the current users prefs.
-                                               $thumbSizes = array( $this->getImageLimitsFromOption( $user, 'thumbsize' ) );
-                                               if ( !$this->displayImg->mustRender() ) {
-                                                       // We can safely include a link to the "full-size" preview,
-                                                       // without actually rendering.
-                                                       $thumbSizes[] = array( $width_orig, $height_orig );
-                                               }
-                                       }
-                                       # Generate thumbnails or thumbnail links as needed...
-                                       $otherSizes = array();
-                                       foreach ( $thumbSizes as $size ) {
-                                               // We include a thumbnail size in the list, if it is
-                                               // less than or equal to the original size of the image
-                                               // asset ($width_orig/$height_orig). We also exclude
-                                               // the current thumbnail's size ($width/$height)
-                                               // since that is added to the message separately, so
-                                               // it can be denoted as the current size being shown.
-                                               if ( $size[0] <= $width_orig && $size[1] <= $height_orig
-                                                       && $size[0] != $width && $size[1] != $height
-                                               ) {
-                                                       $sizeLink = $this->makeSizeLink( $params, $size[0], $size[1] );
-                                                       if ( $sizeLink ) {
-                                                               $otherSizes[] = $sizeLink;
-                                                       }
-                                               }
-                                       }
-                                       $otherSizes = array_unique( $otherSizes );
-                                       $msgsmall = '';
-                                       $sizeLinkBigImagePreview = $this->makeSizeLink( $params, $width, $height );
-                                       if ( $sizeLinkBigImagePreview ) {
-                                               $msgsmall .= wfMessage( 'show-big-image-preview' )->
-                                                       rawParams( $sizeLinkBigImagePreview )->
-                                                       parse();
-                                       }
-                                       if ( count( $otherSizes ) ) {
-                                               $msgsmall .= ' ' .
-                                               Html::rawElement( 'span', array( 'class' => 'mw-filepage-other-resolutions' ),
-                                                       wfMessage( 'show-big-image-other' )->rawParams( $lang->pipeList( $otherSizes ) )->
-                                                       params( count( $otherSizes ) )->parse()
-                                               );
-                                       }
-                               } elseif ( $width == 0 && $height == 0 ) {
-                                       # Some sort of audio file that doesn't have dimensions
-                                       # Don't output a no hi res message for such a file
-                                       $msgsmall = '';
-                               } elseif ( $this->displayImg->isVectorized() ) {
-                                       # For vectorized images, full size is just the frame size
-                                       $msgsmall = '';
-                               } else {
-                                       # Image is small enough to show full size on image page
-                                       $msgsmall = wfMessage( 'file-nohires' )->parse();
-                               }
-
-                               $params['width'] = $width;
-                               $params['height'] = $height;
-                               $thumbnail = $this->displayImg->transform( $params );
-                               Linker::processResponsiveImages( $this->displayImg, $thumbnail, $params );
-
-                               $anchorclose = Html::rawElement(
-                                       'div',
-                                       array( 'class' => 'mw-filepage-resolutioninfo' ),
-                                       $msgsmall
-                               );
-
-                               $isMulti = $this->displayImg->isMultipage() && $this->displayImg->pageCount() > 1;
-                               if ( $isMulti ) {
-                                       $out->addModules( 'mediawiki.page.image.pagination' );
-                                       $out->addHTML( '<table class="multipageimage"><tr><td>' );
-                               }
-
-                               if ( $thumbnail ) {
-                                       $options = array(
-                                               'alt' => $this->displayImg->getTitle()->getPrefixedText(),
-                                               'file-link' => true,
-                                       );
-                                       $out->addHTML( '<div class="fullImageLink" id="file">' .
-                                               $thumbnail->toHtml( $options ) .
-                                               $anchorclose . "</div>\n" );
-                               }
-
-                               if ( $isMulti ) {
-                                       $count = $this->displayImg->pageCount();
-
-                                       if ( $page > 1 ) {
-                                               $label = $out->parse( wfMessage( 'imgmultipageprev' )->text(), false );
-                                               $link = Linker::linkKnown(
-                                                       $this->getTitle(),
-                                                       $label,
-                                                       array(),
-                                                       array( 'page' => $page - 1 )
-                                               );
-                                               $thumb1 = Linker::makeThumbLinkObj(
-                                                       $this->getTitle(),
-                                                       $this->displayImg,
-                                                       $link,
-                                                       $label,
-                                                       'none',
-                                                       array( 'page' => $page - 1 )
-                                               );
-                                       } else {
-                                               $thumb1 = '';
-                                       }
-
-                                       if ( $page < $count ) {
-                                               $label = wfMessage( 'imgmultipagenext' )->text();
-                                               $link = Linker::linkKnown(
-                                                       $this->getTitle(),
-                                                       $label,
-                                                       array(),
-                                                       array( 'page' => $page + 1 )
-                                               );
-                                               $thumb2 = Linker::makeThumbLinkObj(
-                                                       $this->getTitle(),
-                                                       $this->displayImg,
-                                                       $link,
-                                                       $label,
-                                                       'none',
-                                                       array( 'page' => $page + 1 )
-                                               );
-                                       } else {
-                                               $thumb2 = '';
-                                       }
-
-                                       global $wgScript;
-
-                                       $formParams = array(
-                                               'name' => 'pageselector',
-                                               'action' => $wgScript,
-                                       );
-                                       $options = array();
-                                       for ( $i = 1; $i <= $count; $i++ ) {
-                                               $options[] = Xml::option( $lang->formatNum( $i ), $i, $i == $page );
-                                       }
-                                       $select = Xml::tags( 'select',
-                                               array( 'id' => 'pageselector', 'name' => 'page' ),
-                                               implode( "\n", $options ) );
-
-                                       $out->addHTML(
-                                               '</td><td><div class="multipageimagenavbox">' .
-                                               Xml::openElement( 'form', $formParams ) .
-                                               Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
-                                                       wfMessage( 'imgmultigoto' )->rawParams( $select )->parse() .
-                                               Xml::submitButton( wfMessage( 'imgmultigo' )->text() ) .
-                                               Xml::closeElement( 'form' ) .
-                                               "<hr />$thumb1\n$thumb2<br style=\"clear: both\" /></div></td></tr></table>"
-                                       );
-                               }
-                       } elseif ( $this->displayImg->isSafeFile() ) {
-                               # if direct link is allowed but it's not a renderable image, show an icon.
-                               $icon = $this->displayImg->iconThumb();
-
-                               $out->addHTML( '<div class="fullImageLink" id="file">' .
-                                       $icon->toHtml( array( 'file-link' => true ) ) .
-                                       "</div>\n" );
-                       }
-
-                       $longDesc = wfMessage( 'parentheses', $this->displayImg->getLongDesc() )->text();
-
-                       $medialink = "[[Media:$filename|$linktext]]";
-
-                       if ( !$this->displayImg->isSafeFile() ) {
-                               $warning = wfMessage( 'mediawarning' )->plain();
-                               // dirmark is needed here to separate the file name, which
-                               // most likely ends in Latin characters, from the description,
-                               // which may begin with the file type. In RTL environment
-                               // this will get messy.
-                               // The dirmark, however, must not be immediately adjacent
-                               // to the filename, because it can get copied with it.
-                               // See bug 25277.
-                               // @codingStandardsIgnoreStart Ignore long line
-                               $out->addWikiText( <<<EOT
-<div class="fullMedia"><span class="dangerousLink">{$medialink}</span> $dirmark<span class="fileInfo">$longDesc</span></div>
-<div class="mediaWarning">$warning</div>
-EOT
-                               );
-                               // @codingStandardsIgnoreEnd
-                       } else {
-                               $out->addWikiText( <<<EOT
-<div class="fullMedia">{$medialink} {$dirmark}<span class="fileInfo">$longDesc</span>
-</div>
-EOT
-                               );
-                       }
-
-                       $renderLangOptions = $this->displayImg->getAvailableLanguages();
-                       if ( count( $renderLangOptions ) >= 1 ) {
-                               $currentLanguage = $renderLang;
-                               $defaultLang = $this->displayImg->getDefaultRenderLanguage();
-                               if ( is_null( $currentLanguage ) ) {
-                                       $currentLanguage = $defaultLang;
-                               }
-                               $out->addHtml( $this->doRenderLangOpt( $renderLangOptions, $currentLanguage, $defaultLang ) );
-                       }
-
-                       // Add cannot animate thumbnail warning
-                       if ( !$this->displayImg->canAnimateThumbIfAppropriate() ) {
-                               // Include the extension so wiki admins can
-                               // customize it on a per file-type basis
-                               // (aka say things like use format X instead).
-                               // additionally have a specific message for
-                               // file-no-thumb-animation-gif
-                               $ext = $this->displayImg->getExtension();
-                               $noAnimMesg = wfMessageFallback(
-                                       'file-no-thumb-animation-' . $ext,
-                                       'file-no-thumb-animation'
-                               )->plain();
-
-                               $out->addWikiText( <<<EOT
-<div class="mw-noanimatethumb">{$noAnimMesg}</div>
-EOT
-                               );
-                       }
-
-                       if ( !$this->displayImg->isLocal() ) {
-                               $this->printSharedImageText();
-                       }
-               } else {
-                       # Image does not exist
-                       if ( !$this->getID() ) {
-                               # No article exists either
-                               # Show deletion log to be consistent with normal articles
-                               LogEventsList::showLogExtract(
-                                       $out,
-                                       array( 'delete', 'move' ),
-                                       $this->getTitle()->getPrefixedText(),
-                                       '',
-                                       array( 'lim' => 10,
-                                               'conds' => array( "log_action != 'revision'" ),
-                                               'showIfEmpty' => false,
-                                               'msgKey' => array( 'moveddeleted-notice' )
-                                       )
-                               );
-                       }
-
-                       if ( $wgEnableUploads && $user->isAllowed( 'upload' ) ) {
-                               // Only show an upload link if the user can upload
-                               $uploadTitle = SpecialPage::getTitleFor( 'Upload' );
-                               $nofile = array(
-                                       'filepage-nofile-link',
-                                       $uploadTitle->getFullURL( array( 'wpDestFile' => $this->mPage->getFile()->getName() ) )
-                               );
-                       } else {
-                               $nofile = 'filepage-nofile';
-                       }
-                       // Note, if there is an image description page, but
-                       // no image, then this setRobotPolicy is overridden
-                       // by Article::View().
-                       $out->setRobotPolicy( 'noindex,nofollow' );
-                       $out->wrapWikiMsg( "<div id='mw-imagepage-nofile' class='plainlinks'>\n$1\n</div>", $nofile );
-                       if ( !$this->getID() && $wgSend404Code ) {
-                               // If there is no image, no shared image, and no description page,
-                               // output a 404, to be consistent with articles.
-                               $request->response()->header( 'HTTP/1.1 404 Not Found' );
-                       }
-               }
-               $out->setFileVersion( $this->displayImg );
-       }
-
-       /**
-        * Creates an thumbnail of specified size and returns an HTML link to it
-        * @param array $params Scaler parameters
-        * @param int $width
-        * @param int $height
-        * @return string
-        */
-       private function makeSizeLink( $params, $width, $height ) {
-               $params['width'] = $width;
-               $params['height'] = $height;
-               $thumbnail = $this->displayImg->transform( $params );
-               if ( $thumbnail && !$thumbnail->isError() ) {
-                       return Html::rawElement( 'a', array(
-                               'href' => $thumbnail->getUrl(),
-                               'class' => 'mw-thumbnail-link'
-                               ), wfMessage( 'show-big-image-size' )->numParams(
-                                       $thumbnail->getWidth(), $thumbnail->getHeight()
-                               )->parse() );
-               } else {
-                       return '';
-               }
-       }
-
-       /**
-        * Show a notice that the file is from a shared repository
-        */
-       protected function printSharedImageText() {
-               $out = $this->getContext()->getOutput();
-               $this->loadFile();
-
-               $descUrl = $this->mPage->getFile()->getDescriptionUrl();
-               $descText = $this->mPage->getFile()->getDescriptionText( $this->getContext()->getLanguage() );
-
-               /* Add canonical to head if there is no local page for this shared file */
-               if ( $descUrl && $this->mPage->getID() == 0 ) {
-                       $out->setCanonicalUrl( $descUrl );
-               }
-
-               $wrap = "<div class=\"sharedUploadNotice\">\n$1\n</div>\n";
-               $repo = $this->mPage->getFile()->getRepo()->getDisplayName();
-
-               if ( $descUrl && $descText && wfMessage( 'sharedupload-desc-here' )->plain() !== '-' ) {
-                       $out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-here', $repo, $descUrl ) );
-               } elseif ( $descUrl && wfMessage( 'sharedupload-desc-there' )->plain() !== '-' ) {
-                       $out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-there', $repo, $descUrl ) );
-               } else {
-                       $out->wrapWikiMsg( $wrap, array( 'sharedupload', $repo ), ''/*BACKCOMPAT*/ );
-               }
-
-               if ( $descText ) {
-                       $this->mExtraDescription = $descText;
-               }
-       }
-
-       public function getUploadUrl() {
-               $this->loadFile();
-               $uploadTitle = SpecialPage::getTitleFor( 'Upload' );
-               return $uploadTitle->getFullURL( array(
-                       'wpDestFile' => $this->mPage->getFile()->getName(),
-                       'wpForReUpload' => 1
-               ) );
-       }
-
-       /**
-        * Print out the various links at the bottom of the image page, e.g. reupload,
-        * external editing (and instructions link) etc.
-        */
-       protected function uploadLinksBox() {
-               global $wgEnableUploads;
-
-               if ( !$wgEnableUploads ) {
-                       return;
-               }
-
-               $this->loadFile();
-               if ( !$this->mPage->getFile()->isLocal() ) {
-                       return;
-               }
-
-               $out = $this->getContext()->getOutput();
-               $out->addHTML( "<ul>\n" );
-
-               # "Upload a new version of this file" link
-               $canUpload = $this->getTitle()->userCan( 'upload', $this->getContext()->getUser() );
-               if ( $canUpload && UploadBase::userCanReUpload(
-                               $this->getContext()->getUser(),
-                               $this->mPage->getFile()->name )
-               ) {
-                       $ulink = Linker::makeExternalLink(
-                               $this->getUploadUrl(),
-                               wfMessage( 'uploadnewversion-linktext' )->text()
-                       );
-                       $out->addHTML( "<li id=\"mw-imagepage-reupload-link\">"
-                               . "<div class=\"plainlinks\">{$ulink}</div></li>\n" );
-               } else {
-                       $out->addHTML( "<li id=\"mw-imagepage-upload-disallowed\">"
-                               . $this->getContext()->msg( 'upload-disallowed-here' )->escaped() . "</li>\n" );
-               }
-
-               $out->addHTML( "</ul>\n" );
-       }
-
-       /**
-        * For overloading
-        */
-       protected function closeShowImage() {
-       }
-
-       /**
-        * If the page we've just displayed is in the "Image" namespace,
-        * we follow it with an upload history of the image and its usage.
-        */
-       protected function imageHistory() {
-               $this->loadFile();
-               $out = $this->getContext()->getOutput();
-               $pager = new ImageHistoryPseudoPager( $this );
-               $out->addHTML( $pager->getBody() );
-               $out->preventClickjacking( $pager->getPreventClickjacking() );
-
-               $this->mPage->getFile()->resetHistory(); // free db resources
-
-               # Exist check because we don't want to show this on pages where an image
-               # doesn't exist along with the noimage message, that would suck. -ævar
-               if ( $this->mPage->getFile()->exists() ) {
-                       $this->uploadLinksBox();
-               }
-       }
-
-       /**
-        * @param string $target
-        * @param int $limit
-        * @return ResultWrapper
-        */
-       protected function queryImageLinks( $target, $limit ) {
-               $dbr = wfGetDB( DB_SLAVE );
-
-               return $dbr->select(
-                       array( 'imagelinks', 'page' ),
-                       array( 'page_namespace', 'page_title', 'il_to' ),
-                       array( 'il_to' => $target, 'il_from = page_id' ),
-                       __METHOD__,
-                       array( 'LIMIT' => $limit + 1, 'ORDER BY' => 'il_from', )
-               );
-       }
-
-       protected function imageLinks() {
-               $limit = 100;
-
-               $out = $this->getContext()->getOutput();
-
-               $rows = array();
-               $redirects = array();
-               foreach ( $this->getTitle()->getRedirectsHere( NS_FILE ) as $redir ) {
-                       $redirects[$redir->getDBkey()] = array();
-                       $rows[] = (object)array(
-                               'page_namespace' => NS_FILE,
-                               'page_title' => $redir->getDBkey(),
-                       );
-               }
-
-               $res = $this->queryImageLinks( $this->getTitle()->getDBkey(), $limit + 1 );
-               foreach ( $res as $row ) {
-                       $rows[] = $row;
-               }
-               $count = count( $rows );
-
-               $hasMore = $count > $limit;
-               if ( !$hasMore && count( $redirects ) ) {
-                       $res = $this->queryImageLinks( array_keys( $redirects ),
-                               $limit - count( $rows ) + 1 );
-                       foreach ( $res as $row ) {
-                               $redirects[$row->il_to][] = $row;
-                               $count++;
-                       }
-                       $hasMore = ( $res->numRows() + count( $rows ) ) > $limit;
-               }
-
-               if ( $count == 0 ) {
-                       $out->wrapWikiMsg(
-                               Html::rawElement( 'div',
-                                       array( 'id' => 'mw-imagepage-nolinkstoimage' ), "\n$1\n" ),
-                               'nolinkstoimage'
-                       );
-                       return;
-               }
-
-               $out->addHTML( "<div id='mw-imagepage-section-linkstoimage'>\n" );
-               if ( !$hasMore ) {
-                       $out->addWikiMsg( 'linkstoimage', $count );
-               } else {
-                       // More links than the limit. Add a link to [[Special:Whatlinkshere]]
-                       $out->addWikiMsg( 'linkstoimage-more',
-                               $this->getContext()->getLanguage()->formatNum( $limit ),
-                               $this->getTitle()->getPrefixedDBkey()
-                       );
-               }
-
-               $out->addHTML(
-                       Html::openElement( 'ul',
-                               array( 'class' => 'mw-imagepage-linkstoimage' ) ) . "\n"
-               );
-               $count = 0;
-
-               // Sort the list by namespace:title
-               usort( $rows, array( $this, 'compare' ) );
-
-               // Create links for every element
-               $currentCount = 0;
-               foreach ( $rows as $element ) {
-                       $currentCount++;
-                       if ( $currentCount > $limit ) {
-                               break;
-                       }
-
-                       $query = array();
-                       # Add a redirect=no to make redirect pages reachable
-                       if ( isset( $redirects[$element->page_title] ) ) {
-                               $query['redirect'] = 'no';
-                       }
-                       $link = Linker::linkKnown(
-                               Title::makeTitle( $element->page_namespace, $element->page_title ),
-                               null, array(), $query
-                       );
-                       if ( !isset( $redirects[$element->page_title] ) ) {
-                               # No redirects
-                               $liContents = $link;
-                       } elseif ( count( $redirects[$element->page_title] ) === 0 ) {
-                               # Redirect without usages
-                               $liContents = wfMessage( 'linkstoimage-redirect' )->rawParams( $link, '' )->parse();
-                       } else {
-                               # Redirect with usages
-                               $li = '';
-                               foreach ( $redirects[$element->page_title] as $row ) {
-                                       $currentCount++;
-                                       if ( $currentCount > $limit ) {
-                                               break;
-                                       }
-
-                                       $link2 = Linker::linkKnown( Title::makeTitle( $row->page_namespace, $row->page_title ) );
-                                       $li .= Html::rawElement(
-                                               'li',
-                                               array( 'class' => 'mw-imagepage-linkstoimage-ns' . $element->page_namespace ),
-                                               $link2
-                                               ) . "\n";
-                               }
-
-                               $ul = Html::rawElement(
-                                       'ul',
-                                       array( 'class' => 'mw-imagepage-redirectstofile' ),
-                                       $li
-                                       ) . "\n";
-                               $liContents = wfMessage( 'linkstoimage-redirect' )->rawParams(
-                                       $link, $ul )->parse();
-                       }
-                       $out->addHTML( Html::rawElement(
-                                       'li',
-                                       array( 'class' => 'mw-imagepage-linkstoimage-ns' . $element->page_namespace ),
-                                       $liContents
-                               ) . "\n"
-                       );
-
-               };
-               $out->addHTML( Html::closeElement( 'ul' ) . "\n" );
-               $res->free();
-
-               // Add a links to [[Special:Whatlinkshere]]
-               if ( $count > $limit ) {
-                       $out->addWikiMsg( 'morelinkstoimage', $this->getTitle()->getPrefixedDBkey() );
-               }
-               $out->addHTML( Html::closeElement( 'div' ) . "\n" );
-       }
-
-       protected function imageDupes() {
-               $this->loadFile();
-               $out = $this->getContext()->getOutput();
-
-               $dupes = $this->mPage->getDuplicates();
-               if ( count( $dupes ) == 0 ) {
-                       return;
-               }
-
-               $out->addHTML( "<div id='mw-imagepage-section-duplicates'>\n" );
-               $out->addWikiMsg( 'duplicatesoffile',
-                       $this->getContext()->getLanguage()->formatNum( count( $dupes ) ), $this->getTitle()->getDBkey()
-               );
-               $out->addHTML( "<ul class='mw-imagepage-duplicates'>\n" );
-
-               /**
-                * @var $file File
-                */
-               foreach ( $dupes as $file ) {
-                       $fromSrc = '';
-                       if ( $file->isLocal() ) {
-                               $link = Linker::linkKnown( $file->getTitle() );
-                       } else {
-                               $link = Linker::makeExternalLink( $file->getDescriptionUrl(),
-                                       $file->getTitle()->getPrefixedText() );
-                               $fromSrc = wfMessage( 'shared-repo-from', $file->getRepo()->getDisplayName() )->text();
-                       }
-                       $out->addHTML( "<li>{$link} {$fromSrc}</li>\n" );
-               }
-               $out->addHTML( "</ul></div>\n" );
-       }
-
-       /**
-        * Delete the file, or an earlier version of it
-        */
-       public function delete() {
-               $file = $this->mPage->getFile();
-               if ( !$file->exists() || !$file->isLocal() || $file->getRedirected() ) {
-                       // Standard article deletion
-                       parent::delete();
-                       return;
-               }
-
-               $deleter = new FileDeleteForm( $file );
-               $deleter->execute();
-       }
-
-       /**
-        * Display an error with a wikitext description
-        *
-        * @param string $description
-        */
-       function showError( $description ) {
-               $out = $this->getContext()->getOutput();
-               $out->setPageTitle( wfMessage( 'internalerror' ) );
-               $out->setRobotPolicy( 'noindex,nofollow' );
-               $out->setArticleRelated( false );
-               $out->enableClientCache( false );
-               $out->addWikiText( $description );
-       }
-
-       /**
-        * Callback for usort() to do link sorts by (namespace, title)
-        * Function copied from Title::compare()
-        *
-        * @param object $a Object page to compare with
-        * @param object $b Object page to compare with
-        * @return int Result of string comparison, or namespace comparison
-        */
-       protected function compare( $a, $b ) {
-               if ( $a->page_namespace == $b->page_namespace ) {
-                       return strcmp( $a->page_title, $b->page_title );
-               } else {
-                       return $a->page_namespace - $b->page_namespace;
-               }
-       }
-
-       /**
-        * Returns the corresponding $wgImageLimits entry for the selected user option
-        *
-        * @param User $user
-        * @param string $optionName Name of a option to check, typically imagesize or thumbsize
-        * @return array
-        * @since 1.21
-        */
-       public function getImageLimitsFromOption( $user, $optionName ) {
-               global $wgImageLimits;
-
-               $option = $user->getIntOption( $optionName );
-               if ( !isset( $wgImageLimits[$option] ) ) {
-                       $option = User::getDefaultOption( $optionName );
-               }
-
-               // The user offset might still be incorrect, specially if
-               // $wgImageLimits got changed (see bug #8858).
-               if ( !isset( $wgImageLimits[$option] ) ) {
-                       // Default to the first offset in $wgImageLimits
-                       $option = 0;
-               }
-
-               return isset( $wgImageLimits[$option] )
-                       ? $wgImageLimits[$option]
-                       : array( 800, 600 ); // if nothing is set, fallback to a hardcoded default
-       }
-
-       /**
-        * Output a drop-down box for language options for the file
-        *
-        * @param array $langChoices Array of string language codes
-        * @param string $curLang Language code file is being viewed in.
-        * @param string $defaultLang Language code that image is rendered in by default
-        * @return string HTML to insert underneath image.
-        */
-       protected function doRenderLangOpt( array $langChoices, $curLang, $defaultLang ) {
-               global $wgScript;
-               sort( $langChoices );
-               $curLang = wfBCP47( $curLang );
-               $defaultLang = wfBCP47( $defaultLang );
-               $opts = '';
-               $haveCurrentLang = false;
-               $haveDefaultLang = false;
-
-               // We make a list of all the language choices in the file.
-               // Additionally if the default language to render this file
-               // is not included as being in this file (for example, in svgs
-               // usually the fallback content is the english content) also
-               // include a choice for that. Last of all, if we're viewing
-               // the file in a language not on the list, add it as a choice.
-               foreach ( $langChoices as $lang ) {
-                       $code = wfBCP47( $lang );
-                       $name = Language::fetchLanguageName( $code, $this->getContext()->getLanguage()->getCode() );
-                       if ( $name !== '' ) {
-                               $display = wfMessage( 'img-lang-opt', $code, $name )->text();
-                       } else {
-                               $display = $code;
-                       }
-                       $opts .= "\n" . Xml::option( $display, $code, $curLang === $code );
-                       if ( $curLang === $code ) {
-                               $haveCurrentLang = true;
-                       }
-                       if ( $defaultLang === $code ) {
-                               $haveDefaultLang = true;
-                       }
-               }
-               if ( !$haveDefaultLang ) {
-                       // Its hard to know if the content is really in the default language, or
-                       // if its just unmarked content that could be in any language.
-                       $opts = Xml::option(
-                               wfMessage( 'img-lang-default' )->text(),
-                               $defaultLang,
-                               $defaultLang === $curLang
-                       ) . $opts;
-               }
-               if ( !$haveCurrentLang && $defaultLang !== $curLang ) {
-                       $name = Language::fetchLanguageName( $curLang, $this->getContext()->getLanguage()->getCode() );
-                       if ( $name !== '' ) {
-                               $display = wfMessage( 'img-lang-opt', $curLang, $name )->text();
-                       } else {
-                               $display = $curLang;
-                       }
-                       $opts = Xml::option( $display, $curLang, true ) . $opts;
-               }
-
-               $select = Html::rawElement(
-                       'select',
-                       array( 'id' => 'mw-imglangselector', 'name' => 'lang' ),
-                       $opts
-               );
-               $submit = Xml::submitButton( wfMessage( 'img-lang-go' )->text() );
-
-               $formContents = wfMessage( 'img-lang-info' )->rawParams( $select, $submit )->parse()
-                       . Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() );
-
-               $langSelectLine = Html::rawElement( 'div', array( 'id' => 'mw-imglangselector-line' ),
-                       Html::rawElement( 'form', array( 'action' => $wgScript ), $formContents )
-               );
-               return $langSelectLine;
-       }
-}
-
-/**
- * Builds the image revision log shown on image pages
- *
- * @ingroup Media
- */
-class ImageHistoryList extends ContextSource {
-
-       /**
-        * @var Title
-        */
-       protected $title;
-
-       /**
-        * @var File
-        */
-       protected $img;
-
-       /**
-        * @var ImagePage
-        */
-       protected $imagePage;
-
-       /**
-        * @var File
-        */
-       protected $current;
-
-       protected $repo, $showThumb;
-       protected $preventClickjacking = false;
-
-       /**
-        * @param ImagePage $imagePage
-        */
-       public function __construct( $imagePage ) {
-               global $wgShowArchiveThumbnails;
-               $this->current = $imagePage->getFile();
-               $this->img = $imagePage->getDisplayedFile();
-               $this->title = $imagePage->getTitle();
-               $this->imagePage = $imagePage;
-               $this->showThumb = $wgShowArchiveThumbnails && $this->img->canRender();
-               $this->setContext( $imagePage->getContext() );
-       }
-
-       /**
-        * @return ImagePage
-        */
-       public function getImagePage() {
-               return $this->imagePage;
-       }
-
-       /**
-        * @return File
-        */
-       public function getFile() {
-               return $this->img;
-       }
-
-       /**
-        * @param string $navLinks
-        * @return string
-        */
-       public function beginImageHistoryList( $navLinks = '' ) {
-               return Xml::element( 'h2', array( 'id' => 'filehistory' ), $this->msg( 'filehist' )->text() )
-                       . "\n"
-                       . "<div id=\"mw-imagepage-section-filehistory\">\n"
-                       . $this->msg( 'filehist-help' )->parseAsBlock()
-                       . $navLinks . "\n"
-                       . Xml::openElement( 'table', array( 'class' => 'wikitable filehistory' ) ) . "\n"
-                       . '<tr><td></td>'
-                       . ( $this->current->isLocal()
-                               && ( $this->getUser()->isAllowedAny( 'delete', 'deletedhistory' ) ) ? '<td></td>' : '' )
-                       . '<th>' . $this->msg( 'filehist-datetime' )->escaped() . '</th>'
-                       . ( $this->showThumb ? '<th>' . $this->msg( 'filehist-thumb' )->escaped() . '</th>' : '' )
-                       . '<th>' . $this->msg( 'filehist-dimensions' )->escaped() . '</th>'
-                       . '<th>' . $this->msg( 'filehist-user' )->escaped() . '</th>'
-                       . '<th>' . $this->msg( 'filehist-comment' )->escaped() . '</th>'
-                       . "</tr>\n";
-       }
-
-       /**
-        * @param string $navLinks
-        * @return string
-        */
-       public function endImageHistoryList( $navLinks = '' ) {
-               return "</table>\n$navLinks\n</div>\n";
-       }
-
-       /**
-        * @param bool $iscur
-        * @param File $file
-        * @return string
-        */
-       public function imageHistoryLine( $iscur, $file ) {
-               global $wgContLang;
-
-               $user = $this->getUser();
-               $lang = $this->getLanguage();
-               $timestamp = wfTimestamp( TS_MW, $file->getTimestamp() );
-               $img = $iscur ? $file->getName() : $file->getArchiveName();
-               $userId = $file->getUser( 'id' );
-               $userText = $file->getUser( 'text' );
-               $description = $file->getDescription( File::FOR_THIS_USER, $user );
-
-               $local = $this->current->isLocal();
-               $row = $selected = '';
-
-               // Deletion link
-               if ( $local && ( $user->isAllowedAny( 'delete', 'deletedhistory' ) ) ) {
-                       $row .= '<td>';
-                       # Link to remove from history
-                       if ( $user->isAllowed( 'delete' ) ) {
-                               $q = array( 'action' => 'delete' );
-                               if ( !$iscur ) {
-                                       $q['oldimage'] = $img;
-                               }
-                               $row .= Linker::linkKnown(
-                                       $this->title,
-                                       $this->msg( $iscur ? 'filehist-deleteall' : 'filehist-deleteone' )->escaped(),
-                                       array(), $q
-                               );
-                       }
-                       # Link to hide content. Don't show useless link to people who cannot hide revisions.
-                       $canHide = $user->isAllowed( 'deleterevision' );
-                       if ( $canHide || ( $user->isAllowed( 'deletedhistory' ) && $file->getVisibility() ) ) {
-                               if ( $user->isAllowed( 'delete' ) ) {
-                                       $row .= '<br />';
-                               }
-                               // If file is top revision or locked from this user, don't link
-                               if ( $iscur || !$file->userCan( File::DELETED_RESTRICTED, $user ) ) {
-                                       $del = Linker::revDeleteLinkDisabled( $canHide );
-                               } else {
-                                       list( $ts, ) = explode( '!', $img, 2 );
-                                       $query = array(
-                                               'type' => 'oldimage',
-                                               'target' => $this->title->getPrefixedText(),
-                                               'ids' => $ts,
-                                       );
-                                       $del = Linker::revDeleteLink( $query,
-                                               $file->isDeleted( File::DELETED_RESTRICTED ), $canHide );
-                               }
-                               $row .= $del;
-                       }
-                       $row .= '</td>';
-               }
-
-               // Reversion link/current indicator
-               $row .= '<td>';
-               if ( $iscur ) {
-                       $row .= $this->msg( 'filehist-current' )->escaped();
-               } elseif ( $local && $this->title->quickUserCan( 'edit', $user )
-                       && $this->title->quickUserCan( 'upload', $user )
-               ) {
-                       if ( $file->isDeleted( File::DELETED_FILE ) ) {
-                               $row .= $this->msg( 'filehist-revert' )->escaped();
-                       } else {
-                               $row .= Linker::linkKnown(
-                                       $this->title,
-                                       $this->msg( 'filehist-revert' )->escaped(),
-                                       array(),
-                                       array(
-                                               'action' => 'revert',
-                                               'oldimage' => $img,
-                                               'wpEditToken' => $user->getEditToken( $img )
-                                       )
-                               );
-                       }
-               }
-               $row .= '</td>';
-
-               // Date/time and image link
-               if ( $file->getTimestamp() === $this->img->getTimestamp() ) {
-                       $selected = "class='filehistory-selected'";
-               }
-               $row .= "<td $selected style='white-space: nowrap;'>";
-               if ( !$file->userCan( File::DELETED_FILE, $user ) ) {
-                       # Don't link to unviewable files
-                       $row .= '<span class="history-deleted">'
-                               . $lang->userTimeAndDate( $timestamp, $user ) . '</span>';
-               } elseif ( $file->isDeleted( File::DELETED_FILE ) ) {
-                       if ( $local ) {
-                               $this->preventClickjacking();
-                               $revdel = SpecialPage::getTitleFor( 'Revisiondelete' );
-                               # Make a link to review the image
-                               $url = Linker::linkKnown(
-                                       $revdel,
-                                       $lang->userTimeAndDate( $timestamp, $user ),
-                                       array(),
-                                       array(
-                                               'target' => $this->title->getPrefixedText(),
-                                               'file' => $img,
-                                               'token' => $user->getEditToken( $img )
-                                       )
-                               );
-                       } else {
-                               $url = $lang->userTimeAndDate( $timestamp, $user );
-                       }
-                       $row .= '<span class="history-deleted">' . $url . '</span>';
-               } else {
-                       $url = $iscur ? $this->current->getUrl() : $this->current->getArchiveUrl( $img );
-                       $row .= Xml::element(
-                               'a',
-                               array( 'href' => $url ),
-                               $lang->userTimeAndDate( $timestamp, $user )
-                       );
-               }
-               $row .= "</td>";
-
-               // Thumbnail
-               if ( $this->showThumb ) {
-                       $row .= '<td>' . $this->getThumbForLine( $file ) . '</td>';
-               }
-
-               // Image dimensions + size
-               $row .= '<td>';
-               $row .= htmlspecialchars( $file->getDimensionsString() );
-               $row .= $this->msg( 'word-separator' )->plain();
-               $row .= '<span style="white-space: nowrap;">';
-               $row .= $this->msg( 'parentheses' )->sizeParams( $file->getSize() )->plain();
-               $row .= '</span>';
-               $row .= '</td>';
-
-               // Uploading user
-               $row .= '<td>';
-               // Hide deleted usernames
-               if ( $file->isDeleted( File::DELETED_USER ) ) {
-                       $row .= '<span class="history-deleted">'
-                               . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
-               } else {
-                       if ( $local ) {
-                               $row .= Linker::userLink( $userId, $userText );
-                               $row .= $this->msg( 'word-separator' )->plain();
-                               $row .= '<span style="white-space: nowrap;">';
-                               $row .= Linker::userToolLinks( $userId, $userText );
-                               $row .= '</span>';
-                       } else {
-                               $row .= htmlspecialchars( $userText );
-                       }
-               }
-               $row .= '</td>';
-
-               // Don't show deleted descriptions
-               if ( $file->isDeleted( File::DELETED_COMMENT ) ) {
-                       $row .= '<td><span class="history-deleted">' .
-                               $this->msg( 'rev-deleted-comment' )->escaped() . '</span></td>';
-               } else {
-                       $row .= '<td dir="' . $wgContLang->getDir() . '">' .
-                               Linker::formatComment( $description, $this->title ) . '</td>';
-               }
-
-               $rowClass = null;
-               wfRunHooks( 'ImagePageFileHistoryLine', array( $this, $file, &$row, &$rowClass ) );
-               $classAttr = $rowClass ? " class='$rowClass'" : '';
-
-               return "<tr{$classAttr}>{$row}</tr>\n";
-       }
-
-       /**
-        * @param File $file
-        * @return string
-        */
-       protected function getThumbForLine( $file ) {
-               $lang = $this->getLanguage();
-               $user = $this->getUser();
-               if ( $file->allowInlineDisplay() && $file->userCan( File::DELETED_FILE, $user )
-                       && !$file->isDeleted( File::DELETED_FILE )
-               ) {
-                       $params = array(
-                               'width' => '120',
-                               'height' => '120',
-                       );
-                       $timestamp = wfTimestamp( TS_MW, $file->getTimestamp() );
-
-                       $thumbnail = $file->transform( $params );
-                       $options = array(
-                               'alt' => $this->msg( 'filehist-thumbtext',
-                                       $lang->userTimeAndDate( $timestamp, $user ),
-                                       $lang->userDate( $timestamp, $user ),
-                                       $lang->userTime( $timestamp, $user ) )->text(),
-                               'file-link' => true,
-                       );
-
-                       if ( !$thumbnail ) {
-                               return $this->msg( 'filehist-nothumb' )->escaped();
-                       }
-
-                       return $thumbnail->toHtml( $options );
-               } else {
-                       return $this->msg( 'filehist-nothumb' )->escaped();
-               }
-       }
-
-       /**
-        * @param bool $enable
-        */
-       protected function preventClickjacking( $enable = true ) {
-               $this->preventClickjacking = $enable;
-       }
-
-       /**
-        * @return bool
-        */
-       public function getPreventClickjacking() {
-               return $this->preventClickjacking;
-       }
-}
-
-class ImageHistoryPseudoPager extends ReverseChronologicalPager {
-       protected $preventClickjacking = false;
-
-       /**
-        * @var File
-        */
-       protected $mImg;
-
-       /**
-        * @var Title
-        */
-       protected $mTitle;
-
-       /**
-        * @param ImagePage $imagePage
-        */
-       function __construct( $imagePage ) {
-               parent::__construct( $imagePage->getContext() );
-               $this->mImagePage = $imagePage;
-               $this->mTitle = clone ( $imagePage->getTitle() );
-               $this->mTitle->setFragment( '#filehistory' );
-               $this->mImg = null;
-               $this->mHist = array();
-               $this->mRange = array( 0, 0 ); // display range
-       }
-
-       /**
-        * @return Title
-        */
-       function getTitle() {
-               return $this->mTitle;
-       }
-
-       function getQueryInfo() {
-               return false;
-       }
-
-       /**
-        * @return string
-        */
-       function getIndexField() {
-               return '';
-       }
-
-       /**
-        * @param object $row
-        * @return string
-        */
-       function formatRow( $row ) {
-               return '';
-       }
-
-       /**
-        * @return string
-        */
-       function getBody() {
-               $s = '';
-               $this->doQuery();
-               if ( count( $this->mHist ) ) {
-                       $list = new ImageHistoryList( $this->mImagePage );
-                       # Generate prev/next links
-                       $navLink = $this->getNavigationBar();
-                       $s = $list->beginImageHistoryList( $navLink );
-                       // Skip rows there just for paging links
-                       for ( $i = $this->mRange[0]; $i <= $this->mRange[1]; $i++ ) {
-                               $file = $this->mHist[$i];
-                               $s .= $list->imageHistoryLine( !$file->isOld(), $file );
-                       }
-                       $s .= $list->endImageHistoryList( $navLink );
-
-                       if ( $list->getPreventClickjacking() ) {
-                               $this->preventClickjacking();
-                       }
-               }
-               return $s;
-       }
-
-       function doQuery() {
-               if ( $this->mQueryDone ) {
-                       return;
-               }
-               $this->mImg = $this->mImagePage->getFile(); // ensure loading
-               if ( !$this->mImg->exists() ) {
-                       return;
-               }
-               $queryLimit = $this->mLimit + 1; // limit plus extra row
-               if ( $this->mIsBackwards ) {
-                       // Fetch the file history
-                       $this->mHist = $this->mImg->getHistory( $queryLimit, null, $this->mOffset, false );
-                       // The current rev may not meet the offset/limit
-                       $numRows = count( $this->mHist );
-                       if ( $numRows <= $this->mLimit && $this->mImg->getTimestamp() > $this->mOffset ) {
-                               $this->mHist = array_merge( array( $this->mImg ), $this->mHist );
-                       }
-               } else {
-                       // The current rev may not meet the offset
-                       if ( !$this->mOffset || $this->mImg->getTimestamp() < $this->mOffset ) {
-                               $this->mHist[] = $this->mImg;
-                       }
-                       // Old image versions (fetch extra row for nav links)
-                       $oiLimit = count( $this->mHist ) ? $this->mLimit : $this->mLimit + 1;
-                       // Fetch the file history
-                       $this->mHist = array_merge( $this->mHist,
-                               $this->mImg->getHistory( $oiLimit, $this->mOffset, null, false ) );
-               }
-               $numRows = count( $this->mHist ); // Total number of query results
-               if ( $numRows ) {
-                       # Index value of top item in the list
-                       $firstIndex = $this->mIsBackwards ?
-                               $this->mHist[$numRows - 1]->getTimestamp() : $this->mHist[0]->getTimestamp();
-                       # Discard the extra result row if there is one
-                       if ( $numRows > $this->mLimit && $numRows > 1 ) {
-                               if ( $this->mIsBackwards ) {
-                                       # Index value of item past the index
-                                       $this->mPastTheEndIndex = $this->mHist[0]->getTimestamp();
-                                       # Index value of bottom item in the list
-                                       $lastIndex = $this->mHist[1]->getTimestamp();
-                                       # Display range
-                                       $this->mRange = array( 1, $numRows - 1 );
-                               } else {
-                                       # Index value of item past the index
-                                       $this->mPastTheEndIndex = $this->mHist[$numRows - 1]->getTimestamp();
-                                       # Index value of bottom item in the list
-                                       $lastIndex = $this->mHist[$numRows - 2]->getTimestamp();
-                                       # Display range
-                                       $this->mRange = array( 0, $numRows - 2 );
-                               }
-                       } else {
-                               # Setting indexes to an empty string means that they will be
-                               # omitted if they would otherwise appear in URLs. It just so
-                               # happens that this  is the right thing to do in the standard
-                               # UI, in all the relevant cases.
-                               $this->mPastTheEndIndex = '';
-                               # Index value of bottom item in the list
-                               $lastIndex = $this->mIsBackwards ?
-                                       $this->mHist[0]->getTimestamp() : $this->mHist[$numRows - 1]->getTimestamp();
-                               # Display range
-                               $this->mRange = array( 0, $numRows - 1 );
-                       }
-               } else {
-                       $firstIndex = '';
-                       $lastIndex = '';
-                       $this->mPastTheEndIndex = '';
-               }
-               if ( $this->mIsBackwards ) {
-                       $this->mIsFirst = ( $numRows < $queryLimit );
-                       $this->mIsLast = ( $this->mOffset == '' );
-                       $this->mLastShown = $firstIndex;
-                       $this->mFirstShown = $lastIndex;
-               } else {
-                       $this->mIsFirst = ( $this->mOffset == '' );
-                       $this->mIsLast = ( $numRows < $queryLimit );
-                       $this->mLastShown = $lastIndex;
-                       $this->mFirstShown = $firstIndex;
-               }
-               $this->mQueryDone = true;
-       }
-
-       /**
-        * @param bool $enable
-        */
-       protected function preventClickjacking( $enable = true ) {
-               $this->preventClickjacking = $enable;
-       }
-
-       /**
-        * @return bool
-        */
-       public function getPreventClickjacking() {
-               return $this->preventClickjacking;
-       }
-
-}
index 1a3e05a..177d023 100644 (file)
@@ -40,9 +40,9 @@ class WikiImporter {
 
        /**
         * Creates an ImportXMLReader drawing from the source provided
-        * @param string $source
+        * @param ImportStreamSource $source
         */
-       function __construct( $source ) {
+       function __construct( ImportStreamSource $source ) {
                $this->reader = new XMLReader();
 
                if ( !in_array(  'uploadsource', stream_get_wrappers() ) ) {
@@ -393,6 +393,15 @@ class WikiImporter {
                }
        }
 
+       /**
+        * Retrieves the contents of the named attribute of the current element.
+        * @param string $attr the name of the attribute
+        * @return string the value of the attribute or an empty string if it is not set in the current element.
+        */
+       public function nodeAttribute( $attr ) {
+               return $this->reader->getAttribute( $attr );
+       }
+
        /**
         * Shouldn't something like this be built-in to XMLReader?
         * Fetches text contents of the current element, assuming
@@ -618,17 +627,28 @@ class WikiImporter {
                                                &$pageInfo ) ) ) {
                                // Do nothing
                        } elseif ( in_array( $tag, $normalFields ) ) {
-                               $pageInfo[$tag] = $this->nodeContents();
-                               if ( $tag == 'title' ) {
-                                       $title = $this->processTitle( $pageInfo['title'] );
+                               // An XML snippet:
+                               // <page>
+                               //     <id>123</id>
+                               //     <title>Page</title>
+                               //     <redirect title="NewTitle"/>
+                               //     ...
+                               // Because the redirect tag is built differently, we need special handling for that case.
+                               if ( $tag == 'redirect' ) {
+                                       $pageInfo[$tag] = $this->nodeAttribute( 'title' );
+                               } else {
+                                       $pageInfo[$tag] = $this->nodeContents();
+                                       if ( $tag == 'title' ) {
+                                               $title = $this->processTitle( $pageInfo['title'] );
 
-                                       if ( !$title ) {
-                                               $badTitle = true;
-                                               $skip = true;
-                                       }
+                                               if ( !$title ) {
+                                                       $badTitle = true;
+                                                       $skip = true;
+                                               }
 
-                                       $this->pageCallback( $title );
-                                       list( $pageInfo['_title'], $origTitle ) = $title;
+                                               $this->pageCallback( $title );
+                                               list( $pageInfo['_title'], $origTitle ) = $title;
+                                       }
                                }
                        } elseif ( $tag == 'revision' ) {
                                $this->handleRevision( $pageInfo );
@@ -924,10 +944,10 @@ class UploadSourceAdapter {
        private $mPosition;
 
        /**
-        * @param string $source
+        * @param ImportStreamSource $source
         * @return string
         */
-       static function registerSource( $source ) {
+       static function registerSource( ImportStreamSource $source ) {
                $id = wfRandomString();
 
                self::$sourceRegistrations[$id] = $source;
index 7724548..7d88f25 100644 (file)
@@ -408,6 +408,11 @@ class Linker {
         * @return string
         */
        public static function makeSelfLinkObj( $nt, $html = '', $query = '', $trail = '', $prefix = '' ) {
+               $ret = "<strong class=\"selflink\">{$prefix}{$html}</strong>{$trail}";
+               if ( !wfRunHooks( 'SelfLinkBegin', array( $nt, &$html, &$trail, &$prefix, &$ret ) ) ) {
+                       return $ret;
+               }
+
                if ( $html == '' ) {
                        $html = htmlspecialchars( $nt->getPrefixedText() );
                }
@@ -603,7 +608,6 @@ class Linker {
                                }
 
                                // Reduce width for upright images when parameter 'upright' is used
-                               $useSquare = !isset( $fp['upright'] );
                                if ( isset( $fp['upright'] ) && $fp['upright'] == 0 ) {
                                        $fp['upright'] = $wgThumbUpright;
                                }
@@ -615,16 +619,11 @@ class Linker {
                                        round( $wgThumbLimits[$widthOption] * $fp['upright'], -1 ) :
                                        $wgThumbLimits[$widthOption];
 
-                               // Use whichever is smaller: real image width or user preference width
+                               // Use width which is smaller: real image width or user preference width
                                // Unless image is scalable vector.
                                if ( !isset( $hp['height'] ) && ( $hp['width'] <= 0 ||
-                                               $prefWidth < $hp['width'] ||
-                                               ( $useSquare && $prefWidth < $file->getHeight( $page ) ) ||
-                                               $file->isVectorized() ) ) {
+                                               $prefWidth < $hp['width'] || $file->isVectorized() ) ) {
                                        $hp['width'] = $prefWidth;
-                                       if ( $useSquare ) {
-                                               $hp['height'] = $prefWidth;
-                                       }
                                }
                        }
                }
@@ -1318,12 +1317,6 @@ class Linker {
                return $comment;
        }
 
-       /** @var Title */
-       private static $autocommentTitle;
-
-       /** @var bool Whether section links should refer to local page */
-       private static $autocommentLocal;
-
        /**
         * Converts autogenerated comments in edit summaries into section links.
         * The pattern for autogen comments is / * foo * /, which makes for
@@ -1338,80 +1331,59 @@ class Linker {
         * @return string Formatted comment
         */
        private static function formatAutocomments( $comment, $title = null, $local = false ) {
-               // Bah!
-               self::$autocommentTitle = $title;
-               self::$autocommentLocal = $local;
-               $comment = preg_replace_callback(
+               return preg_replace_callback(
                        '!(.*)/\*\s*(.*?)\s*\*/(.*)!',
-                       array( 'Linker', 'formatAutocommentsCallback' ),
-                       $comment );
-               self::$autocommentTitle = null;
-               self::$autocommentLocal = null;
-               return $comment;
-       }
-
-       /**
-        * Helper function for Linker::formatAutocomments
-        * @param array $match
-        * @return string
-        */
-       private static function formatAutocommentsCallback( $match ) {
-               global $wgLang;
-               $title = self::$autocommentTitle;
-               $local = self::$autocommentLocal;
-
-               $pre = $match[1];
-               $auto = $match[2];
-               $post = $match[3];
-               $comment = null;
-               wfRunHooks( 'FormatAutocomments', array( &$comment, $pre, $auto, $post, $title, $local ) );
-               if ( $comment === null ) {
-                       $link = '';
-                       if ( $title ) {
-                               $section = $auto;
-
-                               # Remove links that a user may have manually put in the autosummary
-                               # This could be improved by copying as much of Parser::stripSectionName as desired.
-                               $section = str_replace( '[[:', '', $section );
-                               $section = str_replace( '[[', '', $section );
-                               $section = str_replace( ']]', '', $section );
-
-                               $section = Sanitizer::normalizeSectionNameWhitespace( $section ); # bug 22784
-                               if ( $local ) {
-                                       $sectionTitle = Title::newFromText( '#' . $section );
-                               } else {
-                                       $sectionTitle = Title::makeTitleSafe( $title->getNamespace(),
-                                               $title->getDBkey(), $section );
-                               }
-                               if ( $sectionTitle ) {
-                                       $link = self::link( $sectionTitle,
-                                               $wgLang->getArrow(), array(), array(),
-                                               'noclasses' );
-                               } else {
+                       function ( $match ) use ( $title, $local ) {
+                               global $wgLang;
+
+                               $pre = $match[1];
+                               $auto = $match[2];
+                               $post = $match[3];
+                               $comment = null;
+                               wfRunHooks( 'FormatAutocomments', array( &$comment, $pre, $auto, $post, $title, $local ) );
+                               if ( $comment === null ) {
                                        $link = '';
+                                       if ( $title ) {
+                                               $section = $auto;
+                                               # Remove links that a user may have manually put in the autosummary
+                                               # This could be improved by copying as much of Parser::stripSectionName as desired.
+                                               $section = str_replace( '[[:', '', $section );
+                                               $section = str_replace( '[[', '', $section );
+                                               $section = str_replace( ']]', '', $section );
+
+                                               $section = Sanitizer::normalizeSectionNameWhitespace( $section ); # bug 22784
+                                               if ( $local ) {
+                                                       $sectionTitle = Title::newFromText( '#' . $section );
+                                               } else {
+                                                       $sectionTitle = Title::makeTitleSafe( $title->getNamespace(),
+                                                               $title->getDBkey(), $section );
+                                               }
+                                               if ( $sectionTitle ) {
+                                                       $link = Linker::link( $sectionTitle,
+                                                               $wgLang->getArrow(), array(), array(),
+                                                               'noclasses' );
+                                               } else {
+                                                       $link = '';
+                                               }
+                                       }
+                                       if ( $pre ) {
+                                               # written summary $presep autocomment (summary /* section */)
+                                               $pre .= wfMessage( 'autocomment-prefix' )->inContentLanguage()->escaped();
+                                       }
+                                       if ( $post ) {
+                                               # autocomment $postsep written summary (/* section */ summary)
+                                               $auto .= wfMessage( 'colon-separator' )->inContentLanguage()->escaped();
+                                       }
+                                       $auto = '<span class="autocomment">' . $auto . '</span>';
+                                       $comment = $pre . $link . $wgLang->getDirMark()
+                                               . '<span dir="auto">' . $auto . $post . '</span>';
                                }
-                       }
-                       if ( $pre ) {
-                               # written summary $presep autocomment (summary /* section */)
-                               $pre .= wfMessage( 'autocomment-prefix' )->inContentLanguage()->escaped();
-                       }
-                       if ( $post ) {
-                               # autocomment $postsep written summary (/* section */ summary)
-                               $auto .= wfMessage( 'colon-separator' )->inContentLanguage()->escaped();
-                       }
-                       $auto = '<span class="autocomment">' . $auto . '</span>';
-                       $comment = $pre . $link . $wgLang->getDirMark()
-                               . '<span dir="auto">' . $auto . $post . '</span>';
-               }
-               return $comment;
+                               return $comment;
+               },
+                       $comment
+               );
        }
 
-       /** @var Title */
-       private static $commentContextTitle;
-
-       /** @var bool Whether section links should refer to local page */
-       private static $commentLocal;
-
        /**
         * Formats wiki links and media links in text; all other wiki formatting
         * is ignored
@@ -1423,9 +1395,7 @@ class Linker {
         * @return string
         */
        public static function formatLinksInComment( $comment, $title = null, $local = false ) {
-               self::$commentContextTitle = $title;
-               self::$commentLocal = $local;
-               $html = preg_replace_callback(
+               return preg_replace_callback(
                        '/
                                \[\[
                                :? # ignore optional leading colon
@@ -1438,88 +1408,79 @@ class Linker {
                                \]\]
                                ([^[]*) # 3. link trail (the text up until the next link)
                        /x',
-                       array( 'Linker', 'formatLinksInCommentCallback' ),
-                       $comment );
-               self::$commentContextTitle = null;
-               self::$commentLocal = null;
-               return $html;
-       }
+                       function ( $match ) use ( $title, $local ) {
+                               global $wgContLang;
 
-       /**
-        * @param array $match
-        * @return mixed
-        */
-       protected static function formatLinksInCommentCallback( $match ) {
-               global $wgContLang;
+                               $medians = '(?:' . preg_quote( MWNamespace::getCanonicalName( NS_MEDIA ), '/' ) . '|';
+                               $medians .= preg_quote( $wgContLang->getNsText( NS_MEDIA ), '/' ) . '):';
 
-               $medians = '(?:' . preg_quote( MWNamespace::getCanonicalName( NS_MEDIA ), '/' ) . '|';
-               $medians .= preg_quote( $wgContLang->getNsText( NS_MEDIA ), '/' ) . '):';
+                               $comment = $match[0];
 
-               $comment = $match[0];
-
-               # fix up urlencoded title texts (copied from Parser::replaceInternalLinks)
-               if ( strpos( $match[1], '%' ) !== false ) {
-                       $match[1] = str_replace( array( '<', '>' ), array( '&lt;', '&gt;' ), rawurldecode( $match[1] ) );
-               }
+                               # fix up urlencoded title texts (copied from Parser::replaceInternalLinks)
+                               if ( strpos( $match[1], '%' ) !== false ) {
+                                       $match[1] = str_replace( array( '<', '>' ), array( '&lt;', '&gt;' ), rawurldecode( $match[1] ) );
+                               }
 
-               # Handle link renaming [[foo|text]] will show link as "text"
-               if ( $match[2] != "" ) {
-                       $text = $match[2];
-               } else {
-                       $text = $match[1];
-               }
-               $submatch = array();
-               $thelink = null;
-               if ( preg_match( '/^' . $medians . '(.*)$/i', $match[1], $submatch ) ) {
-                       # Media link; trail not supported.
-                       $linkRegexp = '/\[\[(.*?)\]\]/';
-                       $title = Title::makeTitleSafe( NS_FILE, $submatch[1] );
-                       if ( $title ) {
-                               $thelink = self::makeMediaLinkObj( $title, $text );
-                       }
-               } else {
-                       # Other kind of link
-                       if ( preg_match( $wgContLang->linkTrail(), $match[3], $submatch ) ) {
-                               $trail = $submatch[1];
-                       } else {
-                               $trail = "";
-                       }
-                       $linkRegexp = '/\[\[(.*?)\]\]' . preg_quote( $trail, '/' ) . '/';
-                       if ( isset( $match[1][0] ) && $match[1][0] == ':' ) {
-                               $match[1] = substr( $match[1], 1 );
-                       }
-                       list( $inside, $trail ) = self::splitTrail( $trail );
-
-                       $linkText = $text;
-                       $linkTarget = self::normalizeSubpageLink( self::$commentContextTitle,
-                               $match[1], $linkText );
-
-                       $target = Title::newFromText( $linkTarget );
-                       if ( $target ) {
-                               if ( $target->getText() == '' && !$target->isExternal()
-                                       && !self::$commentLocal && self::$commentContextTitle
-                               ) {
-                                       $newTarget = clone ( self::$commentContextTitle );
-                                       $newTarget->setFragment( '#' . $target->getFragment() );
-                                       $target = $newTarget;
+                               # Handle link renaming [[foo|text]] will show link as "text"
+                               if ( $match[2] != "" ) {
+                                       $text = $match[2];
+                               } else {
+                                       $text = $match[1];
+                               }
+                               $submatch = array();
+                               $thelink = null;
+                               if ( preg_match( '/^' . $medians . '(.*)$/i', $match[1], $submatch ) ) {
+                                       # Media link; trail not supported.
+                                       $linkRegexp = '/\[\[(.*?)\]\]/';
+                                       $title = Title::makeTitleSafe( NS_FILE, $submatch[1] );
+                                       if ( $title ) {
+                                               $thelink = Linker::makeMediaLinkObj( $title, $text );
+                                       }
+                               } else {
+                                       # Other kind of link
+                                       if ( preg_match( $wgContLang->linkTrail(), $match[3], $submatch ) ) {
+                                               $trail = $submatch[1];
+                                       } else {
+                                               $trail = "";
+                                       }
+                                       $linkRegexp = '/\[\[(.*?)\]\]' . preg_quote( $trail, '/' ) . '/';
+                                       if ( isset( $match[1][0] ) && $match[1][0] == ':' ) {
+                                               $match[1] = substr( $match[1], 1 );
+                                       }
+                                       list( $inside, $trail ) = Linker::splitTrail( $trail );
+
+                                       $linkText = $text;
+                                       $linkTarget = Linker::normalizeSubpageLink( $title, $match[1], $linkText );
+
+                                       $target = Title::newFromText( $linkTarget );
+                                       if ( $target ) {
+                                               if ( $target->getText() == '' && !$target->isExternal()
+                                                       && !$local && $title
+                                               ) {
+                                                       $newTarget = clone ( $title );
+                                                       $newTarget->setFragment( '#' . $target->getFragment() );
+                                                       $target = $newTarget;
+                                               }
+                                               $thelink = Linker::link(
+                                                       $target,
+                                                       $linkText . $inside
+                                               ) . $trail;
+                                       }
+                               }
+                               if ( $thelink ) {
+                                       // If the link is still valid, go ahead and replace it in!
+                                       $comment = preg_replace(
+                                               $linkRegexp,
+                                               StringUtils::escapeRegexReplacement( $thelink ),
+                                               $comment,
+                                               1
+                                       );
                                }
-                               $thelink = self::link(
-                                       $target,
-                                       $linkText . $inside
-                               ) . $trail;
-                       }
-               }
-               if ( $thelink ) {
-                       // If the link is still valid, go ahead and replace it in!
-                       $comment = preg_replace(
-                               $linkRegexp,
-                               StringUtils::escapeRegexReplacement( $thelink ),
-                               $comment,
-                               1
-                       );
-               }
 
-               return $comment;
+                               return $comment;
+                       },
+                       $comment
+               );
        }
 
        /**
index 582ba60..f4d4697 100644 (file)
@@ -569,20 +569,30 @@ class MimeMagic {
         * @param string $file
         * @param mixed $ext
         * @return bool|string
+        * @throws MWException
         */
        private function doGuessMimeType( $file, $ext ) { // TODO: remove $ext param
                // Read a chunk of the file
                wfSuppressWarnings();
-               // @todo FIXME: Shouldn't this be rb?
-               $f = fopen( $file, 'rt' );
+               $f = fopen( $file, 'rb' );
                wfRestoreWarnings();
 
                if ( !$f ) {
                        return 'unknown/unknown';
                }
+
+               $fsize = filesize( $file );
+               if ( $fsize === false ) {
+                       return 'unknown/unknown';
+               }
+
                $head = fread( $f, 1024 );
-               fseek( $f, -65558, SEEK_END );
-               $tail = fread( $f, 65558 ); // 65558 = maximum size of a zip EOCDR
+               $tailLength = min( 65558, $fsize ); // 65558 = maximum size of a zip EOCDR
+               if ( fseek( $f, -1 * $tailLength, SEEK_END ) === -1 ) {
+                       throw new MWException(
+                               "Seeking $tailLength bytes from EOF failed in " . __METHOD__ );
+               }
+               $tail = fread( $f, $tailLength );
                fclose( $f );
 
                wfDebug( __METHOD__ . ": analyzing head and tail of $file for magic numbers.\n" );
index 0f3612a..a2b8920 100644 (file)
@@ -473,8 +473,10 @@ class OutputPage extends ContextSource {
         * Get all registered JS and CSS tags for the header.
         *
         * @return string
+        * @deprecated since 1.24 Use OutputPage::headElement to build the full header.
         */
        function getScript() {
+               wfDeprecated( __METHOD__, '1.24' );
                return $this->mScripts . $this->getHeadItems();
        }
 
@@ -630,8 +632,11 @@ class OutputPage extends ContextSource {
         * Get all header items in a string
         *
         * @return string
+        * @deprecated since 1.24 Use OutputPage::headElement or
+        *   if absolutely necessary use OutputPage::getHeadItemsArray
         */
        function getHeadItems() {
+               wfDeprecated( __METHOD__, '1.24' );
                $s = '';
                foreach ( $this->mHeadItems as $item ) {
                        $s .= $item;
@@ -1616,11 +1621,24 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Add a ParserOutput object, but without Html
+        * Add a ParserOutput object, but without Html.
         *
+        * @deprecated since 1.24, use addParserOutputMetadata() instead.
         * @param ParserOutput $parserOutput
         */
        public function addParserOutputNoText( &$parserOutput ) {
+               $this->addParserOutputMetadata( $parserOutput );
+       }
+
+       /**
+        * Add all metadata associated with a ParserOutput object, but without the actual HTML. This
+        * includes categories, language links, ResourceLoader modules, effects of certain magic words,
+        * and so on.
+        *
+        * @since 1.24
+        * @param ParserOutput $parserOutput
+        */
+       public function addParserOutputMetadata( &$parserOutput ) {
                $this->mLanguageLinks += $parserOutput->getLanguageLinks();
                $this->addCategoryLinks( $parserOutput->getCategories() );
                $this->mNewSectionLink = $parserOutput->getNewSection();
@@ -1668,21 +1686,50 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Add a ParserOutput object
+        * Add the HTML and enhancements for it (like ResourceLoader modules) associated with a
+        * ParserOutput object, without any other metadata.
+        *
+        * @since 1.24
+        * @param ParserOutput $parserOutput
+        */
+       public function addParserOutputContent( &$parserOutput ) {
+               $this->addParserOutputText( $parserOutput );
+
+               $this->addModules( $parserOutput->getModules() );
+               $this->addModuleScripts( $parserOutput->getModuleScripts() );
+               $this->addModuleStyles( $parserOutput->getModuleStyles() );
+               $this->addModuleMessages( $parserOutput->getModuleMessages() );
+
+               $this->addJsConfigVars( $parserOutput->getJsConfigVars() );
+       }
+
+       /**
+        * Add the HTML associated with a ParserOutput object, without any metadata.
+        *
+        * @since 1.24
+        * @param ParserOutput $parserOutput
+        */
+       public function addParserOutputText( &$parserOutput ) {
+               $text = $parserOutput->getText();
+               wfRunHooks( 'OutputPageBeforeHTML', array( &$this, &$text ) );
+               $this->addHTML( $text );
+       }
+
+       /**
+        * Add everything from a ParserOutput object.
         *
         * @param ParserOutput $parserOutput
         */
        function addParserOutput( &$parserOutput ) {
-               $this->addParserOutputNoText( $parserOutput );
+               $this->addParserOutputMetadata( $parserOutput );
                $parserOutput->setTOCEnabled( $this->mEnableTOC );
 
                // Touch section edit links only if not previously disabled
                if ( $parserOutput->getEditSectionTokens() ) {
                        $parserOutput->setEditSectionTokens( $this->mEnableSectionEditLinks );
                }
-               $text = $parserOutput->getText();
-               wfRunHooks( 'OutputPageBeforeHTML', array( &$this, &$text ) );
-               $this->addHTML( $text );
+
+               $this->addParserOutputText( $parserOutput );
        }
 
        /**
@@ -1884,7 +1931,12 @@ class OutputPage extends ContextSource {
         *   /w/index.php?title=Main_page&variant=zh-cn should never be served.
         */
        function addAcceptLanguage() {
-               $lang = $this->getTitle()->getPageLanguage();
+               $title = $this->getTitle();
+               if ( !$title instanceof Title ) {
+                       return;
+               }
+
+               $lang = $title->getPageLanguage();
                if ( !$this->getRequest()->getCheck( 'variant' ) && $lang->hasVariants() ) {
                        $variants = $lang->getVariants();
                        $aloption = array();
@@ -2585,15 +2637,18 @@ $templates
 
                $ret .= Html::element( 'title', null, $this->getHTMLTitle() ) . "\n";
 
-               $ret .= (
-                       $this->getHeadLinks() .
-                       "\n" .
-                       $this->buildCssLinks() .
-                       // No newline after buildCssLinks since makeResourceLoaderLink did that already
-                       $this->getHeadScripts() .
-                       "\n" .
-                       $this->getHeadItems()
-               );
+               foreach ( $this->getHeadLinksArray() as $item ) {
+                       $ret .= $item . "\n";
+               }
+
+               // No newline after buildCssLinks since makeResourceLoaderLink did that already
+               $ret .= $this->buildCssLinks();
+
+               $ret .= $this->getHeadScripts() . "\n";
+
+               foreach ( $this->mHeadItems as $item ) {
+                       $ret .= $item . "\n";
+               }
 
                $closeHead = Html::closeElement( 'head' );
                if ( $closeHead ) {
@@ -3434,8 +3489,11 @@ $templates
 
        /**
         * @return string HTML tag links to be put in the header.
+        * @deprecated since 1.24 Use OutputPage::headElement or if you have to,
+        *   OutputPage::getHeadLinksArray directly.
         */
        public function getHeadLinks() {
+               wfDeprecated( __METHOD__, '1.24' );
                return implode( "\n", $this->getHeadLinksArray() );
        }
 
index 1f1b7dd..081315e 100644 (file)
@@ -1010,29 +1010,11 @@ class Preferences {
         * @param array $defaultPreferences
         */
        static function searchPreferences( $user, IContextSource $context, &$defaultPreferences ) {
-               global $wgContLang;
-
-               $defaultPreferences['searcheverything'] = array(
-                       'type' => 'toggle',
-                       'label-message' => 'searcheverything-enable',
-                       'section' => 'searchoptions/advancedsearchoptions',
-               );
-
-               $nsOptions = $wgContLang->getFormattedNamespaces();
-               $nsOptions[0] = $context->msg( 'blanknamespace' )->text();
-               foreach ( $nsOptions as $ns => $name ) {
-                       if ( $ns < 0 ) {
-                               unset( $nsOptions[$ns] );
-                       }
+               foreach ( MWNamespace::getValidNamespaces() as $n ) {
+                       $defaultPreferences[ 'searchNs' . $n ] = array(
+                               'type' => 'api',
+                       );
                }
-
-               $defaultPreferences['searchnamespaces'] = array(
-                       'type' => 'multiselect',
-                       'label-message' => 'defaultns',
-                       'options' => array_flip( $nsOptions ),
-                       'section' => 'searchoptions/advancedsearchoptions',
-                       'prefix' => 'searchNs',
-               );
        }
 
        /**
index a796d35..13696ad 100644 (file)
@@ -166,10 +166,26 @@ abstract class PrefixSearch {
        protected function specialSearch( $search, $limit ) {
                global $wgContLang;
 
-               # normalize searchKey, so aliases with spaces can be found - bug 25675
-               $search = str_replace( ' ', '_', $search );
+               list( $searchKey, $subpageSearch ) = explode( '/', $search, 2 );
+
+               // Handle subpage search separately.
+               if ( $subpageSearch !== null ) {
+                       // Try matching the full search string as a page name
+                       $specialTitle = Title::makeTitleSafe( NS_SPECIAL, $searchKey );
+                       $special = SpecialPageFactory::getPage( $specialTitle->getText() );
+                       if ( $special ) {
+                               $subpages = $special->prefixSearchSubpages( $subpageSearch, $limit );
+                               return array_map( function ( $sub ) use ( $specialTitle ) {
+                                       return $specialTitle->getSubpage( $sub );
+                               }, $subpages );
+                       } else {
+                               return array();
+                       }
+               }
 
-               $searchKey = $wgContLang->caseFold( $search );
+               # normalize searchKey, so aliases with spaces can be found - bug 25675
+               $searchKey = str_replace( ' ', '_', $searchKey );
+               $searchKey = $wgContLang->caseFold( $searchKey );
 
                // Unlike SpecialPage itself, we want the canonical forms of both
                // canonical and alias title forms...
index d34ee03..456e4e6 100644 (file)
@@ -117,15 +117,12 @@ class ProtectionForm {
                                // Expiry selected from list
                                $this->mExpiry[$action] = '';
                                $this->mExpirySelection[$action] = $requestExpirySelection;
-                       } elseif ( $existingExpiry == 'infinity' ) {
-                               // Existing expiry is infinite, use "infinite" in drop-down
-                               $this->mExpiry[$action] = '';
-                               $this->mExpirySelection[$action] = 'infinite';
                        } elseif ( $existingExpiry ) {
                                // Use existing expiry in its own list item
                                $this->mExpiry[$action] = '';
                                $this->mExpirySelection[$action] = $existingExpiry;
                        } else {
+                               // Catches 'infinity' - Existing expiry is infinite, use "infinite" in drop-down
                                // Final default: infinite
                                $this->mExpiry[$action] = '';
                                $this->mExpirySelection[$action] = 'infinite';
index a403e37..06f5bd0 100644 (file)
@@ -1732,6 +1732,7 @@ class Revision implements IDBAccessObject {
         * 50 revisions for the sake of performance.
         *
         * @since 1.20
+        * @deprecated since 1.24
         *
         * @param DatabaseBase|int $db The Database to perform the check on. May be given as a
         *        Database object or a database identifier usable with wfGetDB.
index 1ea6523..6a568c2 100644 (file)
@@ -1507,11 +1507,11 @@ class Sanitizer {
         */
        static function setupAttributeWhitelist() {
                global $wgAllowRdfaAttributes, $wgAllowMicrodataAttributes;
-
                static $whitelist, $staticInitialised;
+
                $globalContext = implode( '-', compact( 'wgAllowRdfaAttributes', 'wgAllowMicrodataAttributes' ) );
 
-               if ( isset( $whitelist ) && $staticInitialised == $globalContext ) {
+               if ( $whitelist !== null && $staticInitialised == $globalContext ) {
                        return $whitelist;
                }
 
index a1bca22..ccb3a15 100644 (file)
@@ -601,6 +601,13 @@ $wgTitle = null;
 
 $wgDeferredUpdateList = array();
 
+// Enable default skins.
+// This is hacky and bad, but it will go away before 1.24 release (or so I hope).
+// These lines should eventually be placed in skins' meta definition files, and loaded by a
+// require_once for each skin file generated by the installer and placed in LocalSettings.php.
+require_once "$wgStyleDirectory/MonoBook/MonoBook.php";
+require_once "$wgStyleDirectory/Vector/Vector.php";
+
 wfProfileOut( $fname . '-globals' );
 wfProfileIn( $fname . '-extensions' );
 
index 10502c2..177e2b1 100644 (file)
 
 /**
  * The main skin class which provides methods and properties for all other skins.
- * This base class is also the "Standard" skin.
  *
  * See docs/skin.txt for more information.
  *
  * @ingroup Skins
  */
 abstract class Skin extends ContextSource {
-       protected $skinname = 'standard';
+       protected $skinname = null;
        protected $mRelevantTitle = null;
        protected $mRelevantUser = null;
 
+       /**
+        * @var string Stylesheets set to use. Subdirectory in skins/ where various stylesheets are
+        *   located. Only needs to be set if you intend to use the getSkinStylePath() method.
+        */
+       public $stylename = null;
+
        /**
         * Fetch the set of available skins.
         * @return array Associative array of strings
@@ -64,6 +69,29 @@ abstract class Skin extends ContextSource {
 
                                        if ( preg_match( '/^([^.]*)\.php$/', $file, $matches ) ) {
                                                $aSkin = $matches[1];
+
+                                               // Explicitly disallow loading core skins via the autodiscovery mechanism.
+                                               //
+                                               // They should be loaded already (in a non-autodicovery way), but old files might still
+                                               // exist on the server because our MW version upgrade process is widely documented as
+                                               // requiring just copying over all files, without removing old ones.
+                                               //
+                                               // This is one of the reasons we should have never used autodiscovery in the first
+                                               // place. This hack can be safely removed when autodiscovery is gone.
+                                               if ( in_array( $aSkin, array( 'CologneBlue', 'Modern', 'MonoBook', 'Vector' ) ) ) {
+                                                       wfLogWarning(
+                                                               "An old copy of the $aSkin skin was found in your skins/ directory. " .
+                                                               "You should remove it to avoid problems in the future." .
+                                                               "See https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery for details."
+                                                       );
+                                                       continue;
+                                               }
+
+                                               wfLogWarning(
+                                                       "A skin using autodiscovery mechanism, $aSkin, was found in your skins/ directory. " .
+                                                       "The mechanism will be removed in MediaWiki 1.25 and the skin will no longer be recognized. " .
+                                                       "See https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery for information how to fix this."
+                                               );
                                                $wgValidSkinNames[strtolower( $aSkin )] = $aSkin;
                                        }
                                }
@@ -82,7 +110,6 @@ abstract class Skin extends ContextSource {
        static function getSkinNameMessages() {
                $messages = array();
                foreach ( self::getSkinNames() as $skinKey => $skinName ) {
-                       // Messages: skinname-vector, skinname-monobook
                        $messages[] = "skinname-$skinKey";
                }
                return $messages;
@@ -119,8 +146,8 @@ abstract class Skin extends ContextSource {
        /**
         * Normalize a skin preference value to a form that can be loaded.
         * If a skin can't be found, it will fall back to the configured
-        * default (or the old 'Classic' skin if that's broken).
-        * @param string $key 'monobook', 'standard', etc.
+        * default, or the hardcoded default if that's broken.
+        * @param string $key 'monobook', 'vector', etc.
         * @return string
         */
        static function normalizeKey( $key ) {
@@ -160,7 +187,7 @@ abstract class Skin extends ContextSource {
 
        /**
         * Factory method for loading a skin of a given type
-        * @param string $key 'monobook', 'standard', etc.
+        * @param string $key 'monobook', 'vector', etc.
         * @return Skin
         */
        static function &newFromKey( $key ) {
@@ -185,7 +212,6 @@ abstract class Skin extends ContextSource {
                                # is no longer valid.
                                wfDebug( "Skin class does not exist: $className\n" );
                                $className = 'SkinVector';
-                               require_once "{$wgStyleDirectory}/Vector.php";
                        }
                }
                $skin = new $className( $key );
@@ -1071,11 +1097,20 @@ abstract class Skin extends ContextSource {
         * Return a fully resolved style path url to images or styles stored in the current skins's folder.
         * This method returns a url resolved using the configured skin style path
         * and includes the style version inside of the url.
+        *
+        * Requires $stylename to be set, otherwise throws MWException.
+        *
         * @param string $name The name or path of a skin resource file
         * @return string The fully resolved style path url including styleversion
         */
        function getSkinStylePath( $name ) {
                global $wgStylePath, $wgStyleVersion;
+
+               if ( $this->stylename === null ) {
+                       $class = get_class( $this );
+                       throw new MWException( "$class::\$stylename must be set to use getSkinStylePath()" );
+               }
+
                return "$wgStylePath/{$this->stylename}/$name?$wgStyleVersion";
        }
 
index 08816ad..f9799a5 100644 (file)
@@ -74,24 +74,12 @@ class SkinTemplate extends Skin {
         */
        public $skinname = 'monobook';
 
-       /**
-        * @var string Stylesheets set to use. Subdirectory in skins/ where various
-        *   stylesheets are located.  Child classes should override the default.
-        */
-       public $stylename = 'monobook';
-
        /**
         * @var string For QuickTemplate, the name of the subclass which will
         *   actually fill the template.  Child classes should override the default.
         */
        public $template = 'QuickTemplate';
 
-       /**
-        * @var bool Whether this skin use OutputPage::headElement() to generate
-        *   the "<head>" tag.
-        */
-       public $useHeadElement = false;
-
        /**
         * Add specific styles for this skin
         *
@@ -146,8 +134,16 @@ class SkinTemplate extends Skin {
                                $ilLangName = Language::fetchLanguageName( $ilInterwikiCode );
 
                                if ( strval( $ilLangName ) === '' ) {
-                                       $ilLangName = $languageLinkText;
+                                       $ilDisplayTextMsg = wfMessage( "interlanguage-link-$ilInterwikiCode" );
+                                       if ( !$ilDisplayTextMsg->isDisabled() ) {
+                                               // Use custom MW message for the display text
+                                               $ilLangName = $ilDisplayTextMsg->text();
+                                       } else {
+                                               // Last resort: fallback to the language link target
+                                               $ilLangName = $languageLinkText;
+                                       }
                                } else {
+                                       // Use the language autonym as display text
                                        $ilLangName = $this->formatLanguageName( $ilLangName );
                                }
 
@@ -159,7 +155,29 @@ class SkinTemplate extends Skin {
                                );
 
                                $languageLinkTitleText = $languageLinkTitle->getText();
-                               if ( $languageLinkTitleText === '' ) {
+                               if ( $ilLangLocalName === '' ) {
+                                       $ilFriendlySiteName = wfMessage( "interlanguage-link-sitename-$ilInterwikiCode" );
+                                       if ( !$ilFriendlySiteName->isDisabled() ) {
+                                               if ( $languageLinkTitleText === '' ) {
+                                                       $ilTitle = wfMessage(
+                                                               'interlanguage-link-title-nonlangonly',
+                                                               $ilFriendlySiteName->text()
+                                                       )->text();
+                                               } else {
+                                                       $ilTitle = wfMessage(
+                                                               'interlanguage-link-title-nonlang',
+                                                               $languageLinkTitleText,
+                                                               $ilFriendlySiteName->text()
+                                                       )->text();
+                                               }
+                                       } else {
+                                               // we have nothing friendly to put in the title, so fall back to
+                                               // displaying the interlanguage link itself in the title text
+                                               // (similar to what is done in page content)
+                                               $ilTitle = $languageLinkTitle->getInterwiki() .
+                                                       ":$languageLinkTitleText";
+                                       }
+                               } elseif ( $languageLinkTitleText === '' ) {
                                        $ilTitle = wfMessage(
                                                'interlanguage-link-title-langonly',
                                                $ilLangLocalName
@@ -290,26 +308,6 @@ class SkinTemplate extends Skin {
                $out = $this->getOutput();
                $tpl = $this->setupTemplateForOutput();
 
-               wfProfileIn( __METHOD__ . '-stuff-head' );
-               if ( !$this->useHeadElement ) {
-                       $tpl->set( 'pagecss', false );
-                       $tpl->set( 'usercss', false );
-
-                       $tpl->set( 'userjs', false );
-                       $tpl->set( 'userjsprev', false );
-
-                       $tpl->set( 'jsvarurl', false );
-
-                       $tpl->set( 'xhtmldefaultnamespace', 'http://www.w3.org/1999/xhtml' );
-                       $tpl->set( 'xhtmlnamespaces', $wgXhtmlNamespaces );
-                       $tpl->set( 'html5version', $wgHtml5Version );
-                       $tpl->set( 'headlinks', $out->getHeadLinks() );
-                       $tpl->set( 'csslinks', $out->buildCssLinks() );
-                       $tpl->set( 'pageclass', $this->getPageClasses( $title ) );
-                       $tpl->set( 'skinnameclass', ( 'skin-' . Sanitizer::escapeClass( $this->getSkinName() ) ) );
-               }
-               wfProfileOut( __METHOD__ . '-stuff-head' );
-
                wfProfileIn( __METHOD__ . '-stuff2' );
                $tpl->set( 'title', $out->getPageTitle() );
                $tpl->set( 'pagetitle', $out->getHTMLTitle() );
@@ -540,11 +538,7 @@ class SkinTemplate extends Skin {
                $tpl->set( 'nav_urls', $this->buildNavUrls() );
 
                // Set the head scripts near the end, in case the above actions resulted in added scripts
-               if ( $this->useHeadElement ) {
-                       $tpl->set( 'headelement', $out->headElement( $this ) );
-               } else {
-                       $tpl->set( 'headscripts', $out->getHeadScripts() . $out->getHeadItems() );
-               }
+               $tpl->set( 'headelement', $out->headElement( $this ) );
 
                $tpl->set( 'debug', '' );
                $tpl->set( 'debughtml', $this->generateDebugHTML() );
index d8f6b75..9d8614d 100644 (file)
@@ -2723,11 +2723,14 @@ class Title {
         * Cascading protection: Get the source of any cascading restrictions on this page.
         *
         * @param bool $getPages Whether or not to retrieve the actual pages
-        *        that the restrictions have come from.
-        * @return array|bool Array of Title objects of the pages from which cascading restrictions
-        *     have come, false for none, or true if such restrictions exist, but $getPages
-        *     was not set.  The restriction array is an array of each type, each of which
-        *     contains a array of unique groups.
+        *        that the restrictions have come from and the actual restrictions
+        *        themselves.
+        * @return array Two elements: First is an array of Title objects of the
+        *        pages from which cascading restrictions have come, false for
+        *        none, or true if such restrictions exist but $getPages was not
+        *        set. Second is an array like that returned by
+        *        Title::getAllRestrictions(), or an empty array if $getPages is
+        *        false.
         */
        public function getCascadeProtectionSources( $getPages = true ) {
                global $wgContLang;
@@ -2834,7 +2837,8 @@ class Title {
         * Accessor/initialisation for mRestrictions
         *
         * @param string $action Action that permission needs to be checked for
-        * @return array Array of Strings the array of groups allowed to edit this article
+        * @return array Restriction levels needed to take the action. All levels
+        *     are required.
         */
        public function getRestrictions( $action ) {
                if ( !$this->mRestrictionsLoaded ) {
@@ -2848,9 +2852,8 @@ class Title {
        /**
         * Accessor/initialisation for mRestrictions
         *
-        * @return array Array of Arrays of Strings the first level indexed by
-        * action, the second level containing the names of the groups
-        * allowed to perform each action
+        * @return array Keys are actions, values are arrays as returned by
+        *     Title::getRestrictions()
         * @since 1.23
         */
        public function getAllRestrictions() {
index 941a405..f2d3d9b 100644 (file)
@@ -1146,7 +1146,7 @@ class User {
                        $token = rtrim( $proposedUser->getToken( false ) ); // correct token
                        // Make comparison in constant time (bug 61346)
                        $passwordCorrect = strlen( $token )
-                               && $this->compareSecrets( $token, $request->getCookie( 'Token' ) );
+                               && hash_equals( $token, $request->getCookie( 'Token' ) );
                        $from = 'cookie';
                } else {
                        // No session or persistent login cookie
@@ -1165,27 +1165,6 @@ class User {
                }
        }
 
-       /**
-        * A comparison of two strings, not vulnerable to timing attacks
-        * @param string $answer The secret string that you are comparing against.
-        * @param string $test Compare this string to the $answer.
-        * @return bool True if the strings are the same, false otherwise
-        */
-       protected function compareSecrets( $answer, $test ) {
-               if ( strlen( $answer ) !== strlen( $test ) ) {
-                       $passwordCorrect = false;
-               } else {
-                       $result = 0;
-                       $answerLength = strlen( $answer );
-                       for ( $i = 0; $i < $answerLength; $i++ ) {
-                               $result |= ord( $answer[$i] ) ^ ord( $test[$i] );
-                       }
-                       $passwordCorrect = ( $result == 0 );
-               }
-
-               return $passwordCorrect;
-       }
-
        /**
         * Load user and user_group data from the database.
         * $this->mId must be set, this is how the user is identified.
@@ -1274,9 +1253,6 @@ class User {
                        $this->mNewpassword = $row->user_newpassword;
                        $this->mNewpassTime = wfTimestampOrNull( TS_MW, $row->user_newpass_time );
                        $this->mEmail = $row->user_email;
-                       if ( isset( $row->user_options ) ) {
-                               $this->decodeOptions( $row->user_options );
-                       }
                        $this->mTouched = wfTimestamp( TS_MW, $row->user_touched );
                        $this->mToken = $row->user_token;
                        if ( $this->mToken == '' ) {
@@ -2573,6 +2549,8 @@ class User {
        /**
         * Set the given option for a user.
         *
+        * You need to call saveSettings() to actually write to the database.
+        *
         * @param string $oname The option to set
         * @param mixed $val New value to set
         */
@@ -3323,34 +3301,6 @@ class User {
                }
        }
 
-       /**
-        * Set this user's options from an encoded string
-        * @param string $str Encoded options to import
-        *
-        * @deprecated since 1.19 due to removal of user_options from the user table
-        */
-       private function decodeOptions( $str ) {
-               wfDeprecated( __METHOD__, '1.19' );
-               if ( !$str ) {
-                       return;
-               }
-
-               $this->mOptionsLoaded = true;
-               $this->mOptionOverrides = array();
-
-               // If an option is not set in $str, use the default value
-               $this->mOptions = self::getDefaultOptions();
-
-               $a = explode( "\n", $str );
-               foreach ( $a as $s ) {
-                       $m = array();
-                       if ( preg_match( "/^(.[^=]*)=(.*)$/", $s, $m ) ) {
-                               $this->mOptions[$m[1]] = $m[2];
-                               $this->mOptionOverrides[$m[1]] = $m[2];
-                       }
-               }
-       }
-
        /**
         * Set a cookie on the user's client. Wrapper for
         * WebResponse::setCookie
@@ -4828,7 +4778,9 @@ class User {
        }
 
        /**
-        * @todo document
+        * Saves the non-default options for this user, as previously set e.g. via
+        * setOption(), in the database's "user_properties" (preferences) table.
+        * Usually used via saveSettings().
         */
        protected function saveOptions() {
                $this->loadOptions();
@@ -4843,13 +4795,13 @@ class User {
                }
 
                $userId = $this->getId();
-               $insert_rows = array();
+
+               $insert_rows = array(); // all the new preference rows
                foreach ( $saveOptions as $key => $value ) {
                        // Don't bother storing default values
                        $defaultOption = self::getDefaultOption( $key );
-                       if ( ( is_null( $defaultOption ) &&
-                               !( $value === false || is_null( $value ) ) ) ||
-                               $value != $defaultOption
+                       if ( ( $defaultOption === null && $value !== false && $value !== null )
+                               || $value != $defaultOption
                        ) {
                                $insert_rows[] = array(
                                        'up_user' => $userId,
@@ -4860,14 +4812,22 @@ class User {
                }
 
                $dbw = wfGetDB( DB_MASTER );
-               // Find and delete any prior preference rows...
+
                $res = $dbw->select( 'user_properties',
-                       array( 'up_property' ), array( 'up_user' => $userId ), __METHOD__ );
-               $priorKeys = array();
+                       array( 'up_property', 'up_value' ), array( 'up_user' => $userId ), __METHOD__ );
+
+               // Find prior rows that need to be removed or updated. These rows will
+               // all be deleted (the later so that INSERT IGNORE applies the new values).
+               $keysDelete = array();
                foreach ( $res as $row ) {
-                       $priorKeys[] = $row->up_property;
+                       if ( !isset( $saveOptions[$row->up_property] )
+                               || strcmp( $saveOptions[$row->up_property], $row->up_value ) != 0
+                       ) {
+                               $keysDelete[] = $row->up_property;
+                       }
                }
-               if ( count( $priorKeys ) ) {
+
+               if ( count( $keysDelete ) ) {
                        // Do the DELETE by PRIMARY KEY for prior rows.
                        // In the past a very large portion of calls to this function are for setting
                        // 'rememberpassword' for new accounts (a preference that has since been removed).
@@ -4876,7 +4836,7 @@ class User {
                        // updates would pile up on each other as they are for higher (newer) user IDs.
                        // It might not be necessary these days, but it shouldn't hurt either.
                        $dbw->delete( 'user_properties',
-                               array( 'up_user' => $userId, 'up_property' => $priorKeys ), __METHOD__ );
+                               array( 'up_user' => $userId, 'up_property' => $keysDelete ), __METHOD__ );
                }
                // Insert the new preference rows
                $dbw->insert( 'user_properties', $insert_rows, __METHOD__, array( 'IGNORE' ) );
index ecc2372..ce9fecd 100644 (file)
@@ -754,17 +754,6 @@ class WebRequest {
                return $this->appendQueryArray( wfCgiToArray( $query ) );
        }
 
-       /**
-        * HTML-safe version of appendQuery().
-        * @deprecated: Deprecated in 1.20, warnings in 1.21, remove in 1.22.
-        *
-        * @param string $query Query string fragment; do not include initial '?'
-        * @return string
-        */
-       public function escapeAppendQuery( $query ) {
-               return htmlspecialchars( $this->appendQuery( $query ) );
-       }
-
        /**
         * @param string $key
         * @param string $value
@@ -1119,6 +1108,9 @@ HTML;
 
                # collect the originating ips
                $ip = $this->getRawIP();
+               if ( !$ip ) {
+                       throw new MWException( 'Unable to determine IP.' );
+               }
 
                # Append XFF
                $forwardedFor = $this->getHeader( 'X-Forwarded-For' );
@@ -1126,34 +1118,35 @@ HTML;
                        $isConfigured = IP::isConfiguredProxy( $ip );
                        $ipchain = array_map( 'trim', explode( ',', $forwardedFor ) );
                        $ipchain = array_reverse( $ipchain );
-                       if ( $ip ) {
-                               array_unshift( $ipchain, $ip );
-                       }
+                       array_unshift( $ipchain, $ip );
 
                        # Step through XFF list and find the last address in the list which is a
                        # trusted server. Set $ip to the IP address given by that trusted server,
                        # unless the address is not sensible (e.g. private). However, prefer private
                        # IP addresses over proxy servers controlled by this site (more sensible).
+                       # Note that some XFF values might be "unknown" with Squid/Varnish.
                        foreach ( $ipchain as $i => $curIP ) {
-                               // ignore 'unknown' value from Squid when 'forwarded_for off' and try next
-                               if ( $curIP === 'unknown' ) {
-                                       continue;
-                               }
                                $curIP = IP::sanitizeIP( IP::canonicalize( $curIP ) );
-                               if ( IP::isTrustedProxy( $curIP ) && isset( $ipchain[$i + 1] ) ) {
-                                       if ( IP::isConfiguredProxy( $curIP ) || // bug 48919; treat IP as sane
-                                               IP::isPublic( $ipchain[$i + 1] ) ||
-                                               $wgUsePrivateIPs
-                                       ) {
-                                               $nextIP = IP::canonicalize( $ipchain[$i + 1] );
-                                               if ( !$nextIP && $isConfigured ) {
-                                                       // We have not yet made it past CDN/proxy servers of this site,
-                                                       // so either they are misconfigured or there is some IP spoofing.
-                                                       throw new MWException( "Invalid IP given in XFF '$forwardedFor'." );
-                                               }
-                                               $ip = $nextIP;
-                                               continue;
+                               if ( !$curIP || !isset( $ipchain[$i + 1] ) || $ipchain[$i + 1] === 'unknown'
+                                       || !IP::isTrustedProxy( $curIP )
+                               ) {
+                                       break; // IP is not valid/trusted or does not point to anything
+                               }
+                               if (
+                                       IP::isPublic( $ipchain[$i + 1] ) ||
+                                       $wgUsePrivateIPs ||
+                                       IP::isConfiguredProxy( $curIP ) // bug 48919; treat IP as sane
+                               ) {
+                                       // Follow the next IP according to the proxy
+                                       $nextIP = IP::canonicalize( $ipchain[$i + 1] );
+                                       if ( !$nextIP && $isConfigured ) {
+                                               // We have not yet made it past CDN/proxy servers of this site,
+                                               // so either they are misconfigured or there is some IP spoofing.
+                                               throw new MWException( "Invalid IP given in XFF '$forwardedFor'." );
                                        }
+                                       $ip = $nextIP;
+                                       // keep traversing the chain
+                                       continue;
                                }
                                break;
                        }
index 555813d..a8bafa3 100644 (file)
@@ -533,6 +533,7 @@ class MediaWiki {
                // Note: Do this after $wgTitle is setup, otherwise the hooks run from
                // isLoggedIn() will do all sorts of weird stuff.
                if (
+                       $request->getProtocol() == 'http' &&
                        (
                                $request->getCookie( 'forceHTTPS', '' ) ||
                                // check for prefixed version for currently logged in users
@@ -542,34 +543,36 @@ class MediaWiki {
                                        $this->context->getUser()->isLoggedIn()
                                        && $this->context->getUser()->requiresHTTPS()
                                )
-                       ) &&
-                       $request->getProtocol() == 'http'
+                       )
                ) {
                        $oldUrl = $request->getFullRequestURL();
                        $redirUrl = preg_replace( '#^http://#', 'https://', $oldUrl );
 
-                       if ( $request->wasPosted() ) {
-                               // This is weird and we'd hope it almost never happens. This
-                               // means that a POST came in via HTTP and policy requires us
-                               // redirecting to HTTPS. It's likely such a request is going
-                               // to fail due to post data being lost, but let's try anyway
-                               // and just log the instance.
-                               //
-                               // @todo @fixme See if we could issue a 307 or 308 here, need
-                               // to see how clients (automated & browser) behave when we do
-                               wfDebugLog( 'RedirectedPosts', "Redirected from HTTP to HTTPS: $oldUrl" );
+                       // ATTENTION: This hook is likely to be removed soon due to overall design of the system.
+                       if ( wfRunHooks( 'BeforeHttpsRedirect', array( $this->context, &$redirUrl ) ) ) {
+
+                               if ( $request->wasPosted() ) {
+                                       // This is weird and we'd hope it almost never happens. This
+                                       // means that a POST came in via HTTP and policy requires us
+                                       // redirecting to HTTPS. It's likely such a request is going
+                                       // to fail due to post data being lost, but let's try anyway
+                                       // and just log the instance.
+                                       //
+                                       // @todo @fixme See if we could issue a 307 or 308 here, need
+                                       // to see how clients (automated & browser) behave when we do
+                                       wfDebugLog( 'RedirectedPosts', "Redirected from HTTP to HTTPS: $oldUrl" );
+                               }
+                               // Setup dummy Title, otherwise OutputPage::redirect will fail
+                               $title = Title::newFromText( NS_MAIN, 'REDIR' );
+                               $this->context->setTitle( $title );
+                               $output = $this->context->getOutput();
+                               // Since we only do this redir to change proto, always send a vary header
+                               $output->addVaryHeader( 'X-Forwarded-Proto' );
+                               $output->redirect( $redirUrl );
+                               $output->output();
+                               wfProfileOut( __METHOD__ );
+                               return;
                        }
-
-                       // Setup dummy Title, otherwise OutputPage::redirect will fail
-                       $title = Title::newFromText( NS_MAIN, 'REDIR' );
-                       $this->context->setTitle( $title );
-                       $output = $this->context->getOutput();
-                       // Since we only do this redir to change proto, always send a vary header
-                       $output->addVaryHeader( 'X-Forwarded-Proto' );
-                       $output->redirect( $redirUrl );
-                       $output->output();
-                       wfProfileOut( __METHOD__ );
-                       return;
                }
 
                if ( $wgUseFileCache && $title->getNamespace() >= 0 ) {
diff --git a/includes/WikiCategoryPage.php b/includes/WikiCategoryPage.php
deleted file mode 100644 (file)
index d382001..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-/**
- * Special handling for category 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
- *
- * @file
- */
-
-/**
- * Special handling for category pages
- */
-class WikiCategoryPage extends WikiPage {
-
-       /**
-        * Don't return a 404 for categories in use.
-        * In use defined as: either the actual page exists
-        * or the category currently has members.
-        *
-        * @return bool
-        */
-       public function hasViewableContent() {
-               if ( parent::hasViewableContent() ) {
-                       return true;
-               } else {
-                       $cat = Category::newFromTitle( $this->mTitle );
-                       // If any of these are not 0, then has members
-                       if ( $cat->getPageCount()
-                               || $cat->getSubcatCount()
-                               || $cat->getFileCount()
-                       ) {
-                               return true;
-                       }
-               }
-               return false;
-       }
-}
diff --git a/includes/WikiFilePage.php b/includes/WikiFilePage.php
deleted file mode 100644 (file)
index 34f15c3..0000000
+++ /dev/null
@@ -1,236 +0,0 @@
-<?php
-/**
- * Special handling for file 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
- *
- * @file
- */
-
-/**
- * Special handling for file pages
- *
- * @ingroup Media
- */
-class WikiFilePage extends WikiPage {
-       /**
-        * @var File
-        */
-       protected $mFile = false;                               // !< File object
-       protected $mRepo = null;                            // !<
-       protected $mFileLoaded = false;             // !<
-       protected $mDupes = null;                               // !<
-
-       public function __construct( $title ) {
-               parent::__construct( $title );
-               $this->mDupes = null;
-               $this->mRepo = null;
-       }
-
-       public function getActionOverrides() {
-               $overrides = parent::getActionOverrides();
-               $overrides['revert'] = 'RevertFileAction';
-               return $overrides;
-       }
-
-       /**
-        * @param File $file
-        */
-       public function setFile( $file ) {
-               $this->mFile = $file;
-               $this->mFileLoaded = true;
-       }
-
-       /**
-        * @return bool
-        */
-       protected function loadFile() {
-               if ( $this->mFileLoaded ) {
-                       return true;
-               }
-               $this->mFileLoaded = true;
-
-               $this->mFile = wfFindFile( $this->mTitle );
-               if ( !$this->mFile ) {
-                       $this->mFile = wfLocalFile( $this->mTitle ); // always a File
-               }
-               $this->mRepo = $this->mFile->getRepo();
-               return true;
-       }
-
-       /**
-        * @return mixed|null|Title
-        */
-       public function getRedirectTarget() {
-               $this->loadFile();
-               if ( $this->mFile->isLocal() ) {
-                       return parent::getRedirectTarget();
-               }
-               // Foreign image page
-               $from = $this->mFile->getRedirected();
-               $to = $this->mFile->getName();
-               if ( $from == $to ) {
-                       return null;
-               }
-               $this->mRedirectTarget = Title::makeTitle( NS_FILE, $to );
-               return $this->mRedirectTarget;
-       }
-
-       /**
-        * @return bool|mixed|Title
-        */
-       public function followRedirect() {
-               $this->loadFile();
-               if ( $this->mFile->isLocal() ) {
-                       return parent::followRedirect();
-               }
-               $from = $this->mFile->getRedirected();
-               $to = $this->mFile->getName();
-               if ( $from == $to ) {
-                       return false;
-               }
-               return Title::makeTitle( NS_FILE, $to );
-       }
-
-       /**
-        * @return bool
-        */
-       public function isRedirect() {
-               $this->loadFile();
-               if ( $this->mFile->isLocal() ) {
-                       return parent::isRedirect();
-               }
-
-               return (bool)$this->mFile->getRedirected();
-       }
-
-       /**
-        * @return bool
-        */
-       public function isLocal() {
-               $this->loadFile();
-               return $this->mFile->isLocal();
-       }
-
-       /**
-        * @return bool|File
-        */
-       public function getFile() {
-               $this->loadFile();
-               return $this->mFile;
-       }
-
-       /**
-        * @return array|null
-        */
-       public function getDuplicates() {
-               $this->loadFile();
-               if ( !is_null( $this->mDupes ) ) {
-                       return $this->mDupes;
-               }
-               $hash = $this->mFile->getSha1();
-               if ( !( $hash ) ) {
-                       $this->mDupes = array();
-                       return $this->mDupes;
-               }
-               $dupes = RepoGroup::singleton()->findBySha1( $hash );
-               // Remove duplicates with self and non matching file sizes
-               $self = $this->mFile->getRepoName() . ':' . $this->mFile->getName();
-               $size = $this->mFile->getSize();
-
-               /**
-                * @var $file File
-                */
-               foreach ( $dupes as $index => $file ) {
-                       $key = $file->getRepoName() . ':' . $file->getName();
-                       if ( $key == $self ) {
-                               unset( $dupes[$index] );
-                       }
-                       if ( $file->getSize() != $size ) {
-                               unset( $dupes[$index] );
-                       }
-               }
-               $this->mDupes = $dupes;
-               return $this->mDupes;
-       }
-
-       /**
-        * Override handling of action=purge
-        * @return bool
-        */
-       public function doPurge() {
-               $this->loadFile();
-               if ( $this->mFile->exists() ) {
-                       wfDebug( 'ImagePage::doPurge purging ' . $this->mFile->getName() . "\n" );
-                       $update = new HTMLCacheUpdate( $this->mTitle, 'imagelinks' );
-                       $update->doUpdate();
-                       $this->mFile->upgradeRow();
-                       $this->mFile->purgeCache( array( 'forThumbRefresh' => true ) );
-               } else {
-                       wfDebug( 'ImagePage::doPurge no image for '
-                               . $this->mFile->getName() . "; limiting purge to cache only\n" );
-                       // even if the file supposedly doesn't exist, force any cached information
-                       // to be updated (in case the cached information is wrong)
-                       $this->mFile->purgeCache( array( 'forThumbRefresh' => true ) );
-               }
-               if ( $this->mRepo ) {
-                       // Purge redirect cache
-                       $this->mRepo->invalidateImageRedirect( $this->mTitle );
-               }
-               return parent::doPurge();
-       }
-
-       /**
-        * Get the categories this file is a member of on the wiki where it was uploaded.
-        * For local files, this is the same as getCategories().
-        * For foreign API files (InstantCommons), this is not supported currently.
-        * Results will include hidden categories.
-        *
-        * @return TitleArray|Title[]
-        * @since 1.23
-        */
-       public function getForeignCategories() {
-               $this->loadFile();
-               $title = $this->mTitle;
-               $file = $this->mFile;
-
-               if ( ! $file instanceof LocalFile ) {
-                       wfDebug( __CLASS__ . '::' . __METHOD__ . " is not supported for this file\n" );
-                       return TitleArray::newFromResult( new FakeResultWrapper( array() ) );
-               }
-
-               /** @var LocalRepo $repo */
-               $repo = $file->getRepo();
-               $dbr = $repo->getSlaveDB();
-
-               $res = $dbr->select(
-                       array( 'page', 'categorylinks' ),
-                       array(
-                               'page_title' => 'cl_to',
-                               'page_namespace' => NS_CATEGORY,
-                       ),
-                       array(
-                               'page_namespace' => $title->getNamespace(),
-                               'page_title' => $title->getDBkey(),
-                       ),
-                       __METHOD__,
-                       array(),
-                       array( 'categorylinks' => array( 'INNER JOIN', 'page_id = cl_from' ) )
-               );
-
-               return TitleArray::newFromResult( $res );
-       }
-}
diff --git a/includes/WikiPage.php b/includes/WikiPage.php
deleted file mode 100644 (file)
index 8fe948b..0000000
+++ /dev/null
@@ -1,3716 +0,0 @@
-<?php
-/**
- * Base representation for a MediaWiki page.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * Abstract class for type hinting (accepts WikiPage, Article, ImagePage, CategoryPage)
- */
-interface Page {
-}
-
-/**
- * Class representing a MediaWiki article and history.
- *
- * Some fields are public only for backwards-compatibility. Use accessors.
- * In the past, this class was part of Article.php and everything was public.
- *
- * @internal documentation reviewed 15 Mar 2010
- */
-class WikiPage implements Page, IDBAccessObject {
-       // Constants for $mDataLoadedFrom and related
-
-       /**
-        * @var Title
-        */
-       public $mTitle = null;
-
-       /**@{{
-        * @protected
-        */
-       public $mDataLoaded = false;         // !< Boolean
-       public $mIsRedirect = false;         // !< Boolean
-       public $mLatest = false;             // !< Integer (false means "not loaded")
-       /**@}}*/
-
-       /** @var stdclass Map of cache fields (text, parser output, ect) for a proposed/new edit */
-       public $mPreparedEdit = false;
-
-       /**
-        * @var int
-        */
-       protected $mId = null;
-
-       /**
-        * @var int One of the READ_* constants
-        */
-       protected $mDataLoadedFrom = self::READ_NONE;
-
-       /**
-        * @var Title
-        */
-       protected $mRedirectTarget = null;
-
-       /**
-        * @var Revision
-        */
-       protected $mLastRevision = null;
-
-       /**
-        * @var string Timestamp of the current revision or empty string if not loaded
-        */
-       protected $mTimestamp = '';
-
-       /**
-        * @var string
-        */
-       protected $mTouched = '19700101000000';
-
-       /**
-        * @var string
-        */
-       protected $mLinksUpdated = '19700101000000';
-
-       /**
-        * @var int|null
-        */
-       protected $mCounter = null;
-
-       /**
-        * Constructor and clear the article
-        * @param Title $title Reference to a Title object.
-        */
-       public function __construct( Title $title ) {
-               $this->mTitle = $title;
-       }
-
-       /**
-        * Create a WikiPage object of the appropriate class for the given title.
-        *
-        * @param Title $title
-        *
-        * @throws MWException
-        * @return WikiPage Object of the appropriate type
-        */
-       public static function factory( Title $title ) {
-               $ns = $title->getNamespace();
-
-               if ( $ns == NS_MEDIA ) {
-                       throw new MWException( "NS_MEDIA is a virtual namespace; use NS_FILE." );
-               } elseif ( $ns < 0 ) {
-                       throw new MWException( "Invalid or virtual namespace $ns given." );
-               }
-
-               switch ( $ns ) {
-                       case NS_FILE:
-                               $page = new WikiFilePage( $title );
-                               break;
-                       case NS_CATEGORY:
-                               $page = new WikiCategoryPage( $title );
-                               break;
-                       default:
-                               $page = new WikiPage( $title );
-               }
-
-               return $page;
-       }
-
-       /**
-        * Constructor from a page id
-        *
-        * @param int $id Article ID to load
-        * @param string|int $from One of the following values:
-        *        - "fromdb" or WikiPage::READ_NORMAL to select from a slave database
-        *        - "fromdbmaster" or WikiPage::READ_LATEST to select from the master database
-        *
-        * @return WikiPage|null
-        */
-       public static function newFromID( $id, $from = 'fromdb' ) {
-               // page id's are never 0 or negative, see bug 61166
-               if ( $id < 1 ) {
-                       return null;
-               }
-
-               $from = self::convertSelectType( $from );
-               $db = wfGetDB( $from === self::READ_LATEST ? DB_MASTER : DB_SLAVE );
-               $row = $db->selectRow( 'page', self::selectFields(), array( 'page_id' => $id ), __METHOD__ );
-               if ( !$row ) {
-                       return null;
-               }
-               return self::newFromRow( $row, $from );
-       }
-
-       /**
-        * Constructor from a database row
-        *
-        * @since 1.20
-        * @param object $row Database row containing at least fields returned by selectFields().
-        * @param string|int $from Source of $data:
-        *        - "fromdb" or WikiPage::READ_NORMAL: from a slave DB
-        *        - "fromdbmaster" or WikiPage::READ_LATEST: from the master DB
-        *        - "forupdate" or WikiPage::READ_LOCKING: from the master DB using SELECT FOR UPDATE
-        * @return WikiPage
-        */
-       public static function newFromRow( $row, $from = 'fromdb' ) {
-               $page = self::factory( Title::newFromRow( $row ) );
-               $page->loadFromRow( $row, $from );
-               return $page;
-       }
-
-       /**
-        * Convert 'fromdb', 'fromdbmaster' and 'forupdate' to READ_* constants.
-        *
-        * @param object|string|int $type
-        * @return mixed
-        */
-       private static function convertSelectType( $type ) {
-               switch ( $type ) {
-               case 'fromdb':
-                       return self::READ_NORMAL;
-               case 'fromdbmaster':
-                       return self::READ_LATEST;
-               case 'forupdate':
-                       return self::READ_LOCKING;
-               default:
-                       // It may already be an integer or whatever else
-                       return $type;
-               }
-       }
-
-       /**
-        * 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 behavior.
-        *
-        * @todo Move this UI stuff somewhere else
-        *
-        * @return array
-        */
-       public function getActionOverrides() {
-               $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() );
-       }
-
-       /**
-        * Get the title object of the article
-        * @return Title Title object of this page
-        */
-       public function getTitle() {
-               return $this->mTitle;
-       }
-
-       /**
-        * Clear the object
-        * @return void
-        */
-       public function clear() {
-               $this->mDataLoaded = false;
-               $this->mDataLoadedFrom = self::READ_NONE;
-
-               $this->clearCacheFields();
-       }
-
-       /**
-        * Clear the object cache fields
-        * @return void
-        */
-       protected function clearCacheFields() {
-               $this->mId = null;
-               $this->mCounter = null;
-               $this->mRedirectTarget = null; // Title object if set
-               $this->mLastRevision = null; // Latest revision
-               $this->mTouched = '19700101000000';
-               $this->mLinksUpdated = '19700101000000';
-               $this->mTimestamp = '';
-               $this->mIsRedirect = false;
-               $this->mLatest = false;
-               // Bug 57026: do not clear mPreparedEdit since prepareTextForEdit() already checks
-               // the requested rev ID and content against the cached one for equality. For most
-               // content types, the output should not change during the lifetime of this cache.
-               // Clearing it can cause extra parses on edit for no reason.
-       }
-
-       /**
-        * Clear the mPreparedEdit cache field, as may be needed by mutable content types
-        * @return void
-        * @since 1.23
-        */
-       public function clearPreparedEdit() {
-               $this->mPreparedEdit = false;
-       }
-
-       /**
-        * Return the list of revision fields that should be selected to create
-        * a new page.
-        *
-        * @return array
-        */
-       public static function selectFields() {
-               global $wgContentHandlerUseDB;
-
-               $fields = array(
-                       'page_id',
-                       'page_namespace',
-                       'page_title',
-                       'page_restrictions',
-                       'page_counter',
-                       'page_is_redirect',
-                       'page_is_new',
-                       'page_random',
-                       'page_touched',
-                       'page_links_updated',
-                       'page_latest',
-                       'page_len',
-               );
-
-               if ( $wgContentHandlerUseDB ) {
-                       $fields[] = 'page_content_model';
-               }
-
-               return $fields;
-       }
-
-       /**
-        * Fetch a page record with the given conditions
-        * @param DatabaseBase $dbr
-        * @param array $conditions
-        * @param array $options
-        * @return object|bool Database result resource, or false on failure
-        */
-       protected function pageData( $dbr, $conditions, $options = array() ) {
-               $fields = self::selectFields();
-
-               wfRunHooks( 'ArticlePageDataBefore', array( &$this, &$fields ) );
-
-               $row = $dbr->selectRow( 'page', $fields, $conditions, __METHOD__, $options );
-
-               wfRunHooks( 'ArticlePageDataAfter', array( &$this, &$row ) );
-
-               return $row;
-       }
-
-       /**
-        * Fetch a page record matching the Title object's namespace and title
-        * using a sanitized title string
-        *
-        * @param DatabaseBase $dbr
-        * @param Title $title
-        * @param array $options
-        * @return object|bool Database result resource, or false on failure
-        */
-       public function pageDataFromTitle( $dbr, $title, $options = array() ) {
-               return $this->pageData( $dbr, array(
-                       'page_namespace' => $title->getNamespace(),
-                       'page_title' => $title->getDBkey() ), $options );
-       }
-
-       /**
-        * Fetch a page record matching the requested ID
-        *
-        * @param DatabaseBase $dbr
-        * @param int $id
-        * @param array $options
-        * @return object|bool Database result resource, or false on failure
-        */
-       public function pageDataFromId( $dbr, $id, $options = array() ) {
-               return $this->pageData( $dbr, array( 'page_id' => $id ), $options );
-       }
-
-       /**
-        * Set the general counter, title etc data loaded from
-        * some source.
-        *
-        * @param object|string|int $from One of the following:
-        *   - A DB query result object.
-        *   - "fromdb" or WikiPage::READ_NORMAL to get from a slave DB.
-        *   - "fromdbmaster" or WikiPage::READ_LATEST to get from the master DB.
-        *   - "forupdate"  or WikiPage::READ_LOCKING to get from the master DB
-        *     using SELECT FOR UPDATE.
-        *
-        * @return void
-        */
-       public function loadPageData( $from = 'fromdb' ) {
-               $from = self::convertSelectType( $from );
-               if ( is_int( $from ) && $from <= $this->mDataLoadedFrom ) {
-                       // We already have the data from the correct location, no need to load it twice.
-                       return;
-               }
-
-               if ( $from === self::READ_LOCKING ) {
-                       $data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle, array( 'FOR UPDATE' ) );
-               } elseif ( $from === self::READ_LATEST ) {
-                       $data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle );
-               } elseif ( $from === self::READ_NORMAL ) {
-                       $data = $this->pageDataFromTitle( wfGetDB( DB_SLAVE ), $this->mTitle );
-                       // Use a "last rev inserted" timestamp key to diminish the issue of slave lag.
-                       // Note that DB also stores the master position in the session and checks it.
-                       $touched = $this->getCachedLastEditTime();
-                       if ( $touched ) { // key set
-                               if ( !$data || $touched > wfTimestamp( TS_MW, $data->page_touched ) ) {
-                                       $from = self::READ_LATEST;
-                                       $data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle );
-                               }
-                       }
-               } else {
-                       // No idea from where the caller got this data, assume slave database.
-                       $data = $from;
-                       $from = self::READ_NORMAL;
-               }
-
-               $this->loadFromRow( $data, $from );
-       }
-
-       /**
-        * Load the object from a database row
-        *
-        * @since 1.20
-        * @param object $data Database row containing at least fields returned by selectFields()
-        * @param string|int $from One of the following:
-        *        - "fromdb" or WikiPage::READ_NORMAL if the data comes from a slave DB
-        *        - "fromdbmaster" or WikiPage::READ_LATEST if the data comes from the master DB
-        *        - "forupdate"  or WikiPage::READ_LOCKING if the data comes from from
-        *          the master DB using SELECT FOR UPDATE
-        */
-       public function loadFromRow( $data, $from ) {
-               $lc = LinkCache::singleton();
-               $lc->clearLink( $this->mTitle );
-
-               if ( $data ) {
-                       $lc->addGoodLinkObjFromRow( $this->mTitle, $data );
-
-                       $this->mTitle->loadFromRow( $data );
-
-                       // Old-fashioned restrictions
-                       $this->mTitle->loadRestrictions( $data->page_restrictions );
-
-                       $this->mId = intval( $data->page_id );
-                       $this->mCounter = intval( $data->page_counter );
-                       $this->mTouched = wfTimestamp( TS_MW, $data->page_touched );
-                       $this->mLinksUpdated = wfTimestampOrNull( TS_MW, $data->page_links_updated );
-                       $this->mIsRedirect = intval( $data->page_is_redirect );
-                       $this->mLatest = intval( $data->page_latest );
-                       // Bug 37225: $latest may no longer match the cached latest Revision object.
-                       // Double-check the ID of any cached latest Revision object for consistency.
-                       if ( $this->mLastRevision && $this->mLastRevision->getId() != $this->mLatest ) {
-                               $this->mLastRevision = null;
-                               $this->mTimestamp = '';
-                       }
-               } else {
-                       $lc->addBadLinkObj( $this->mTitle );
-
-                       $this->mTitle->loadFromRow( false );
-
-                       $this->clearCacheFields();
-
-                       $this->mId = 0;
-               }
-
-               $this->mDataLoaded = true;
-               $this->mDataLoadedFrom = self::convertSelectType( $from );
-       }
-
-       /**
-        * @return int Page ID
-        */
-       public function getId() {
-               if ( !$this->mDataLoaded ) {
-                       $this->loadPageData();
-               }
-               return $this->mId;
-       }
-
-       /**
-        * @return bool Whether or not the page exists in the database
-        */
-       public function exists() {
-               if ( !$this->mDataLoaded ) {
-                       $this->loadPageData();
-               }
-               return $this->mId > 0;
-       }
-
-       /**
-        * Check if this page is something we're going to be showing
-        * some sort of sensible content for. If we return false, page
-        * views (plain action=view) will return an HTTP 404 response,
-        * so spiders and robots can know they're following a bad link.
-        *
-        * @return bool
-        */
-       public function hasViewableContent() {
-               return $this->exists() || $this->mTitle->isAlwaysKnown();
-       }
-
-       /**
-        * @return int The view count for the page
-        */
-       public function getCount() {
-               if ( !$this->mDataLoaded ) {
-                       $this->loadPageData();
-               }
-
-               return $this->mCounter;
-       }
-
-       /**
-        * Tests if the article content represents a redirect
-        *
-        * @return bool
-        */
-       public function isRedirect() {
-               $content = $this->getContent();
-               if ( !$content ) {
-                       return false;
-               }
-
-               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();
-       }
-
-       /**
-        * Loads page_touched and returns a value indicating if it should be used
-        * @return bool true if not a redirect
-        */
-       public function checkTouched() {
-               if ( !$this->mDataLoaded ) {
-                       $this->loadPageData();
-               }
-               return !$this->mIsRedirect;
-       }
-
-       /**
-        * Get the page_touched field
-        * @return string Containing GMT timestamp
-        */
-       public function getTouched() {
-               if ( !$this->mDataLoaded ) {
-                       $this->loadPageData();
-               }
-               return $this->mTouched;
-       }
-
-       /**
-        * Get the page_links_updated field
-        * @return string|null Containing GMT timestamp
-        */
-       public function getLinksTimestamp() {
-               if ( !$this->mDataLoaded ) {
-                       $this->loadPageData();
-               }
-               return $this->mLinksUpdated;
-       }
-
-       /**
-        * Get the page_latest field
-        * @return int rev_id of current revision
-        */
-       public function getLatest() {
-               if ( !$this->mDataLoaded ) {
-                       $this->loadPageData();
-               }
-               return (int)$this->mLatest;
-       }
-
-       /**
-        * Get the Revision object of the oldest revision
-        * @return Revision|null
-        */
-       public function getOldestRevision() {
-               wfProfileIn( __METHOD__ );
-
-               // Try using the slave database first, then try the master
-               $continue = 2;
-               $db = wfGetDB( DB_SLAVE );
-               $revSelectFields = Revision::selectFields();
-
-               $row = null;
-               while ( $continue ) {
-                       $row = $db->selectRow(
-                               array( 'page', 'revision' ),
-                               $revSelectFields,
-                               array(
-                                       'page_namespace' => $this->mTitle->getNamespace(),
-                                       'page_title' => $this->mTitle->getDBkey(),
-                                       'rev_page = page_id'
-                               ),
-                               __METHOD__,
-                               array(
-                                       'ORDER BY' => 'rev_timestamp ASC'
-                               )
-                       );
-
-                       if ( $row ) {
-                               $continue = 0;
-                       } else {
-                               $db = wfGetDB( DB_MASTER );
-                               $continue--;
-                       }
-               }
-
-               wfProfileOut( __METHOD__ );
-               return $row ? Revision::newFromRow( $row ) : null;
-       }
-
-       /**
-        * Loads everything except the text
-        * This isn't necessary for all uses, so it's only done if needed.
-        */
-       protected function loadLastEdit() {
-               if ( $this->mLastRevision !== null ) {
-                       return; // already loaded
-               }
-
-               $latest = $this->getLatest();
-               if ( !$latest ) {
-                       return; // page doesn't exist or is missing page_latest info
-               }
-
-               // Bug 37225: if session S1 loads the page row FOR UPDATE, the result always includes the
-               // latest changes committed. This is true even within REPEATABLE-READ transactions, where
-               // S1 normally only sees changes committed before the first S1 SELECT. Thus we need S1 to
-               // also gets the revision row FOR UPDATE; otherwise, it may not find it since a page row
-               // UPDATE and revision row INSERT by S2 may have happened after the first S1 SELECT.
-               // http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html#isolevel_repeatable-read.
-               $flags = ( $this->mDataLoadedFrom == self::READ_LOCKING ) ? Revision::READ_LOCKING : 0;
-               $revision = Revision::newFromPageId( $this->getId(), $latest, $flags );
-               if ( $revision ) { // sanity
-                       $this->setLastEdit( $revision );
-               }
-       }
-
-       /**
-        * Set the latest revision
-        * @param Revision $revision
-        */
-       protected function setLastEdit( Revision $revision ) {
-               $this->mLastRevision = $revision;
-               $this->mTimestamp = $revision->getTimestamp();
-       }
-
-       /**
-        * Get the latest revision
-        * @return Revision|null
-        */
-       public function getRevision() {
-               $this->loadLastEdit();
-               if ( $this->mLastRevision ) {
-                       return $this->mLastRevision;
-               }
-               return null;
-       }
-
-       /**
-        * Get the content of the current revision. No side-effects...
-        *
-        * @param int $audience int 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 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, $user );
-               }
-               return null;
-       }
-
-       /**
-        * Get the text of the current revision. No side-effects...
-        *
-        * @param int $audience One of:
-        *   Revision::FOR_PUBLIC       to be displayed to all users
-        *   Revision::FOR_THIS_USER    to be displayed to the given user
-        *   Revision::RAW              get the text regardless of permissions
-        * @param User $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
-        * @deprecated since 1.21, getContent() should be used instead.
-        */
-       public function getText( $audience = Revision::FOR_PUBLIC, User $user = null ) {
-               ContentHandler::deprecated( __METHOD__, '1.21' );
-
-               $this->loadLastEdit();
-               if ( $this->mLastRevision ) {
-                       return $this->mLastRevision->getText( $audience, $user );
-               }
-               return false;
-       }
-
-       /**
-        * Get the text of the current revision. No side-effects...
-        *
-        * @return string|bool The text of the current revision. False on failure
-        * @deprecated since 1.21, getContent() should be used instead.
-        */
-       public function getRawText() {
-               ContentHandler::deprecated( __METHOD__, '1.21' );
-
-               return $this->getText( Revision::RAW );
-       }
-
-       /**
-        * @return string MW timestamp of last article revision
-        */
-       public function getTimestamp() {
-               // Check if the field has been filled by WikiPage::setTimestamp()
-               if ( !$this->mTimestamp ) {
-                       $this->loadLastEdit();
-               }
-
-               return wfTimestamp( TS_MW, $this->mTimestamp );
-       }
-
-       /**
-        * Set the page timestamp (use only to avoid DB queries)
-        * @param string $ts MW timestamp of last article revision
-        * @return void
-        */
-       public function setTimestamp( $ts ) {
-               $this->mTimestamp = wfTimestamp( TS_MW, $ts );
-       }
-
-       /**
-        * @param int $audience One of:
-        *   Revision::FOR_PUBLIC       to be displayed to all users
-        *   Revision::FOR_THIS_USER    to be displayed to the given user
-        *   Revision::RAW              get the text regardless of permissions
-        * @param User $user User object to check for, only if FOR_THIS_USER is passed
-        *   to the $audience parameter
-        * @return int user ID for the user that made the last article revision
-        */
-       public function getUser( $audience = Revision::FOR_PUBLIC, User $user = null ) {
-               $this->loadLastEdit();
-               if ( $this->mLastRevision ) {
-                       return $this->mLastRevision->getUser( $audience, $user );
-               } else {
-                       return -1;
-               }
-       }
-
-       /**
-        * Get the User object of the user who created the page
-        * @param int $audience One of:
-        *   Revision::FOR_PUBLIC       to be displayed to all users
-        *   Revision::FOR_THIS_USER    to be displayed to the given user
-        *   Revision::RAW              get the text regardless of permissions
-        * @param User $user User object to check for, only if FOR_THIS_USER is passed
-        *   to the $audience parameter
-        * @return User|null
-        */
-       public function getCreator( $audience = Revision::FOR_PUBLIC, User $user = null ) {
-               $revision = $this->getOldestRevision();
-               if ( $revision ) {
-                       $userName = $revision->getUserText( $audience, $user );
-                       return User::newFromName( $userName, false );
-               } else {
-                       return null;
-               }
-       }
-
-       /**
-        * @param int $audience One of:
-        *   Revision::FOR_PUBLIC       to be displayed to all users
-        *   Revision::FOR_THIS_USER    to be displayed to the given user
-        *   Revision::RAW              get the text regardless of permissions
-        * @param User $user User object to check for, only if FOR_THIS_USER is passed
-        *   to the $audience parameter
-        * @return string username of the user that made the last article revision
-        */
-       public function getUserText( $audience = Revision::FOR_PUBLIC, User $user = null ) {
-               $this->loadLastEdit();
-               if ( $this->mLastRevision ) {
-                       return $this->mLastRevision->getUserText( $audience, $user );
-               } else {
-                       return '';
-               }
-       }
-
-       /**
-        * @param int $audience One of:
-        *   Revision::FOR_PUBLIC       to be displayed to all users
-        *   Revision::FOR_THIS_USER    to be displayed to the given user
-        *   Revision::RAW              get the text regardless of permissions
-        * @param User $user User object to check for, only if FOR_THIS_USER is passed
-        *   to the $audience parameter
-        * @return string Comment stored for the last article revision
-        */
-       public function getComment( $audience = Revision::FOR_PUBLIC, User $user = null ) {
-               $this->loadLastEdit();
-               if ( $this->mLastRevision ) {
-                       return $this->mLastRevision->getComment( $audience, $user );
-               } else {
-                       return '';
-               }
-       }
-
-       /**
-        * Returns true if last revision was marked as "minor edit"
-        *
-        * @return bool Minor edit indicator for the last article revision.
-        */
-       public function getMinorEdit() {
-               $this->loadLastEdit();
-               if ( $this->mLastRevision ) {
-                       return $this->mLastRevision->isMinor();
-               } else {
-                       return false;
-               }
-       }
-
-       /**
-        * Get the cached timestamp for the last time the page changed.
-        * This is only used to help handle slave lag by comparing to page_touched.
-        * @return string MW timestamp
-        */
-       protected function getCachedLastEditTime() {
-               global $wgMemc;
-               $key = wfMemcKey( 'page-lastedit', md5( $this->mTitle->getPrefixedDBkey() ) );
-               return $wgMemc->get( $key );
-       }
-
-       /**
-        * Set the cached timestamp for the last time the page changed.
-        * This is only used to help handle slave lag by comparing to page_touched.
-        * @param string $timestamp
-        * @return void
-        */
-       public function setCachedLastEditTime( $timestamp ) {
-               global $wgMemc;
-               $key = wfMemcKey( 'page-lastedit', md5( $this->mTitle->getPrefixedDBkey() ) );
-               $wgMemc->set( $key, wfTimestamp( TS_MW, $timestamp ), 60 * 15 );
-       }
-
-       /**
-        * Determine whether a page would be suitable for being counted as an
-        * article in the site_stats table based on the title & its content
-        *
-        * @param object|bool $editInfo (false): object returned by prepareTextForEdit(),
-        *   if false, the current database state will be used
-        * @return bool
-        */
-       public function isCountable( $editInfo = false ) {
-               global $wgArticleCountMethod;
-
-               if ( !$this->mTitle->isContentPage() ) {
-                       return false;
-               }
-
-               if ( $editInfo ) {
-                       $content = $editInfo->pstContent;
-               } else {
-                       $content = $this->getContent();
-               }
-
-               if ( !$content || $content->isRedirect() ) {
-                       return false;
-               }
-
-               $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.
-                               $hasLinks = (bool)count( $editInfo->output->getLinks() );
-                       } else {
-                               $hasLinks = (bool)wfGetDB( DB_SLAVE )->selectField( 'pagelinks', 1,
-                                       array( 'pl_from' => $this->getId() ), __METHOD__ );
-                       }
-               }
-
-               return $content->isCountable( $hasLinks );
-       }
-
-       /**
-        * If this page is a redirect, get its target
-        *
-        * The target will be fetched from the redirect table if possible.
-        * If this page doesn't have an entry there, call insertRedirect()
-        * @return Title|null Title object, or null if this page is not a redirect
-        */
-       public function getRedirectTarget() {
-               if ( !$this->mTitle->isRedirect() ) {
-                       return null;
-               }
-
-               if ( $this->mRedirectTarget !== null ) {
-                       return $this->mRedirectTarget;
-               }
-
-               // Query the redirect table
-               $dbr = wfGetDB( DB_SLAVE );
-               $row = $dbr->selectRow( 'redirect',
-                       array( 'rd_namespace', 'rd_title', 'rd_fragment', 'rd_interwiki' ),
-                       array( 'rd_from' => $this->getId() ),
-                       __METHOD__
-               );
-
-               // rd_fragment and rd_interwiki were added later, populate them if empty
-               if ( $row && !is_null( $row->rd_fragment ) && !is_null( $row->rd_interwiki ) ) {
-                       $this->mRedirectTarget = Title::makeTitle(
-                               $row->rd_namespace, $row->rd_title,
-                               $row->rd_fragment, $row->rd_interwiki );
-                       return $this->mRedirectTarget;
-               }
-
-               // This page doesn't have an entry in the redirect table
-               $this->mRedirectTarget = $this->insertRedirect();
-               return $this->mRedirectTarget;
-       }
-
-       /**
-        * Insert an entry for this page into the redirect table.
-        *
-        * Don't call this function directly unless you know what you're doing.
-        * @return Title|null Title object or null if not a redirect
-        */
-       public function insertRedirect() {
-               // recurse through to only get the final target
-               $content = $this->getContent();
-               $retval = $content ? $content->getUltimateRedirectTarget() : null;
-               if ( !$retval ) {
-                       return null;
-               }
-               $this->insertRedirectEntry( $retval );
-               return $retval;
-       }
-
-       /**
-        * Insert or update the redirect table entry for this page to indicate
-        * it redirects to $rt .
-        * @param Title $rt Redirect target
-        */
-       public function insertRedirectEntry( $rt ) {
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->replace( 'redirect', array( 'rd_from' ),
-                       array(
-                               'rd_from' => $this->getId(),
-                               'rd_namespace' => $rt->getNamespace(),
-                               'rd_title' => $rt->getDBkey(),
-                               'rd_fragment' => $rt->getFragment(),
-                               'rd_interwiki' => $rt->getInterwiki(),
-                       ),
-                       __METHOD__
-               );
-       }
-
-       /**
-        * Get the Title object or URL this page redirects to
-        *
-        * @return bool|Title|string false, Title of in-wiki target, or string with URL
-        */
-       public function followRedirect() {
-               return $this->getRedirectURL( $this->getRedirectTarget() );
-       }
-
-       /**
-        * Get the Title object or URL to use for a redirect. We use Title
-        * objects for same-wiki, non-special redirects and URLs for everything
-        * else.
-        * @param Title $rt Redirect target
-        * @return bool|Title|string false, Title object of local target, or string with URL
-        */
-       public function getRedirectURL( $rt ) {
-               if ( !$rt ) {
-                       return false;
-               }
-
-               if ( $rt->isExternal() ) {
-                       if ( $rt->isLocal() ) {
-                               // Offsite wikis need an HTTP redirect.
-                               //
-                               // This can be hard to reverse and may produce loops,
-                               // so they may be disabled in the site configuration.
-                               $source = $this->mTitle->getFullURL( 'redirect=no' );
-                               return $rt->getFullURL( array( 'rdfrom' => $source ) );
-                       } else {
-                               // External pages pages without "local" bit set are not valid
-                               // redirect targets
-                               return false;
-                       }
-               }
-
-               if ( $rt->isSpecialPage() ) {
-                       // Gotta handle redirects to special pages differently:
-                       // Fill the HTTP response "Location" header and ignore
-                       // the rest of the page we're on.
-                       //
-                       // Some pages are not valid targets
-                       if ( $rt->isValidRedirectTarget() ) {
-                               return $rt->getFullURL();
-                       } else {
-                               return false;
-                       }
-               }
-
-               return $rt;
-       }
-
-       /**
-        * Get a list of users who have edited this article, not including the user who made
-        * the most recent revision, which you can get from $article->getUser() if you want it
-        * @return UserArrayFromResult
-        */
-       public function getContributors() {
-               // @todo FIXME: This is expensive; cache this info somewhere.
-
-               $dbr = wfGetDB( DB_SLAVE );
-
-               if ( $dbr->implicitGroupby() ) {
-                       $realNameField = 'user_real_name';
-               } else {
-                       $realNameField = 'MIN(user_real_name) AS user_real_name';
-               }
-
-               $tables = array( 'revision', 'user' );
-
-               $fields = array(
-                       'user_id' => 'rev_user',
-                       'user_name' => 'rev_user_text',
-                       $realNameField,
-                       'timestamp' => 'MAX(rev_timestamp)',
-               );
-
-               $conds = array( 'rev_page' => $this->getId() );
-
-               // The user who made the top revision gets credited as "this page was last edited by
-               // John, based on contributions by Tom, Dick and Harry", so don't include them twice.
-               $user = $this->getUser();
-               if ( $user ) {
-                       $conds[] = "rev_user != $user";
-               } else {
-                       $conds[] = "rev_user_text != {$dbr->addQuotes( $this->getUserText() )}";
-               }
-
-               $conds[] = "{$dbr->bitAnd( 'rev_deleted', Revision::DELETED_USER )} = 0"; // username hidden?
-
-               $jconds = array(
-                       'user' => array( 'LEFT JOIN', 'rev_user = user_id' ),
-               );
-
-               $options = array(
-                       'GROUP BY' => array( 'rev_user', 'rev_user_text' ),
-                       'ORDER BY' => 'timestamp DESC',
-               );
-
-               $res = $dbr->select( $tables, $fields, $conds, __METHOD__, $options, $jconds );
-               return new UserArrayFromResult( $res );
-       }
-
-       /**
-        * Get the last N authors
-        * @param int $num Number of revisions to get
-        * @param int|string $revLatest The latest rev_id, selected from the master (optional)
-        * @return array Array of authors, duplicates not removed
-        */
-       public function getLastNAuthors( $num, $revLatest = 0 ) {
-               wfProfileIn( __METHOD__ );
-               // First try the slave
-               // If that doesn't have the latest revision, try the master
-               $continue = 2;
-               $db = wfGetDB( DB_SLAVE );
-
-               do {
-                       $res = $db->select( array( 'page', 'revision' ),
-                               array( 'rev_id', 'rev_user_text' ),
-                               array(
-                                       'page_namespace' => $this->mTitle->getNamespace(),
-                                       'page_title' => $this->mTitle->getDBkey(),
-                                       'rev_page = page_id'
-                               ), __METHOD__,
-                               array(
-                                       'ORDER BY' => 'rev_timestamp DESC',
-                                       'LIMIT' => $num
-                               )
-                       );
-
-                       if ( !$res ) {
-                               wfProfileOut( __METHOD__ );
-                               return array();
-                       }
-
-                       $row = $db->fetchObject( $res );
-
-                       if ( $continue == 2 && $revLatest && $row->rev_id != $revLatest ) {
-                               $db = wfGetDB( DB_MASTER );
-                               $continue--;
-                       } else {
-                               $continue = 0;
-                       }
-               } while ( $continue );
-
-               $authors = array( $row->rev_user_text );
-
-               foreach ( $res as $row ) {
-                       $authors[] = $row->rev_user_text;
-               }
-
-               wfProfileOut( __METHOD__ );
-               return $authors;
-       }
-
-       /**
-        * Should the parser cache be used?
-        *
-        * @param ParserOptions $parserOptions ParserOptions to check
-        * @param int $oldid
-        * @return bool
-        */
-       public function isParserCacheUsed( ParserOptions $parserOptions, $oldid ) {
-               global $wgEnableParserCache;
-
-               return $wgEnableParserCache
-                       && $parserOptions->getStubThreshold() == 0
-                       && $this->exists()
-                       && ( $oldid === null || $oldid === 0 || $oldid === $this->getLatest() )
-                       && $this->getContentHandler()->isParserCacheSupported();
-       }
-
-       /**
-        * Get a ParserOutput for the given ParserOptions and revision ID.
-        * The parser cache will be used if possible.
-        *
-        * @since 1.19
-        * @param ParserOptions $parserOptions ParserOptions to use for the parse operation
-        * @param null|int $oldid Revision ID to get the text from, passing null or 0 will
-        *   get the current revision (default value)
-        *
-        * @return ParserOutput|bool ParserOutput or false if the revision was not found
-        */
-       public function getParserOutput( ParserOptions $parserOptions, $oldid = null ) {
-               wfProfileIn( __METHOD__ );
-
-               $useParserCache = $this->isParserCacheUsed( $parserOptions, $oldid );
-               wfDebug( __METHOD__ . ': using parser cache: ' . ( $useParserCache ? 'yes' : 'no' ) . "\n" );
-               if ( $parserOptions->getStubThreshold() ) {
-                       wfIncrStats( 'pcache_miss_stub' );
-               }
-
-               if ( $useParserCache ) {
-                       $parserOutput = ParserCache::singleton()->get( $this, $parserOptions );
-                       if ( $parserOutput !== false ) {
-                               wfProfileOut( __METHOD__ );
-                               return $parserOutput;
-                       }
-               }
-
-               if ( $oldid === null || $oldid === 0 ) {
-                       $oldid = $this->getLatest();
-               }
-
-               $pool = new PoolWorkArticleView( $this, $parserOptions, $oldid, $useParserCache );
-               $pool->execute();
-
-               wfProfileOut( __METHOD__ );
-
-               return $pool->getParserOutput();
-       }
-
-       /**
-        * Do standard deferred updates after page view (existing or missing page)
-        * @param User $user The relevant user
-        * @param int $oldid The revision id being viewed. If not given or 0, latest revision is assumed.
-        */
-       public function doViewUpdates( User $user, $oldid = 0 ) {
-               global $wgDisableCounters;
-               if ( wfReadOnly() ) {
-                       return;
-               }
-
-               // Don't update page view counters on views from bot users (bug 14044)
-               if ( !$wgDisableCounters && !$user->isAllowed( 'bot' ) && $this->exists() ) {
-                       DeferredUpdates::addUpdate( new ViewCountUpdate( $this->getId() ) );
-                       DeferredUpdates::addUpdate( new SiteStatsUpdate( 1, 0, 0 ) );
-               }
-
-               // Update newtalk / watchlist notification status
-               $user->clearNotification( $this->mTitle, $oldid );
-       }
-
-       /**
-        * Perform the actions of a page purging
-        * @return bool
-        */
-       public function doPurge() {
-               global $wgUseSquid;
-
-               if ( !wfRunHooks( 'ArticlePurge', array( &$this ) ) ) {
-                       return false;
-               }
-
-               // Invalidate the cache
-               $this->mTitle->invalidateCache();
-
-               if ( $wgUseSquid ) {
-                       // Commit the transaction before the purge is sent
-                       $dbw = wfGetDB( DB_MASTER );
-                       $dbw->commit( __METHOD__ );
-
-                       // Send purge
-                       $update = SquidUpdate::newSimplePurge( $this->mTitle );
-                       $update->doUpdate();
-               }
-
-               if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
-                       // @todo move this logic to MessageCache
-
-                       if ( $this->exists() ) {
-                               // 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;
-                       }
-
-                       MessageCache::singleton()->replace( $this->mTitle->getDBkey(), $text );
-               }
-               return true;
-       }
-
-       /**
-        * Insert a new empty page record for this article.
-        * This *must* be followed up by creating a revision
-        * and running $this->updateRevisionOn( ... );
-        * or else the record will be left in a funky state.
-        * Best if all done inside a transaction.
-        *
-        * @param DatabaseBase $dbw
-        * @return int The newly created page_id key, or false if the title already existed
-        */
-       public function insertOn( $dbw ) {
-               wfProfileIn( __METHOD__ );
-
-               $page_id = $dbw->nextSequenceValue( 'page_page_id_seq' );
-               $dbw->insert( 'page', array(
-                       'page_id'           => $page_id,
-                       'page_namespace'    => $this->mTitle->getNamespace(),
-                       'page_title'        => $this->mTitle->getDBkey(),
-                       'page_counter'      => 0,
-                       'page_restrictions' => '',
-                       'page_is_redirect'  => 0, // Will set this shortly...
-                       'page_is_new'       => 1,
-                       'page_random'       => wfRandom(),
-                       'page_touched'      => $dbw->timestamp(),
-                       'page_latest'       => 0, // Fill this in shortly...
-                       'page_len'          => 0, // Fill this in shortly...
-               ), __METHOD__, 'IGNORE' );
-
-               $affected = $dbw->affectedRows();
-
-               if ( $affected ) {
-                       $newid = $dbw->insertId();
-                       $this->mId = $newid;
-                       $this->mTitle->resetArticleID( $newid );
-               }
-               wfProfileOut( __METHOD__ );
-
-               return $affected ? $newid : false;
-       }
-
-       /**
-        * Update the page record to point to a newly saved revision.
-        *
-        * @param DatabaseBase $dbw
-        * @param Revision $revision For ID number, and text used to set
-        *   length and redirect status fields
-        * @param int $lastRevision If given, will not overwrite the page field
-        *   when different from the currently set value.
-        *   Giving 0 indicates the new page flag should be set on.
-        * @param bool $lastRevIsRedirect If given, will optimize adding and
-        *   removing rows in redirect table.
-        * @return bool true on success, false on failure
-        */
-       public function updateRevisionOn( $dbw, $revision, $lastRevision = null,
-               $lastRevIsRedirect = null
-       ) {
-               global $wgContentHandlerUseDB;
-
-               wfProfileIn( __METHOD__ );
-
-               $content = $revision->getContent();
-               $len = $content ? $content->getSize() : 0;
-               $rt = $content ? $content->getUltimateRedirectTarget() : null;
-
-               $conditions = array( 'page_id' => $this->getId() );
-
-               if ( !is_null( $lastRevision ) ) {
-                       // An extra check against threads stepping on each other
-                       $conditions['page_latest'] = $lastRevision;
-               }
-
-               $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',
-                       $row,
-                       $conditions,
-                       __METHOD__ );
-
-               $result = $dbw->affectedRows() > 0;
-               if ( $result ) {
-                       $this->updateRedirectOn( $dbw, $rt, $lastRevIsRedirect );
-                       $this->setLastEdit( $revision );
-                       $this->setCachedLastEditTime( $now );
-                       $this->mLatest = $revision->getId();
-                       $this->mIsRedirect = (bool)$rt;
-                       // Update the LinkCache.
-                       LinkCache::singleton()->addGoodLinkObj( $this->getId(), $this->mTitle, $len, $this->mIsRedirect,
-                                                                                                       $this->mLatest, $revision->getContentModel() );
-               }
-
-               wfProfileOut( __METHOD__ );
-               return $result;
-       }
-
-       /**
-        * Add row to the redirect table if this is a redirect, remove otherwise.
-        *
-        * @param DatabaseBase $dbw
-        * @param Title $redirectTitle Title object pointing to the redirect target,
-        *   or NULL if this is not a redirect
-        * @param null|bool $lastRevIsRedirect If given, will optimize adding and
-        *   removing rows in redirect table.
-        * @return bool true on success, false on failure
-        * @private
-        */
-       public function updateRedirectOn( $dbw, $redirectTitle, $lastRevIsRedirect = null ) {
-               // Always update redirects (target link might have changed)
-               // Update/Insert if we don't know if the last revision was a redirect or not
-               // Delete if changing from redirect to non-redirect
-               $isRedirect = !is_null( $redirectTitle );
-
-               if ( !$isRedirect && $lastRevIsRedirect === false ) {
-                       return true;
-               }
-
-               wfProfileIn( __METHOD__ );
-               if ( $isRedirect ) {
-                       $this->insertRedirectEntry( $redirectTitle );
-               } else {
-                       // This is not a redirect, remove row from redirect table
-                       $where = array( 'rd_from' => $this->getId() );
-                       $dbw->delete( 'redirect', $where, __METHOD__ );
-               }
-
-               if ( $this->getTitle()->getNamespace() == NS_FILE ) {
-                       RepoGroup::singleton()->getLocalRepo()->invalidateImageRedirect( $this->getTitle() );
-               }
-               wfProfileOut( __METHOD__ );
-
-               return ( $dbw->affectedRows() != 0 );
-       }
-
-       /**
-        * If the given revision is newer than the currently set page_latest,
-        * update the page record. Otherwise, do nothing.
-        *
-        * @param DatabaseBase $dbw
-        * @param Revision $revision
-        * @return bool
-        */
-       public function updateIfNewerOn( $dbw, $revision ) {
-               wfProfileIn( __METHOD__ );
-
-               $row = $dbw->selectRow(
-                       array( 'revision', 'page' ),
-                       array( 'rev_id', 'rev_timestamp', 'page_is_redirect' ),
-                       array(
-                               'page_id' => $this->getId(),
-                               'page_latest=rev_id' ),
-                       __METHOD__ );
-
-               if ( $row ) {
-                       if ( wfTimestamp( TS_MW, $row->rev_timestamp ) >= $revision->getTimestamp() ) {
-                               wfProfileOut( __METHOD__ );
-                               return false;
-                       }
-                       $prev = $row->rev_id;
-                       $lastRevIsRedirect = (bool)$row->page_is_redirect;
-               } else {
-                       // No or missing previous revision; mark the page as new
-                       $prev = 0;
-                       $lastRevIsRedirect = null;
-               }
-
-               $ret = $this->updateRevisionOn( $dbw, $revision, $prev, $lastRevIsRedirect );
-
-               wfProfileOut( __METHOD__ );
-               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 Revision $undo
-        * @param Revision $undoafter 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,
-        * must exist and must not be deleted
-        * @param Revision $undo
-        * @param Revision $undoafter Must be an earlier revision than $undo
-        * @return string|bool string on success, false on failure
-        * @deprecated since 1.21: use ContentHandler::getUndoContent() instead.
-        */
-       public function getUndoText( Revision $undo, Revision $undoafter = null ) {
-               ContentHandler::deprecated( __METHOD__, '1.21' );
-
-               $this->loadLastEdit();
-
-               if ( $this->mLastRevision ) {
-                       if ( is_null( $undoafter ) ) {
-                               $undoafter = $undo->getPrevious();
-                       }
-
-                       $handler = $this->getContentHandler();
-                       $undone = $handler->getUndoContent( $this->mLastRevision, $undo, $undoafter );
-
-                       if ( !$undone ) {
-                               return false;
-                       } else {
-                               return ContentHandler::getContentText( $undone );
-                       }
-               }
-
-               return false;
-       }
-
-       /**
-        * @param string|null|bool $section Null/false, a section number (0, 1, 2, T1, T2, ...) or "new".
-        * @param string $text New text of the section.
-        * @param string $sectionTitle New section's subject, only if $section is "new".
-        * @param string $edittime Revision timestamp or null to use the current revision.
-        *
-        * @throws MWException
-        * @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' );
-
-               //NOTE: keep condition in sync with condition in replaceSectionContent!
-               if ( strval( $section ) == '' ) {
-                       // 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 if this page's content model supports sections.
-        *
-        * @return bool
-        *
-        * @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 string|null|bool $section Null/false, a section number (0, 1, 2, T1, T2, ...) or "new".
-        * @param Content $sectionContent New content of the section.
-        * @param string $sectionTitle New section's subject, only if $section is "new".
-        * @param string $edittime Revision timestamp or null to use the current revision.
-        *
-        * @throws MWException
-        * @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() ) {
-                               wfProfileOut( __METHOD__ );
-                               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' ) {
-                               $oldContent = $this->getContent();
-                       } else {
-                               $dbw = wfGetDB( DB_MASTER );
-                               $rev = Revision::loadFromTimestamp( $dbw, $this->mTitle, $edittime );
-
-                               if ( !$rev ) {
-                                       wfDebug( "WikiPage::replaceSection asked for bogus section (page: " .
-                                               $this->getId() . "; section: $section; edittime: $edittime)\n" );
-                                       wfProfileOut( __METHOD__ );
-                                       return null;
-                               }
-
-                               $oldContent = $rev->getContent();
-                       }
-
-                       if ( ! $oldContent ) {
-                               wfDebug( __METHOD__ . ": no page text\n" );
-                               wfProfileOut( __METHOD__ );
-                               return null;
-                       }
-
-                       // FIXME: $oldContent might be null?
-                       $newContent = $oldContent->replaceSection( $section, $sectionContent, $sectionTitle );
-               }
-
-               wfProfileOut( __METHOD__ );
-               return $newContent;
-       }
-
-       /**
-        * Check flags and add EDIT_NEW or EDIT_UPDATE to them as needed.
-        * @param int $flags
-        * @return int Updated $flags
-        */
-       public function checkFlags( $flags ) {
-               if ( !( $flags & EDIT_NEW ) && !( $flags & EDIT_UPDATE ) ) {
-                       if ( $this->exists() ) {
-                               $flags |= EDIT_UPDATE;
-                       } else {
-                               $flags |= EDIT_NEW;
-                       }
-               }
-
-               return $flags;
-       }
-
-       /**
-        * Change an existing article or create a new article. Updates RC and all necessary caches,
-        * optionally via the deferred update array.
-        *
-        * @param string $text New text
-        * @param string $summary Edit summary
-        * @param int $flags 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 bool|int $baseRevId The revision ID this edit was based off, if any
-        * @param User $user The user doing the edit
-        *
-        * @throws MWException
-        * @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.
-        *
-        * 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 string $summary Edit summary
-        * @param int $flags 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 bool|int $baseRevId The revision ID this edit was based off, if any
-        * @param User $user The user doing the edit
-        * @param string $serialisation_format Format for storing the content in the
-        *   database.
-        *
-        * @throws MWException
-        * @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
-               if ( $this->mTitle->getText() === '' ) {
-                       throw new MWException( 'Something is trying to edit an article with an empty title' );
-               }
-
-               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() );
-
-               // Load the data from the master database if needed.
-               // The caller may already loaded it from the master or even loaded it using
-               // SELECT FOR UPDATE, so do not override that using clear().
-               $this->loadPageData( 'fromdbmaster' );
-
-               $flags = $this->checkFlags( $flags );
-
-               // 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' );
-                       }
-
-                       wfProfileOut( __METHOD__ );
-                       return $status;
-               }
-
-               // Silently ignore EDIT_MINOR if not allowed
-               $isminor = ( $flags & EDIT_MINOR ) && $user->isAllowed( 'minoredit' );
-               $bot = $flags & EDIT_FORCE_BOT;
-
-               $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 == '' ) {
-                       if ( !$old_content ) {
-                               $old_content = null;
-                       }
-                       $summary = $handler->getAutosummary( $old_content, $content, $flags );
-               }
-
-               $editInfo = $this->prepareContentForEdit( $content, null, $user, $serialisation_format );
-               $serialized = $editInfo->pst;
-
-               /**
-                * @var Content $content
-                */
-               $content = $editInfo->pstContent;
-               $newsize = $content->getSize();
-
-               $dbw = wfGetDB( DB_MASTER );
-               $now = wfTimestampNow();
-               $this->mTimestamp = $now;
-
-               if ( $flags & EDIT_UPDATE ) {
-                       // Update article, but only if changed.
-                       $status->value['new'] = false;
-
-                       if ( !$oldid ) {
-                               // Article gone missing
-                               wfDebug( __METHOD__ . ": EDIT_UPDATE specified but article doesn't exist\n" );
-                               $status->fatal( 'edit-gone-missing' );
-
-                               wfProfileOut( __METHOD__ );
-                               return $status;
-                       } elseif ( !$old_content ) {
-                               // Sanity check for bug 37225
-                               wfProfileOut( __METHOD__ );
-                               throw new MWException( "Could not find text for current revision {$oldid}." );
-                       }
-
-                       $revision = new Revision( array(
-                               'page'       => $this->getId(),
-                               'title'      => $this->getTitle(), // for determining the default content model
-                               'comment'    => $summary,
-                               'minor_edit' => $isminor,
-                               'text'       => $serialized,
-                               'len'        => $newsize,
-                               'parent_id'  => $oldid,
-                               'user'       => $user->getId(),
-                               'user_text'  => $user->getName(),
-                               'timestamp'  => $now,
-                               'content_model' => $content->getModel(),
-                               'content_format' => $serialisation_format,
-                       ) ); // XXX: pass content object?!
-
-                       $changed = !$content->equals( $old_content );
-
-                       if ( $changed ) {
-                               if ( !$content->isValid() ) {
-                                       wfProfileOut( __METHOD__ );
-                                       throw new MWException( "New content failed validity check!" );
-                               }
-
-                               $dbw->begin( __METHOD__ );
-                               try {
-
-                                       $prepStatus = $content->prepareSave( $this, $flags, $baseRevId, $user );
-                                       $status->merge( $prepStatus );
-
-                                       if ( !$status->isOK() ) {
-                                               $dbw->rollback( __METHOD__ );
-
-                                               wfProfileOut( __METHOD__ );
-                                               return $status;
-                                       }
-                                       $revisionId = $revision->insertOn( $dbw );
-
-                                       // Update page
-                                       //
-                                       // We check for conflicts by comparing $oldid with the current latest revision ID.
-                                       $ok = $this->updateRevisionOn( $dbw, $revision, $oldid, $oldIsRedirect );
-
-                                       if ( !$ok ) {
-                                               // Belated edit conflict! Run away!!
-                                               $status->fatal( 'edit-conflict' );
-
-                                               $dbw->rollback( __METHOD__ );
-
-                                               wfProfileOut( __METHOD__ );
-                                               return $status;
-                                       }
-
-                                       wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $revision, $baseRevId, $user ) );
-                                       // Update recentchanges
-                                       if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
-                                               // Mark as patrolled if the user can do so
-                                               $patrolled = $wgUseRCPatrol && !count(
-                                               $this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
-                                               // Add RC row to the DB
-                                               $rc = RecentChange::notifyEdit( $now, $this->mTitle, $isminor, $user, $summary,
-                                                       $oldid, $this->getTimestamp(), $bot, '', $oldsize, $newsize,
-                                                       $revisionId, $patrolled
-                                               );
-
-                                               // Log auto-patrolled edits
-                                               if ( $patrolled ) {
-                                                       PatrolLog::record( $rc, true, $user );
-                                               }
-                                       }
-                                       $user->incEditCount();
-                               } catch ( MWException $e ) {
-                                       $dbw->rollback( __METHOD__ );
-                                       // Question: Would it perhaps be better if this method turned all
-                                       // exceptions into $status's?
-                                       throw $e;
-                               }
-                               $dbw->commit( __METHOD__ );
-                       } else {
-                               // Bug 32948: revision ID must be set to page {{REVISIONID}} and
-                               // related variables correctly
-                               $revision->setId( $this->getLatest() );
-                       }
-
-                       // Update links tables, site stats, etc.
-                       $this->doEditUpdates(
-                               $revision,
-                               $user,
-                               array(
-                                       'changed' => $changed,
-                                       'oldcountable' => $oldcountable
-                               )
-                       );
-
-                       if ( !$changed ) {
-                               $status->warning( 'edit-no-change' );
-                               $revision = null;
-                               // Update page_touched, this is usually implicit in the page update
-                               // Other cache updates are done in onArticleEdit()
-                               $this->mTitle->invalidateCache();
-                       }
-               } else {
-                       // Create new article
-                       $status->value['new'] = true;
-
-                       $dbw->begin( __METHOD__ );
-                       try {
-
-                               $prepStatus = $content->prepareSave( $this, $flags, $baseRevId, $user );
-                               $status->merge( $prepStatus );
-
-                               if ( !$status->isOK() ) {
-                                       $dbw->rollback( __METHOD__ );
-
-                                       wfProfileOut( __METHOD__ );
-                                       return $status;
-                               }
-
-                               $status->merge( $prepStatus );
-
-                               // Add the page record; stake our claim on this title!
-                               // This will return false if the article already exists
-                               $newid = $this->insertOn( $dbw );
-
-                               if ( $newid === false ) {
-                                       $dbw->rollback( __METHOD__ );
-                                       $status->fatal( 'edit-already-exists' );
-
-                                       wfProfileOut( __METHOD__ );
-                                       return $status;
-                               }
-
-                               // Save the revision text...
-                               $revision = new Revision( array(
-                                       'page'       => $newid,
-                                       'title'      => $this->getTitle(), // for determining the default content model
-                                       'comment'    => $summary,
-                                       'minor_edit' => $isminor,
-                                       'text'       => $serialized,
-                                       'len'        => $newsize,
-                                       'user'       => $user->getId(),
-                                       'user_text'  => $user->getName(),
-                                       '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
-                               $content = $revision->getContent(); // sanity; get normalized version
-
-                               if ( $content ) {
-                                       $newsize = $content->getSize();
-                               }
-
-                               // Update the page record with revision data
-                               $this->updateRevisionOn( $dbw, $revision, 0 );
-
-                               wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $revision, false, $user ) );
-
-                               // Update recentchanges
-                               if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
-                                       // Mark as patrolled if the user can do so
-                                       $patrolled = ( $wgUseRCPatrol || $wgUseNPPatrol ) && !count(
-                                               $this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
-                                       // Add RC row to the DB
-                                       $rc = RecentChange::notifyNew( $now, $this->mTitle, $isminor, $user, $summary, $bot,
-                                               '', $newsize, $revisionId, $patrolled );
-
-                                       // Log auto-patrolled edits
-                                       if ( $patrolled ) {
-                                               PatrolLog::record( $rc, true, $user );
-                                       }
-                               }
-                               $user->incEditCount();
-
-                       } catch ( MWException $e ) {
-                               $dbw->rollback( __METHOD__ );
-                               throw $e;
-                       }
-                       $dbw->commit( __METHOD__ );
-
-                       // Update links, etc.
-                       $this->doEditUpdates( $revision, $user, array( 'created' => true ) );
-
-                       $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
-               if ( !( $flags & EDIT_DEFER_UPDATES ) ) {
-                       DeferredUpdates::doUpdates();
-               }
-
-               // Return the new revision (or null) to the caller
-               $status->value['revision'] = $revision;
-
-               $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' );
-
-               wfProfileOut( __METHOD__ );
-               return $status;
-       }
-
-       /**
-        * 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
-        *        - 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).
-        * @return ParserOptions
-        */
-       public function makeParserOptions( $context ) {
-               $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();
-               }
-
-               return $options;
-       }
-
-       /**
-        * Prepare text which is about to be saved.
-        * Returns a stdclass with source, pst and output members
-        *
-        * @deprecated since 1.21: use prepareContentForEdit instead.
-        * @return object
-        */
-       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 int|null $revid
-        * @param User|null $user
-        * @param string|null $serialization_format
-        *
-        * @return bool|object
-        *
-        * @since 1.21
-        */
-       public function prepareContentForEdit( Content $content, $revid = null, User $user = null,
-               $serialization_format = null
-       ) {
-               global $wgContLang, $wgUser;
-               $user = is_null( $user ) ? $wgUser : $user;
-               //XXX: check $user->getId() here???
-
-               // Use a sane default for $serialization_format, see bug 57026
-               if ( $serialization_format === null ) {
-                       $serialization_format = $content->getContentHandler()->getDefaultFormat();
-               }
-
-               if ( $this->mPreparedEdit
-                       && $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;
-               }
-
-               $popts = ParserOptions::newFromUserAndLang( $user, $wgContLang );
-               wfRunHooks( 'ArticlePrepareTextForEdit', array( $this, $popts ) );
-
-               $edit = (object)array();
-               $edit->revid = $revid;
-               $edit->timestamp = wfTimestampNow();
-
-               $edit->pstContent = $content ? $content->preSaveTransform( $this->mTitle, $user, $popts ) : null;
-
-               $edit->format = $serialization_format;
-               $edit->popts = $this->makeParserOptions( 'canonical' );
-               $edit->output = $edit->pstContent
-                       ? $edit->pstContent->getParserOutput( $this->mTitle, $revid, $edit->popts )
-                       : null;
-
-               $edit->newContent = $content;
-               $edit->oldContent = $this->getContent( Revision::RAW );
-
-               // NOTE: B/C for hooks! don't use these fields!
-               $edit->newText = $edit->newContent ? ContentHandler::getContentText( $edit->newContent ) : '';
-               $edit->oldText = $edit->oldContent ? ContentHandler::getContentText( $edit->oldContent ) : '';
-               $edit->pst = $edit->pstContent ? $edit->pstContent->serialize( $serialization_format ) : '';
-
-               $this->mPreparedEdit = $edit;
-               return $edit;
-       }
-
-       /**
-        * Do standard deferred updates after page edit.
-        * Update links tables, site stats, search index and message cache.
-        * Purges pages that include this page if the text was changed here.
-        * Every 100th edit, prune the recent changes table.
-        *
-        * @param Revision $revision
-        * @param User $user User object that did the revision
-        * @param array $options Array of options, following indexes are used:
-        * - changed: boolean, whether the revision changed the content (default true)
-        * - created: boolean, whether the revision created the page (default false)
-        * - oldcountable: boolean or null (default null):
-        *   - boolean: whether the page was counted as an article before that
-        *     revision, only used in changed is true and created is false
-        *   - null: don't change the article count
-        */
-       public function doEditUpdates( Revision $revision, User $user, array $options = array() ) {
-               global $wgEnableParserCache;
-
-               wfProfileIn( __METHOD__ );
-
-               $options += array( 'changed' => true, 'created' => false, 'oldcountable' => null );
-               $content = $revision->getContent();
-
-               // Parse the text
-               // Be careful not to do pre-save transform twice: $text is usually
-               // already pre-save transformed once.
-               if ( !$this->mPreparedEdit || $this->mPreparedEdit->output->getFlag( 'vary-revision' ) ) {
-                       wfDebug( __METHOD__ . ": No prepared edit or vary-revision is set...\n" );
-                       $editInfo = $this->prepareContentForEdit( $content, $revision->getId(), $user );
-               } else {
-                       wfDebug( __METHOD__ . ": No vary-revision, using prepared edit...\n" );
-                       $editInfo = $this->mPreparedEdit;
-               }
-
-               // Save it to the parser cache
-               if ( $wgEnableParserCache ) {
-                       $parserCache = ParserCache::singleton();
-                       $parserCache->save(
-                               $editInfo->output, $this, $editInfo->popts, $editInfo->timestamp, $editInfo->revid
-                       );
-               }
-
-               // Update the links tables and other secondary data
-               if ( $content ) {
-                       $recursive = $options['changed']; // bug 50785
-                       $updates = $content->getSecondaryDataUpdates(
-                               $this->getTitle(), null, $recursive, $editInfo->output );
-                       DataUpdate::runUpdates( $updates );
-               }
-
-               wfRunHooks( 'ArticleEditUpdates', array( &$this, &$editInfo, $options['changed'] ) );
-
-               if ( wfRunHooks( 'ArticleEditUpdatesDeleteFromRecentchanges', array( &$this ) ) ) {
-                       if ( 0 == mt_rand( 0, 99 ) ) {
-                               // Flush old entries from the `recentchanges` table; we do this on
-                               // random requests so as to avoid an increase in writes for no good reason
-                               RecentChange::purgeExpiredChanges();
-                       }
-               }
-
-               if ( !$this->exists() ) {
-                       wfProfileOut( __METHOD__ );
-                       return;
-               }
-
-               $id = $this->getId();
-               $title = $this->mTitle->getPrefixedDBkey();
-               $shortTitle = $this->mTitle->getDBkey();
-
-               if ( !$options['changed'] ) {
-                       $good = 0;
-               } elseif ( $options['created'] ) {
-                       $good = (int)$this->isCountable( $editInfo );
-               } elseif ( $options['oldcountable'] !== null ) {
-                       $good = (int)$this->isCountable( $editInfo ) - (int)$options['oldcountable'];
-               } else {
-                       $good = 0;
-               }
-               $edits = $options['changed'] ? 1 : 0;
-               $total = $options['created'] ? 1 : 0;
-
-               DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, $edits, $good, $total ) );
-               DeferredUpdates::addUpdate( new SearchUpdate( $id, $title, $content ) );
-
-               // If this is another user's talk page, update newtalk.
-               // Don't do this if $options['changed'] = false (null-edits) nor if
-               // it's a minor edit and the user doesn't want notifications for those.
-               if ( $options['changed']
-                       && $this->mTitle->getNamespace() == NS_USER_TALK
-                       && $shortTitle != $user->getTitleKey()
-                       && !( $revision->isMinor() && $user->isAllowed( 'nominornewtalk' ) )
-               ) {
-                       $recipient = User::newFromName( $shortTitle, false );
-                       if ( !$recipient ) {
-                               wfDebug( __METHOD__ . ": invalid username\n" );
-                       } else {
-                               // Allow extensions to prevent user notification when a new message is added to their talk page
-                               if ( wfRunHooks( 'ArticleEditUpdateNewTalk', array( &$this, $recipient ) ) ) {
-                                       if ( User::isIP( $shortTitle ) ) {
-                                               // An anonymous user
-                                               $recipient->setNewtalk( true, $revision );
-                                       } elseif ( $recipient->isLoggedIn() ) {
-                                               $recipient->setNewtalk( true, $revision );
-                                       } else {
-                                               wfDebug( __METHOD__ . ": don't need to notify a nonexistent user\n" );
-                                       }
-                               }
-                       }
-               }
-
-               if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
-                       // XXX: could skip pseudo-messages like js/css here, based on content model.
-                       $msgtext = $content ? $content->getWikitextForTransclusion() : null;
-                       if ( $msgtext === false || $msgtext === null ) {
-                               $msgtext = '';
-                       }
-
-                       MessageCache::singleton()->replace( $shortTitle, $msgtext );
-               }
-
-               if ( $options['created'] ) {
-                       self::onArticleCreate( $this->mTitle );
-               } elseif ( $options['changed'] ) { // bug 50785
-                       self::onArticleEdit( $this->mTitle );
-               }
-
-               wfProfileOut( __METHOD__ );
-       }
-
-       /**
-        * 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 string $text Text submitted
-        * @param User $user The relevant user
-        * @param string $comment Comment submitted
-        * @param bool $minor 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() );
-               $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 string $comment comment submitted
-        * @param string $serialisation_format Format for storing the content in the database
-        * @param bool $minor Whereas it's a minor modification
-        */
-       public function doQuickEditContent( Content $content, User $user, $comment = '', $minor = false,
-               $serialisation_format = null
-       ) {
-               wfProfileIn( __METHOD__ );
-
-               $serialized = $content->serialize( $serialisation_format );
-
-               $dbw = wfGetDB( DB_MASTER );
-               $revision = new Revision( array(
-                       'title'      => $this->getTitle(), // for determining the default content model
-                       'page'       => $this->getId(),
-                       'user_text'  => $user->getName(),
-                       'user'       => $user->getId(),
-                       'text'       => $serialized,
-                       'length'     => $content->getSize(),
-                       'comment'    => $comment,
-                       'minor_edit' => $minor ? 1 : 0,
-               ) ); // XXX: set the content object?
-               $revision->insertOn( $dbw );
-               $this->updateRevisionOn( $dbw, $revision );
-
-               wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $revision, false, $user ) );
-
-               wfProfileOut( __METHOD__ );
-       }
-
-       /**
-        * Update the article's restriction field, and leave a log entry.
-        * This works for protection both existing and non-existing pages.
-        *
-        * @param array $limit Set of restriction keys
-        * @param array $expiry Per restriction type expiration
-        * @param int &$cascade Set to false if cascading protection isn't allowed.
-        * @param string $reason
-        * @param User $user The user updating the restrictions
-        * @return Status
-        */
-       public function doUpdateRestrictions( array $limit, array $expiry,
-               &$cascade, $reason, User $user
-       ) {
-               global $wgCascadingRestrictionLevels, $wgContLang;
-
-               if ( wfReadOnly() ) {
-                       return Status::newFatal( 'readonlytext', wfReadOnlyReason() );
-               }
-
-               $this->loadPageData( 'fromdbmaster' );
-               $restrictionTypes = $this->mTitle->getRestrictionTypes();
-               $id = $this->getId();
-
-               if ( !$cascade ) {
-                       $cascade = false;
-               }
-
-               // Take this opportunity to purge out expired restrictions
-               Title::purgeExpiredRestrictions();
-
-               // @todo FIXME: Same limitations as described in ProtectionForm.php (line 37);
-               // we expect a single selection, but the schema allows otherwise.
-               $isProtected = false;
-               $protect = false;
-               $changed = false;
-
-               $dbw = wfGetDB( DB_MASTER );
-
-               foreach ( $restrictionTypes as $action ) {
-                       if ( !isset( $expiry[$action] ) ) {
-                               $expiry[$action] = $dbw->getInfinity();
-                       }
-                       if ( !isset( $limit[$action] ) ) {
-                               $limit[$action] = '';
-                       } elseif ( $limit[$action] != '' ) {
-                               $protect = true;
-                       }
-
-                       // Get current restrictions on $action
-                       $current = implode( '', $this->mTitle->getRestrictions( $action ) );
-                       if ( $current != '' ) {
-                               $isProtected = true;
-                       }
-
-                       if ( $limit[$action] != $current ) {
-                               $changed = true;
-                       } elseif ( $limit[$action] != '' ) {
-                               // Only check expiry change if the action is actually being
-                               // protected, since expiry does nothing on an not-protected
-                               // action.
-                               if ( $this->mTitle->getRestrictionExpiry( $action ) != $expiry[$action] ) {
-                                       $changed = true;
-                               }
-                       }
-               }
-
-               if ( !$changed && $protect && $this->mTitle->areRestrictionsCascading() != $cascade ) {
-                       $changed = true;
-               }
-
-               // If nothing has changed, do nothing
-               if ( !$changed ) {
-                       return Status::newGood();
-               }
-
-               if ( !$protect ) { // No protection at all means unprotection
-                       $revCommentMsg = 'unprotectedarticle';
-                       $logAction = 'unprotect';
-               } elseif ( $isProtected ) {
-                       $revCommentMsg = 'modifiedarticleprotection';
-                       $logAction = 'modify';
-               } else {
-                       $revCommentMsg = 'protectedarticle';
-                       $logAction = 'protect';
-               }
-
-               // Truncate for whole multibyte characters
-               $reason = $wgContLang->truncate( $reason, 255 );
-
-               $logRelationsValues = array();
-               $logRelationsField = null;
-
-               if ( $id ) { // Protection of existing page
-                       if ( !wfRunHooks( 'ArticleProtect', array( &$this, &$user, $limit, $reason ) ) ) {
-                               return Status::newGood();
-                       }
-
-                       // Only certain restrictions can cascade...
-                       $editrestriction = isset( $limit['edit'] )
-                               ? array( $limit['edit'] )
-                               : $this->mTitle->getRestrictions( 'edit' );
-                       foreach ( array_keys( $editrestriction, 'sysop' ) as $key ) {
-                               $editrestriction[$key] = 'editprotected'; // backwards compatibility
-                       }
-                       foreach ( array_keys( $editrestriction, 'autoconfirmed' ) as $key ) {
-                               $editrestriction[$key] = 'editsemiprotected'; // backwards compatibility
-                       }
-
-                       $cascadingRestrictionLevels = $wgCascadingRestrictionLevels;
-                       foreach ( array_keys( $cascadingRestrictionLevels, 'sysop' ) as $key ) {
-                               $cascadingRestrictionLevels[$key] = 'editprotected'; // backwards compatibility
-                       }
-                       foreach ( array_keys( $cascadingRestrictionLevels, 'autoconfirmed' ) as $key ) {
-                               $cascadingRestrictionLevels[$key] = 'editsemiprotected'; // backwards compatibility
-                       }
-
-                       // The schema allows multiple restrictions
-                       if ( !array_intersect( $editrestriction, $cascadingRestrictionLevels ) ) {
-                               $cascade = false;
-                       }
-
-                       // insert null revision to identify the page protection change as edit summary
-                       $latest = $this->getLatest();
-                       $nullRevision = $this->insertProtectNullRevision(
-                               $revCommentMsg,
-                               $limit,
-                               $expiry,
-                               $cascade,
-                               $reason,
-                               $user
-                       );
-
-                       if ( $nullRevision === null ) {
-                               return Status::newFatal( 'no-null-revision', $this->mTitle->getPrefixedText() );
-                       }
-
-                       $logRelationsField = 'pr_id';
-
-                       // Update restrictions table
-                       foreach ( $limit as $action => $restrictions ) {
-                               $dbw->delete(
-                                       'page_restrictions',
-                                       array(
-                                               'pr_page' => $id,
-                                               'pr_type' => $action
-                                       ),
-                                       __METHOD__
-                               );
-                               if ( $restrictions != '' ) {
-                                       $dbw->insert(
-                                               'page_restrictions',
-                                               array(
-                                                       'pr_id' => $dbw->nextSequenceValue( 'page_restrictions_pr_id_seq' ),
-                                                       'pr_page' => $id,
-                                                       'pr_type' => $action,
-                                                       'pr_level' => $restrictions,
-                                                       'pr_cascade' => ( $cascade && $action == 'edit' ) ? 1 : 0,
-                                                       'pr_expiry' => $dbw->encodeExpiry( $expiry[$action] )
-                                               ),
-                                               __METHOD__
-                                       );
-                                       $logRelationsValues[] = $dbw->insertId();
-                               }
-                       }
-
-                       // Clear out legacy restriction fields
-                       $dbw->update(
-                               'page',
-                               array( 'page_restrictions' => '' ),
-                               array( 'page_id' => $id ),
-                               __METHOD__
-                       );
-
-                       wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $nullRevision, $latest, $user ) );
-                       wfRunHooks( 'ArticleProtectComplete', array( &$this, &$user, $limit, $reason ) );
-               } else { // Protection of non-existing page (also known as "title protection")
-                       // Cascade protection is meaningless in this case
-                       $cascade = false;
-
-                       if ( $limit['create'] != '' ) {
-                               $dbw->replace( 'protected_titles',
-                                       array( array( 'pt_namespace', 'pt_title' ) ),
-                                       array(
-                                               'pt_namespace' => $this->mTitle->getNamespace(),
-                                               'pt_title' => $this->mTitle->getDBkey(),
-                                               'pt_create_perm' => $limit['create'],
-                                               'pt_timestamp' => $dbw->timestamp(),
-                                               'pt_expiry' => $dbw->encodeExpiry( $expiry['create'] ),
-                                               'pt_user' => $user->getId(),
-                                               'pt_reason' => $reason,
-                                       ), __METHOD__
-                               );
-                       } else {
-                               $dbw->delete( 'protected_titles',
-                                       array(
-                                               'pt_namespace' => $this->mTitle->getNamespace(),
-                                               'pt_title' => $this->mTitle->getDBkey()
-                                       ), __METHOD__
-                               );
-                       }
-               }
-
-               $this->mTitle->flushRestrictions();
-               InfoAction::invalidateCache( $this->mTitle );
-
-               if ( $logAction == 'unprotect' ) {
-                       $params = array();
-               } else {
-                       $protectDescriptionLog = $this->protectDescriptionLog( $limit, $expiry );
-                       $params = array( $protectDescriptionLog, $cascade ? 'cascade' : '' );
-               }
-
-               // Update the protection log
-               $log = new LogPage( 'protect' );
-               $logId = $log->addEntry( $logAction, $this->mTitle, $reason, $params, $user );
-               if ( $logRelationsField !== null && count( $logRelationsValues ) ) {
-                       $log->addRelations( $logRelationsField, $logRelationsValues, $logId );
-               }
-
-               return Status::newGood();
-       }
-
-       /**
-        * Insert a new null revision for this page.
-        *
-        * @param string $revCommentMsg Comment message key for the revision
-        * @param array $limit Set of restriction keys
-        * @param array $expiry Per restriction type expiration
-        * @param int $cascade Set to false if cascading protection isn't allowed.
-        * @param string $reason
-        * @param User|null $user
-        * @return Revision|null Null on error
-        */
-       public function insertProtectNullRevision( $revCommentMsg, array $limit,
-               array $expiry, $cascade, $reason, $user = null
-       ) {
-               global $wgContLang;
-               $dbw = wfGetDB( DB_MASTER );
-
-               // Prepare a null revision to be added to the history
-               $editComment = $wgContLang->ucfirst(
-                       wfMessage(
-                               $revCommentMsg,
-                               $this->mTitle->getPrefixedText()
-                       )->inContentLanguage()->text()
-               );
-               if ( $reason ) {
-                       $editComment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $reason;
-               }
-               $protectDescription = $this->protectDescription( $limit, $expiry );
-               if ( $protectDescription ) {
-                       $editComment .= wfMessage( 'word-separator' )->inContentLanguage()->text();
-                       $editComment .= wfMessage( 'parentheses' )->params( $protectDescription )
-                               ->inContentLanguage()->text();
-               }
-               if ( $cascade ) {
-                       $editComment .= wfMessage( 'word-separator' )->inContentLanguage()->text();
-                       $editComment .= wfMessage( 'brackets' )->params(
-                               wfMessage( 'protect-summary-cascade' )->inContentLanguage()->text()
-                       )->inContentLanguage()->text();
-               }
-
-               $nullRev = Revision::newNullRevision( $dbw, $this->getId(), $editComment, true, $user );
-               if ( $nullRev ) {
-                       $nullRev->insertOn( $dbw );
-
-                       // Update page record and touch page
-                       $oldLatest = $nullRev->getParentId();
-                       $this->updateRevisionOn( $dbw, $nullRev, $oldLatest );
-               }
-
-               return $nullRev;
-       }
-
-       /**
-        * @param string $expiry 14-char timestamp or "infinity", or false if the input was invalid
-        * @return string
-        */
-       protected function formatExpiry( $expiry ) {
-               global $wgContLang;
-               $dbr = wfGetDB( DB_SLAVE );
-
-               $encodedExpiry = $dbr->encodeExpiry( $expiry );
-               if ( $encodedExpiry != 'infinity' ) {
-                       return wfMessage(
-                               'protect-expiring',
-                               $wgContLang->timeanddate( $expiry, false, false ),
-                               $wgContLang->date( $expiry, false, false ),
-                               $wgContLang->time( $expiry, false, false )
-                       )->inContentLanguage()->text();
-               } else {
-                       return wfMessage( 'protect-expiry-indefinite' )
-                               ->inContentLanguage()->text();
-               }
-       }
-
-       /**
-        * Builds the description to serve as comment for the edit.
-        *
-        * @param array $limit Set of restriction keys
-        * @param array $expiry Per restriction type expiration
-        * @return string
-        */
-       public function protectDescription( array $limit, array $expiry ) {
-               $protectDescription = '';
-
-               foreach ( array_filter( $limit ) as $action => $restrictions ) {
-                       # $action is one of $wgRestrictionTypes = array( 'create', 'edit', 'move', 'upload' ).
-                       # All possible message keys are listed here for easier grepping:
-                       # * restriction-create
-                       # * restriction-edit
-                       # * restriction-move
-                       # * restriction-upload
-                       $actionText = wfMessage( 'restriction-' . $action )->inContentLanguage()->text();
-                       # $restrictions is one of $wgRestrictionLevels = array( '', 'autoconfirmed', 'sysop' ),
-                       # with '' filtered out. All possible message keys are listed below:
-                       # * protect-level-autoconfirmed
-                       # * protect-level-sysop
-                       $restrictionsText = wfMessage( 'protect-level-' . $restrictions )->inContentLanguage()->text();
-
-                       $expiryText = $this->formatExpiry( $expiry[$action] );
-
-                       if ( $protectDescription !== '' ) {
-                               $protectDescription .= wfMessage( 'word-separator' )->inContentLanguage()->text();
-                       }
-                       $protectDescription .= wfMessage( 'protect-summary-desc' )
-                               ->params( $actionText, $restrictionsText, $expiryText )
-                               ->inContentLanguage()->text();
-               }
-
-               return $protectDescription;
-       }
-
-       /**
-        * Builds the description to serve as comment for the log entry.
-        *
-        * Some bots may parse IRC lines, which are generated from log entries which contain plain
-        * protect description text. Keep them in old format to avoid breaking compatibility.
-        * TODO: Fix protection log to store structured description and format it on-the-fly.
-        *
-        * @param array $limit Set of restriction keys
-        * @param array $expiry Per restriction type expiration
-        * @return string
-        */
-       public function protectDescriptionLog( array $limit, array $expiry ) {
-               global $wgContLang;
-
-               $protectDescriptionLog = '';
-
-               foreach ( array_filter( $limit ) as $action => $restrictions ) {
-                       $expiryText = $this->formatExpiry( $expiry[$action] );
-                       $protectDescriptionLog .= $wgContLang->getDirMark() . "[$action=$restrictions] ($expiryText)";
-               }
-
-               return trim( $protectDescriptionLog );
-       }
-
-       /**
-        * Take an array of page restrictions and flatten it to a string
-        * suitable for insertion into the page_restrictions field.
-        *
-        * @param string[] $limit
-        *
-        * @throws MWException
-        * @return string
-        */
-       protected static function flattenRestrictions( $limit ) {
-               if ( !is_array( $limit ) ) {
-                       throw new MWException( 'WikiPage::flattenRestrictions given non-array restriction set' );
-               }
-
-               $bits = array();
-               ksort( $limit );
-
-               foreach ( array_filter( $limit ) as $action => $restrictions ) {
-                       $bits[] = "$action=$restrictions";
-               }
-
-               return implode( ':', $bits );
-       }
-
-       /**
-        * Same as doDeleteArticleReal(), but returns a simple boolean. This is kept around for
-        * backwards compatibility, if you care about error reporting you should use
-        * doDeleteArticleReal() instead.
-        *
-        * Deletes the article with database consistency, writes logs, purges caches
-        *
-        * @param string $reason Delete reason for deletion log
-        * @param bool $suppress Suppress all revisions and log the deletion in
-        *        the suppression log instead of the deletion log
-        * @param int $id Article ID
-        * @param bool $commit Defaults to true, triggers transaction end
-        * @param array &$error Array of errors to append to
-        * @param User $user The deleting user
-        * @return bool true if successful
-        */
-       public function doDeleteArticle(
-               $reason, $suppress = false, $id = 0, $commit = true, &$error = '', User $user = null
-       ) {
-               $status = $this->doDeleteArticleReal( $reason, $suppress, $id, $commit, $error, $user );
-               return $status->isGood();
-       }
-
-       /**
-        * Back-end article deletion
-        * Deletes the article with database consistency, writes logs, purges caches
-        *
-        * @since 1.19
-        *
-        * @param string $reason Delete reason for deletion log
-        * @param bool $suppress Suppress all revisions and log the deletion in
-        *   the suppression log instead of the deletion log
-        * @param int $id Article ID
-        * @param bool $commit Defaults to true, triggers transaction end
-        * @param array &$error Array of errors to append to
-        * @param User $user The deleting user
-        * @return Status Status object; if successful, $status->value is the log_id of the
-        *   deletion log entry. If the page couldn't be deleted because it wasn't
-        *   found, $status is a non-fatal 'cannotdelete' error
-        */
-       public function doDeleteArticleReal(
-               $reason, $suppress = false, $id = 0, $commit = true, &$error = '', User $user = null
-       ) {
-               global $wgUser, $wgContentHandlerUseDB;
-
-               wfDebug( __METHOD__ . "\n" );
-
-               $status = Status::newGood();
-
-               if ( $this->mTitle->getDBkey() === '' ) {
-                       $status->error( 'cannotdelete', wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
-                       return $status;
-               }
-
-               $user = is_null( $user ) ? $wgUser : $user;
-               if ( ! wfRunHooks( 'ArticleDelete', array( &$this, &$user, &$reason, &$error, &$status ) ) ) {
-                       if ( $status->isOK() ) {
-                               // Hook aborted but didn't set a fatal status
-                               $status->fatal( 'delete-hook-aborted' );
-                       }
-                       return $status;
-               }
-
-               if ( $id == 0 ) {
-                       $this->loadPageData( 'forupdate' );
-                       $id = $this->getID();
-                       if ( $id == 0 ) {
-                               $status->error( 'cannotdelete', wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
-                               return $status;
-                       }
-               }
-
-               // Bitfields to further suppress the content
-               if ( $suppress ) {
-                       $bitfield = 0;
-                       // This should be 15...
-                       $bitfield |= Revision::DELETED_TEXT;
-                       $bitfield |= Revision::DELETED_COMMENT;
-                       $bitfield |= Revision::DELETED_USER;
-                       $bitfield |= Revision::DELETED_RESTRICTED;
-               } else {
-                       $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.
-               // Text is *not* removed from the text table; bulk storage
-               // is left intact to avoid breaking block-compression or
-               // immutable storage schemes.
-               //
-               // For backwards compatibility, note that some older archive
-               // table entries will have ar_text and ar_flags fields still.
-               //
-               // 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(
-                               'page_id' => $id,
-                               'page_id = rev_page'
-                       ), __METHOD__
-               );
-
-               // Now that it's safely backed up, delete it
-               $dbw->delete( 'page', array( 'page_id' => $id ), __METHOD__ );
-               $ok = ( $dbw->affectedRows() > 0 ); // $id could be laggy
-
-               if ( !$ok ) {
-                       $dbw->rollback( __METHOD__ );
-                       $status->error( 'cannotdelete', wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
-                       return $status;
-               }
-
-               if ( !$dbw->cascadingDeletes() ) {
-                       $dbw->delete( 'revision', array( 'rev_page' => $id ), __METHOD__ );
-               }
-
-               // Clone the title, so we have the information we need when we log
-               $logTitle = clone $this->mTitle;
-
-               $this->doDeleteUpdates( $id, $content );
-
-               // Log the deletion, if the page was suppressed, log it at Oversight instead
-               $logtype = $suppress ? 'suppress' : 'delete';
-
-               $logEntry = new ManualLogEntry( $logtype, 'delete' );
-               $logEntry->setPerformer( $user );
-               $logEntry->setTarget( $logTitle );
-               $logEntry->setComment( $reason );
-               $logid = $logEntry->insert();
-               $logEntry->publish( $logid );
-
-               if ( $commit ) {
-                       $dbw->commit( __METHOD__ );
-               }
-
-               wfRunHooks( 'ArticleDeleteComplete', array( &$this, &$user, $reason, $id, $content, $logEntry ) );
-               $status->value = $logid;
-               return $status;
-       }
-
-       /**
-        * Do some database updates after deletion
-        *
-        * @param int $id page_id value of the page being deleted
-        * @param Content $content Optional page content to be used when determining
-        *   the required updates. This may be needed because $this->getContent()
-        *   may already return null when the page proper was deleted.
-        */
-       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( $content );
-               DataUpdate::runUpdates( $updates );
-
-               // Reparse any pages transcluding this page
-               LinksUpdate::queueRecursiveJobsForTable( $this->mTitle, 'templatelinks' );
-
-               // Reparse any pages including this image
-               if ( $this->mTitle->getNamespace() == NS_FILE ) {
-                       LinksUpdate::queueRecursiveJobsForTable( $this->mTitle, 'imagelinks' );
-               }
-
-               // Clear caches
-               WikiPage::onArticleDelete( $this->mTitle );
-
-               // Reset this object and the Title object
-               $this->loadFromRow( false, self::READ_LATEST );
-
-               // Search engine
-               DeferredUpdates::addUpdate( new SearchUpdate( $id, $this->mTitle ) );
-       }
-
-       /**
-        * Roll back the most recent consecutive set of edits to a page
-        * from the same user; fails if there are no eligible edits to
-        * roll back to, e.g. user is the sole contributor. This function
-        * performs permissions checks on $user, then calls commitRollback()
-        * to do the dirty work
-        *
-        * @todo Separate the business/permission stuff out from backend code
-        *
-        * @param string $fromP Name of the user whose edits to rollback.
-        * @param string $summary Custom summary. Set to default summary if empty.
-        * @param string $token Rollback token.
-        * @param bool $bot If true, mark all reverted edits as bot.
-        *
-        * @param array $resultDetails contains result-specific array of additional values
-        *    'alreadyrolled' : 'current' (rev)
-        *    success        : 'summary' (str), 'current' (rev), 'target' (rev)
-        *
-        * @param User $user The user performing the rollback
-        * @return array Array of errors, each error formatted as
-        *   array(messagekey, param1, param2, ...).
-        * On success, the array is empty.  This array can also be passed to
-        * OutputPage::showPermissionsErrorPage().
-        */
-       public function doRollback(
-               $fromP, $summary, $token, $bot, &$resultDetails, User $user
-       ) {
-               $resultDetails = null;
-
-               // Check permissions
-               $editErrors = $this->mTitle->getUserPermissionsErrors( 'edit', $user );
-               $rollbackErrors = $this->mTitle->getUserPermissionsErrors( 'rollback', $user );
-               $errors = array_merge( $editErrors, wfArrayDiff2( $rollbackErrors, $editErrors ) );
-
-               if ( !$user->matchEditToken( $token, array( $this->mTitle->getPrefixedText(), $fromP ) ) ) {
-                       $errors[] = array( 'sessionfailure' );
-               }
-
-               if ( $user->pingLimiter( 'rollback' ) || $user->pingLimiter() ) {
-                       $errors[] = array( 'actionthrottledtext' );
-               }
-
-               // If there were errors, bail out now
-               if ( !empty( $errors ) ) {
-                       return $errors;
-               }
-
-               return $this->commitRollback( $fromP, $summary, $bot, $resultDetails, $user );
-       }
-
-       /**
-        * Backend implementation of doRollback(), please refer there for parameter
-        * and return value documentation
-        *
-        * NOTE: This function does NOT check ANY permissions, it just commits the
-        * rollback to the DB. Therefore, you should only call this function direct-
-        * ly if you want to use custom permissions checks. If you don't, use
-        * doRollback() instead.
-        * @param string $fromP Name of the user whose edits to rollback.
-        * @param string $summary Custom summary. Set to default summary if empty.
-        * @param bool $bot If true, mark all reverted edits as bot.
-        *
-        * @param array $resultDetails Contains result-specific array of additional values
-        * @param User $guser The user performing the rollback
-        * @return array
-        */
-       public function commitRollback( $fromP, $summary, $bot, &$resultDetails, User $guser ) {
-               global $wgUseRCPatrol, $wgContLang;
-
-               $dbw = wfGetDB( DB_MASTER );
-
-               if ( wfReadOnly() ) {
-                       return array( array( 'readonlytext' ) );
-               }
-
-               // Get the last editor
-               $current = $this->getRevision();
-               if ( is_null( $current ) ) {
-                       // Something wrong... no page?
-                       return array( array( 'notanarticle' ) );
-               }
-
-               $from = str_replace( '_', ' ', $fromP );
-               // User name given should match up with the top revision.
-               // If the user was deleted then $from should be empty.
-               if ( $from != $current->getUserText() ) {
-                       $resultDetails = array( 'current' => $current );
-                       return array( array( 'alreadyrolled',
-                               htmlspecialchars( $this->mTitle->getPrefixedText() ),
-                               htmlspecialchars( $fromP ),
-                               htmlspecialchars( $current->getUserText() )
-                       ) );
-               }
-
-               // Get the last edit not by this guy...
-               // Note: these may not be public values
-               $user = intval( $current->getRawUser() );
-               $user_text = $dbw->addQuotes( $current->getRawUserText() );
-               $s = $dbw->selectRow( 'revision',
-                       array( 'rev_id', 'rev_timestamp', 'rev_deleted' ),
-                       array( 'rev_page' => $current->getPage(),
-                               "rev_user != {$user} OR rev_user_text != {$user_text}"
-                       ), __METHOD__,
-                       array( 'USE INDEX' => 'page_timestamp',
-                               'ORDER BY' => 'rev_timestamp DESC' )
-                       );
-               if ( $s === false ) {
-                       // No one else ever edited this page
-                       return array( array( 'cantrollback' ) );
-               } elseif ( $s->rev_deleted & Revision::DELETED_TEXT
-                       || $s->rev_deleted & Revision::DELETED_USER
-               ) {
-                       // Only admins can see this text
-                       return array( array( 'notvisiblerev' ) );
-               }
-
-               // Set patrolling and bot flag on the edits, which gets rollbacked.
-               // This is done before the rollback edit to have patrolling also on failure (bug 62157).
-               $set = array();
-               if ( $bot && $guser->isAllowed( 'markbotedits' ) ) {
-                       // Mark all reverted edits as bot
-                       $set['rc_bot'] = 1;
-               }
-
-               if ( $wgUseRCPatrol ) {
-                       // Mark all reverted edits as patrolled
-                       $set['rc_patrolled'] = 1;
-               }
-
-               if ( count( $set ) ) {
-                       $dbw->update( 'recentchanges', $set,
-                               array( /* WHERE */
-                                       'rc_cur_id' => $current->getPage(),
-                                       'rc_user_text' => $current->getUserText(),
-                                       'rc_timestamp > ' . $dbw->addQuotes( $s->rev_timestamp ),
-                               ), __METHOD__
-                       );
-               }
-
-               // Generate the edit summary if necessary
-               $target = Revision::newFromId( $s->rev_id );
-               if ( empty( $summary ) ) {
-                       if ( $from == '' ) { // no public user name
-                               $summary = wfMessage( 'revertpage-nouser' );
-                       } else {
-                               $summary = wfMessage( 'revertpage' );
-                       }
-               }
-
-               // Allow the custom summary to use the same args as the default message
-               $args = array(
-                       $target->getUserText(), $from, $s->rev_id,
-                       $wgContLang->timeanddate( wfTimestamp( TS_MW, $s->rev_timestamp ) ),
-                       $current->getId(), $wgContLang->timeanddate( $current->getTimestamp() )
-               );
-               if ( $summary instanceof Message ) {
-                       $summary = $summary->params( $args )->inContentLanguage()->text();
-               } else {
-                       $summary = wfMsgReplaceArgs( $summary, $args );
-               }
-
-               // Trim spaces on user supplied text
-               $summary = trim( $summary );
-
-               // Truncate for whole multibyte characters.
-               $summary = $wgContLang->truncate( $summary, 255 );
-
-               // Save
-               $flags = EDIT_UPDATE;
-
-               if ( $guser->isAllowed( 'minoredit' ) ) {
-                       $flags |= EDIT_MINOR;
-               }
-
-               if ( $bot && ( $guser->isAllowedAny( 'markbotedits', 'bot' ) ) ) {
-                       $flags |= EDIT_FORCE_BOT;
-               }
-
-               // Actually store the edit
-               $status = $this->doEditContent(
-                       $target->getContent(),
-                       $summary,
-                       $flags,
-                       $target->getId(),
-                       $guser
-               );
-
-               if ( !$status->isOK() ) {
-                       return $status->getErrorsArray();
-               }
-
-               // raise error, when the edit is an edit without a new version
-               if ( empty( $status->value['revision'] ) ) {
-                       $resultDetails = array( 'current' => $current );
-                       return array( array( 'alreadyrolled',
-                                       htmlspecialchars( $this->mTitle->getPrefixedText() ),
-                                       htmlspecialchars( $fromP ),
-                                       htmlspecialchars( $current->getUserText() )
-                       ) );
-               }
-
-               $revId = $status->value['revision']->getId();
-
-               wfRunHooks( 'ArticleRollbackComplete', array( $this, $guser, $target, $current ) );
-
-               $resultDetails = array(
-                       'summary' => $summary,
-                       'current' => $current,
-                       'target' => $target,
-                       'newid' => $revId
-               );
-
-               return array();
-       }
-
-       /**
-        * The onArticle*() functions are supposed to be a kind of hooks
-        * which should be called whenever any of the specified actions
-        * are done.
-        *
-        * This is a good place to put code to clear caches, for instance.
-        *
-        * This is called on page move and undelete, as well as edit
-        *
-        * @param Title $title
-        */
-       public static function onArticleCreate( $title ) {
-               // Update existence markers on article/talk tabs...
-               if ( $title->isTalkPage() ) {
-                       $other = $title->getSubjectPage();
-               } else {
-                       $other = $title->getTalkPage();
-               }
-
-               $other->invalidateCache();
-               $other->purgeSquid();
-
-               $title->touchLinks();
-               $title->purgeSquid();
-               $title->deleteTitleProtection();
-       }
-
-       /**
-        * Clears caches when article is deleted
-        *
-        * @param Title $title
-        */
-       public static function onArticleDelete( $title ) {
-               // Update existence markers on article/talk tabs...
-               if ( $title->isTalkPage() ) {
-                       $other = $title->getSubjectPage();
-               } else {
-                       $other = $title->getTalkPage();
-               }
-
-               $other->invalidateCache();
-               $other->purgeSquid();
-
-               $title->touchLinks();
-               $title->purgeSquid();
-
-               // File cache
-               HTMLFileCache::clearFileCache( $title );
-               InfoAction::invalidateCache( $title );
-
-               // Messages
-               if ( $title->getNamespace() == NS_MEDIAWIKI ) {
-                       MessageCache::singleton()->replace( $title->getDBkey(), false );
-               }
-
-               // Images
-               if ( $title->getNamespace() == NS_FILE ) {
-                       $update = new HTMLCacheUpdate( $title, 'imagelinks' );
-                       $update->doUpdate();
-               }
-
-               // User talk pages
-               if ( $title->getNamespace() == NS_USER_TALK ) {
-                       $user = User::newFromName( $title->getText(), false );
-                       if ( $user ) {
-                               $user->setNewtalk( false );
-                       }
-               }
-
-               // Image redirects
-               RepoGroup::singleton()->getLocalRepo()->invalidateImageRedirect( $title );
-       }
-
-       /**
-        * Purge caches on page update etc
-        *
-        * @param Title $title
-        * @todo Verify that $title is always a Title object (and never false or
-        *   null), add Title hint to parameter $title.
-        */
-       public static function onArticleEdit( $title ) {
-               // Invalidate caches of articles which include this page
-               DeferredUpdates::addHTMLCacheUpdate( $title, 'templatelinks' );
-
-               // Invalidate the caches of all pages which redirect here
-               DeferredUpdates::addHTMLCacheUpdate( $title, 'redirect' );
-
-               // Purge squid for this page only
-               $title->purgeSquid();
-
-               // Clear file cache for this page only
-               HTMLFileCache::clearFileCache( $title );
-               InfoAction::invalidateCache( $title );
-       }
-
-       /**#@-*/
-
-       /**
-        * Returns a list of categories this page is a member of.
-        * Results will include hidden categories
-        *
-        * @return TitleArray
-        */
-       public function getCategories() {
-               $id = $this->getId();
-               if ( $id == 0 ) {
-                       return TitleArray::newFromResult( new FakeResultWrapper( array() ) );
-               }
-
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( 'categorylinks',
-                       array( 'cl_to AS page_title, ' . NS_CATEGORY . ' AS page_namespace' ),
-                       // Have to do that since DatabaseBase::fieldNamesWithAlias treats numeric indexes
-                       // as not being aliases, and NS_CATEGORY is numeric
-                       array( 'cl_from' => $id ),
-                       __METHOD__ );
-
-               return TitleArray::newFromResult( $res );
-       }
-
-       /**
-        * Returns a list of hidden categories this page is a member of.
-        * Uses the page_props and categorylinks tables.
-        *
-        * @return array Array of Title objects
-        */
-       public function getHiddenCategories() {
-               $result = array();
-               $id = $this->getId();
-
-               if ( $id == 0 ) {
-                       return array();
-               }
-
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( array( 'categorylinks', 'page_props', 'page' ),
-                       array( 'cl_to' ),
-                       array( 'cl_from' => $id, 'pp_page=page_id', 'pp_propname' => 'hiddencat',
-                               'page_namespace' => NS_CATEGORY, 'page_title=cl_to' ),
-                       __METHOD__ );
-
-               if ( $res !== false ) {
-                       foreach ( $res as $row ) {
-                               $result[] = Title::makeTitle( NS_CATEGORY, $row->cl_to );
-                       }
-               }
-
-               return $result;
-       }
-
-       /**
-        * Return an applicable autosummary if one exists for the given edit.
-        * @param string|null $oldtext The previous text of the page.
-        * @param string|null $newtext The submitted text of the page.
-        * @param int $flags 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 ) {
-               // NOTE: stub for backwards-compatibility. assumes the given text is
-               // wikitext. will break horribly if it isn't.
-
-               ContentHandler::deprecated( __METHOD__, '1.21' );
-
-               $handler = ContentHandler::getForModelID( CONTENT_MODEL_WIKITEXT );
-               $oldContent = is_null( $oldtext ) ? null : $handler->unserializeContent( $oldtext );
-               $newContent = is_null( $newtext ) ? null : $handler->unserializeContent( $newtext );
-
-               return $handler->getAutosummary( $oldContent, $newContent, $flags );
-       }
-
-       /**
-        * Auto-generates a deletion reason
-        *
-        * @param bool &$hasHistory Whether the page has a history
-        * @return string|bool String containing deletion reason or empty string, or boolean false
-        *    if no revision occurred
-        */
-       public function getAutoDeleteReason( &$hasHistory ) {
-               return $this->getContentHandler()->getAutoDeleteReason( $this->getTitle(), $hasHistory );
-       }
-
-       /**
-        * Update all the appropriate counts in the category table, given that
-        * we've added the categories $added and deleted the categories $deleted.
-        *
-        * @param array $added The names of categories that were added
-        * @param array $deleted The names of categories that were deleted
-        */
-       public function updateCategoryCounts( array $added, array $deleted ) {
-               $that = $this;
-               $method = __METHOD__;
-               $dbw = wfGetDB( DB_MASTER );
-
-               // Do this at the end of the commit to reduce lock wait timeouts
-               $dbw->onTransactionPreCommitOrIdle(
-                       function() use ( $dbw, $that, $method, $added, $deleted ) {
-                               $ns = $that->getTitle()->getNamespace();
-
-                               $addFields = array( 'cat_pages = cat_pages + 1' );
-                               $removeFields = array( 'cat_pages = cat_pages - 1' );
-                               if ( $ns == NS_CATEGORY ) {
-                                       $addFields[] = 'cat_subcats = cat_subcats + 1';
-                                       $removeFields[] = 'cat_subcats = cat_subcats - 1';
-                               } elseif ( $ns == NS_FILE ) {
-                                       $addFields[] = 'cat_files = cat_files + 1';
-                                       $removeFields[] = 'cat_files = cat_files - 1';
-                               }
-
-                               if ( count( $added ) ) {
-                                       $insertRows = array();
-                                       foreach ( $added as $cat ) {
-                                               $insertRows[] = array(
-                                                       'cat_title'   => $cat,
-                                                       'cat_pages'   => 1,
-                                                       'cat_subcats' => ( $ns == NS_CATEGORY ) ? 1 : 0,
-                                                       'cat_files'   => ( $ns == NS_FILE ) ? 1 : 0,
-                                               );
-                                       }
-                                       $dbw->upsert(
-                                               'category',
-                                               $insertRows,
-                                               array( 'cat_title' ),
-                                               $addFields,
-                                               $method
-                                       );
-                               }
-
-                               if ( count( $deleted ) ) {
-                                       $dbw->update(
-                                               'category',
-                                               $removeFields,
-                                               array( 'cat_title' => $deleted ),
-                                               $method
-                                       );
-                               }
-
-                               foreach ( $added as $catName ) {
-                                       $cat = Category::newFromName( $catName );
-                                       wfRunHooks( 'CategoryAfterPageAdded', array( $cat, $that ) );
-                               }
-
-                               foreach ( $deleted as $catName ) {
-                                       $cat = Category::newFromName( $catName );
-                                       wfRunHooks( 'CategoryAfterPageRemoved', array( $cat, $that ) );
-                               }
-                       }
-               );
-       }
-
-       /**
-        * Updates cascading protections
-        *
-        * @param ParserOutput $parserOutput ParserOutput object for the current version
-        */
-       public function doCascadeProtectionUpdates( ParserOutput $parserOutput ) {
-               if ( wfReadOnly() || !$this->mTitle->areRestrictionsCascading() ) {
-                       return;
-               }
-
-               // templatelinks or imagelinks tables may have become out of sync,
-               // especially if using variable-based transclusions.
-               // For paranoia, check if things have changed and if
-               // so apply updates to the database. This will ensure
-               // that cascaded protections apply as soon as the changes
-               // are visible.
-
-               // Get templates from templatelinks and images from imagelinks
-               $id = $this->getId();
-
-               $dbLinks = array();
-
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( array( 'templatelinks' ),
-                       array( 'tl_namespace', 'tl_title' ),
-                       array( 'tl_from' => $id ),
-                       __METHOD__
-               );
-
-               foreach ( $res as $row ) {
-                       $dbLinks["{$row->tl_namespace}:{$row->tl_title}"] = true;
-               }
-
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( array( 'imagelinks' ),
-                       array( 'il_to' ),
-                       array( 'il_from' => $id ),
-                       __METHOD__
-               );
-
-               foreach ( $res as $row ) {
-                       $dbLinks[NS_FILE . ":{$row->il_to}"] = true;
-               }
-
-               // Get templates and images from parser output.
-               $poLinks = array();
-               foreach ( $parserOutput->getTemplates() as $ns => $templates ) {
-                       foreach ( $templates as $dbk => $id ) {
-                               $poLinks["$ns:$dbk"] = true;
-                       }
-               }
-               foreach ( $parserOutput->getImages() as $dbk => $id ) {
-                       $poLinks[NS_FILE . ":$dbk"] = true;
-               }
-
-               // Get the diff
-               $links_diff = array_diff_key( $poLinks, $dbLinks );
-
-               if ( count( $links_diff ) > 0 ) {
-                       // Whee, link updates time.
-                       // Note: we are only interested in links here. We don't need to get
-                       // other DataUpdate items from the parser output.
-                       $u = new LinksUpdate( $this->mTitle, $parserOutput, false );
-                       $u->doUpdate();
-               }
-       }
-
-       /**
-        * Return a list of templates used by this article.
-        * Uses the templatelinks table
-        *
-        * @deprecated since 1.19; use Title::getTemplateLinksFrom()
-        * @return array Array of Title objects
-        */
-       public function getUsedTemplates() {
-               return $this->mTitle->getTemplateLinksFrom();
-       }
-
-       /**
-        * This function is called right before saving the wikitext,
-        * so we can do things like signatures and links-in-context.
-        *
-        * @deprecated since 1.19; use Parser::preSaveTransform() instead
-        * @param string $text Article contents
-        * @param User $user User doing the edit
-        * @param ParserOptions $popts Parser options, default options for
-        *   the user loaded if null given
-        * @return string Article contents with altered wikitext markup (signatures
-        *      converted, {{subst:}}, templates, etc.)
-        */
-       public function preSaveTransform( $text, User $user = null, ParserOptions $popts = null ) {
-               global $wgParser, $wgUser;
-
-               wfDeprecated( __METHOD__, '1.19' );
-
-               $user = is_null( $user ) ? $wgUser : $user;
-
-               if ( $popts === null ) {
-                       $popts = ParserOptions::newFromUser( $user );
-               }
-
-               return $wgParser->preSaveTransform( $text, $this->mTitle, $user, $popts );
-       }
-
-       /**
-        * Check whether the number of revisions of this page surpasses $wgDeleteRevisionsLimit
-        *
-        * @deprecated since 1.19; use Title::isBigDeletion() instead.
-        * @return bool
-        */
-       public function isBigDeletion() {
-               wfDeprecated( __METHOD__, '1.19' );
-               return $this->mTitle->isBigDeletion();
-       }
-
-       /**
-        * Get the  approximate revision count of this page.
-        *
-        * @deprecated since 1.19; use Title::estimateRevisionCount() instead.
-        * @return int
-        */
-       public function estimateRevisionCount() {
-               wfDeprecated( __METHOD__, '1.19' );
-               return $this->mTitle->estimateRevisionCount();
-       }
-
-       /**
-        * Update the article's restriction field, and leave a log entry.
-        *
-        * @deprecated since 1.19
-        * @param array $limit Set of restriction keys
-        * @param string $reason
-        * @param int &$cascade Set to false if cascading protection isn't allowed.
-        * @param array $expiry Per restriction type expiration
-        * @param User $user The user updating the restrictions
-        * @return bool true on success
-        */
-       public function updateRestrictions(
-               $limit = array(), $reason = '', &$cascade = 0, $expiry = array(), User $user = null
-       ) {
-               global $wgUser;
-
-               $user = is_null( $user ) ? $wgUser : $user;
-
-               return $this->doUpdateRestrictions( $limit, $expiry, $cascade, $reason, $user )->isOK();
-       }
-
-       /**
-        * 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 {
-       /** @var Page */
-       private $page;
-
-       /** @var string */
-       private $cacheKey;
-
-       /** @var int */
-       private $revid;
-
-       /** @var ParserOptions */
-       private $parserOptions;
-
-       /** @var Content|null */
-       private $content = null;
-
-       /** @var ParserOutput|bool */
-       private $parserOutput = false;
-
-       /** @var bool */
-       private $isDirty = false;
-
-       /** @var Status|bool */
-       private $error = false;
-
-       /**
-        * @param Page $page
-        * @param int $revid ID of the revision being parsed.
-        * @param bool $useParserCache Whether to use the parser cache.
-        * @param ParserOptions $parserOptions ParserOptions to use for the parse
-        *   operation.
-        * @param Content|string $content Content to parse or null to load it; may
-        *   also be given as a wikitext string, for BC.
-        */
-       public 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->content = $content;
-               $this->cacheKey = ParserCache::singleton()->getKey( $page, $parserOptions );
-               parent::__construct( 'ArticleView', $this->cacheKey . ':revid:' . $revid );
-       }
-
-       /**
-        * Get the ParserOutput from this object, or false in case of failure
-        *
-        * @return ParserOutput
-        */
-       public function getParserOutput() {
-               return $this->parserOutput;
-       }
-
-       /**
-        * Get whether the ParserOutput is a dirty one (i.e. expired)
-        *
-        * @return bool
-        */
-       public function getIsDirty() {
-               return $this->isDirty;
-       }
-
-       /**
-        * Get a Status object in case of error or false otherwise
-        *
-        * @return Status|bool
-        */
-       public function getError() {
-               return $this->error;
-       }
-
-       /**
-        * @return bool
-        */
-       public function doWork() {
-               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->content !== null ) {
-                       $content = $this->content;
-               } elseif ( $isCurrent ) {
-                       // 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 ) {
-                               $content = null;
-                       } else {
-                               // XXX: why use PUBLIC audience here (default), and RAW above?
-                               $content = $rev->getContent();
-                       }
-               }
-
-               if ( $content === null ) {
-                       return false;
-               }
-
-               // Reduce effects of race conditions for slow parses (bug 46014)
-               $cacheTime = wfTimestampNow();
-
-               $time = - microtime( true );
-               $this->parserOutput = $content->getParserOutput(
-                       $this->page->getTitle(),
-                       $this->revid,
-                       $this->parserOptions
-               );
-               $time += microtime( true );
-
-               // Timing hack
-               if ( $time > 3 ) {
-                       wfDebugLog( 'slow-parse', sprintf( "%-5.2f %s", $time,
-                               $this->page->getTitle()->getPrefixedDBkey() ) );
-               }
-
-               if ( $this->cacheable && $this->parserOutput->isCacheable() && $isCurrent ) {
-                       ParserCache::singleton()->save(
-                               $this->parserOutput, $this->page, $this->parserOptions, $cacheTime, $this->revid );
-               }
-
-               // Make sure file cache is not used on uncacheable content.
-               // Output that has magic words in it can still use the parser cache
-               // (if enabled), though it will generally expire sooner.
-               if ( !$this->parserOutput->isCacheable() || $this->parserOutput->containsOldMagic() ) {
-                       $wgUseFileCache = false;
-               }
-
-               if ( $isCurrent ) {
-                       $this->page->doCascadeProtectionUpdates( $this->parserOutput );
-               }
-
-               return true;
-       }
-
-       /**
-        * @return bool
-        */
-       public function getCachedWork() {
-               $this->parserOutput = ParserCache::singleton()->get( $this->page, $this->parserOptions );
-
-               if ( $this->parserOutput === false ) {
-                       wfDebug( __METHOD__ . ": parser cache miss\n" );
-                       return false;
-               } else {
-                       wfDebug( __METHOD__ . ": parser cache hit\n" );
-                       return true;
-               }
-       }
-
-       /**
-        * @return bool
-        */
-       public function fallback() {
-               $this->parserOutput = ParserCache::singleton()->getDirty( $this->page, $this->parserOptions );
-
-               if ( $this->parserOutput === false ) {
-                       wfDebugLog( 'dirty', 'dirty missing' );
-                       wfDebug( __METHOD__ . ": no dirty cache\n" );
-                       return false;
-               } else {
-                       wfDebug( __METHOD__ . ": sending dirty output\n" );
-                       wfDebugLog( 'dirty', "dirty output {$this->cacheKey}" );
-                       $this->isDirty = true;
-                       return true;
-               }
-       }
-
-       /**
-        * @param Status $status
-        * @return bool
-        */
-       public function error( $status ) {
-               $this->error = $status;
-               return false;
-       }
-}
index 8fb104d..d4b08b2 100644 (file)
@@ -222,17 +222,6 @@ abstract class Action {
                return $this->getContext()->getLanguage();
        }
 
-       /**
-        * Shortcut to get the user Language being used for this instance
-        *
-        * @deprecated since 1.19 Use getLanguage instead
-        * @return Language
-        */
-       final public function getLang() {
-               wfDeprecated( __METHOD__, '1.19' );
-               return $this->getLanguage();
-       }
-
        /**
         * Shortcut to get the Title object from the page
         * @return Title
index c9b3f8f..16e407f 100644 (file)
@@ -41,7 +41,6 @@ class RenderAction extends FormlessAction {
        }
 
        public function show() {
-
                $this->page->render();
        }
 }
index cfd4d01..25a1714 100644 (file)
@@ -87,17 +87,19 @@ abstract class ApiBase extends ContextSource {
         */
        const GET_VALUES_FOR_HELP = 1;
 
-       private $mMainModule, $mModuleName, $mModulePrefix;
+       /** @var ApiMain */
+       private $mMainModule;
+       /** @var string */
+       private $mModuleName, $mModulePrefix;
        private $mSlaveDB = null;
        private $mParamCache = array();
 
        /**
-        * Constructor
         * @param ApiMain $mainModule
         * @param string $moduleName Name of this module
         * @param string $modulePrefix Prefix to use for parameter names
         */
-       public function __construct( $mainModule, $moduleName, $modulePrefix = '' ) {
+       public function __construct( ApiMain $mainModule, $moduleName, $modulePrefix = '' ) {
                $this->mMainModule = $mainModule;
                $this->mModuleName = $moduleName;
                $this->mModulePrefix = $modulePrefix;
@@ -907,6 +909,7 @@ abstract class ApiBase extends ContextSource {
                        array(
                                array( 'invalidtitle', 'title' ),
                                array( 'nosuchpageid', 'pageid' ),
+                               array( 'code' => 'pagecannotexist', 'info' => "Namespace doesn't allow actual pages" ),
                        )
                );
        }
@@ -1962,15 +1965,13 @@ abstract class ApiBase extends ContextSource {
         * @since 1.21
         */
        public function dieUsageMsgOrDebug( $error ) {
-               global $wgDebugAPI;
-               if ( $wgDebugAPI !== true ) {
+               if ( $this->getConfig()->get( 'DebugAPI' ) !== true ) {
                        $this->dieUsageMsg( $error );
                }
 
                if ( is_string( $error ) ) {
                        $error = array( $error );
                }
-
                $parsed = $this->parseMsg( $error );
                $this->setWarning( '$wgDebugAPI: ' . $parsed['code'] . ' - ' . $parsed['info'] );
        }
index be8286c..35bba17 100644 (file)
@@ -90,7 +90,6 @@ class ApiCreateAccount extends ApiBase {
                $result = array();
                if ( $status->isGood() ) {
                        // Success!
-                       global $wgEmailAuthentication;
                        $user = $status->getValue();
 
                        if ( $params['language'] ) {
@@ -106,7 +105,7 @@ class ApiCreateAccount extends ApiBase {
                                        'createaccount-title',
                                        'createaccount-text'
                                ) );
-                       } elseif ( $wgEmailAuthentication && Sanitizer::validateEmail( $user->getEmail() ) ) {
+                       } elseif ( $this->getConfig()->get( 'EmailAuthentication' ) && Sanitizer::validateEmail( $user->getEmail() ) ) {
                                // Send out an email authentication message if needed
                                $status->merge( $user->sendConfirmationMail() );
                        }
@@ -183,8 +182,6 @@ class ApiCreateAccount extends ApiBase {
        }
 
        public function getAllowedParams() {
-               global $wgEmailConfirmToEdit;
-
                return array(
                        'name' => array(
                                ApiBase::PARAM_TYPE => 'user',
@@ -195,7 +192,7 @@ class ApiCreateAccount extends ApiBase {
                        'token' => null,
                        'email' => array(
                                ApiBase::PARAM_TYPE => 'string',
-                               ApiBase::PARAM_REQUIRED => $wgEmailConfirmToEdit
+                               ApiBase::PARAM_REQUIRED => $this->getConfig()->get( 'EmailConfirmToEdit' ),
                        ),
                        'realname' => null,
                        'mailpassword' => array(
@@ -293,10 +290,9 @@ class ApiCreateAccount extends ApiBase {
                );
 
                // 'passwordtooshort' has parameters. :(
-               global $wgMinimalPasswordLength;
                $errors[] = array(
                        'code' => 'passwordtooshort',
-                       'info' => wfMessage( 'passwordtooshort', $wgMinimalPasswordLength )
+                       'info' => wfMessage( 'passwordtooshort', $this->getConfig()->get( 'MinimalPasswordLength' ) )
                                ->inLanguage( 'en' )->useDatabase( false )->parse()
                );
 
index cb0f8c2..884306a 100644 (file)
@@ -399,7 +399,6 @@ class ApiEditPage extends ApiBase {
 
                $status = $ep->internalAttemptSave( $result, $user->isAllowed( 'bot' ) && $params['bot'] );
                $wgRequest = $oldRequest;
-               global $wgMaxArticleSize;
 
                switch ( $status->value ) {
                        case EditPage::AS_HOOK_ERROR:
@@ -423,7 +422,7 @@ class ApiEditPage extends ApiBase {
 
                        case EditPage::AS_MAX_ARTICLE_SIZE_EXCEEDED:
                        case EditPage::AS_CONTENT_TOO_BIG:
-                               $this->dieUsageMsg( array( 'contenttoobig', $wgMaxArticleSize ) );
+                               $this->dieUsageMsg( array( 'contenttoobig', $this->getConfig()->get( 'MaxArticleSize' ) ) );
 
                        case EditPage::AS_READ_ONLY_PAGE_ANON:
                                $this->dieUsageMsg( 'noedit-anon' );
@@ -499,8 +498,6 @@ class ApiEditPage extends ApiBase {
        }
 
        public function getPossibleErrors() {
-               global $wgMaxArticleSize;
-
                return array_merge( parent::getPossibleErrors(),
                        $this->getTitleOrPageIdErrorMessage(),
                        array(
@@ -519,7 +516,7 @@ class ApiEditPage extends ApiBase {
                                array( 'spamdetected', 'spam' ),
                                array( 'summaryrequired' ),
                                array( 'blockedtext' ),
-                               array( 'contenttoobig', $wgMaxArticleSize ),
+                               array( 'contenttoobig', $this->getConfig()->get( 'MaxArticleSize' ) ),
                                array( 'noedit-anon' ),
                                array( 'noedit' ),
                                array( 'actionthrottledtext' ),
index 28ed5e4..82d303f 100644 (file)
@@ -39,6 +39,15 @@ class ApiExpandTemplates extends ApiBase {
 
                // Get parameters
                $params = $this->extractRequestParams();
+               $this->requireMaxOneParameter( $params, 'prop', 'generatexml' );
+
+               if ( $params['prop'] === null ) {
+                       $this->setWarning( 'Because no values have been specified for the prop parameter, a legacy format has been used for the output.'
+                                . ' This format is deprecated, and in the future, a default value will be set for the prop parameter, causing the new format to always be used.' );
+                       $prop = array();
+               } else {
+                       $prop = array_flip( $params['prop'] );
+               }
 
                // Create title for parser
                $title_obj = Title::newFromText( $params['title'] );
@@ -56,7 +65,9 @@ class ApiExpandTemplates extends ApiBase {
                        $options->setRemoveComments( false );
                }
 
-               if ( $params['generatexml'] ) {
+               $retval = array();
+
+               if ( isset( $prop['parsetree'] ) || $params['generatexml'] ) {
                        $wgParser->startExternalParse( $title_obj, $options, OT_PREPROCESS );
                        $dom = $wgParser->preprocessToDom( $params['text'] );
                        if ( is_callable( array( $dom, 'saveXML' ) ) ) {
@@ -64,16 +75,54 @@ class ApiExpandTemplates extends ApiBase {
                        } else {
                                $xml = $dom->__toString();
                        }
-                       $xml_result = array();
-                       ApiResult::setContent( $xml_result, $xml );
-                       $result->addValue( null, 'parsetree', $xml_result );
+                       if ( isset( $prop['parsetree'] ) ) {
+                               unset( $prop['parsetree'] );
+                               $retval['parsetree'] = $xml;
+                       } else {
+                               // the old way
+                               $xml_result = array();
+                               ApiResult::setContent( $xml_result, $xml );
+                               $result->addValue( null, 'parsetree', $xml_result );
+                       }
                }
-               $retval = $wgParser->preprocess( $params['text'], $title_obj, $options );
 
-               // Return result
-               $retval_array = array();
-               ApiResult::setContent( $retval_array, $retval );
-               $result->addValue( null, $this->getModuleName(), $retval_array );
+               // if they didn't want any output except (probably) the parse tree,
+               // then don't bother actually fully expanding it
+               if ( $prop || $params['prop'] === null ) {
+                       $wgParser->startExternalParse( $title_obj, $options, OT_PREPROCESS );
+                       $frame = $wgParser->getPreprocessor()->newFrame();
+                       $wikitext = $wgParser->preprocess( $params['text'], $title_obj, $options, null, $frame );
+                       if ( $params['prop'] === null ) {
+                               // the old way
+                               ApiResult::setContent( $retval, $wikitext );
+                       } else {
+                               if ( isset( $prop['categories'] ) ) {
+                                       $categories = $wgParser->getOutput()->getCategories();
+                                       if ( !empty( $categories ) ) {
+                                               $categories_result = array();
+                                               foreach ( $categories as $category => $sortkey ) {
+                                                       $entry = array();
+                                                       $entry['sortkey'] = $sortkey;
+                                                       ApiResult::setContent( $entry, $category );
+                                                       $categories_result[] = $entry;
+                                               }
+                                               $result->setIndexedTagName( $categories_result, 'category' );
+                                               $retval['categories'] = $categories_result;
+                                       }
+                               }
+                               if ( isset( $prop['volatile'] ) && $frame->isVolatile() ) {
+                                       $retval['volatile'] = '';
+                               }
+                               if ( isset( $prop['ttl'] ) && $frame->getTTL() !== null ) {
+                                       $retval['ttl'] = $frame->getTTL();
+                               }
+                               if ( isset( $prop['wikitext'] ) ) {
+                                       $retval['wikitext'] = $wikitext;
+                               }
+                       }
+               }
+               $result->setSubelements( $retval, array( 'wikitext', 'parsetree' ) );
+               $result->addValue( null, $this->getModuleName(), $retval );
        }
 
        public function getAllowedParams() {
@@ -85,8 +134,21 @@ class ApiExpandTemplates extends ApiBase {
                                ApiBase::PARAM_TYPE => 'string',
                                ApiBase::PARAM_REQUIRED => true,
                        ),
-                       'generatexml' => false,
+                       'prop' => array(
+                               ApiBase::PARAM_TYPE => array(
+                                       'wikitext',
+                                       'categories',
+                                       'volatile',
+                                       'ttl',
+                                       'parsetree',
+                               ),
+                               ApiBase::PARAM_ISMULTI => true,
+                       ),
                        'includecomments' => false,
+                       'generatexml' => array(
+                               ApiBase::PARAM_TYPE => 'boolean',
+                               ApiBase::PARAM_DEPRECATED => true,
+                       ),
                );
        }
 
@@ -94,16 +156,47 @@ class ApiExpandTemplates extends ApiBase {
                return array(
                        'text' => 'Wikitext to convert',
                        'title' => 'Title of page',
-                       'generatexml' => 'Generate XML parse tree',
+                       'prop' => array(
+                               'Which pieces of information to get',
+                               ' wikitext   - The expanded wikitext',
+                               ' categories - Any categories present in the input that are not represented in the wikitext output',
+                               ' volatile   - Whether the output is volatile and should not be reused elsewhere within the page',
+                               ' ttl        - The maximum time after which caches of the result should be invalidated',
+                               ' parsetree  - The XML parse tree of the input',
+                               'Note that if no values are selected, the result will contain the wikitext,',
+                               'but the output will be in a deprecated format.',
+                       ),
                        'includecomments' => 'Whether to include HTML comments in the output',
+                       'generatexml' => 'Generate XML parse tree (replaced by prop=parsetree)',
                );
        }
 
        public function getResultProperties() {
                return array(
-                       '' => array(
-                               '*' => 'string'
-                       )
+                       'wikitext' => array(
+                               'wikitext' => 'string',
+                       ),
+                       'categories' => array(
+                               'categories' => array(
+                                       ApiBase::PROP_TYPE => 'array',
+                                       ApiBase::PROP_NULLABLE => true,
+                               ),
+                       ),
+                       'volatile' => array(
+                               'volatile' => array(
+                                       ApiBase::PROP_TYPE => 'boolean',
+                                       ApiBase::PROP_NULLABLE => true,
+                               ),
+                       ),
+                       'ttl' => array(
+                               'ttl' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true,
+                               ),
+                       ),
+                       'parsetree' => array(
+                               'parsetree' => 'string',
+                       ),
                );
        }
 
index afd5a13..3392a5c 100644 (file)
@@ -41,30 +41,29 @@ class ApiFeedContributions extends ApiBase {
        public function execute() {
                $params = $this->extractRequestParams();
 
-               global $wgFeed, $wgFeedClasses, $wgFeedLimit, $wgSitename, $wgLanguageCode;
-
-               if ( !$wgFeed ) {
+               $config = $this->getConfig();
+               if ( !$config->get( 'Feed' ) ) {
                        $this->dieUsage( 'Syndication feeds are not available', 'feed-unavailable' );
                }
 
-               if ( !isset( $wgFeedClasses[$params['feedformat']] ) ) {
+               $feedClasses = $config->get( 'FeedClasses' );
+               if ( !isset( $feedClasses[$params['feedformat']] ) ) {
                        $this->dieUsage( 'Invalid subscription feed type', 'feed-invalid' );
                }
 
-               global $wgMiserMode;
-               if ( $params['showsizediff'] && $wgMiserMode ) {
+               if ( $params['showsizediff'] && $this->getConfig()->get( 'MiserMode' ) ) {
                        $this->dieUsage( 'Size difference is disabled in Miser Mode', 'sizediffdisabled' );
                }
 
                $msg = wfMessage( 'Contributions' )->inContentLanguage()->text();
-               $feedTitle = $wgSitename . ' - ' . $msg . ' [' . $wgLanguageCode . ']';
+               $feedTitle = $config->get( 'Sitename' ) . ' - ' . $msg . ' [' . $config->get( 'LanguageCode' ) . ']';
                $feedUrl = SpecialPage::getTitleFor( 'Contributions', $params['user'] )->getFullURL();
 
                $target = $params['user'] == 'newbies'
                        ? 'newbies'
                        : Title::makeTitleSafe( NS_USER, $params['user'] )->getText();
 
-               $feed = new $wgFeedClasses[$params['feedformat']] (
+               $feed = new $feedClasses[$params['feedformat']] (
                        $feedTitle,
                        htmlspecialchars( $msg ),
                        $feedUrl
@@ -82,8 +81,9 @@ class ApiFeedContributions extends ApiBase {
                        'showSizeDiff' => $params['showsizediff'],
                ) );
 
-               if ( $pager->getLimit() > $wgFeedLimit ) {
-                       $pager->setLimit( $wgFeedLimit );
+               $feedLimit = $this->getConfig()->get( 'FeedLimit' );
+               if ( $pager->getLimit() > $feedLimit ) {
+                       $pager->setLimit( $feedLimit );
                }
 
                $feedItems = array();
@@ -159,8 +159,7 @@ class ApiFeedContributions extends ApiBase {
        }
 
        public function getAllowedParams() {
-               global $wgFeedClasses;
-               $feedFormatNames = array_keys( $wgFeedClasses );
+               $feedFormatNames = array_keys( $this->getConfig()->get( 'FeedClasses' ) );
 
                return array(
                        'feedformat' => array(
index a2641ee..bb68d5a 100644 (file)
@@ -40,15 +40,16 @@ class ApiFeedRecentChanges extends ApiBase {
         * as an RSS/Atom feed.
         */
        public function execute() {
-               global $wgFeed, $wgFeedClasses;
+               $config = $this->getConfig();
 
                $this->params = $this->extractRequestParams();
 
-               if ( !$wgFeed ) {
+               if ( !$config->get( 'Feed' ) ) {
                        $this->dieUsage( 'Syndication feeds are not available', 'feed-unavailable' );
                }
 
-               if ( !isset( $wgFeedClasses[$this->params['feedformat']] ) ) {
+               $feedClasses = $config->get( 'FeedClasses' );
+               if ( !isset( $feedClasses[$this->params['feedformat']] ) ) {
                        $this->dieUsage( 'Invalid subscription feed type', 'feed-invalid' );
                }
 
@@ -110,8 +111,8 @@ class ApiFeedRecentChanges extends ApiBase {
        }
 
        public function getAllowedParams() {
-               global $wgFeedClasses, $wgAllowCategorizedRecentChanges, $wgFeedLimit;
-               $feedFormatNames = array_keys( $wgFeedClasses );
+               $config = $this->getConfig();
+               $feedFormatNames = array_keys( $config->get( 'FeedClasses' ) );
 
                $ret = array(
                        'feedformat' => array(
@@ -133,7 +134,7 @@ class ApiFeedRecentChanges extends ApiBase {
                        'limit' => array(
                                ApiBase::PARAM_DFLT => 50,
                                ApiBase::PARAM_MIN => 1,
-                               ApiBase::PARAM_MAX => $wgFeedLimit,
+                               ApiBase::PARAM_MAX => $config->get( 'FeedLimit' ),
                                ApiBase::PARAM_TYPE => 'integer',
                        ),
                        'from' => array(
@@ -157,7 +158,7 @@ class ApiFeedRecentChanges extends ApiBase {
                        'showlinkedto' => false,
                );
 
-               if ( $wgAllowCategorizedRecentChanges ) {
+               if ( $config->get( 'AllowCategorizedRecentChanges' ) ) {
                        $ret += array(
                                'categories' => array(
                                        ApiBase::PARAM_TYPE => 'string',
index 64c3eec..983b6a8 100644 (file)
@@ -50,16 +50,16 @@ class ApiFeedWatchlist extends ApiBase {
         * Wrap the result as an RSS/Atom feed.
         */
        public function execute() {
-               global $wgFeed, $wgFeedClasses, $wgFeedLimit, $wgSitename, $wgLanguageCode;
-
+               $config = $this->getConfig();
+               $feedClasses = $config->get( 'FeedClasses' );
                try {
                        $params = $this->extractRequestParams();
 
-                       if ( !$wgFeed ) {
+                       if ( !$config->get( 'Feed' ) ) {
                                $this->dieUsage( 'Syndication feeds are not available', 'feed-unavailable' );
                        }
 
-                       if ( !isset( $wgFeedClasses[$params['feedformat']] ) ) {
+                       if ( !isset( $feedClasses[$params['feedformat']] ) ) {
                                $this->dieUsage( 'Invalid subscription feed type', 'feed-invalid' );
                        }
 
@@ -75,7 +75,7 @@ class ApiFeedWatchlist extends ApiBase {
                                'wlprop' => 'title|user|comment|timestamp|ids',
                                'wldir' => 'older', // reverse order - from newest to oldest
                                'wlend' => $endTime, // stop at this time
-                               'wllimit' => min( 50, $wgFeedLimit )
+                               'wllimit' => min( 50, $this->getConfig()->get( 'FeedLimit' ) )
                        );
 
                        if ( $params['wlowner'] !== null ) {
@@ -122,10 +122,10 @@ class ApiFeedWatchlist extends ApiBase {
 
                        $msg = wfMessage( 'watchlist' )->inContentLanguage()->text();
 
-                       $feedTitle = $wgSitename . ' - ' . $msg . ' [' . $wgLanguageCode . ']';
+                       $feedTitle = $this->getConfig()->get( 'Sitename' ) . ' - ' . $msg . ' [' . $this->getConfig()->get( 'LanguageCode' ) . ']';
                        $feedUrl = SpecialPage::getTitleFor( 'Watchlist' )->getFullURL();
 
-                       $feed = new $wgFeedClasses[$params['feedformat']] (
+                       $feed = new $feedClasses[$params['feedformat']] (
                                $feedTitle,
                                htmlspecialchars( $msg ),
                                $feedUrl
@@ -137,14 +137,14 @@ class ApiFeedWatchlist extends ApiBase {
                        $this->getMain()->setCacheMaxAge( 0 );
 
                        // @todo FIXME: Localise  brackets
-                       $feedTitle = $wgSitename . ' - Error - ' .
+                       $feedTitle = $this->getConfig()->get( 'Sitename' ) . ' - Error - ' .
                                wfMessage( 'watchlist' )->inContentLanguage()->text() .
-                               ' [' . $wgLanguageCode . ']';
+                               ' [' . $this->getConfig()->get( 'LanguageCode' ) . ']';
                        $feedUrl = SpecialPage::getTitleFor( 'Watchlist' )->getFullURL();
 
                        $feedFormat = isset( $params['feedformat'] ) ? $params['feedformat'] : 'rss';
                        $msg = wfMessage( 'watchlist' )->inContentLanguage()->escaped();
-                       $feed = new $wgFeedClasses[$feedFormat] ( $feedTitle, $msg, $feedUrl );
+                       $feed = new $feedClasses[$feedFormat] ( $feedTitle, $msg, $feedUrl );
 
                        if ( $e instanceof UsageException ) {
                                $errorCode = $e->getCodeString();
@@ -205,8 +205,7 @@ class ApiFeedWatchlist extends ApiBase {
        }
 
        public function getAllowedParams( $flags = 0 ) {
-               global $wgFeedClasses;
-               $feedFormatNames = array_keys( $wgFeedClasses );
+               $feedFormatNames = array_keys( $this->getConfig()->get( 'FeedClasses' ) );
                $ret = array(
                        'feedformat' => array(
                                ApiBase::PARAM_DFLT => 'rss',
index 8954abc..03a6843 100644 (file)
@@ -154,9 +154,9 @@ abstract class ApiFormatBase extends ApiBase {
                $this->getMain()->getRequest()->response()->header( "Content-Type: $mime; charset=utf-8" );
 
                //Set X-Frame-Options API results (bug 39180)
-               global $wgApiFrameOptions;
-               if ( $wgApiFrameOptions ) {
-                       $this->getMain()->getRequest()->response()->header( "X-Frame-Options: $wgApiFrameOptions" );
+               $apiFrameOptions = $this->getConfig()->get( 'ApiFrameOptions' );
+               if ( $apiFrameOptions ) {
+                       $this->getMain()->getRequest()->response()->header( "X-Frame-Options: $apiFrameOptions" );
                }
 
                if ( $isHtml ) {
index 8e1d39d..b3d5937 100644 (file)
@@ -147,6 +147,15 @@ class ApiFormatXml extends ApiFormatBase {
                                $subElemIndName = null;
                        }
 
+                       if ( isset( $elemValue['_subelements'] ) ) {
+                               foreach ( $elemValue['_subelements'] as $subElemId ) {
+                                       if ( isset( $elemValue[$subElemId] ) && !is_array( $elemValue[$subElemId] ) ) {
+                                               $elemValue[$subElemId] = array( '*' => $elemValue[$subElemId] );
+                                       }
+                               }
+                               unset( $elemValue['_subelements'] );
+                       }
+
                        $indElements = array();
                        $subElements = array();
                        foreach ( $elemValue as $subElemId => & $subElemValue ) {
index 1d960c9..3144fc1 100644 (file)
@@ -98,8 +98,6 @@ class ApiImport extends ApiBase {
        }
 
        public function getAllowedParams() {
-               global $wgImportSources;
-
                return array(
                        'token' => array(
                                ApiBase::PARAM_TYPE => 'string',
@@ -110,7 +108,7 @@ class ApiImport extends ApiBase {
                                ApiBase::PARAM_TYPE => 'upload',
                        ),
                        'interwikisource' => array(
-                               ApiBase::PARAM_TYPE => $wgImportSources
+                               ApiBase::PARAM_TYPE => $this->getConfig()->get( 'ImportSources' ),
                        ),
                        'interwikipage' => null,
                        'fullhistory' => false,
index 6336e81..f818c5f 100644 (file)
@@ -79,8 +79,6 @@ class ApiLogin extends ApiBase {
                $loginForm = new LoginForm();
                $loginForm->setContext( $context );
 
-               global $wgCookiePrefix, $wgPasswordAttemptThrottle;
-
                $authRes = $loginForm->authenticateUserData();
                switch ( $authRes ) {
                        case LoginForm::SUCCESS:
@@ -100,14 +98,14 @@ class ApiLogin extends ApiBase {
                                $result['lguserid'] = intval( $user->getId() );
                                $result['lgusername'] = $user->getName();
                                $result['lgtoken'] = $user->getToken();
-                               $result['cookieprefix'] = $wgCookiePrefix;
+                               $result['cookieprefix'] = $this->getConfig()->get( 'CookiePrefix' );
                                $result['sessionid'] = session_id();
                                break;
 
                        case LoginForm::NEED_TOKEN:
                                $result['result'] = 'NeedToken';
                                $result['token'] = $loginForm->getLoginToken();
-                               $result['cookieprefix'] = $wgCookiePrefix;
+                               $result['cookieprefix'] = $this->getConfig()->get( 'CookiePrefix' );
                                $result['sessionid'] = session_id();
                                break;
 
@@ -149,7 +147,8 @@ class ApiLogin extends ApiBase {
 
                        case LoginForm::THROTTLED:
                                $result['result'] = 'Throttled';
-                               $result['wait'] = intval( $wgPasswordAttemptThrottle['seconds'] );
+                               $throttle = $this->getConfig()->get( 'PasswordAttemptThrottle' );
+                               $result['wait'] = intval( $throttle['seconds'] );
                                break;
 
                        case LoginForm::USER_BLOCKED:
index df56735..84db9ed 100644 (file)
@@ -186,12 +186,12 @@ class ApiMain extends ApiBase {
                        }
                }
 
-               global $wgAPIModules, $wgAPIFormatModules;
+               $config = $this->getConfig();
                $this->mModuleMgr = new ApiModuleManager( $this );
                $this->mModuleMgr->addModules( self::$Modules, 'action' );
-               $this->mModuleMgr->addModules( $wgAPIModules, 'action' );
+               $this->mModuleMgr->addModules( $config->get( 'APIModules' ), 'action' );
                $this->mModuleMgr->addModules( self::$Formats, 'format' );
-               $this->mModuleMgr->addModules( $wgAPIFormatModules, 'format' );
+               $this->mModuleMgr->addModules( $config->get( 'APIFormatModules' ), 'format' );
 
                $this->mResult = new ApiResult( $this );
                $this->mEnableWrite = $enableWrite;
@@ -465,8 +465,6 @@ class ApiMain extends ApiBase {
         * @return bool False if the caller should abort (403 case), true otherwise (all other cases)
         */
        protected function handleCORS() {
-               global $wgCrossSiteAJAXdomains, $wgCrossSiteAJAXdomainExceptions;
-
                $originParam = $this->getParameter( 'origin' ); // defaults to null
                if ( $originParam === null ) {
                        // No origin parameter, nothing to do
@@ -494,10 +492,11 @@ class ApiMain extends ApiBase {
                        return false;
                }
 
+               $config = $this->getConfig();
                $matchOrigin = self::matchOrigin(
                        $originParam,
-                       $wgCrossSiteAJAXdomains,
-                       $wgCrossSiteAJAXdomainExceptions
+                       $config->get( 'CrossSiteAJAXdomains' ),
+                       $config->get( 'CrossSiteAJAXdomainExceptions' )
                );
 
                if ( $matchOrigin ) {
@@ -554,29 +553,29 @@ class ApiMain extends ApiBase {
        }
 
        protected function sendCacheHeaders() {
-               global $wgUseXVO, $wgVaryOnXFP;
                $response = $this->getRequest()->response();
                $out = $this->getOutput();
 
-               if ( $wgVaryOnXFP ) {
+               $config = $this->getConfig();
+
+               if ( $config->get( 'VaryOnXFP' ) ) {
                        $out->addVaryHeader( 'X-Forwarded-Proto' );
                }
 
                if ( $this->mCacheMode == 'private' ) {
                        $response->header( 'Cache-Control: private' );
-
                        return;
                }
 
+               $useXVO = $config->get( 'UseXVO' );
                if ( $this->mCacheMode == 'anon-public-user-private' ) {
                        $out->addVaryHeader( 'Cookie' );
                        $response->header( $out->getVaryHeader() );
-                       if ( $wgUseXVO ) {
+                       if ( $useXVO ) {
                                $response->header( $out->getXVO() );
                                if ( $out->haveCacheVaryCookies() ) {
                                        // Logged in, mark this request private
                                        $response->header( 'Cache-Control: private' );
-
                                        return;
                                }
                                // Logged out, send normal public headers below
@@ -591,7 +590,7 @@ class ApiMain extends ApiBase {
 
                // Send public headers
                $response->header( $out->getVaryHeader() );
-               if ( $wgUseXVO ) {
+               if ( $useXVO ) {
                        $response->header( $out->getXVO() );
                }
 
@@ -644,8 +643,6 @@ class ApiMain extends ApiBase {
         * @return string
         */
        protected function substituteResultWithError( $e ) {
-               global $wgShowHostnames;
-
                $result = $this->getResult();
 
                // Printer may not be initialized if the extractRequestParams() fails for the main module
@@ -669,6 +666,8 @@ class ApiMain extends ApiBase {
                // Update raw mode flag for the selected printer.
                $result->setRawMode( $this->mPrinter->getNeedsRawData() );
 
+               $config = $this->getConfig();
+
                if ( $e instanceof UsageException ) {
                        // User entered incorrect parameters - print usage screen
                        $errMessage = $e->getMessageArray();
@@ -678,9 +677,8 @@ class ApiMain extends ApiBase {
                                ApiResult::setContent( $errMessage, $this->makeHelpMsg() );
                        }
                } else {
-                       global $wgShowSQLErrors, $wgShowExceptionDetails;
                        // Something is seriously wrong
-                       if ( ( $e instanceof DBQueryError ) && !$wgShowSQLErrors ) {
+                       if ( ( $e instanceof DBQueryError ) && !$config->get( 'ShowSQLErrors' ) ) {
                                $info = 'Database query error';
                        } else {
                                $info = "Exception Caught: {$e->getMessage()}";
@@ -692,7 +690,7 @@ class ApiMain extends ApiBase {
                        );
                        ApiResult::setContent(
                                $errMessage,
-                               $wgShowExceptionDetails ? "\n\n{$e->getTraceAsString()}\n\n" : ''
+                               $config->get( 'ShowExceptionDetails' ) ? "\n\n{$e->getTraceAsString()}\n\n" : ''
                        );
                }
 
@@ -707,7 +705,7 @@ class ApiMain extends ApiBase {
                if ( !is_null( $requestid ) ) {
                        $result->addValue( null, 'requestid', $requestid );
                }
-               if ( $wgShowHostnames ) {
+               if ( $config->get( 'ShowHostnames' ) ) {
                        // servedby is especially useful when debugging errors
                        $result->addValue( null, 'servedby', wfHostName() );
                }
@@ -725,8 +723,6 @@ class ApiMain extends ApiBase {
         * @return array
         */
        protected function setupExecuteAction() {
-               global $wgShowHostnames;
-
                // First add the id to the top element
                $result = $this->getResult();
                $requestid = $this->getParameter( 'requestid' );
@@ -734,7 +730,7 @@ class ApiMain extends ApiBase {
                        $result->addValue( null, 'requestid', $requestid );
                }
 
-               if ( $wgShowHostnames ) {
+               if ( $this->getConfig()->get( 'ShowHostnames' ) ) {
                        $servedby = $this->getParameter( 'servedby' );
                        if ( $servedby ) {
                                $result->addValue( null, 'servedby', wfHostName() );
@@ -792,7 +788,6 @@ class ApiMain extends ApiBase {
        protected function checkMaxLag( $module, $params ) {
                if ( $module->shouldCheckMaxlag() && isset( $params['maxlag'] ) ) {
                        // Check for maxlag
-                       global $wgShowHostnames;
                        $maxLag = $params['maxlag'];
                        list( $host, $lag ) = wfGetLB()->getMaxLag();
                        if ( $lag > $maxLag ) {
@@ -801,7 +796,7 @@ class ApiMain extends ApiBase {
                                $response->header( 'Retry-After: ' . max( intval( $maxLag ), 5 ) );
                                $response->header( 'X-Database-Lag: ' . intval( $lag ) );
 
-                               if ( $wgShowHostnames ) {
+                               if ( $this->getConfig()->get( 'ShowHostnames' ) ) {
                                        $this->dieUsage( "Waiting for $host: $lag seconds lagged", 'maxlag' );
                                }
 
@@ -1057,8 +1052,7 @@ class ApiMain extends ApiBase {
         * @param bool $isError
         */
        protected function printResult( $isError ) {
-               global $wgDebugAPI;
-               if ( $wgDebugAPI !== false ) {
+               if ( $this->getConfig()->get( 'DebugAPI' ) !== false ) {
                        $this->setWarning( 'SECURITY WARNING: $wgDebugAPI is enabled' );
                }
 
@@ -1257,20 +1251,22 @@ class ApiMain extends ApiBase {
         * @return string
         */
        public function makeHelpMsg() {
-               global $wgMemc, $wgAPICacheHelpTimeout;
+               global $wgMemc;
                $this->setHelp();
                // Get help text from cache if present
                $key = wfMemcKey( 'apihelp', $this->getModuleName(),
                        str_replace( ' ', '_', SpecialVersion::getVersion( 'nodb' ) ) );
-               if ( $wgAPICacheHelpTimeout > 0 ) {
+
+               $cacheHelpTimeout = $this->getConfig()->get( 'APICacheHelpTimeout' );
+               if ( $cacheHelpTimeout > 0 ) {
                        $cached = $wgMemc->get( $key );
                        if ( $cached ) {
                                return $cached;
                        }
                }
                $retval = $this->reallyMakeHelpMsg();
-               if ( $wgAPICacheHelpTimeout > 0 ) {
-                       $wgMemc->set( $key, $retval, $wgAPICacheHelpTimeout );
+               if ( $cacheHelpTimeout > 0 ) {
+                       $wgMemc->set( $key, $retval, $cacheHelpTimeout );
                }
 
                return $retval;
index 68b62af..7fb045e 100644 (file)
@@ -45,7 +45,6 @@ class ApiOpenSearch extends ApiBase {
        }
 
        public function execute() {
-               global $wgEnableOpenSearchSuggest, $wgSearchSuggestCacheExpiry;
                $params = $this->extractRequestParams();
                $search = $params['search'];
                $limit = $params['limit'];
@@ -53,11 +52,11 @@ class ApiOpenSearch extends ApiBase {
                $suggest = $params['suggest'];
 
                // Some script that was loaded regardless of wgEnableOpenSearchSuggest, likely cached.
-               if ( $suggest && !$wgEnableOpenSearchSuggest ) {
+               if ( $suggest && !$this->getConfig()->get( 'EnableOpenSearchSuggest' ) ) {
                        $searches = array();
                } else {
                        // Open search results may be stored for a very long time
-                       $this->getMain()->setCacheMaxAge( $wgSearchSuggestCacheExpiry );
+                       $this->getMain()->setCacheMaxAge( $this->getConfig()->get( 'SearchSuggestCacheExpiry' ) );
                        $this->getMain()->setCacheMode( 'public' );
 
                        $searcher = new StringPrefixSearch;
@@ -70,12 +69,10 @@ class ApiOpenSearch extends ApiBase {
        }
 
        public function getAllowedParams() {
-               global $wgOpenSearchDefaultLimit;
-
                return array(
                        'search' => null,
                        'limit' => array(
-                               ApiBase::PARAM_DFLT => $wgOpenSearchDefaultLimit,
+                               ApiBase::PARAM_DFLT => $this->getConfig()->get( 'OpenSearchDefaultLimit' ),
                                ApiBase::PARAM_TYPE => 'limit',
                                ApiBase::PARAM_MIN => 1,
                                ApiBase::PARAM_MAX => 100,
index fcba5b5..9dc4d03 100644 (file)
@@ -325,7 +325,7 @@ class ApiParse extends ApiBase {
                if ( isset( $prop['headitems'] ) || isset( $prop['headhtml'] ) ) {
                        $context = $this->getContext();
                        $context->setTitle( $titleObj );
-                       $context->getOutput()->addParserOutputNoText( $p_result );
+                       $context->getOutput()->addParserOutputMetadata( $p_result );
 
                        if ( isset( $prop['headitems'] ) ) {
                                $headItems = $this->formatHeadItems( $p_result->getHeadItems() );
@@ -436,6 +436,7 @@ class ApiParse extends ApiBase {
                $popts->enableLimitReport( !$params['disablepp'] );
                $popts->setIsPreview( $params['preview'] || $params['sectionpreview'] );
                $popts->setIsSectionPreview( $params['sectionpreview'] );
+               $popts->setEditSection( !$params['disableeditsection'] );
 
                wfProfileOut( __METHOD__ );
 
@@ -574,9 +575,9 @@ class ApiParse extends ApiBase {
                        'and will be removed in MediaWiki 1.24. Use "prop=langlinks" ' .
                        'to generate your own HTML.' );
 
-               global $wgContLang, $wgHideInterlanguageLinks;
+               global $wgContLang;
 
-               if ( $wgHideInterlanguageLinks || count( $languages ) == 0 ) {
+               if ( $this->getConfig()->get( 'HideInterlanguageLinks' ) || count( $languages ) == 0 ) {
                        return '';
                }
 
@@ -748,6 +749,7 @@ class ApiParse extends ApiBase {
                        'uselang' => null,
                        'section' => null,
                        'disablepp' => false,
+                       'disableeditsection' => false,
                        'generatexml' => false,
                        'preview' => false,
                        'sectionpreview' => false,
@@ -816,6 +818,7 @@ class ApiParse extends ApiBase {
                        'uselang' => 'Which language to parse the request in',
                        'section' => 'Only retrieve the content of this section number',
                        'disablepp' => 'Disable the PP Report from the parser output',
+                       'disableeditsection' => 'Disable edit section links from the parser output',
                        'generatexml' => "Generate XML parse tree (requires contentmodel=$wikitext)",
                        'preview' => 'Parse in preview mode',
                        'sectionpreview' => 'Parse in section preview mode (enables preview mode too)',
index 27f0f1e..b9f97e3 100644 (file)
@@ -29,7 +29,6 @@
  */
 class ApiProtect extends ApiBase {
        public function execute() {
-               global $wgRestrictionLevels;
                $params = $this->extractRequestParams();
 
                $pageObj = $this->getTitleOrPageId( $params, 'fromdbmaster' );
@@ -74,11 +73,11 @@ class ApiProtect extends ApiBase {
                        if ( !in_array( $p[0], $restrictionTypes ) && $p[0] != 'create' ) {
                                $this->dieUsageMsg( array( 'protect-invalidaction', $p[0] ) );
                        }
-                       if ( !in_array( $p[1], $wgRestrictionLevels ) && $p[1] != 'all' ) {
+                       if ( !in_array( $p[1], $this->getConfig()->get( 'RestrictionLevels' ) ) && $p[1] != 'all' ) {
                                $this->dieUsageMsg( array( 'protect-invalidlevel', $p[1] ) );
                        }
 
-                       if ( in_array( $expiry[$i], array( 'infinite', 'indefinite', 'never' ) ) ) {
+                       if ( in_array( $expiry[$i], array( 'infinite', 'indefinite', 'infinity', 'never' ) ) ) {
                                $expiryarray[$p[0]] = $db->getInfinity();
                        } else {
                                $exp = strtotime( $expiry[$i] );
@@ -188,7 +187,7 @@ class ApiProtect extends ApiBase {
                        'expiry' => array(
                                'Expiry timestamps. If only one timestamp is ' .
                                        'set, it\'ll be used for all protections.',
-                               'Use \'infinite\', \'indefinite\' or \'never\', for a never-expiring protection.'
+                               'Use \'infinite\', \'indefinite\', \'infinity\' or \'never\', for a never-expiring protection.'
                        ),
                        'reason' => 'Reason for (un)protecting',
                        'cascade' => array(
index e5d6a3c..981dc18 100644 (file)
@@ -54,17 +54,16 @@ class ApiPurge extends ApiBase {
 
                        if ( $forceLinkUpdate || $forceRecursiveLinkUpdate ) {
                                if ( !$this->getUser()->pingLimiter( 'linkpurge' ) ) {
-                                       global $wgEnableParserCache;
-
                                        $popts = $page->makeParserOptions( 'canonical' );
 
                                        # Parse content; note that HTML generation is only needed if we want to cache the result.
                                        $content = $page->getContent( Revision::RAW );
+                                       $enableParserCache = $this->getConfig()->get( 'EnableParserCache' );
                                        $p_result = $content->getParserOutput(
                                                $title,
                                                $page->getLatest(),
                                                $popts,
-                                               $wgEnableParserCache
+                                               $enableParserCache
                                        );
 
                                        # Update the links tables
@@ -74,7 +73,7 @@ class ApiPurge extends ApiBase {
 
                                        $r['linkupdate'] = '';
 
-                                       if ( $wgEnableParserCache ) {
+                                       if ( $enableParserCache ) {
                                                $pcache = ParserCache::singleton();
                                                $pcache->save( $p_result, $page, $popts );
                                        }
index fc115b8..a2f4121 100644 (file)
@@ -131,13 +131,13 @@ class ApiQuery extends ApiBase {
                $this->mModuleMgr = new ApiModuleManager( $this );
 
                // Allow custom modules to be added in LocalSettings.php
-               global $wgAPIPropModules, $wgAPIListModules, $wgAPIMetaModules;
+               $config = $this->getConfig();
                $this->mModuleMgr->addModules( self::$QueryPropModules, 'prop' );
-               $this->mModuleMgr->addModules( $wgAPIPropModules, 'prop' );
+               $this->mModuleMgr->addModules( $config->get( 'APIPropModules' ), 'prop' );
                $this->mModuleMgr->addModules( self::$QueryListModules, 'list' );
-               $this->mModuleMgr->addModules( $wgAPIListModules, 'list' );
+               $this->mModuleMgr->addModules( $config->get( 'APIListModules' ), 'list' );
                $this->mModuleMgr->addModules( self::$QueryMetaModules, 'meta' );
-               $this->mModuleMgr->addModules( $wgAPIMetaModules, 'meta' );
+               $this->mModuleMgr->addModules( $config->get( 'APIMetaModules' ), 'meta' );
 
                // Create PageSet that will process titles/pageids/revids/generator
                $this->mPageSet = new ApiPageSet( $this );
index 4266a8e..68d968f 100644 (file)
@@ -228,8 +228,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                }
 
                if ( !is_null( $params['mime'] ) ) {
-                       global $wgMiserMode;
-                       if ( $wgMiserMode ) {
+                       if ( $this->getConfig()->get( 'MiserMode' ) ) {
                                $this->dieUsage( 'MIME search disabled in Miser Mode', 'mimesearchdisabled' );
                        }
 
index 8d4af0b..c6171e9 100644 (file)
@@ -63,14 +63,13 @@ class ApiQueryAllMessages extends ApiQueryBase {
                if ( in_array( '*', $params['messages'] ) ) {
                        $message_names = Language::getMessageKeysFor( $langObj->getCode() );
                        if ( $params['includelocal'] ) {
-                               global $wgLanguageCode;
                                $message_names = array_unique( array_merge(
                                        $message_names,
                                        // Pass in the content language code so we get local messages that have a
                                        // MediaWiki:msgkey page. We might theoretically miss messages that have no
                                        // MediaWiki:msgkey page but do have a MediaWiki:msgkey/lang page, but that's
                                        // just a stupid case.
-                                       MessageCache::singleton()->getAllMessageKeys( $wgLanguageCode )
+                                       MessageCache::singleton()->getAllMessageKeys( $this->getConfig()->get( 'LanguageCode' ) )
                                ) );
                        }
                        sort( $message_names );
@@ -116,7 +115,7 @@ class ApiQueryAllMessages extends ApiQueryBase {
                        global $wgContLang;
                        $lang = $langObj->getCode();
 
-                       $customisedMessages = AllmessagesTablePager::getCustomisedStatuses(
+                       $customisedMessages = AllMessagesTablePager::getCustomisedStatuses(
                                array_map( array( $langObj, 'ucfirst' ), $messages_target ), $lang, $lang != $wgContLang->getCode() );
 
                        $customised = $params['customised'] === 'modified';
index b283177..a3ba5ab 100644 (file)
@@ -225,8 +225,6 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
        }
 
        public function getAllowedParams() {
-               global $wgRestrictionLevels;
-
                return array(
                        'from' => null,
                        'continue' => null,
@@ -255,7 +253,7 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                                ApiBase::PARAM_ISMULTI => true
                        ),
                        'prlevel' => array(
-                               ApiBase::PARAM_TYPE => $wgRestrictionLevels,
+                               ApiBase::PARAM_TYPE => $this->getConfig()->get( 'RestrictionLevels' ),
                                ApiBase::PARAM_ISMULTI => true
                        ),
                        'prfiltercascade' => array(
index 42464ef..e32104f 100644 (file)
@@ -155,7 +155,6 @@ class ApiQueryAllUsers extends ApiQueryBase {
                }
 
                if ( $params['activeusers'] ) {
-                       global $wgActiveUserDays;
                        $this->addTables( 'recentchanges' );
 
                        $this->addJoinConds( array( 'recentchanges' => array(
@@ -165,7 +164,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
                        $this->addFields( array( 'recentedits' => 'COUNT(*)' ) );
 
                        $this->addWhere( 'rc_log_type IS NULL OR rc_log_type != ' . $db->addQuotes( 'newusers' ) );
-                       $timestamp = $db->timestamp( wfTimestamp( TS_UNIX ) - $wgActiveUserDays * 24 * 3600 );
+                       $timestamp = $db->timestamp( wfTimestamp( TS_UNIX ) - $this->getConfig()->get( 'ActiveUserDays' ) * 24 * 3600 );
                        $this->addWhere( 'rc_timestamp >= ' . $db->addQuotes( $timestamp ) );
 
                        $this->addOption( 'GROUP BY', $userFieldToSort );
@@ -368,8 +367,6 @@ class ApiQueryAllUsers extends ApiQueryBase {
        }
 
        public function getParamDescription() {
-               global $wgActiveUserDays;
-
                return array(
                        'from' => 'The user name to start enumerating from',
                        'to' => 'The user name to stop enumerating at',
@@ -391,7 +388,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
                        ),
                        'limit' => 'How many total user names to return',
                        'witheditsonly' => 'Only list users who have made edits',
-                       'activeusers' => "Only list users active in the last {$wgActiveUserDays} days(s)"
+                       'activeusers' => "Only list users active in the last {$this->getConfig()->get( 'ActiveUserDays' )} days(s)"
                );
        }
 
index 01384c0..8e014df 100644 (file)
@@ -321,8 +321,7 @@ abstract class ApiQueryBase extends ApiBase {
                );
                $this->profileDBOut();
 
-               global $wgAPIMaxDBRows;
-               if ( $rowcount > $wgAPIMaxDBRows ) {
+               if ( $rowcount > $this->getConfig()->get( 'APIMaxDBRows' ) ) {
                        return false;
                }
 
index 7d27a64..d62e87d 100644 (file)
@@ -109,14 +109,14 @@ class ApiQueryBlocks extends ApiQueryBase {
                        $this->addWhereFld( 'ipb_auto', 0 );
                }
                if ( isset( $params['ip'] ) ) {
-                       global $wgBlockCIDRLimit;
+                       $blockCIDRLimit = $this->getConfig()->get( 'BlockCIDRLimit' );
                        if ( IP::isIPv4( $params['ip'] ) ) {
                                $type = 'IPv4';
-                               $cidrLimit = $wgBlockCIDRLimit['IPv4'];
+                               $cidrLimit = $blockCIDRLimit['IPv4'];
                                $prefixLen = 0;
                        } elseif ( IP::isIPv6( $params['ip'] ) ) {
                                $type = 'IPv6';
-                               $cidrLimit = $wgBlockCIDRLimit['IPv6'];
+                               $cidrLimit = $blockCIDRLimit['IPv6'];
                                $prefixLen = 3; // IP::toHex output is prefixed with "v6-"
                        } else {
                                $this->dieUsage( 'IP parameter is not valid', 'param_ip' );
@@ -331,7 +331,7 @@ class ApiQueryBlocks extends ApiQueryBase {
        }
 
        public function getParamDescription() {
-               global $wgBlockCIDRLimit;
+               $blockCIDRLimit = $this->getConfig()->get( 'BlockCIDRLimit' );
                $p = $this->getModulePrefix();
 
                return array(
@@ -343,7 +343,7 @@ class ApiQueryBlocks extends ApiQueryBase {
                        'ip' => array(
                                'Get all blocks applying to this IP or CIDR range, including range blocks.',
                                "Cannot be used together with bkusers. CIDR ranges broader than " .
-                                       "IPv4/{$wgBlockCIDRLimit['IPv4']} or IPv6/{$wgBlockCIDRLimit['IPv6']} " .
+                                       "IPv4/{$blockCIDRLimit['IPv4']} or IPv6/{$blockCIDRLimit['IPv6']} " .
                                        "are not accepted"
                        ),
                        'limit' => 'The maximum amount of blocks to list',
@@ -427,18 +427,18 @@ class ApiQueryBlocks extends ApiQueryBase {
        }
 
        public function getPossibleErrors() {
-               global $wgBlockCIDRLimit;
+               $blockCIDRLimit = $this->getConfig()->get( 'BlockCIDRLimit' );
 
                return array_merge( parent::getPossibleErrors(),
                        $this->getRequireMaxOneParameterErrorMessages( array( 'users', 'ip' ) ),
                        array(
                                array(
                                        'code' => 'cidrtoobroad',
-                                       'info' => "IPv4 CIDR ranges broader than /{$wgBlockCIDRLimit['IPv4']} are not accepted"
+                                       'info' => "IPv4 CIDR ranges broader than /{$blockCIDRLimit['IPv4']} are not accepted"
                                ),
                                array(
                                        'code' => 'cidrtoobroad',
-                                       'info' => "IPv6 CIDR ranges broader than /{$wgBlockCIDRLimit['IPv6']} are not accepted"
+                                       'info' => "IPv6 CIDR ranges broader than /{$blockCIDRLimit['IPv6']} are not accepted"
                                ),
                                array( 'code' => 'param_ip', 'info' => 'IP parameter is not valid' ),
                                array( 'code' => 'param_user', 'info' => 'User parameter may not be empty' ),
index a3bc3b9..dc11071 100644 (file)
@@ -86,9 +86,8 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
 
                // Scanning large datasets for rare categories sucks, and I already told
                // how to have efficient subcategory access :-) ~~~~ (oh well, domas)
-               global $wgMiserMode;
                $miser_ns = array();
-               if ( $wgMiserMode ) {
+               if ( $this->getConfig()->get( 'MiserMode' ) ) {
                        $miser_ns = $params['namespace'];
                } else {
                        $this->addWhereFld( 'page_namespace', $params['namespace'] );
@@ -339,7 +338,6 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
        }
 
        public function getParamDescription() {
-               global $wgMiserMode;
                $p = $this->getModulePrefix();
                $desc = array(
                        'title' => "Which category to enumerate (required). Must include " .
@@ -374,7 +372,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                        'limit' => 'The maximum number of pages to return.',
                );
 
-               if ( $wgMiserMode ) {
+               if ( $this->getConfig()->get( 'MiserMode' ) ) {
                        $desc['namespace'] = array(
                                $desc['namespace'],
                                "NOTE: Due to \$wgMiserMode, using this may result in fewer than \"{$p}limit\" results",
index 070681c..33e8739 100644 (file)
@@ -59,9 +59,8 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
                $this->addOption( 'USE INDEX', 'el_index' );
                $this->addWhere( 'page_id=el_from' );
 
-               global $wgMiserMode;
                $miser_ns = array();
-               if ( $wgMiserMode ) {
+               if ( $this->getConfig()->get( 'MiserMode' ) ) {
                        $miser_ns = $params['namespace'];
                } else {
                        $this->addWhereFld( 'page_namespace', $params['namespace'] );
@@ -209,7 +208,6 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
        }
 
        public function getParamDescription() {
-               global $wgMiserMode;
                $p = $this->getModulePrefix();
                $desc = array(
                        'prop' => array(
@@ -230,7 +228,7 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
                        'expandurl' => 'Expand protocol-relative URLs with the canonical protocol',
                );
 
-               if ( $wgMiserMode ) {
+               if ( $this->getConfig()->get( 'MiserMode' ) ) {
                        $desc['namespace'] = array(
                                $desc['namespace'],
                                "NOTE: Due to \$wgMiserMode, using this may result in fewer than \"{$p}limit\" results",
index 5a82f19..4b49a80 100644 (file)
@@ -256,15 +256,13 @@ class ApiQueryImageInfo extends ApiQueryBase {
         * @return array Array of parameters for transform.
         */
        protected function mergeThumbParams( $image, $thumbParams, $otherParams ) {
-               global $wgThumbLimits;
-
                if ( !isset( $thumbParams['width'] ) && isset( $thumbParams['height'] ) ) {
                        // We want to limit only by height in this situation, so pass the
                        // image's full width as the limiting width. But some file types
                        // don't have a width of their own, so pick something arbitrary so
                        // thumbnailing the default icon works.
                        if ( $image->getWidth() <= 0 ) {
-                               $thumbParams['width'] = max( $wgThumbLimits );
+                               $thumbParams['width'] = max( $this->getConfig()->get( 'ThumbLimits' ) );
                        } else {
                                $thumbParams['width'] = $image->getWidth();
                        }
index f160791..8b6886d 100644 (file)
@@ -57,21 +57,20 @@ class ApiQueryInfo extends ApiQueryBase {
         * @return void
         */
        public function requestExtraData( $pageSet ) {
-               global $wgDisableCounters, $wgContentHandlerUseDB;
-
                $pageSet->requestField( 'page_restrictions' );
                // when resolving redirects, no page will have this field
                if ( !$pageSet->isResolvingRedirects() ) {
                        $pageSet->requestField( 'page_is_redirect' );
                }
                $pageSet->requestField( 'page_is_new' );
-               if ( !$wgDisableCounters ) {
+               $config = $this->getConfig();
+               if ( !$config->get( 'DisableCounters' ) ) {
                        $pageSet->requestField( 'page_counter' );
                }
                $pageSet->requestField( 'page_touched' );
                $pageSet->requestField( 'page_latest' );
                $pageSet->requestField( 'page_len' );
-               if ( $wgContentHandlerUseDB ) {
+               if ( $config->get( 'ContentHandlerUseDB' ) ) {
                        $pageSet->requestField( 'page_content_model' );
                }
        }
@@ -295,9 +294,7 @@ class ApiQueryInfo extends ApiQueryBase {
                        : array();
                $this->pageIsNew = $pageSet->getCustomField( 'page_is_new' );
 
-               global $wgDisableCounters;
-
-               if ( !$wgDisableCounters ) {
+               if ( !$this->getConfig()->get( 'DisableCounters' ) ) {
                        $this->pageCounter = $pageSet->getCustomField( 'page_counter' );
                }
                $this->pageTouched = $pageSet->getCustomField( 'page_touched' );
@@ -359,11 +356,9 @@ class ApiQueryInfo extends ApiQueryBase {
                $pageInfo['pagelanguage'] = $title->getPageLanguage()->getCode();
 
                if ( $titleExists ) {
-                       global $wgDisableCounters;
-
                        $pageInfo['touched'] = wfTimestamp( TS_ISO_8601, $this->pageTouched[$pageid] );
                        $pageInfo['lastrevid'] = intval( $this->pageLatest[$pageid] );
-                       $pageInfo['counter'] = $wgDisableCounters
+                       $pageInfo['counter'] = $this->getConfig()->get( 'DisableCounters' )
                                ? ''
                                : intval( $this->pageCounter[$pageid] );
                        $pageInfo['length'] = intval( $this->pageLength[$pageid] );
@@ -711,15 +706,14 @@ class ApiQueryInfo extends ApiQueryBase {
         * Get the count of watchers and put it in $this->watchers
         */
        private function getWatcherInfo() {
-               global $wgUnwatchedPageThreshold;
-
                if ( count( $this->everything ) == 0 ) {
                        return;
                }
 
                $user = $this->getUser();
                $canUnwatchedpages = $user->isAllowed( 'unwatchedpages' );
-               if ( !$canUnwatchedpages && !is_int( $wgUnwatchedPageThreshold ) ) {
+               $unwatchedPageThreshold = $this->getConfig()->get( 'UnwatchedPageThreshold' );
+               if ( !$canUnwatchedpages && !is_int( $unwatchedPageThreshold ) ) {
                        return;
                }
 
@@ -737,7 +731,7 @@ class ApiQueryInfo extends ApiQueryBase {
                ) );
                $this->addOption( 'GROUP BY', array( 'wl_namespace', 'wl_title' ) );
                if ( !$canUnwatchedpages ) {
-                       $this->addOption( 'HAVING', "COUNT(*) >= $wgUnwatchedPageThreshold" );
+                       $this->addOption( 'HAVING', "COUNT(*) >= $unwatchedPageThreshold" );
                }
 
                $res = $this->select( __METHOD__ );
index 2d9d710..3aad785 100644 (file)
@@ -187,8 +187,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                $prefix = $params['prefix'];
 
                if ( !is_null( $prefix ) ) {
-                       global $wgMiserMode;
-                       if ( $wgMiserMode ) {
+                       if ( $this->getConfig()->get( 'MiserMode' ) ) {
                                $this->dieUsage( 'Prefix search disabled in Miser Mode', 'prefixsearchdisabled' );
                        }
 
@@ -449,10 +448,12 @@ class ApiQueryLogEvents extends ApiQueryBase {
                return $vals;
        }
 
+       /**
+        * @return array
+        */
        private function getAllowedLogActions() {
-               global $wgLogActions, $wgLogActionsHandlers;
-
-               return array_keys( array_merge( $wgLogActions, $wgLogActionsHandlers ) );
+               $config = $this->getConfig();
+               return array_keys( array_merge( $config->get( 'LogActions' ), $config->get( 'LogActionsHandlers' ) ) );
        }
 
        public function getCacheMode( $params ) {
@@ -472,8 +473,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
        }
 
        public function getAllowedParams( $flags = 0 ) {
-               global $wgLogTypes;
-
+               $config = $this->getConfig();
                return array(
                        'prop' => array(
                                ApiBase::PARAM_ISMULTI => true,
@@ -492,7 +492,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                                )
                        ),
                        'type' => array(
-                               ApiBase::PARAM_TYPE => $wgLogTypes
+                               ApiBase::PARAM_TYPE => $config->get( 'LogTypes' )
                        ),
                        'action' => array(
                                // validation on request is done in execute()
@@ -567,8 +567,6 @@ class ApiQueryLogEvents extends ApiQueryBase {
        }
 
        public function getResultProperties() {
-               global $wgLogTypes;
-
                return array(
                        'ids' => array(
                                'logid' => 'integer',
@@ -580,7 +578,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                        ),
                        'type' => array(
                                'type' => array(
-                                       ApiBase::PROP_TYPE => $wgLogTypes
+                                       ApiBase::PROP_TYPE => $this->getConfig()->get( 'LogTypes' )
                                ),
                                'action' => 'string'
                        ),
@@ -628,12 +626,18 @@ class ApiQueryLogEvents extends ApiQueryBase {
        }
 
        public function getPossibleErrors() {
-               return array_merge( parent::getPossibleErrors(), array(
-                       array( 'code' => 'param_user', 'info' => 'User name $user not found' ),
-                       array( 'code' => 'param_title', 'info' => 'Bad title value \'title\'' ),
-                       array( 'code' => 'param_prefix', 'info' => 'Bad title value \'prefix\'' ),
-                       array( 'code' => 'prefixsearchdisabled', 'info' => 'Prefix search disabled in Miser Mode' ),
-               ) );
+               return array_merge(
+                       parent::getPossibleErrors(),
+                       $this->getRequireMaxOneParameterErrorMessages(
+                               array( 'title', 'prefix', 'namespace' ) ),
+                       array(
+                               array( 'code' => 'param_user', 'info' => 'User name $user not found' ),
+                               array( 'code' => 'param_title', 'info' => 'Bad title value \'title\'' ),
+                               array( 'code' => 'param_prefix', 'info' => 'Bad title value \'prefix\'' ),
+                               array( 'code' => 'prefixsearchdisabled',
+                                       'info' => 'Prefix search disabled in Miser Mode' ),
+                       )
+               );
        }
 
        public function getExamples() {
index 8f120c6..2cc18c5 100644 (file)
@@ -175,8 +175,6 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
        }
 
        public function getAllowedParams() {
-               global $wgRestrictionLevels;
-
                return array(
                        'namespace' => array(
                                ApiBase::PARAM_ISMULTI => true,
@@ -184,7 +182,7 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
                        ),
                        'level' => array(
                                ApiBase::PARAM_ISMULTI => true,
-                               ApiBase::PARAM_TYPE => array_diff( $wgRestrictionLevels, array( '' ) )
+                               ApiBase::PARAM_TYPE => array_diff( $this->getConfig()->get( 'RestrictionLevels' ), array( '' ) )
                        ),
                        'limit' => array(
                                ApiBase::PARAM_DFLT => 10,
@@ -246,8 +244,6 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
        }
 
        public function getResultProperties() {
-               global $wgRestrictionLevels;
-
                return array(
                        '' => array(
                                'ns' => 'namespace',
@@ -277,7 +273,7 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
                        ),
                        'level' => array(
                                'level' => array(
-                                       ApiBase::PROP_TYPE => array_diff( $wgRestrictionLevels, array( '' ) )
+                                       ApiBase::PROP_TYPE => array_diff( $this->getConfig()->get( 'RestrictionLevels' ), array( '' ) )
                                )
                        )
                );
index 45950e7..1a7f826 100644 (file)
@@ -35,10 +35,10 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
        public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'qp' );
                // Build mapping from special page names to QueryPage classes
-               global $wgAPIUselessQueryPages;
+               $uselessQueryPages = $this->getConfig()->get( 'APIUselessQueryPages' );
                $this->qpMap = array();
                foreach ( QueryPage::getPages() as $page ) {
-                       if ( !in_array( $page[1], $wgAPIUselessQueryPages ) ) {
+                       if ( !in_array( $page[1], $uselessQueryPages ) ) {
                                $this->qpMap[$page[1]] = $page[0];
                        }
                }
@@ -56,8 +56,6 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
         * @param ApiPageSet $resultPageSet
         */
        public function run( $resultPageSet = null ) {
-               global $wgQueryCacheLimit;
-
                $params = $this->extractRequestParams();
                $result = $this->getResult();
 
@@ -77,7 +75,7 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
                                if ( $ts ) {
                                        $r['cachedtimestamp'] = wfTimestamp( TS_ISO_8601, $ts );
                                }
-                               $r['maxresults'] = $wgQueryCacheLimit;
+                               $r['maxresults'] = $this->getConfig()->get( 'QueryCacheLimit' );
                        }
                }
                $result->addValue( array( 'query' ), $this->getModuleName(), $r );
index 1fb2a69..e4078d5 100644 (file)
@@ -738,7 +738,6 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
        }
 
        public function getResultProperties() {
-               global $wgLogTypes;
                $props = array(
                        '' => array(
                                'type' => array(
@@ -814,7 +813,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                                        ApiBase::PROP_NULLABLE => true
                                ),
                                'logtype' => array(
-                                       ApiBase::PROP_TYPE => $wgLogTypes,
+                                       ApiBase::PROP_TYPE => $this->getConfig()->get( 'LogTypes' ),
                                        ApiBase::PROP_NULLABLE => true
                                ),
                                'logaction' => array(
index 50c3c7b..3ff6805 100644 (file)
@@ -624,10 +624,9 @@ class ApiQueryRevisions extends ApiQueryBase {
                }
 
                if ( $content && ( !is_null( $this->diffto ) || !is_null( $this->difftotext ) ) ) {
-                       global $wgAPIMaxUncachedDiffs;
                        static $n = 0; // Number of uncached diffs we've had
 
-                       if ( $n < $wgAPIMaxUncachedDiffs ) {
+                       if ( $n < $this->getConfig()->get( 'APIMaxUncachedDiffs' ) ) {
                                $vals['diff'] = array();
                                $context = new DerivativeContext( $this->getContext() );
                                $context->setTitle( $title );
index d67fac2..1c41113 100644 (file)
@@ -257,8 +257,6 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
        }
 
        public function getAllowedParams() {
-               global $wgSearchType;
-
                $params = array(
                        'search' => array(
                                ApiBase::PARAM_TYPE => 'string',
@@ -319,7 +317,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                                $alternatives[0] = self::BACKEND_NULL_PARAM;
                        }
                        $params['backend'] = array(
-                               ApiBase::PARAM_DFLT => $wgSearchType,
+                               ApiBase::PARAM_DFLT => $this->getConfig()->get( 'SearchType' ),
                                ApiBase::PARAM_TYPE => $alternatives,
                        );
                }
index 0a97d04..aacf091 100644 (file)
@@ -120,31 +120,34 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        protected function appendGeneralInfo( $property ) {
-               global $wgContLang, $wgDisableLangConversion, $wgDisableTitleConversion;
+               global $wgContLang;
+
+               $config = $this->getConfig();
 
                $data = array();
                $mainPage = Title::newMainPage();
                $data['mainpage'] = $mainPage->getPrefixedText();
                $data['base'] = wfExpandUrl( $mainPage->getFullURL(), PROTO_CURRENT );
-               $data['sitename'] = $GLOBALS['wgSitename'];
+               $data['sitename'] = $config->get( 'Sitename' );
 
                // wgLogo can either be a relative or an absolute path
                // make sure we always return an absolute path
-               $data['logo'] = wfExpandUrl( $GLOBALS['wgLogo'], PROTO_RELATIVE );
+               $data['logo'] = wfExpandUrl( $config->get( 'Logo' ), PROTO_RELATIVE );
+
+               $data['generator'] = "MediaWiki {$config->get( 'Version' )}";
 
-               $data['generator'] = "MediaWiki {$GLOBALS['wgVersion']}";
                $data['phpversion'] = phpversion();
                $data['phpsapi'] = PHP_SAPI;
-               $data['dbtype'] = $GLOBALS['wgDBtype'];
+               $data['dbtype'] = $config->get( 'DBtype' );
                $data['dbversion'] = $this->getDB()->getServerVersion();
 
                $allowFrom = array( '' );
                $allowException = true;
-               if ( !$GLOBALS['wgAllowExternalImages'] ) {
-                       if ( $GLOBALS['wgEnableImageWhitelist'] ) {
+               if ( !$config->get( 'AllowExternalImages' ) ) {
+                       if ( $config->get( 'EnableImageWhitelist' ) ) {
                                $data['imagewhitelistenabled'] = '';
                        }
-                       $allowFrom = $GLOBALS['wgAllowExternalImagesFrom'];
+                       $allowFrom = $config->get( 'AllowExternalImagesFrom' );
                        $allowException = !empty( $allowFrom );
                }
                if ( $allowException ) {
@@ -152,11 +155,11 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        $this->getResult()->setIndexedTagName( $data['externalimages'], 'prefix' );
                }
 
-               if ( !$wgDisableLangConversion ) {
+               if ( !$config->get( 'DisableLangConversion' ) ) {
                        $data['langconversion'] = '';
                }
 
-               if ( !$wgDisableTitleConversion ) {
+               if ( !$config->get( 'DisableTitleConversion' ) ) {
                        $data['titleconversion'] = '';
                }
 
@@ -177,22 +180,22 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        $data['linktrail'] = '';
                }
 
-               $git = SpecialVersion::getGitHeadSha1( $GLOBALS['IP'] );
+               global $IP;
+               $git = SpecialVersion::getGitHeadSha1( $IP );
                if ( $git ) {
                        $data['git-hash'] = $git;
                        $data['git-branch'] =
                                SpecialVersion::getGitCurrentBranch( $GLOBALS['IP'] );
                } else {
-                       $svn = SpecialVersion::getSvnRevision( $GLOBALS['IP'] );
+                       $svn = SpecialVersion::getSvnRevision( $IP );
                        if ( $svn ) {
                                $data['rev'] = $svn;
                        }
                }
 
                // 'case-insensitive' option is reserved for future
-               $data['case'] = $GLOBALS['wgCapitalLinks'] ? 'first-letter' : 'case-sensitive';
-
-               $data['lang'] = $GLOBALS['wgLanguageCode'];
+               $data['case'] = $config->get( 'CapitalLinks' ) ? 'first-letter' : 'case-sensitive';
+               $data['lang'] = $config->get( 'LanguageCode' );
 
                $fallbacks = array();
                foreach ( $wgContLang->getFallbackLanguages() as $code ) {
@@ -222,12 +225,12 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        $data['readonly'] = '';
                        $data['readonlyreason'] = wfReadOnlyReason();
                }
-               if ( $GLOBALS['wgEnableWriteAPI'] ) {
+               if ( $config->get( 'EnableWriteAPI' ) ) {
                        $data['writeapi'] = '';
                }
 
-               $tz = $GLOBALS['wgLocaltimezone'];
-               $offset = $GLOBALS['wgLocalTZoffset'];
+               $tz = $config->get( 'Localtimezone' );
+               $offset = $config->get( 'LocalTZoffset' );
                if ( is_null( $tz ) ) {
                        $tz = 'UTC';
                        $offset = 0;
@@ -236,33 +239,34 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                }
                $data['timezone'] = $tz;
                $data['timeoffset'] = intval( $offset );
-               $data['articlepath'] = $GLOBALS['wgArticlePath'];
-               $data['scriptpath'] = $GLOBALS['wgScriptPath'];
-               $data['script'] = $GLOBALS['wgScript'];
-               $data['variantarticlepath'] = $GLOBALS['wgVariantArticlePath'];
-               $data['server'] = $GLOBALS['wgServer'];
-               $data['servername'] = $GLOBALS['wgServerName'];
+               $data['articlepath'] = $config->get( 'ArticlePath' );
+               $data['scriptpath'] = $config->get( 'ScriptPath' );
+               $data['script'] = $config->get( 'Script' );
+               $data['variantarticlepath'] = $config->get( 'VariantArticlePath'  );
+               $data['server'] = $config->get( 'Server' );
+               $data['servername'] = $config->get( 'ServerName' );
                $data['wikiid'] = wfWikiID();
                $data['time'] = wfTimestamp( TS_ISO_8601, time() );
 
-               if ( $GLOBALS['wgMiserMode'] ) {
+               if ( $config->get( 'MiserMode' ) ) {
                        $data['misermode'] = '';
                }
 
                $data['maxuploadsize'] = UploadBase::getMaxUploadSize();
 
-               $data['thumblimits'] = $GLOBALS['wgThumbLimits'];
+               $data['thumblimits'] = $config->get( 'ThumbLimits' );
                $this->getResult()->setIndexedTagName( $data['thumblimits'], 'limit' );
                $data['imagelimits'] = array();
                $this->getResult()->setIndexedTagName( $data['imagelimits'], 'limit' );
-               foreach ( $GLOBALS['wgImageLimits'] as $k => $limit ) {
+               foreach ( $config->get( 'ImageLimits' ) as $k => $limit ) {
                        $data['imagelimits'][$k] = array( 'width' => $limit[0], 'height' => $limit[1] );
                }
 
-               if ( !empty( $GLOBALS['wgFavicon'] ) ) {
+                $favicon = $config->get( 'Favicon' );
+                if ( !empty( $favicon ) ) {
                        // wgFavicon can either be a relative or an absolute path
                        // make sure we always return an absolute path
-                       $data['favicon'] = wfExpandUrl( $GLOBALS['wgFavicon'], PROTO_RELATIVE );
+                       $data['favicon'] = wfExpandUrl( $favicon, PROTO_RELATIVE );
                }
 
                wfRunHooks( 'APIQuerySiteInfoGeneralInfo', array( $this, &$data ) );
@@ -309,8 +313,8 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        protected function appendNamespaceAliases( $property ) {
-               global $wgNamespaceAliases, $wgContLang;
-               $aliases = array_merge( $wgNamespaceAliases, $wgContLang->getNamespaceAliases() );
+               global $wgContLang;
+               $aliases = array_merge( $this->getConfig()->get( 'NamespaceAliases' ), $wgContLang->getNamespaceAliases() );
                $namespaces = $wgContLang->getNamespaces();
                $data = array();
                foreach ( $aliases as $title => $ns ) {
@@ -380,6 +384,8 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $langNames = Language::fetchLanguageNames( $langCode );
 
                $getPrefixes = Interwiki::getAllPrefixes( $local );
+               $extraLangPrefixes = $this->getConfig()->get( 'ExtraInterlanguageLinkPrefixes' );
+               $localInterwikis = $this->getConfig()->get( 'LocalInterwikis' );
                $data = array();
 
                foreach ( $getPrefixes as $row ) {
@@ -392,12 +398,30 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        if ( $row['iw_trans'] == '1' ) {
                                $val['trans'] = '';
                        }
+
                        if ( isset( $langNames[$prefix] ) ) {
                                $val['language'] = $langNames[$prefix];
                        }
+                       if ( in_array( $prefix, $localInterwikis ) ) {
+                               $val['localinterwiki'] = '';
+                       }
+                       if ( in_array( $prefix, $extraLangPrefixes ) ) {
+                               $val['extralanglink'] = '';
+
+                               $linktext = wfMessage( "interlanguage-link-$prefix" );
+                               if ( !$linktext->isDisabled() ) {
+                                       $val['linktext'] = $linktext->text();
+                               }
+
+                               $sitename = wfMessage( "interlanguage-link-sitename-$prefix" );
+                               if ( !$sitename->isDisabled() ) {
+                                       $val['sitename'] = $sitename->text();
+                               }
+                       }
+
                        $val['url'] = wfExpandUrl( $row['iw_url'], PROTO_CURRENT );
                        if (substr( $row['iw_url'], 0, 2) == '//') {
-                               $val['protorel'] = true;
+                               $val['protorel'] = '';
                        }
                        if ( isset( $row['iw_wikiid'] ) ) {
                                $val['wikiid'] = $row['iw_wikiid'];
@@ -415,11 +439,11 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        protected function appendDbReplLagInfo( $property, $includeAll ) {
-               global $wgShowHostnames;
                $data = array();
                $lb = wfGetLB();
+               $showHostnames = $this->getConfig()->get( 'ShowHostnames' );
                if ( $includeAll ) {
-                       if ( !$wgShowHostnames ) {
+                       if ( !$showHostnames ) {
                                $this->dieUsage(
                                        'Cannot view all servers info unless $wgShowHostnames is true',
                                        'includeAllDenied'
@@ -436,7 +460,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                } else {
                        list( , $lag, $index ) = $lb->getMaxLag();
                        $data[] = array(
-                               'host' => $wgShowHostnames
+                               'host' => $showHostnames
                                                ? $lb->getServerName( $index )
                                                : '',
                                'lag' => intval( $lag )
@@ -450,11 +474,10 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        protected function appendStatistics( $property ) {
-               global $wgDisableCounters;
                $data = array();
                $data['pages'] = intval( SiteStats::pages() );
                $data['articles'] = intval( SiteStats::articles() );
-               if ( !$wgDisableCounters ) {
+               if ( !$this->getConfig()->get( 'DisableCounters' ) ) {
                        $data['views'] = intval( SiteStats::views() );
                }
                $data['edits'] = intval( SiteStats::edits() );
@@ -470,33 +493,32 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        protected function appendUserGroups( $property, $numberInGroup ) {
-               global $wgGroupPermissions, $wgAddGroups, $wgRemoveGroups;
-               global $wgGroupsAddToSelf, $wgGroupsRemoveFromSelf;
+               $config = $this->getConfig();
 
                $data = array();
                $result = $this->getResult();
-               foreach ( $wgGroupPermissions as $group => $permissions ) {
+               foreach ( $config->get( 'GroupPermissions' ) as $group => $permissions ) {
                        $arr = array(
                                'name' => $group,
                                'rights' => array_keys( $permissions, true ),
                        );
 
                        if ( $numberInGroup ) {
-                               global $wgAutopromote;
+                               $autopromote = $config->get( 'Autopromote' );
 
                                if ( $group == 'user' ) {
                                        $arr['number'] = SiteStats::users();
                                // '*' and autopromote groups have no size
-                               } elseif ( $group !== '*' && !isset( $wgAutopromote[$group] ) ) {
+                               } elseif ( $group !== '*' && !isset( $autopromote[$group] ) ) {
                                        $arr['number'] = SiteStats::numberInGroup( $group );
                                }
                        }
 
                        $groupArr = array(
-                               'add' => $wgAddGroups,
-                               'remove' => $wgRemoveGroups,
-                               'add-self' => $wgGroupsAddToSelf,
-                               'remove-self' => $wgGroupsRemoveFromSelf
+                               'add' => $config->get( 'AddGroups' ),
+                               'remove' => $config->get( 'RemoveGroups' ),
+                               'add-self' => $config->get( 'GroupsAddToSelf' ),
+                               'remove-self' => $config->get( 'GroupsRemoveFromSelf' )
                        );
 
                        foreach ( $groupArr as $type => $rights ) {
@@ -516,10 +538,8 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        protected function appendFileExtensions( $property ) {
-               global $wgFileExtensions;
-
                $data = array();
-               foreach ( array_unique( $wgFileExtensions ) as $ext ) {
+               foreach ( array_unique( $this->getConfig()->get( 'FileExtensions' ) ) as $ext ) {
                        $data[] = array( 'ext' => $ext );
                }
                $this->getResult()->setIndexedTagName( $data, 'fe' );
@@ -528,15 +548,17 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        protected function appendExtensions( $property ) {
-               global $wgExtensionCredits;
                $data = array();
-               foreach ( $wgExtensionCredits as $type => $extensions ) {
+               foreach ( $this->getConfig()->get( 'ExtensionCredits' ) as $type => $extensions ) {
                        foreach ( $extensions as $ext ) {
                                $ret = array();
                                $ret['type'] = $type;
                                if ( isset( $ext['name'] ) ) {
                                        $ret['name'] = $ext['name'];
                                }
+                               if ( isset( $ext['namemsg'] ) ) {
+                                       $ret['namemsg'] = $ext['namemsg'];
+                               }
                                if ( isset( $ext['description'] ) ) {
                                        $ret['description'] = $ext['description'];
                                }
@@ -611,10 +633,10 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        protected function appendRightsInfo( $property ) {
-               global $wgRightsPage, $wgRightsUrl, $wgRightsText;
-               $title = Title::newFromText( $wgRightsPage );
-               $url = $title ? wfExpandUrl( $title->getFullURL(), PROTO_CURRENT ) : $wgRightsUrl;
-               $text = $wgRightsText;
+               $config = $this->getConfig();
+               $title = Title::newFromText( $config->get( 'RightsPage' ) );
+               $url = $title ? wfExpandUrl( $title->getFullURL(), PROTO_CURRENT ) : $config->get( 'RightsUrl' );
+               $text = $config->get( 'RightsText' );
                if ( !$text && $title ) {
                        $text = $title->getPrefixedText();
                }
@@ -628,14 +650,12 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        protected function appendRestrictions( $property ) {
-               global $wgRestrictionTypes, $wgRestrictionLevels,
-                       $wgCascadingRestrictionLevels, $wgSemiprotectedRestrictionLevels;
-
+               $config = $this->getConfig();
                $data = array(
-                       'types' => $wgRestrictionTypes,
-                       'levels' => $wgRestrictionLevels,
-                       'cascadinglevels' => $wgCascadingRestrictionLevels,
-                       'semiprotectedlevels' => $wgSemiprotectedRestrictionLevels,
+                       'types' => $config->get( 'RestrictionTypes' ),
+                       'levels' => $config->get( 'RestrictionLevels' ),
+                       'cascadinglevels' => $config->get( 'CascadingRestrictionLevels' ),
+                       'semiprotectedlevels' => $config->get( 'SemiprotectedRestrictionLevels' ),
                );
 
                $this->getResult()->setIndexedTagName( $data['types'], 'type' );
@@ -709,9 +729,8 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        public function appendProtocols( $property ) {
-               global $wgUrlProtocols;
                // Make a copy of the global so we don't try to set the _element key of it - bug 45130
-               $protocols = array_values( $wgUrlProtocols );
+               $protocols = array_values( $this->getConfig()->get( 'UrlProtocols' ) );
                $this->getResult()->setIndexedTagName( $protocols, 'p' );
 
                return $this->getResult()->addValue( 'query', $property, $protocols );
@@ -726,15 +745,15 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        public function appendSubscribedHooks( $property ) {
-               global $wgHooks;
-               $myWgHooks = $wgHooks;
+               $hooks = $this->getConfig()->get( 'Hooks' );
+               $myWgHooks = $hooks;
                ksort( $myWgHooks );
 
                $data = array();
-               foreach ( $myWgHooks as $hook => $hooks ) {
+               foreach ( $myWgHooks as $name => $subscribers ) {
                        $arr = array(
-                               'name' => $hook,
-                               'subscribers' => array_map( array( 'SpecialVersion', 'arrayToString' ), $hooks ),
+                               'name' => $name,
+                               'subscribers' => array_map( array( 'SpecialVersion', 'arrayToString' ), $subscribers ),
                        );
 
                        $this->getResult()->setIndexedTagName( $arr['subscribers'], 's' );
@@ -747,6 +766,15 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        public function getCacheMode( $params ) {
+               // Messages for $wgExtraInterlanguageLinkPrefixes depend on user language
+               if (
+                       count( $this->getConfig()->get( 'ExtraInterlanguageLinkPrefixes' ) ) &&
+                       !is_null( $params['prop'] ) &&
+                       in_array( 'interwikimap', $params['prop'] )
+               ) {
+                       return 'anon-public-user-private';
+               }
+
                return 'public';
        }
 
index 568ccb5..24c4c20 100644 (file)
@@ -517,8 +517,8 @@ class ApiQueryContributions extends ApiQueryBase {
        }
 
        public function getParamDescription() {
-               global $wgRCMaxAge;
                $p = $this->getModulePrefix();
+               $RCMaxAge = $this->getConfig()->get( 'RCMaxAge' );
 
                return array(
                        'limit' => 'The maximum number of contributions to return',
@@ -548,7 +548,7 @@ class ApiQueryContributions extends ApiQueryBase {
                        'show' => array(
                                "Show only items that meet thse criteria, e.g. non minor edits only: {$p}show=!minor",
                                "NOTE: If {$p}show=patrolled or {$p}show=!patrolled is set, revisions older than",
-                               "\$wgRCMaxAge ($wgRCMaxAge) won't be shown",
+                               "\$wgRCMaxAge ($RCMaxAge) won't be shown",
                        ),
                        'tag' => 'Only list revisions tagged with this tag',
                        'toponly' => 'Only list changes which are the latest revision',
index ee5e458..140f35a 100644 (file)
@@ -31,6 +31,8 @@
  */
 class ApiQueryUserInfo extends ApiQueryBase {
 
+       const WL_UNREAD_LIMIT = 1000;
+
        private $prop = array();
 
        public function __construct( ApiQuery $query, $moduleName ) {
@@ -50,7 +52,6 @@ class ApiQueryUserInfo extends ApiQueryBase {
        }
 
        protected function getCurrentUserInfo() {
-               global $wgHiddenPrefs;
                $user = $this->getUser();
                $result = $this->getResult();
                $vals = array();
@@ -120,7 +121,7 @@ class ApiQueryUserInfo extends ApiQueryBase {
                        $vals['ratelimits'] = $this->getRateLimits();
                }
 
-               if ( isset( $this->prop['realname'] ) && !in_array( 'realname', $wgHiddenPrefs ) ) {
+               if ( isset( $this->prop['realname'] ) && !in_array( 'realname', $this->getConfig()->get( 'HiddenPrefs' ) ) ) {
                        $vals['realname'] = $user->getRealName();
                }
 
@@ -153,11 +154,32 @@ class ApiQueryUserInfo extends ApiQueryBase {
                        $vals['acceptlang'] = $acceptLang;
                }
 
+               if ( isset( $this->prop['unreadcount'] ) ) {
+                       $dbr = $this->getQuery()->getNamedDB( 'watchlist', DB_SLAVE, 'watchlist' );
+
+                       $sql = $dbr->selectSQLText(
+                               'watchlist',
+                               array( 'dummy' => 1 ),
+                               array(
+                                       'wl_user' => $user->getId(),
+                                       'wl_notificationtimestamp IS NOT NULL',
+                               ),
+                               __METHOD__,
+                               array( 'LIMIT' => self::WL_UNREAD_LIMIT )
+                       );
+                       $count = $dbr->selectField( array( 'c' => "($sql)" ), 'COUNT(*)' );
+
+                       if ( $count >= self::WL_UNREAD_LIMIT ) {
+                               $vals['unreadcount'] = self::WL_UNREAD_LIMIT . '+';
+                       } else {
+                               $vals['unreadcount'] = (int)$count;
+                       }
+               }
+
                return $vals;
        }
 
        protected function getRateLimits() {
-               global $wgRateLimits;
                $user = $this->getUser();
                if ( !$user->isPingLimitable() ) {
                        return array(); // No limits
@@ -181,7 +203,7 @@ class ApiQueryUserInfo extends ApiQueryBase {
 
                // Now get the actual limits
                $retval = array();
-               foreach ( $wgRateLimits as $action => $limits ) {
+               foreach ( $this->getConfig()->get( 'RateLimits' ) as $action => $limits ) {
                        foreach ( $categories as $cat ) {
                                if ( isset( $limits[$cat] ) && !is_null( $limits[$cat] ) ) {
                                        $retval[$action][$cat]['hits'] = intval( $limits[$cat][0] );
@@ -212,7 +234,8 @@ class ApiQueryUserInfo extends ApiQueryBase {
                                        'email',
                                        'realname',
                                        'acceptlang',
-                                       'registrationdate'
+                                       'registrationdate',
+                                       'unreadcount',
                                )
                        )
                );
@@ -237,6 +260,9 @@ class ApiQueryUserInfo extends ApiQueryBase {
                                '  acceptlang       - Echoes the Accept-Language header sent by ' .
                                        'the client in a structured format',
                                '  registrationdate - Adds the user\'s registration date',
+                               '  unreadcount      - Adds the count of unread pages on the user\'s watchlist ' .
+                                       '(maximum ' . ( self::WL_UNREAD_LIMIT - 1 ) . '; returns "' .
+                                       self::WL_UNREAD_LIMIT . '+" if more)',
                        )
                );
        }
index 9a4dd82..506fb59 100644 (file)
@@ -168,6 +168,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                                || ( isset( $show['bot'] ) && isset( $show['!bot'] ) )
                                || ( isset( $show['anon'] ) && isset( $show['!anon'] ) )
                                || ( isset( $show['patrolled'] ) && isset( $show['!patrolled'] ) )
+                               || ( isset( $show['unread'] ) && isset( $show['!unread'] ) )
                        ) {
                                $this->dieUsageMsg( 'show' );
                        }
@@ -191,6 +192,8 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                        $this->addWhereIf( 'rc_user != 0', isset( $show['!anon'] ) );
                        $this->addWhereIf( 'rc_patrolled = 0', isset( $show['!patrolled'] ) );
                        $this->addWhereIf( 'rc_patrolled != 0', isset( $show['patrolled'] ) );
+                       $this->addWhereIf( 'wl_notificationtimestamp IS NOT NULL', isset( $show['unread'] ) );
+                       $this->addWhereIf( 'wl_notificationtimestamp IS NULL', isset( $show['!unread'] ) );
                }
 
                if ( !is_null( $params['type'] ) ) {
@@ -490,6 +493,8 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                                        '!anon',
                                        'patrolled',
                                        '!patrolled',
+                                       'unread',
+                                       '!unread',
                                )
                        ),
                        'type' => array(
@@ -557,8 +562,6 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
        }
 
        public function getResultProperties() {
-               global $wgLogTypes;
-
                return array(
                        '' => array(
                                'type' => array(
@@ -627,7 +630,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                                        ApiBase::PROP_NULLABLE => true
                                ),
                                'logtype' => array(
-                                       ApiBase::PROP_TYPE => $wgLogTypes,
+                                       ApiBase::PROP_TYPE => $this->getConfig()->get( 'LogTypes' ),
                                        ApiBase::PROP_NULLABLE => true
                                ),
                                'logaction' => array(
index c351561..7d0a15a 100644 (file)
  * Each subarray may either be a dictionary - key-value pairs with unique keys,
  * or lists, where the items are added using $data[] = $value notation.
  *
- * There are two special key values that change how XML output is generated:
- *   '_element' This key sets the tag name for the rest of the elements in the current array.
- *              It is only inserted if the formatter returned true for getNeedsRawData()
- *   '*'        This key has special meaning only to the XML formatter, and is outputted as is
- *              for all others. In XML it becomes the content of the current element.
+ * There are three special key values that change how XML output is generated:
+ *   '_element'     This key sets the tag name for the rest of the elements in the current array.
+ *                  It is only inserted if the formatter returned true for getNeedsRawData()
+ *   '_subelements' This key causes the specified elements to be returned as subelements rather than attributes.
+ *                  It is only inserted if the formatter returned true for getNeedsRawData()
+ *   '*'            This key has special meaning only to the XML formatter, and is outputted as is
+ *                  for all others. In XML it becomes the content of the current element.
  *
  * @ingroup API
  */
@@ -211,6 +213,30 @@ class ApiResult extends ApiBase {
                }
        }
 
+       /**
+        * Causes the elements with the specified names to be output as
+        * subelements rather than attributes.
+        * @param array $arr
+        * @param array|string $names The element name(s) to be output as subelements
+        */
+       public function setSubelements( &$arr, $names ) {
+               // In raw mode, add the '_subelements', otherwise just ignore
+               if ( !$this->getIsRawMode() ) {
+                       return;
+               }
+               if ( $arr === null || $names === null || !is_array( $arr ) ) {
+                       ApiBase::dieDebug( __METHOD__, 'Bad parameter' );
+               }
+               if ( !is_array( $names ) ) {
+                       $names = array( $names );
+               }
+               if ( !isset( $arr['_subelements'] ) ) {
+                       $arr['_subelements'] = $names;
+               } else {
+                       $arr['_subelements'] = array_merge( $arr['_subelements'], $names );
+               }
+       }
+
        /**
         * In case the array contains indexed values (in addition to named),
         * give all indexed values the given tag name. This function MUST be
@@ -288,15 +314,14 @@ class ApiResult extends ApiBase {
         * @since 1.21 int $flags replaced boolean $override
         */
        public function addValue( $path, $name, $value, $flags = 0 ) {
-               global $wgAPIMaxResultSize;
-
                $data = &$this->mData;
                if ( $this->mCheckingSize ) {
                        $newsize = $this->mSize + self::size( $value );
-                       if ( $newsize > $wgAPIMaxResultSize ) {
+                       $maxResultSize = $this->getConfig()->get( 'APIMaxResultSize' );
+                       if ( $newsize > $maxResultSize ) {
                                $this->setWarning(
                                        "This result was truncated because it would otherwise be larger than the " .
-                                               "limit of {$wgAPIMaxResultSize} bytes" );
+                                               "limit of {$maxResultSize} bytes" );
 
                                return false;
                        }
index d0ce6d7..80e09b6 100644 (file)
@@ -115,8 +115,8 @@ class ApiRollback extends ApiBase {
                $p = $this->getModulePrefix();
 
                return array(
-                       'title' => "Title of the page you want to delete. Cannot be used together with {$p}pageid",
-                       'pageid' => "Page ID of the page you want to delete. Cannot be used together with {$p}title",
+                       'title' => "Title of the page you want to roll back. Cannot be used together with {$p}pageid",
+                       'pageid' => "Page ID of the page you want to roll back. Cannot be used together with {$p}title",
                        'user' => 'Name of the user whose edits are to be rolled back. If ' .
                                'set incorrectly, you\'ll get a badtoken error.',
                        'token' => 'A rollback token previously retrieved through ' .
index 49306d7..5e6c962 100644 (file)
@@ -34,8 +34,6 @@ class ApiUpload extends ApiBase {
        protected $mParams;
 
        public function execute() {
-               global $wgEnableAsyncUploads;
-
                // Check whether upload is enabled
                if ( !UploadBase::isEnabled() ) {
                        $this->dieUsageMsg( 'uploaddisabled' );
@@ -47,7 +45,7 @@ class ApiUpload extends ApiBase {
                $this->mParams = $this->extractRequestParams();
                $request = $this->getMain()->getRequest();
                // Check if async mode is actually supported (jobs done in cli mode)
-               $this->mParams['async'] = ( $this->mParams['async'] && $wgEnableAsyncUploads );
+               $this->mParams['async'] = ( $this->mParams['async'] && $this->getConfig()->get( 'EnableAsyncUploads' ) );
                // Add the uploaded file to the params array
                $this->mParams['file'] = $request->getFileName( 'file' );
                $this->mParams['chunk'] = $request->getFileName( 'chunk' );
@@ -471,8 +469,6 @@ class ApiUpload extends ApiBase {
         * Performs file verification, dies on error.
         */
        protected function checkVerification( array $verification ) {
-               global $wgFileExtensions;
-
                // @todo Move them to ApiBase's message map
                switch ( $verification['status'] ) {
                        // Recoverable errors
@@ -504,7 +500,7 @@ class ApiUpload extends ApiBase {
                        case UploadBase::FILETYPE_BADTYPE:
                                $extradata = array(
                                        'filetype' => $verification['finalExt'],
-                                       'allowed' => array_values( array_unique( $wgFileExtensions ) )
+                                       'allowed' => array_values( array_unique( $this->getConfig()->get( 'FileExtensions' ) ) )
                                );
                                $this->getResult()->setIndexedTagName( $extradata['allowed'], 'ext' );
 
@@ -666,8 +662,7 @@ class ApiUpload extends ApiBase {
         * Checks if asynchronous copy uploads are enabled and throws an error if they are not.
         */
        protected function checkAsyncDownloadEnabled() {
-               global $wgAllowAsyncCopyUploads;
-               if ( !$wgAllowAsyncCopyUploads ) {
+               if ( !$this->getConfig()->get( 'AllowAsyncCopyUploads' ) ) {
                        $this->dieUsage( 'Asynchronous copy uploads disabled', 'asynccopyuploaddisabled' );
                }
        }
index a3cf87e..e5afd21 100644 (file)
@@ -1025,7 +1025,7 @@ class MessageCache {
                        $wgParser->firstCallInit();
                        # Clone it and store it
                        $class = $wgParserConf['class'];
-                       if ( $class == 'Parser_DiffTest' ) {
+                       if ( $class == 'ParserDiffTest' ) {
                                # Uncloneable
                                $this->mParser = new $class( $wgParserConf );
                        } else {
index 246f95d..cd43f82 100644 (file)
@@ -432,13 +432,11 @@ class ChangesList extends ContextSource {
         * @return string
         */
        public function insertComment( $rc ) {
-               if ( $rc->mAttribs['rc_type'] != RC_MOVE && $rc->mAttribs['rc_type'] != RC_MOVE_OVER_REDIRECT ) {
-                       if ( $this->isDeleted( $rc, Revision::DELETED_COMMENT ) ) {
-                               return ' <span class="history-deleted">' .
-                                       $this->msg( 'rev-deleted-comment' )->escaped() . '</span>';
-                       } else {
-                               return Linker::commentBlock( $rc->mAttribs['rc_comment'], $rc->getTitle() );
-                       }
+               if ( $this->isDeleted( $rc, Revision::DELETED_COMMENT ) ) {
+                       return ' <span class="history-deleted">' .
+                               $this->msg( 'rev-deleted-comment' )->escaped() . '</span>';
+               } else {
+                       return Linker::commentBlock( $rc->mAttribs['rc_comment'], $rc->getTitle() );
                }
 
                return '';
index 7307c69..0c073c6 100644 (file)
@@ -143,11 +143,7 @@ class EnhancedChangesList extends ChangesList {
 
                $type = $cacheEntry->mAttribs['rc_type'];
 
-               // @todo remove handling for RC_MOVE and RC_MOVE_OVER_REDIRECT (bug 63755)
-               if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
-                       // Use an # character to prevent collision with page names
-                       $cacheGroupingKey = '##' . ( $this->rcMoveIndex++ );
-               } elseif ( $type == RC_LOG ) {
+               if ( $type == RC_LOG ) {
                        // Group by log type
                        $cacheGroupingKey = SpecialPage::getTitleFor(
                                'Log',
@@ -551,16 +547,12 @@ class EnhancedChangesList extends ChangesList {
 
                $r .= '<td class="mw-enhanced-rc"><span class="mw-enhancedchanges-arrow-space"></span>';
                # Flag and Timestamp
-               if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
-                       $r .= $this->recentChangesFlags( array() ); // no flags, but need the placeholders
-               } else {
-                       $r .= $this->recentChangesFlags( array(
-                               'newpage' => $type == RC_NEW,
-                               'minor' => $rcObj->mAttribs['rc_minor'],
-                               'unpatrolled' => $rcObj->unpatrolled,
-                               'bot' => $rcObj->mAttribs['rc_bot'],
-                       ) );
-               }
+               $r .= $this->recentChangesFlags( array(
+                       'newpage' => $type == RC_NEW,
+                       'minor' => $rcObj->mAttribs['rc_minor'],
+                       'unpatrolled' => $rcObj->unpatrolled,
+                       'bot' => $rcObj->mAttribs['rc_bot'],
+               ) );
                $r .= '&#160;' . $rcObj->timestamp . '&#160;</td><td>';
                # Article or log link
                if ( $logType ) {
index 458f21a..d590ff6 100644 (file)
@@ -53,10 +53,7 @@ class OldChangesList extends ChangesList {
                $classes[] = $watched && $rc->mAttribs['rc_timestamp'] >= $watched
                        ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
 
-               // Moved pages (very very old, not supported anymore)
-               if ( $rc->mAttribs['rc_type'] == RC_MOVE || $rc->mAttribs['rc_type'] == RC_MOVE_OVER_REDIRECT ) {
-               // Log entries
-               } elseif ( $rc->mAttribs['rc_log_type'] ) {
+               if ( $rc->mAttribs['rc_log_type'] ) {
                        $logtitle = SpecialPage::getTitleFor( 'Log', $rc->mAttribs['rc_log_type'] );
                        $this->insertLog( $s, $logtitle, $rc->mAttribs['rc_log_type'] );
                // Log entries (old format) or log targets, and special pages
index 25a572b..c3fe183 100644 (file)
@@ -97,11 +97,8 @@ class RCCacheEntryFactory {
        private function buildCLink( RecentChange $cacheEntry ) {
                $type = $cacheEntry->mAttribs['rc_type'];
 
-               // Page moves, very old style, not supported anymore
-               if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
-                       $clink = '';
                // New unpatrolled pages
-               } elseif ( $cacheEntry->unpatrolled && $type == RC_NEW ) {
+               if ( $cacheEntry->unpatrolled && $type == RC_NEW ) {
                        $clink = Linker::linkKnown( $cacheEntry->getTitle() );
                // Log entries
                } elseif ( $type == RC_LOG ) {
@@ -171,7 +168,7 @@ class RCCacheEntryFactory {
        private function buildCurLink( RecentChange $cacheEntry, $showDiffLinks, $counter ) {
                $queryParams = $this->buildCurQueryParams( $cacheEntry );
                $curMessage = $this->getMessage( 'cur' );
-               $logTypes = array( RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT );
+               $logTypes = array( RC_LOG );
 
                if ( !$showDiffLinks || in_array( $cacheEntry->mAttribs['rc_type'], $logTypes ) ) {
                        $curLink = $curMessage;
@@ -206,7 +203,7 @@ class RCCacheEntryFactory {
        private function buildDiffLink( RecentChange $cacheEntry, $showDiffLinks, $counter ) {
                $queryParams = $this->buildDiffQueryParams( $cacheEntry );
                $diffMessage = $this->getMessage( 'diff' );
-               $logTypes = array( RC_NEW, RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT );
+               $logTypes = array( RC_NEW, RC_LOG );
 
                if ( !$showDiffLinks ) {
                        $diffLink = $diffMessage;
@@ -230,7 +227,7 @@ class RCCacheEntryFactory {
                $lastOldid = $cacheEntry->mAttribs['rc_last_oldid'];
                $lastMessage = $this->getMessage( 'last' );
                $type = $cacheEntry->mAttribs['rc_type'];
-               $logTypes = array( RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT );
+               $logTypes = array( RC_LOG );
 
                // Make "last" link
                if ( !$showDiffLinks || !$lastOldid || in_array( $type, $logTypes ) ) {
index 370e109..8fa6ed9 100644 (file)
@@ -147,18 +147,12 @@ class RecentChange {
                        case RC_NEW:
                                $type = 'new';
                                break;
-                       case RC_MOVE:
-                               $type = 'move';
-                               break;
                        case RC_LOG:
                                $type = 'log';
                                break;
                        case RC_EXTERNAL:
                                $type = 'external';
                                break;
-                       case RC_MOVE_OVER_REDIRECT:
-                               $type = 'move over redirect';
-                               break;
                        default:
                                $type = "$rcType";
                }
index 61a76b7..0d7f3f0 100644 (file)
@@ -69,7 +69,7 @@ class GlobalVarConfig implements Config {
         */
        protected function getWithPrefix( $prefix, $name ) {
                $var = $prefix . $name;
-               if ( !isset( $GLOBALS[ $var ] ) ) {
+               if ( !array_key_exists( $var, $GLOBALS ) ) {
                        throw new ConfigException( __METHOD__ . ": undefined variable: '$var'" );
                }
                return $GLOBALS[ $var ];
index 8ba43f6..e09be56 100644 (file)
@@ -342,7 +342,7 @@ abstract class AbstractContent implements Content {
         *
         * @see Content::replaceSection
         */
-       public function replaceSection( $section, Content $with, $sectionTitle = '' ) {
+       public function replaceSection( $sectionId, Content $with, $sectionTitle = '' ) {
                return null;
        }
 
index 3286c0a..61b9254 100644 (file)
@@ -378,10 +378,9 @@ interface Content {
         *
         * @since 1.21
         *
-        * @param string $sectionId 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.
+        * @param string|number $sectionId Section identifier as a number or string
+        * (e.g. 0, 1 or 'T-1'). 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|bool|null The section, or false if no such section
         *    exist, or null if sections are not supported.
@@ -394,13 +393,15 @@ interface Content {
         *
         * @since 1.21
         *
-        * @param mixed $section Null/false or a section number (0, 1, 2, T1, T2...), or "new"
+        * @param string|number|null|bool $sectionId Section identifier as a number or string
+        * (e.g. 0, 1 or 'T-1'), null/false or an empty string for the whole page
+        * or 'new' for a new section.
         * @param Content $with New content of the section
         * @param string $sectionTitle New section's subject, only if $section is 'new'
         *
         * @return string|null Complete article text, or null if error
         */
-       public function replaceSection( $section, Content $with, $sectionTitle = '' );
+       public function replaceSection( $sectionId, Content $with, $sectionTitle = '' );
 
        /**
         * Returns a Content object with pre-save transformations applied (or this
index ccea916..cdf5962 100644 (file)
@@ -37,17 +37,17 @@ class WikitextContent extends TextContent {
        }
 
        /**
-        * @param string $section
+        * @param string|number $sectionId
         *
         * @return Content|bool|null
         *
         * @see Content::getSection()
         */
-       public function getSection( $section ) {
+       public function getSection( $sectionId ) {
                global $wgParser;
 
                $text = $this->getNativeData();
-               $sect = $wgParser->getSection( $text, $section, false );
+               $sect = $wgParser->getSection( $text, $sectionId, false );
 
                if ( $sect === false ) {
                        return false;
@@ -57,7 +57,7 @@ class WikitextContent extends TextContent {
        }
 
        /**
-        * @param string $section
+        * @param string|number|null|bool $sectionId
         * @param Content $with
         * @param string $sectionTitle
         *
@@ -66,7 +66,7 @@ class WikitextContent extends TextContent {
         *
         * @see Content::replaceSection()
         */
-       public function replaceSection( $section, Content $with, $sectionTitle = '' ) {
+       public function replaceSection( $sectionId, Content $with, $sectionTitle = '' ) {
                wfProfileIn( __METHOD__ );
 
                $myModelId = $this->getModel();
@@ -82,13 +82,13 @@ class WikitextContent extends TextContent {
                $oldtext = $this->getNativeData();
                $text = $with->getNativeData();
 
-               if ( $section === '' ) {
+               if ( strval( $sectionId ) === '' ) {
                        wfProfileOut( __METHOD__ );
 
                        return $with; # XXX: copy first?
                }
 
-               if ( $section == 'new' ) {
+               if ( $sectionId === 'new' ) {
                        # Inserting a new section
                        $subject = $sectionTitle ? wfMessage( 'newsectionheaderdefaultlevel' )
                                        ->rawParams( $sectionTitle )->inContentLanguage()->text() . "\n\n" : '';
@@ -101,7 +101,7 @@ class WikitextContent extends TextContent {
                        # Replacing an existing section; roll out the big guns
                        global $wgParser;
 
-                       $text = $wgParser->replaceSection( $oldtext, $section, $text );
+                       $text = $wgParser->replaceSection( $oldtext, $sectionId, $text );
                }
 
                $newContent = new WikitextContent( $text );
index 4a3c2cb..d0c0bdc 100644 (file)
@@ -134,18 +134,6 @@ abstract class ContextSource implements IContextSource {
                return $this->getContext()->getUser();
        }
 
-       /**
-        * Get the Language object
-        *
-        * @deprecated since 1.19 Use getLanguage instead
-        * @return Language
-        */
-       public function getLang() {
-               wfDeprecated( __METHOD__, '1.19' );
-
-               return $this->getLanguage();
-       }
-
        /**
         * Get the Language object
         *
index 4a7b466..f550e9e 100644 (file)
@@ -237,17 +237,6 @@ class DerivativeContext extends ContextSource {
                }
        }
 
-       /**
-        * Set the Language object
-        *
-        * @deprecated since 1.19 Use setLanguage instead
-        * @param Language|string $l Language instance or language code
-        */
-       public function setLang( $l ) {
-               wfDeprecated( __METHOD__, '1.19' );
-               $this->setLanguage( $l );
-       }
-
        /**
         * Set the Language object
         *
@@ -267,15 +256,6 @@ class DerivativeContext extends ContextSource {
                }
        }
 
-       /**
-        * @deprecated since 1.19 Use getLanguage instead
-        * @return Language
-        */
-       public function getLang() {
-               wfDeprecated( __METHOD__, '1.19' );
-               $this->getLanguage();
-       }
-
        /**
         * Get the Language object
         *
index 5534ee3..f718103 100644 (file)
@@ -76,14 +76,6 @@ interface IContextSource {
         */
        public function getUser();
 
-       /**
-        * Get the Language object
-        *
-        * @deprecated since 1.19 Use getLanguage instead
-        * @return Language
-        */
-       public function getLang();
-
        /**
         * Get the Language object
         *
index c87bfc0..93602a0 100644 (file)
@@ -268,17 +268,6 @@ class RequestContext implements IContextSource {
                return $code;
        }
 
-       /**
-        * Set the Language object
-        *
-        * @deprecated since 1.19 Use setLanguage instead
-        * @param Language|string $l Language instance or language code
-        */
-       public function setLang( $l ) {
-               wfDeprecated( __METHOD__, '1.19' );
-               $this->setLanguage( $l );
-       }
-
        /**
         * Set the Language object
         *
@@ -298,16 +287,6 @@ class RequestContext implements IContextSource {
                }
        }
 
-       /**
-        * @deprecated since 1.19 Use getLanguage instead
-        * @return Language
-        */
-       public function getLang() {
-               wfDeprecated( __METHOD__, '1.19' );
-
-               return $this->getLanguage();
-       }
-
        /**
         * Get the Language object.
         * Initialization of user or request objects can depend on this.
@@ -329,22 +308,28 @@ class RequestContext implements IContextSource {
 
                        global $wgLanguageCode, $wgContLang;
 
-                       $request = $this->getRequest();
-                       $user = $this->getUser();
+                       try {
+                               $request = $this->getRequest();
+                               $user = $this->getUser();
 
-                       $code = $request->getVal( 'uselang', $user->getOption( 'language' ) );
-                       $code = self::sanitizeLangCode( $code );
+                               $code = $request->getVal( 'uselang', $user->getOption( 'language' ) );
+                               $code = self::sanitizeLangCode( $code );
 
-                       wfRunHooks( 'UserGetLanguageObject', array( $user, &$code, $this ) );
+                               wfRunHooks( 'UserGetLanguageObject', array( $user, &$code, $this ) );
 
-                       if ( $code === $wgLanguageCode ) {
-                               $this->lang = $wgContLang;
-                       } else {
-                               $obj = Language::factory( $code );
-                               $this->lang = $obj;
-                       }
+                               if ( $code === $wgLanguageCode ) {
+                                       $this->lang = $wgContLang;
+                               } else {
+                                       $obj = Language::factory( $code );
+                                       $this->lang = $obj;
+                               }
 
-                       unset( $this->recursion );
+                               unset( $this->recursion );
+                       }
+                       catch ( Exception $ex ) {
+                               unset( $this->recursion );
+                               throw $ex;
+                       }
                }
 
                return $this->lang;
index 536d721..3017ea8 100644 (file)
@@ -71,7 +71,13 @@ class CloneDatabase {
         * Clone the table structure
         */
        public function cloneTableStructure() {
+               global $wgSharedTables, $wgSharedDB;
                foreach ( $this->tablesToClone as $tbl ) {
+                       if ( $wgSharedDB && in_array( $tbl, $wgSharedTables, true ) ) {
+                               // Shared tables don't work properly when cloning due to
+                               // how prefixes are handled (bug 65654)
+                               throw new MWException( "Cannot clone shared table $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.
index 16e1ef2..7bbcc2f 100644 (file)
@@ -2539,11 +2539,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * @return string
         */
        protected function escapeLikeInternal( $s ) {
-               $s = str_replace( '\\', '\\\\', $s );
-               $s = $this->strencode( $s );
-               $s = str_replace( array( '%', '_' ), array( '\%', '\_' ), $s );
-
-               return $s;
+               return addcslashes( $s, '\%_' );
        }
 
        /**
@@ -2579,7 +2575,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                        }
                }
 
-               return " LIKE '" . $s . "' ";
+               return " LIKE {$this->addQuotes( $s )} ";
        }
 
        /**
index 8c9b06c..b8d5d79 100644 (file)
@@ -87,17 +87,12 @@ class DatabaseMysqli extends DatabaseMysqlBase {
                } else {
                        $mysqli->options( MYSQLI_SET_CHARSET_NAME, 'binary' );
                }
+               $mysqli->options( MYSQLI_OPT_CONNECT_TIMEOUT, 3 );
 
-               $numAttempts = 2;
-               for ( $i = 0; $i < $numAttempts; $i++ ) {
-                       if ( $i > 1 ) {
-                               usleep( 1000 );
-                       }
-                       if ( $mysqli->real_connect( $realServer, $this->mUser,
-                               $this->mPassword, $this->mDBname, $port, null, $connFlags )
-                       ) {
-                               return $mysqli;
-                       }
+               if ( $mysqli->real_connect( $realServer, $this->mUser,
+                       $this->mPassword, $this->mDBname, $port, null, $connFlags )
+               ) {
+                       return $mysqli;
                }
 
                return false;
index 396de4f..7686010 100644 (file)
@@ -1491,6 +1491,10 @@ class DatabaseOracle extends DatabaseBase {
                                        throw new DBUnexpectedError( $this, "Cannot create LOB descriptor: " . $e['message'] );
                                }
 
+                               if ( is_object( $val ) ) {
+                                       $val = $val->getData();
+                               }
+
                                if ( $col_type == 'BLOB' ) {
                                        $lob[$col]->writeTemporary( $val );
                                        oci_bind_by_name( $stmt, ":$col", $lob[$col], -1, SQLT_BLOB );
index 131b758..3d7267a 100644 (file)
@@ -521,7 +521,6 @@ class DatabasePostgres extends DatabaseBase {
        }
 
        function reportQueryError( $error, $errno, $sql, $fname, $tempIgnore = false ) {
-               /* Transaction stays in the ERROR state until rolledback */
                if ( $tempIgnore ) {
                        /* Check for constraint violation */
                        if ( $errno === '23505' ) {
@@ -530,8 +529,10 @@ class DatabasePostgres extends DatabaseBase {
                                return;
                        }
                }
-               /* Don't ignore serious errors */
-               $this->rollback( __METHOD__ );
+               /* Transaction stays in the ERROR state until rolledback */
+               if ( $this->mTrxLevel ) {
+                       $this->rollback( __METHOD__ );
+               };
                parent::reportQueryError( $error, $errno, $sql, $fname, false );
        }
 
@@ -1565,7 +1566,8 @@ SQL;
                //}
 
                if ( isset( $options['FOR UPDATE'] ) ) {
-                       $postLimitTail .= ' FOR UPDATE OF ' . implode( ', ', $options['FOR UPDATE'] );
+                       $postLimitTail .= ' FOR UPDATE OF ' .
+                               implode( ', ', array_map( array( &$this, 'tableName' ), $options['FOR UPDATE'] ) );
                } elseif ( isset( $noKeyOptions['FOR UPDATE'] ) ) {
                        $postLimitTail .= ' FOR UPDATE';
                }
index bea195b..168d846 100644 (file)
@@ -236,7 +236,7 @@ class LBFactorySimple extends LBFactory {
         * @return LoadBalancer
         */
        function newMainLB( $wiki = false ) {
-               global $wgDBservers, $wgMasterWaitTimeout;
+               global $wgDBservers;
                if ( $wgDBservers ) {
                        $servers = $wgDBservers;
                } else {
@@ -267,7 +267,6 @@ class LBFactorySimple extends LBFactory {
 
                return new LoadBalancer( array(
                        'servers' => $servers,
-                       'masterWaitTimeout' => $wgMasterWaitTimeout
                ) );
        }
 
index 3c1885f..bda3dd6 100644 (file)
@@ -286,11 +286,9 @@ class LBFactoryMulti extends LBFactory {
         * @return LoadBalancer
         */
        function newLoadBalancer( $template, $loads, $groupLoads ) {
-               global $wgMasterWaitTimeout;
                $servers = $this->makeServerArray( $template, $loads, $groupLoads );
                $lb = new LoadBalancer( array(
                        'servers' => $servers,
-                       'masterWaitTimeout' => $wgMasterWaitTimeout
                ) );
 
                return $lb;
index 38c3d2d..ee35c13 100644 (file)
@@ -45,7 +45,6 @@ class LoadBalancer {
        /**
         * @param array $params with keys:
         *   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
         */
@@ -54,12 +53,7 @@ class LoadBalancer {
                        throw new MWException( __CLASS__ . ': missing servers parameter' );
                }
                $this->mServers = $params['servers'];
-
-               if ( isset( $params['waitTimeout'] ) ) {
-                       $this->mWaitTimeout = $params['waitTimeout'];
-               } else {
-                       $this->mWaitTimeout = 10;
-               }
+               $this->mWaitTimeout = 10;
 
                $this->mReadIndex = -1;
                $this->mWriteIndex = -1;
index 9ae9034..20f348a 100644 (file)
@@ -81,10 +81,10 @@ class SearchUpdate implements DeferrableUpdate {
                wfProfileIn( __METHOD__ );
 
                $page = WikiPage::newFromId( $this->id, WikiPage::READ_LATEST );
-               $indexTitle = $this->indexTitle();
 
                foreach ( SearchEngine::getSearchTypes() as $type ) {
                        $search = SearchEngine::create( $type );
+                       $indexTitle = $this->indexTitle( $search );
                        if ( !$search->supports( 'search-update' ) ) {
                                continue;
                        }
@@ -181,13 +181,13 @@ class SearchUpdate implements DeferrableUpdate {
         *
         * @return string A stripped-down title string ready for the search index
         */
-       private function indexTitle() {
+       private function indexTitle( SearchEngine $search ) {
                global $wgContLang;
 
                $ns = $this->title->getNamespace();
                $title = $this->title->getText();
 
-               $lc = SearchEngine::legalSearchChars() . '&#;';
+               $lc = $search->legalSearchChars() . '&#;';
                $t = $wgContLang->normalizeForSearch( $title );
                $t = preg_replace( "/[^{$lc}]+/", ' ', $t );
                $t = $wgContLang->lc( $t );
index dd3f351..3aad389 100644 (file)
@@ -554,7 +554,7 @@ class DifferenceEngine extends ContextSource {
 
                        // 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
+                               // This needs to be synchronised with Article::showCssOrJsPage(), which sucks
                                // Give hooks a chance to customise the output
                                // @todo standardize this crap into one function
                                if ( ContentHandler::runLegacyHooks( 'ShowRawCssJs', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
@@ -562,8 +562,9 @@ class DifferenceEngine extends ContextSource {
                                        // use the content object's own rendering
                                        $cnt = $this->mNewRev->getContent();
                                        $po = $cnt ? $cnt->getParserOutput( $this->mNewRev->getTitle(), $this->mNewRev->getId() ) : null;
-                                       $txt = $po ? $po->getText() : '';
-                                       $out->addHTML( $txt );
+                                       if ( $po ) {
+                                               $out->addParserOutputContent( $po );
+                                       }
                                }
                        } elseif ( !wfRunHooks( 'ArticleContentViewCustom', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
                                // Handled by extension
index 9586657..3f81a94 100644 (file)
@@ -213,7 +213,13 @@ class FSFileBackend extends FileBackendStore {
                                wfEscapeShellArg( $this->cleanPathSlashes( $tempFile->getPath() ) ),
                                wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
                        ) );
-                       $status->value = new FSFileOpHandle( $this, $params, 'Create', $cmd, $dest );
+                       $handler = function( $errors, Status $status, array $params, $cmd ) {
+                               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
+                                       $status->fatal( 'backend-fail-create', $params['dst'] );
+                                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
+                               }
+                       };
+                       $status->value = new FSFileOpHandle( $this, $params, $handler, $cmd, $dest );
                        $tempFile->bind( $status->value );
                } else { // immediate write
                        $this->trapWarnings();
@@ -230,16 +236,6 @@ class FSFileBackend extends FileBackendStore {
                return $status;
        }
 
-       /**
-        * @see FSFileBackend::doExecuteOpHandlesInternal()
-        */
-       protected function getResponseCreate( $errors, Status $status, array $params, $cmd ) {
-               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
-                       $status->fatal( 'backend-fail-create', $params['dst'] );
-                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
-               }
-       }
-
        protected function doStoreInternal( array $params ) {
                $status = Status::newGood();
 
@@ -256,7 +252,13 @@ class FSFileBackend extends FileBackendStore {
                                wfEscapeShellArg( $this->cleanPathSlashes( $params['src'] ) ),
                                wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
                        ) );
-                       $status->value = new FSFileOpHandle( $this, $params, 'Store', $cmd, $dest );
+                       $handler = function( $errors, Status $status, array $params, $cmd ) {
+                               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
+                                       $status->fatal( 'backend-fail-store', $params['src'], $params['dst'] );
+                                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
+                               }
+                       };
+                       $status->value = new FSFileOpHandle( $this, $params, $handler, $cmd, $dest );
                } else { // immediate write
                        $this->trapWarnings();
                        $ok = copy( $params['src'], $dest );
@@ -277,16 +279,6 @@ class FSFileBackend extends FileBackendStore {
                return $status;
        }
 
-       /**
-        * @see FSFileBackend::doExecuteOpHandlesInternal()
-        */
-       protected function getResponseStore( $errors, Status $status, array $params, $cmd ) {
-               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
-                       $status->fatal( 'backend-fail-store', $params['src'], $params['dst'] );
-                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
-               }
-       }
-
        protected function doCopyInternal( array $params ) {
                $status = Status::newGood();
 
@@ -318,7 +310,13 @@ class FSFileBackend extends FileBackendStore {
                                wfEscapeShellArg( $this->cleanPathSlashes( $source ) ),
                                wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
                        ) );
-                       $status->value = new FSFileOpHandle( $this, $params, 'Copy', $cmd, $dest );
+                       $handler = function( $errors, Status $status, array $params, $cmd ) {
+                               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
+                                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+                                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
+                               }
+                       };
+                       $status->value = new FSFileOpHandle( $this, $params, $handler, $cmd, $dest );
                } else { // immediate write
                        $this->trapWarnings();
                        $ok = ( $source === $dest ) ? true : copy( $source, $dest );
@@ -341,16 +339,6 @@ class FSFileBackend extends FileBackendStore {
                return $status;
        }
 
-       /**
-        * @see FSFileBackend::doExecuteOpHandlesInternal()
-        */
-       protected function getResponseCopy( $errors, Status $status, array $params, $cmd ) {
-               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
-                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
-                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
-               }
-       }
-
        protected function doMoveInternal( array $params ) {
                $status = Status::newGood();
 
@@ -382,7 +370,13 @@ class FSFileBackend extends FileBackendStore {
                                wfEscapeShellArg( $this->cleanPathSlashes( $source ) ),
                                wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
                        ) );
-                       $status->value = new FSFileOpHandle( $this, $params, 'Move', $cmd );
+                       $handler = function( $errors, Status $status, array $params, $cmd ) {
+                               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
+                                       $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
+                                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
+                               }
+                       };
+                       $status->value = new FSFileOpHandle( $this, $params, $handler, $cmd );
                } else { // immediate write
                        $this->trapWarnings();
                        $ok = ( $source === $dest ) ? true : rename( $source, $dest );
@@ -398,16 +392,6 @@ class FSFileBackend extends FileBackendStore {
                return $status;
        }
 
-       /**
-        * @see FSFileBackend::doExecuteOpHandlesInternal()
-        */
-       protected function getResponseMove( $errors, Status $status, array $params, $cmd ) {
-               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
-                       $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
-                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
-               }
-       }
-
        protected function doDeleteInternal( array $params ) {
                $status = Status::newGood();
 
@@ -431,7 +415,13 @@ class FSFileBackend extends FileBackendStore {
                                wfIsWindows() ? 'DEL' : 'unlink',
                                wfEscapeShellArg( $this->cleanPathSlashes( $source ) )
                        ) );
-                       $status->value = new FSFileOpHandle( $this, $params, 'Copy', $cmd );
+                       $handler = function( $errors, Status $status, array $params, $cmd ) {
+                               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
+                                       $status->fatal( 'backend-fail-delete', $params['src'] );
+                                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
+                               }
+                       };
+                       $status->value = new FSFileOpHandle( $this, $params, $handler, $cmd );
                } else { // immediate write
                        $this->trapWarnings();
                        $ok = unlink( $source );
@@ -446,16 +436,6 @@ class FSFileBackend extends FileBackendStore {
                return $status;
        }
 
-       /**
-        * @see FSFileBackend::doExecuteOpHandlesInternal()
-        */
-       protected function getResponseDelete( $errors, Status $status, array $params, $cmd ) {
-               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
-                       $status->fatal( 'backend-fail-delete', $params['src'] );
-                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
-               }
-       }
-
        /**
         * @param string $fullCont
         * @param string $dirRel
@@ -716,8 +696,8 @@ class FSFileBackend extends FileBackendStore {
 
                foreach ( $fileOpHandles as $index => $fileOpHandle ) {
                        $status = Status::newGood();
-                       $function = 'getResponse' . $fileOpHandle->call;
-                       $this->$function( $errs[$index], $status, $fileOpHandle->params, $fileOpHandle->cmd );
+                       $function = $fileOpHandle->call;
+                       $function( $errs[$index], $status, $fileOpHandle->params, $fileOpHandle->cmd );
                        $statuses[$index] = $status;
                        if ( $status->isOK() && $fileOpHandle->chmodPath ) {
                                $this->chmod( $fileOpHandle->chmodPath );
@@ -812,7 +792,7 @@ class FSFileOpHandle extends FileBackendStoreOpHandle {
        /**
         * @param FSFileBackend $backend
         * @param array $params
-        * @param string $call
+        * @param callback $call
         * @param string $cmd
         * @param int|null $chmodPath
         */
index 340c315..ee9a49d 100644 (file)
@@ -1147,6 +1147,7 @@ abstract class FileBackendStore extends FileBackend {
                $this->clearCache();
 
                $supportedOps = array( 'create', 'store', 'copy', 'move', 'delete', 'describe', 'null' );
+               // Parallel ops may be disabled in config due to dependencies (e.g. needing popen())
                $async = ( $this->parallelize === 'implicit' && count( $ops ) > 1 );
                $maxConcurrency = $this->concurrency; // throttle
 
index 56d7000..b0d83e0 100644 (file)
@@ -167,7 +167,11 @@ class FileOpBatch {
                        // or the backend does not support async ops and did it synchronously.
                        foreach ( $performOpsBatch as $i => $fileOp ) {
                                if ( !isset( $status->success[$i] ) ) { // didn't already fail in precheck()
-                                       $subStatus = $fileOp->attemptAsync();
+                                       // Parallel ops may be disabled in config due to missing dependencies,
+                                       // (e.g. needing popen()). When they are, $performOpsBatch has size 1.
+                                       $subStatus = ( count( $performOpsBatch ) > 1 )
+                                               ? $fileOp->attemptAsync()
+                                               : $fileOp->attempt();
                                        if ( $subStatus->value instanceof FileBackendStoreOpHandle ) {
                                                $opHandles[$i] = $subStatus->value; // deferred
                                        } else {
index 9249a09..9ef23f8 100644 (file)
@@ -1066,10 +1066,11 @@ class SwiftFileBackend extends FileBackendStore {
                        list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $op['response'];
                        fclose( $op['stream'] ); // close open handle
                        if ( $rcode >= 200 && $rcode <= 299 ) {
+                               $size = $tmpFiles[$path] ? $tmpFiles[$path]->getSize() : 0;
                                // Double check that the disk is not full/broken
-                               if ( $tmpFiles[$path]->getSize() != $rhdrs['content-length'] ) {
+                               if ( $size != $rhdrs['content-length'] ) {
                                        $tmpFiles[$path] = null;
-                                       $rerr = "Got {$tmpFiles[$path]->getSize()}/{$rhdrs['content-length']} bytes";
+                                       $rerr = "Got {$size}/{$rhdrs['content-length']} bytes";
                                        $this->onError( null, __METHOD__,
                                                array( 'src' => $path ) + $ep, $rerr, $rcode, $rdesc );
                                }
index a45cd72..1103e38 100644 (file)
@@ -2018,4 +2018,13 @@ abstract class File {
                        throw new MWException( "A Title object is not set for this File.\n" );
                }
        }
+
+       /**
+        * True if creating thumbnails from the file is large or otherwise resource-intensive.
+        * @return bool
+        */
+       public function isExpensiveToThumbnail() {
+               $handler = $this->getHandler();
+               return $handler ? $handler->isExpensiveToThumbnail( $this ) : false;
+       }
 }
index 01f3ab7..296de96 100644 (file)
@@ -304,15 +304,6 @@ class HTMLForm extends ContextSource {
                return $this->displayFormat === 'vform';
        }
 
-       /**
-        * Add the HTMLForm-specific JavaScript, if it hasn't been
-        * done already.
-        * @deprecated since 1.18 load modules with ResourceLoader instead
-        */
-       static function addJS() {
-               wfDeprecated( __METHOD__, '1.18' );
-       }
-
        /**
         * Get the HTMLFormField subclass for this descriptor.
         *
@@ -583,7 +574,7 @@ class HTMLForm extends ContextSource {
         * Add header text, inside the form.
         *
         * @param string $msg Complete text of message to display
-        * @param string $section The section to add the header to
+        * @param string|null $section The section to add the header to
         *
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
@@ -605,7 +596,7 @@ class HTMLForm extends ContextSource {
         * @since 1.19
         *
         * @param string $msg Complete text of message to display
-        * @param string $section The section to add the header to
+        * @param string|null $section The section to add the header to
         *
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
@@ -623,7 +614,7 @@ class HTMLForm extends ContextSource {
         * Add footer text, inside the form.
         *
         * @param string $msg complete text of message to display
-        * @param string $section The section to add the footer text to
+        * @param string|null $section The section to add the footer text to
         *
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
@@ -645,7 +636,7 @@ class HTMLForm extends ContextSource {
         * @since 1.19
         *
         * @param string $msg Complete text of message to display
-        * @param string $section The section to add the footer text to
+        * @param string|null $section The section to add the footer text to
         *
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
index 17c5ab2..88478f4 100644 (file)
@@ -351,10 +351,23 @@ abstract class Installer {
        public function __construct() {
                global $wgMessagesDirs, $wgUser;
 
-               // Disable the i18n cache and LoadBalancer
+               // Disable the i18n cache
                Language::getLocalisationCache()->disableBackend();
+               // Disable LoadBalancer and wfGetDB etc.
                LBFactory::disableBackend();
 
+               // Disable object cache (otherwise CACHE_ANYTHING will try CACHE_DB and
+               // SqlBagOStuff will then throw since we just disabled wfGetDB)
+               $GLOBALS['wgMemc'] = new EmptyBagOStuff;
+               ObjectCache::clear();
+               $emptyCache = array( 'class' => 'EmptyBagOStuff' );
+               $GLOBALS['wgObjectCaches'] = array(
+                       CACHE_NONE => $emptyCache,
+                       CACHE_DB => $emptyCache,
+                       CACHE_ANYTHING => $emptyCache,
+                       CACHE_MEMCACHED => $emptyCache,
+               );
+
                // Load the installer's i18n.
                $wgMessagesDirs['MediawikiInstaller'] = __DIR__ . '/i18n';
 
@@ -389,7 +402,7 @@ abstract class Installer {
                $this->compiledDBs = $compiledDBs;
 
                $this->parserTitle = Title::newFromText( 'Installer' );
-               $this->parserOptions = new ParserOptions; // language will  be wrong :(
+               $this->parserOptions = new ParserOptions; // language will be wrong :(
                $this->parserOptions->setEditSection( false );
        }
 
index 5e89ca4..3c8a5b1 100644 (file)
@@ -221,9 +221,12 @@ class LocalSettingsGenerator {
                                                wfBoolToStr( $perm ) . ";\n";
                                }
                        }
-                       if ( $this->groupPermissions['*']['edit'] === false
-                               && $this->groupPermissions['*']['createaccount'] === false
-                               && $this->groupPermissions['*']['read'] !== false
+                       if ( ( isset( $this->groupPermissions['*']['edit'] ) &&
+                                       $this->groupPermissions['*']['edit'] === false )
+                               && ( isset( $this->groupPermissions['*']['createaccount'] ) &&
+                                       $this->groupPermissions['*']['createaccount'] === false )
+                               && ( isset( $this->groupPermissions['*']['read'] ) &&
+                                       $this->groupPermissions['*']['read'] !== false )
                        ) {
                                $noFollow = "\n# Set \$wgNoFollowLinks to true if you open up your wiki to editing by\n"
                                        . "# the general public and wish to apply nofollow to external links as a\n"
index 8b77cb1..2f77021 100644 (file)
@@ -254,6 +254,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        // 1.24
                        array( 'addField', 'page_props', 'pp_sortkey', 'patch-pp_sortkey.sql' ),
                        array( 'dropField', 'recentchanges', 'rc_cur_time', 'patch-drop-rc_cur_time.sql' ),
+                       array( 'addIndex', 'watchlist', 'wl_user_notificationtimestamp', 'patch-watchlist-user-notificationtimestamp-index.sql' ),
                );
        }
 
@@ -647,25 +648,23 @@ class MysqlUpdater extends DatabaseUpdater {
                );
 
                global $wgContLang;
-               foreach ( MWNamespace::getCanonicalNamespaces() as $ns => $name ) {
+               foreach ( $wgContLang->getNamespaces() as $ns => $name ) {
                        if ( $ns == 0 ) {
                                continue;
                        }
 
                        $this->output( "Cleaning up broken links for namespace $ns... " );
-
-                       $pagelinks = $this->db->tableName( 'pagelinks' );
-                       $name = $wgContLang->getNsText( $ns );
-                       $prefix = $this->db->strencode( $name );
-                       $likeprefix = str_replace( '_', '\\_', $prefix );
-
-                       $sql = "UPDATE $pagelinks
-                                          SET pl_namespace=$ns,
-                                                  pl_title=TRIM(LEADING '$prefix:' FROM pl_title)
-                                        WHERE pl_namespace=0
-                                          AND pl_title LIKE '$likeprefix:%'";
-
-                       $this->db->query( $sql, __METHOD__ );
+                       $this->db->update( 'pagelinks',
+                               array(
+                                       'pl_namespace' => $ns,
+                                       "pl_title = TRIM(LEADING {$this->db->addQuotes( "$name:" )} FROM pl_title)",
+                               ),
+                               array(
+                                       'pl_namespace' => 0,
+                                       'pl_title' . $this->db->buildLike( "$name:", $this->db->anyString() ),
+                               ),
+                               __METHOD__
+                       );
                        $this->output( "done.\n" );
                }
        }
index 8c81080..e8de7de 100644 (file)
@@ -250,6 +250,7 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'addPgIndex', 'recentchanges', 'rc_timestamp_bot', '(rc_timestamp) WHERE rc_bot = 0' ),
                        array( 'addPgIndex', 'templatelinks', 'templatelinks_from', '(tl_from)' ),
                        array( 'addPgIndex', 'watchlist', 'wl_user', '(wl_user)' ),
+                       array( 'addPgIndex', 'watchlist', 'wl_user_notificationtimestamp', '(wl_user, wl_notificationtimestamp)' ),
                        array( 'addPgIndex', 'logging', 'logging_user_type_time',
                                '(log_user, log_type, log_timestamp)' ),
                        array( 'addPgIndex', 'logging', 'logging_page_id_time', '(log_page,log_timestamp)' ),
index 7813115..111d654 100644 (file)
@@ -132,6 +132,7 @@ class SqliteUpdater extends DatabaseUpdater {
                        // 1.24
                        array( 'addField', 'page_props', 'pp_sortkey', 'patch-pp_sortkey.sql' ),
                        array( 'dropField', 'recentchanges', 'rc_cur_time', 'patch-drop-rc_cur_time.sql' ),
+                       array( 'addIndex', 'watchlist', 'wl_user_notificationtimestamp', 'patch-watchlist-user-notificationtimestamp-index.sql' ),
                );
        }
 
index 66e8bd9..46348f9 100644 (file)
@@ -180,9 +180,9 @@ class WebInstaller extends Installer {
                        return $this->session;
                }
 
-               $cssDir = $this->request->getVal( 'css' );
-               if ( $cssDir ) {
-                       $this->outputCss( $cssDir );
+               $isCSS = $this->request->getVal( 'css' );
+               if ( $isCSS ) {
+                       $this->outputCss();
                        return $this->session;
                }
 
@@ -1154,12 +1154,11 @@ class WebInstaller extends Installer {
        }
 
        /**
-        * @param string $dir CSS direction ( rtl or ltr )
+        * Output stylesheet for web installer pages
         */
-       public function outputCss( $dir ) {
-               $dir = ( $dir == 'rtl' ? 'rtl' : 'ltr' );
+       public function outputCss() {
                $this->request->response()->header( 'Content-type: text/css' );
-               echo $this->output->getCSS( $dir );
+               echo $this->output->getCSS();
        }
 
        /**
index c3fd51d..97f4830 100644 (file)
@@ -119,101 +119,63 @@ class WebInstallerOutput {
        }
 
        /**
-        * Get the raw vector CSS, flipping if needed
-        *
-        * @todo Possibly get rid of this function and use ResourceLoader in the manner it was
-        *   designed to be used in, rather than just grabbing a list of filenames from it,
-        *   and not properly handling such details as media types in module definitions.
-        *
-        * @param string $dir 'ltr' or 'rtl'
+        * Get the stylesheet of the MediaWiki skin.
         *
         * @return string
         */
-       public function getCSS( $dir ) {
-               // All CSS files these modules reference will be concatenated in sequence
-               // and loaded as one file.
+       public function getCSS() {
+               // Horrible, horrible hack: the installer is currently hardcoded to use the Vector skin, so load
+               // it here. Include instead of require, as this will work without it, it will just look bad.
+               global $wgResourceModules;
+               global $wgStyleDirectory;
+               include_once "$wgStyleDirectory/Vector/Vector.php";
+
                $moduleNames = array(
+                       // See SkinTemplate::setupSkinUserCss
                        'mediawiki.legacy.shared',
+                       // See Vector::setupSkinUserCss
                        'mediawiki.skinning.interface',
                        'skins.vector.styles',
+
                        'mediawiki.legacy.config',
                );
 
-               $prepend = '';
                $css = '';
 
                $resourceLoader = new ResourceLoader();
+               $rlContext = new ResourceLoaderContext( $resourceLoader, new FauxRequest( array(
+                               'debug' => 'true',
+                               'lang' => $this->getLanguageCode(),
+                               'only' => 'styles',
+                               'skin' => 'vector',
+               ) ) );
                foreach ( $moduleNames as $moduleName ) {
                        /** @var ResourceLoaderFileModule $module */
                        $module = $resourceLoader->getModule( $moduleName );
-                       $cssFileNames = $module->getAllStyleFiles();
-
-                       wfSuppressWarnings();
-                       foreach ( $cssFileNames as $cssFileName ) {
-                               if ( !file_exists( $cssFileName ) ) {
-                                       $prepend .= ResourceLoader::makeComment( "Unable to find $cssFileName." );
-                                       continue;
-                               }
-
-                               if ( !is_readable( $cssFileName ) ) {
-                                       $prepend .= ResourceLoader::makeComment( "Unable to read $cssFileName. " .
-                                               "Please check file permissions." );
-                                       continue;
-                               }
-
-                               try {
-
-                                       if ( preg_match( '/\.less$/', $cssFileName ) ) {
-                                               // Run the LESS compiler for *.less files (bug 55589)
-                                               $compiler = ResourceLoader::getLessCompiler();
-                                               $cssFileContents = $compiler->compileFile( $cssFileName );
-                                       } else {
-                                               // Regular CSS file
-                                               $cssFileContents = file_get_contents( $cssFileName );
-                                       }
-
-                                       if ( $cssFileContents ) {
-                                               // Rewrite URLs, though don't bother embedding images. While static image
-                                               // files may be cached, CSS returned by this function is definitely not.
-                                               $cssDirName = dirname( $cssFileName );
-                                               $css .= CSSMin::remap(
-                                                       /* source */ $cssFileContents,
-                                                       /* local */ $cssDirName,
-                                                       /* remote */ '..' . str_replace(
-                                                               array( $GLOBALS['IP'], DIRECTORY_SEPARATOR ),
-                                                               array( '', '/' ),
-                                                               $cssDirName
-                                                       ),
-                                                       /* embedData */ false
-                                               );
-                                       } else {
-                                               $prepend .= ResourceLoader::makeComment( "Unable to read $cssFileName." );
-                                       }
-                               } catch ( Exception $e ) {
-                                       $prepend .= ResourceLoader::formatException( $e );
-                               }
-
-                               $css .= "\n";
+                       // One of the modules will be missing if Vector is unavailable
+                       if ( !$module ) {
+                               continue;
                        }
-                       wfRestoreWarnings();
-               }
 
-               $css = $prepend . $css;
+                       // Based on: ResourceLoaderFileModule::getStyles (without the DB query)
+                       $styles = ResourceLoader::makeCombinedStyles( $module->readStyleFiles(
+                               $module->getStyleFiles( $rlContext ),
+                               $module->getFlip( $rlContext )
+                       ) );
 
-               if ( $dir == 'rtl' ) {
-                       $css = CSSJanus::transform( $css, true );
+                       $css .= implode( "\n", $styles );
                }
 
                return $css;
        }
 
        /**
-        * "<link>" to index.php?css=foobar for the "<head>"
+        * "<link>" to index.php?css=1 for the "<head>"
         *
         * @return string
         */
        private function getCssUrl() {
-               return Html::linkedStyle( $_SERVER['PHP_SELF'] . '?css=' . $this->getDir() );
+               return Html::linkedStyle( $_SERVER['PHP_SELF'] . '?css=1' );
        }
 
        public function useShortHeader( $use = true ) {
index ce8f95c..1192e2c 100644 (file)
@@ -11,6 +11,7 @@
        "config-title": "মিডিয়াউইকি $1 ইন্সটলেশন",
        "config-information": "তথ্য",
        "config-localsettings-key": "হালনাগাদ কি",
+       "config-localsettings-badkey": "আপনি যেই চাবিটি দিয়েছেন তা সঠিক নয়।",
        "config-session-error": "সেশন শুরুতে ত্রুটি: $1",
        "config-your-language": "আপনার ভাষা:",
        "config-your-language-help": "ইন্সটল করা সময় ব্যবহারের জন্য ভাষা নির্বাচন করুন।",
@@ -32,6 +33,7 @@
        "config-page-copying": "অনুলেপন",
        "config-page-upgradedoc": "হালনাগাদকরণ",
        "config-page-existingwiki": "ইতিমধ্যেই থাকা উইকি",
+       "config-help-restart": "আপনি কী সকল সংরক্ষিত উপাত্ত পরিষ্কার করতে যা আপনি প্রবেস করিয়েছিলেন এবং ইন্সটালেসন ব্যবস্থা পুনরায় আরম্ভ করতে চান?",
        "config-restart": "হ্যাঁ, পুনরায় চালু করুন",
        "config-env-php": "পিএইচপি $1 ইন্সটল করা হয়েছে।",
        "config-apc": "[http://www.php.net/apc এপিসি] ইনস্টল হয়েছে",
@@ -45,6 +47,7 @@
        "config-db-charset": "ডেটাবেজের অক্ষর সেট",
        "config-db-port": "ডেটাবেজ পোর্ট:",
        "config-db-schema": "মিডিয়াউইকির স্কিমা",
+       "config-pg-test-error": "উপাত্তশালা $1-এর সাথে সংযোগ দেয়া সম্ভব হয়নি। কারন:$2",
        "config-sqlite-dir": "এসকিউলাইট ডেটা ডিরেক্টরি:",
        "config-oracle-def-ts": "পূর্বনির্ধারিত টেবিলস্পেস",
        "config-oracle-temp-ts": "সাময়কি টেবিলস্পেস:",
@@ -56,6 +59,7 @@
        "config-missing-db-name": "আপনাকে অবশ্যই \"ডেটাবেজ নাম\"-এর জন্য একটি মান প্রবেশ করাতে হবে",
        "config-missing-db-host": "আপনাকে অবশ্যই \"ডেটাবেজ হোস্ট\"-এর জন্য একটি মান প্রবেশ করাতে হবে",
        "config-missing-db-server-oracle": "আপনাকে অবশ্যই \"ডেটাবেজ টিএনএস\"-এর জন্য একটি মান প্রবেশ করাতে হবে",
+       "config-connection-error": "$1।\n\n\nদয়া করে প্রস্তাবকারী, ব্যবহারকারী নাম ও শব্দচাবি দেখুন এবং পুনরায় চেষ্টা করুন।",
        "config-mysql-engine": "সংরক্ষণ ইঞ্জিন:",
        "config-mysql-innodb": "ইনোডিবি",
        "config-mysql-myisam": "মাইআইএসএএম",
index de69e20..ca6b37d 100644 (file)
@@ -92,6 +92,7 @@
        "config-db-username": "Anv implijer an diaz roadennoù :",
        "config-db-password": "Ger-tremen an diaz roadennoù :",
        "config-db-password-empty": "Lakait ur ger-tremen evit kont nevez an diaz roadennoù : $1.\nHa pa vefe posupl da grouiñ kontoù hep ger-tremen, n'eo ket erbedet evit abegoù surentez.",
+       "config-db-username-empty": "Ret eo deoc'h ebarzhiñ un talvoud evit  \"{{int:config-db-username}}\".",
        "config-db-install-username": "Ebarzhit an anv implijer a vo implijet da gevreañ ouzh an diaz roadennoù e-pad an argerzh staliañ.\nN'eo ket anv implijer ar gont MediaWiki, an anv implijer evit ho tiaz roadennoù eo.",
        "config-db-install-password": "Ebarzhit ar ger-tremen a vo implijet da gevreañ ouzh an diaz roadennoù e-pad an argerzh staliañ.\nN'eo ket ar ger-tremen evit ar gont MediaWiki, ar ger-tremen evit ho tiaz roadennoù eo.",
        "config-db-install-help": "Merkañ anv an implijer hag ar ger-tremen a vo implijet evit kevreañ ouzh an diaz roadennoù e-pad an argerzh staliañ.",
        "config-install-mainpage-failed": "Ne c'haller ket ensoc'hañ ar bajenn bennañ: $1",
        "config-download-localsettings": "Pellgargañ <code>LocalSettings.php</code>",
        "config-help": "skoazell",
+       "config-help-tooltip": "klikañ evit astenn",
        "config-nofile": "N'eus ket bet gallet kavout ar restr \"$1\". Daoust ha dilamet eo bet ?",
        "mainpagetext": "'''Meziant MediaWiki staliet.'''",
        "mainpagedocfooter": "Sellit ouzh [//meta.wikimedia.org/wiki/Help:Contents Sturlevr an implijerien] evit gouzout hiroc'h war an doare da implijout ar meziant wiki.\n\n== Kregiñ ganti ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Roll an arventennoù kefluniañ]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAG MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Roll ar c'haozeadennoù diwar-benn dasparzhoù MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lec'hiañ MediaWiki en ho yezh"
index ebd94ec..72b6f73 100644 (file)
@@ -83,5 +83,5 @@
        "config-help": "гӀо",
        "config-nofile": "Файл \"$1\" каро цаелира. И дӀаяьккхина ярий?",
        "mainpagetext": "'''Вики-белха гlирс «MediaWiki» кхочуш дика дlахlоттийна.'''",
-       "mainpagedocfooter": "Викийца болх бан хаамаш карор бу хlокху чохь [//meta.wikimedia.org/wiki/Help:Contents нисвохааман куьйгаллица].\n\n== Цхьаболу пайде гlирсаш ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Гlирс нисбан тарлушболу могlам];\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Сих сиха лушдолу хаттарш а жоьпаш оцу MediaWiki];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Хаам бохьуьйту араяларца башхонца керла MediaWiki].\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
+       "mainpagedocfooter": "Викийца болх бан хаамаш карор бу хӀокху чохь [//meta.wikimedia.org/wiki/Help:Contents нисвохааман куьйгаллица].\n\n== Цхьаболу пайде гӀирсаш ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings ГӀирс нисбан тарлушболу могӀам];\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Сих сиха лушдолу хаттарш а жоьпаш оцу MediaWiki];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Хаам бохьуьйту араяларца башхонца керла MediaWiki].\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
 }
index 837cc0f..cd18c92 100644 (file)
        "config-license-none": "Keine Lizenzangabe in der Fußzeile",
        "config-license-cc-by-sa": "''Creative Commons'' „Namensnennung – Weitergabe unter gleichen Bedingungen“",
        "config-license-cc-by": "''Creative Commons'' „Namensnennung“",
-       "config-license-cc-by-nc-sa": "''Creative Commons'' „Namensnennung, nicht kommerziell – Weitergabe unter gleichen Bedingungen“",
+       "config-license-cc-by-nc-sa": "''Creative Commons'' „Namensnennung – nicht kommerziell – Weitergabe unter gleichen Bedingungen“",
        "config-license-cc-0": "''Creative Commons'' „Zero“ (Gemeinfreiheit)",
        "config-license-gfdl": "GNU-Lizenz für freie Dokumentation 1.3 oder höher",
        "config-license-pd": "Gemeinfreiheit",
index 94fc5e4..325ee98 100644 (file)
@@ -10,7 +10,9 @@
        "config-desc": "Το πρόγραμμα εγκατάστασης για το MediaWiki",
        "config-title": "Εγκατάσταση MediaWiki $1",
        "config-information": "Πληροφορίες",
+       "config-localsettings-key": "Κλειδί αναβάθμισης:",
        "config-localsettings-badkey": "Το κλειδί που δώσατε είναι εσφαλμένο.",
+       "config-upgrade-key-missing": "Έχει εντοπιστεί μια υπάρχουσα εγκατάσταση του MediaWiki.\nΓια να αναβαθμίσετε αυτήν την εγκατάσταση, παρακαλούμε να βάλετε την ακόλουθη γραμμή στο κάτω μέρος του <code>LocalSettings.php</code> σας:\n\n$1",
        "config-your-language": "Η γλώσσα σας:",
        "config-wiki-language": "Γλώσσα του wiki:",
        "config-back": "← Πίσω",
        "config-page-releasenotes": "Σημειώσεις έκδοσης",
        "config-page-copying": "Αντιγραφή",
        "config-page-upgradedoc": "Αναβάθμιση",
-       "config-page-existingwiki": "Υπάρχον βίκι",
-       "config-help-restart": "Θέλετε να καταργήσετε όλα τα αποθηκευμένα δεδομένα που έχετε εισάγει και να επανεκκινήσετε τη διαδικασία εγκατάστασης;",
+       "config-page-existingwiki": "Υπάρχον wiki",
+       "config-help-restart": "Î\98έλεÏ\84ε Î½Î± ÎºÎ±Ï\84αÏ\81γήÏ\83εÏ\84ε Ï\8cλα Ï\84α Î±Ï\80οθηκεÏ\85μένα Î´ÎµÎ´Î¿Î¼Î­Î½Î± Ï\80οÏ\85 Î­Ï\87εÏ\84ε ÎµÎ¹Ï\83αγάγει ÎºÎ±Î¹ Î½Î± ÎµÏ\80ανεκκινήÏ\83εÏ\84ε Ï\84η Î´Î¹Î±Î´Î¹ÎºÎ±Ï\83ία ÎµÎ³ÎºÎ±Ï\84άÏ\83Ï\84αÏ\83ηÏ\82;",
        "config-restart": "Ναι, κάντε επανεκκίνηση",
        "config-env-good": "Το περιβάλλον έχει ελεγχθεί.\nΜπορείτε να εγκαταστήσετε το MediaWiki.",
        "config-env-bad": "Το περιβάλλον έχει ελεγχθεί.\nΔεν μπορείτε να εγκαταστήσετε το MediaWiki.",
        "config-env-php": "H PHP $1 είναι εγκατεστημένη.",
-       "config-env-php-toolow": "PHP  $1 εγκαταστάθηκε.\nΩστόσο, το MediaWiki απαιτεί PHP  $2  ή μεταγενέστερη έκδοση.",
+       "config-env-php-toolow": "Η PHP $1 είναι εγκατεστημένη.\nΩστόσο, το MediaWiki απαιτεί την PHP $2 ή μεταγενέστερη έκδοση.",
+       "config-apc": "Το [http://www.php.net/apc APC] είναι εγκατεστημένο",
+       "config-diff3-bad": "Το GNU diff3 δεν βρέθηκε.",
        "config-db-type": "Τύπος βάσης δεδομένων:",
        "config-db-host": "Φιλοξενία βάσης δεδομένων:",
-       "config-db-wiki-settings": "Αναγνώριση αυτού του βίκι",
+       "config-db-host-oracle": "Βάση δεδομένων TNS:",
+       "config-db-wiki-settings": "Αναγνώριση αυτού του wiki",
        "config-db-name": "Όνομα βάσης δεδομένων:",
        "config-db-install-account": "Λογαριασμός χρήστη για την εγκατάσταση",
        "config-db-username": "Όνομα χρήστη βάσης δεδομένων:",
        "config-db-password": "Κωδικός πρόσβασης βάσης δεδομένων:",
+       "config-db-wiki-account": "Λογαριασμός χρήστη για κανονική λειτουργία",
        "config-charset-mysql5-binary": "MySQL 4.1/5.0 δυαδικό",
+       "config-db-port": "Θύρα βάσης δεδομένων:",
        "config-header-mysql": "Ρυθμίσεις MySQL",
        "config-header-postgres": "Ρυθμίσεις PostgreSQL",
        "config-header-sqlite": "Ρυθμίσεις SQLite",
        "config-header-oracle": "Ρυθμίσεις Oracle",
+       "config-header-mssql": "Ρυθμίσεις του Microsoft SQL Server",
        "config-invalid-db-type": "Μη έγκυρος τύπος βάσης δεδομένων",
+       "config-missing-db-name": "Πρέπει να εισαγάγετε μια τιμή για \"{{int:config-db-name}}\".",
+       "config-missing-db-host": "Πρέπει να εισαγάγετε μια τιμή για \"{{int:config-db-host}}\".",
+       "config-missing-db-server-oracle": "Πρέπει να εισαγάγετε μια τιμή για \"{{int:config-db-host-oracle}}\".",
+       "config-connection-error": "$1.\n\nΕλέγξτε τη διεύθυνση, το όνομα χρήστη και τον κωδικό πρόσβασης και προσπαθήστε ξανά.",
+       "config-sqlite-readonly": "Το αρχείο <code>$1</code> δεν είναι εγγράψιμο.",
+       "config-regenerate": "Αναδημιουργία LocalSettings.php →",
+       "config-mysql-engine": "Μηχανή αποθήκευσης:",
        "config-mysql-utf8": "UTF-8",
-       "config-site-name": "Όνομα του βίκι:",
+       "config-mssql-auth": "Τύπος ελέγχου ταυτότητας:",
+       "config-mssql-windowsauth": "Έλεγχος ταυτότητας των Windows",
+       "config-site-name": "Όνομα του wiki:",
+       "config-site-name-help": "Αυτό θα εμφανίζεται στη γραμμή τίτλου του προγράμματος περιήγησης και σε διάφορα άλλα μέρη.",
        "config-site-name-blank": "Εισαγάγετε όνομα ιστοχώρου.",
        "config-project-namespace": "Ονοματοχώρος εγχειρήματος:",
        "config-ns-generic": "Εγχείρημα",
        "config-admin-name": "Το όνομα χρήστη σας:",
        "config-admin-password": "Κωδικός πρόσβασης:",
        "config-admin-password-confirm": "Επανάληψη κωδικού πρόσβασης:",
+       "config-admin-password-mismatch": "Οι δύο κωδικοί πρόσβασης που εισηγάγατε δεν ταιριάζουν.",
        "config-admin-email": "Διεύθυνση ηλεκτρονικού ταχυδρομείου:",
+       "config-admin-error-bademail": "Έχετε εισαγάγει μη έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου.",
        "config-optional-continue": "Να ερωτηθώ περισσότερες ερωτήσεις.",
-       "config-profile-wiki": "Παραδοσιακό wiki",
+       "config-optional-skip": "Βαρέθηκα ήδη, απλά εγκαταστήστε το wiki.",
+       "config-profile": "Προφίλ δικαιωμάτων χρήστη:",
+       "config-profile-wiki": "Ανοικτό wiki",
        "config-profile-no-anon": "Απαιτείται η δημιουργία λογαριασμού",
+       "config-profile-fishbowl": "Εξουσιοδοτημένοι συντάκτες μόνο",
        "config-profile-private": "Ιδιωτικό wiki",
+       "config-license-cc-choose": "Επιλέξτε μια προσαρμοσμένη άδεια Creative Commons",
        "config-email-settings": "Ρυθμίσεις ηλεκτρονικού ταχυδρομείου",
+       "config-email-usertalk": "Ενεργοποίηση ειδοποίησης σελίδας συζήτησης χρήστη",
+       "config-email-auth": "Ενεργοποίηση ταυτοποίησης μέσω ηλεκτρονικού ταχυδρομείου",
        "config-upload-settings": "Ανέβασμα εικόνων και άλλων αρχείων",
        "config-upload-enable": "Ενεργοποιήστε το ανέβασμα αρχείων",
        "config-logo": "Διεύθυνση URL λογότυπου:",
        "config-cc-again": "Επιλέξτε ξανά...",
+       "config-advanced-settings": "Προηγμένες ρυθμίσεις παραμέτρων",
        "config-extensions": "Επεκτάσεις",
        "config-install-step-done": "έγινε",
        "config-install-step-failed": "απέτυχε",
+       "config-install-user-alreadyexists": "Ο χρήστης \"$1\" υπάρχει ήδη",
+       "config-install-tables": "Γίνεται δημιουργία πινάκων",
+       "config-install-tables-failed": "<strong>Σφάλμα:</strong>Η δημιουργία πινάκων απέτυχε με το ακόλουθο μήνυμα λάθους: $1",
+       "config-install-interwiki": "Γίνεται συμπλήρωση του προεπιλεγμένου πίνακα interwiki",
+       "config-install-interwiki-list": "Αδυναμία ανάγνωσης του αρχείου <code>interwiki.list</code>.",
        "config-help": "βοήθεια",
-       "mainpagetext": "'''To λογισμικό MediaWiki εγκαταστάθηκε με επιτυχία.'''",
+       "mainpagetext": "<strong>To MediaWiki εγκαταστάθηκε με επιτυχία.</strong>",
        "mainpagedocfooter": "Περισσότερες πληροφορίες σχετικά με τη χρήση και με τη ρύθμιση παραμέτρων θα βρείτε στους συνδέσμους: [//meta.wikimedia.org/wiki/MediaWiki_localisation Οδηγίες για τροποποίηση του περιβάλλοντος εργασίας] και [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Εγχειρίδιο χρήστη]."
 }
index 80ef1a7..b37a1b7 100644 (file)
@@ -20,7 +20,9 @@
                        "Csbotero",
                        "Sporeunai",
                        "Ihojose",
-                       "Seb35"
+                       "Seb35",
+                       "McDutchie",
+                       "Miguel2706"
                ]
        },
        "config-desc": "El instalador de MediaWiki",
@@ -97,7 +99,7 @@
        "config-gd": "Se ha encontrado una biblioteca de gráficos GD integrada.\nLa miniaturización de imágenes se habilitará si habilitas las subidas.",
        "config-no-scaling": "No se ha encontrado ninguma biblioteca GD o ImageMagik.\nSe inhabilitará la miniaturización de imágenes.",
        "config-no-uri": "'''Error:''' No se pudo determinar el URI actual.\nSe interrumpió la instalación.",
-       "config-no-cli-uri": "''' Advertencia ''': No se ha especificado ningún <code>--scriptpath</code>, por defecto se usará: <code>$1</code> .",
+       "config-no-cli-uri": "<strong>Aviso:</strong> No se especificó <code>--scriptpath</code>; se usa el valor predeterminado: <code>$1</code>.",
        "config-using-server": "Utilizando el nombre de servidor \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Utilizando la dirección URL del servidor \"<nowiki>$1$2</nowiki>\".",
        "config-uploads-not-safe": "'''Atención:''' Su directorio por defecto para las cargas, <code>$1</code>, es vulnerable a la ejecución de scripts arbitrarios.\nAunque MediaWiki comprueba todos los archivos cargados por si hubiese amenazas de seguridad, es altamente recomendable [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security cerrar esta vulnerabilidad de seguridad] antes de activar las cargas.",
        "config-mysql-utf8": "UTF-8",
        "config-mysql-charset-help": "En '''modo binario''', MediaWiki almacena texto UTF-8 para la base de datos en campos binarios.\nEsto es más eficiente que el modo UTF-8 de MySQL y le permite utilizar la gama completa de caracteres Unicode.\n\nEn '''modo UTF-8''', MySQL sabrá qué conjunto de caracteres emplean sus datos y puede presentarlos y convertirlos adecuadamente, pero no le permitirá almacenar caracteres por encima del [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plano multilingüe básico].",
        "config-mssql-auth": "Tipo de autentificación:",
-       "config-mssql-install-auth": "Seleccione el tipo de autenticación que se utilizará para conectarse a la base de datos durante el proceso de instalación.\nSi selecciona \"{{int:config-mssql-windowsauth}}\", las credenciales del usuario que sea cual sea el servidor Web se ejecuta como será utilizado.",
+       "config-mssql-install-auth": "Seleccione el tipo de autenticación que se utilizará para conectarse a la base de datos durante el proceso de instalación.\nSi selecciona \"{{int:config-mssql-windowsauth}}\", las credenciales de cualquier usuario de el servidor web que se está ejecutando van a ser utilizadas.",
        "config-mssql-web-auth": "Seleccione el tipo de autenticación que utilizará el servidor web para conectarse al servidor de base de datos, durante el funcionamiento normal de la wiki.\nSi selecciona \"{{int:config-mssql-windowsauth}}\", las credenciales del usuario que sea cual sea el servidor Web se ejecuta como será utilizado.",
        "config-mssql-sqlauth": "Autenticación de SQL Server",
        "config-mssql-windowsauth": "Autentificación de Windows",
index 1c46557..13b61ed 100644 (file)
@@ -32,7 +32,7 @@
        "config-db-port": "Andmebaasi port:",
        "config-invalid-db-type": "Vigane andmebaasi tüüp",
        "config-site-name": "Viki nimi:",
-       "config-site-name-blank": "Sisestage lehekülje nimi.",
+       "config-site-name-blank": "Sisesta võrgukoha nimi.",
        "config-project-namespace": "Projekti nimeruum:",
        "config-ns-generic": "Projekt",
        "config-admin-box": "Administraatorikonto",
index c18cb2e..6d5861b 100644 (file)
        "config-install-done": "'''Parabéns!'''\nInstalou correctamente MediaWiki.\n\nO programa de instalación xerou un ficheiro <code>LocalSettings.php</code>.\nEste ficheiro contén toda a súa configuración.\n\nTerá que descargalo e poñelo na base da instalación do seu wiki (no mesmo directorio ca index.php). A descarga debería comezar automaticamente.\n\nSe non comezou a descarga ou se a cancelou, pode facer que comece de novo premendo na ligazón que aparece a continuación:\n\n$3\n\n'''Nota:''' Se non fai iso agora, este ficheiro de configuración xerado non estará dispoñible máis adiante se sae da instalación sen descargalo.\n\nCando faga todo isto, xa poderá '''[$2 entrar no seu wiki]'''.",
        "config-download-localsettings": "Descargar o <code>LocalSettings.php</code>",
        "config-help": "axuda",
+       "config-help-tooltip": "prema para expandir",
        "config-nofile": "Non se puido atopar o ficheiro \"$1\". Se cadra, foi borrado.",
        "config-extension-link": "Sabía que o seu wiki soporta [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensións]?\n\nPode explorar as [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensións por categoría] ou a [//www.mediawiki.org/wiki/Extension_Matrix matriz de extensións] para ollar a lista completa de extensións.",
        "mainpagetext": "'''MediaWiki instalouse correctamente.'''",
index 59c4e89..5c0e9db 100644 (file)
@@ -14,7 +14,7 @@
        "config-localsettings-badkey": "Le clave que tu forniva es incorrecte",
        "config-upgrade-key-missing": "Un installation existente de MediaWiki ha essite detegite.\nPro actualisar iste installation, es necessari adjunger le sequente linea al fin del file <code>LocalSettings.php</code>:\n\n$1",
        "config-localsettings-incomplete": "Le file <code>LocalSettings.php</code> existente pare esser incomplete.\nLe variabile $1 non es definite.\nPer favor cambia <code>LocalSettings.php</code> de sorta que iste variabile es definite, e clicca \"{{int:Config-continue}}\".",
-       "config-localsettings-connection-error": "Un error esseva incontrate durante le connexion al base de datos usante le configurationes specificate in <code>LocalSettings.php</code> o <code>AdminSettings.php</code>. Per favor repara iste configurationes e tenta lo de novo.\n\n$1",
+       "config-localsettings-connection-error": "Un error ha essite incontrate durante le connexion al base de datos usante le configuration specificate in <code>LocalSettings.php</code>. Per favor corrige iste configuration e reproba.\n\n$1",
        "config-session-error": "Error al comenciamento del session: $1",
        "config-session-expired": "Le datos de tu session pare haber expirate.\nLe sessiones es configurate pro un duration de $1.\nTu pote augmentar isto per definir <code>session.gc_maxlifetime</code> in php.ini.\nReinitia le processo de installation.",
        "config-no-session": "Le datos de tu session es perdite!\nVerifica tu php.ini e assecura te que un directorio appropriate es definite in <code>session.save_path</code>.",
        "config-db-username": "Nomine de usator del base de datos:",
        "config-db-password": "Contrasigno del base de datos:",
        "config-db-password-empty": "Per favor entra un contrasigno pro le nove usator del base de datos: $1.\nBen que il es possibile crear usatores sin contrasigno, isto non es secur.",
+       "config-db-username-empty": "Es necessari entrar un valor pro \"{{int:config-db-username}}\".",
        "config-db-install-username": "Entra le nomine de usator que essera usate pro connecter al base de datos durante le processo de installation. Isto non es le nomine de usator del conto MediaWiki; isto es le nomine de usator pro tu base de datos.",
        "config-db-install-password": "Entra le contrasigno que essera usate pro connecter al base de datos durante le processo de installation. Isto non es le contrasigno del conto MediaWiki; isto es le contrasigno pro tu base de datos.",
        "config-db-install-help": "Entra le nomine de usator e contrasigno que essera usate pro connecter al base de datos durante le processo de installation.",
        "config-header-oracle": "Configuration de Oracle",
        "config-header-mssql": "Configuration de Microsoft SQL Server",
        "config-invalid-db-type": "Typo de base de datos invalide",
-       "config-missing-db-name": "Tu debe entrar un valor pro \"Nomine de base de datos\"",
-       "config-missing-db-host": "Tu debe entrar un valor pro \"Host del base de datos\"",
-       "config-missing-db-server-oracle": "You must enter a value for \"TNS del base de datos\"",
+       "config-missing-db-name": "Es necessari entrar un valor pro \"{{int:config-db-name}}\".",
+       "config-missing-db-host": "Es necessari entrar un valor pro \"{{int:config-db-host}}\".",
+       "config-missing-db-server-oracle": "Es necessari entrar un valor pro \"{{int:config-db-host-oracle}}\".",
        "config-invalid-db-server-oracle": "TNS de base de datos \"$1\" invalide.\nUsa o \"TNS Name\" o un catena \"Easy Connect\". ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Methodos de nomenclatura de Oracle])",
        "config-invalid-db-name": "Nomine de base de datos \"$1\" invalide.\nUsa solmente litteras ASCII (a-z, A-Z), numeros (0-9), characteres de sublineamento (_) e tractos de union (-).",
        "config-invalid-db-prefix": "Prefixo de base de datos \"$1\" invalide.\nUsa solmente litteras ASCII (a-z, A-Z), numeros (0-9), characteres de sublineamento (_) e tractos de union (-).",
        "config-mysql-utf8": "UTF-8",
        "config-mysql-charset-help": "In '''modo binari''', MediaWiki immagazina le texto UTF-8 in le base de datos in campos binari.\nIsto es plus efficiente que le modo UTF-8 de MySQL, e permitte usar le rango complete de characteres Unicode.\n\nIn '''modo UTF-8''', MySQL cognoscera le codification de characteres usate pro tu dats, e pote presentar e converter lo appropriatemente, ma illo non permittera immagazinar characteres supra le [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Plano Multilingue Basic].",
        "config-mssql-auth": "Typo de authentication:",
-       "config-mssql-install-auth": "Selige le typo de authentication que essera usate pro connecter al base de datos durante le processo de installation.\nSi tu selige \"Authentication per Windows\", le credentiales del usator que executa le servitor web essera usate.",
-       "config-mssql-web-auth": "Selige le typo de authentication que le servitor web usara pro connecter al base de datos durante le operation ordinari del wiki.\nSi tu selige \"Authentication per Windows\", le credentiales del usator que executa le servitor web essera usate.",
+       "config-mssql-install-auth": "Selige le typo de authentication a usar pro connecter al base de datos durante le processo de installation.\nSi tu selige \"{{int:config-mssql-windowsauth}}\", le credentiales del usator que executa le servitor web essera usate.",
+       "config-mssql-web-auth": "Selige le typo de authentication que le servitor web usara pro connecter al base de datos durante le operation ordinari del wiki.\nSi tu selige \"{{int:config-mssql-windowsauth}}\", le credentiales del usator que executa le servitor web essera usate.",
        "config-mssql-sqlauth": "Authentication per SQL Server",
        "config-mssql-windowsauth": "Authentication per Windows",
        "config-site-name": "Nomine del wiki:",
        "config-install-done": "'''Felicitationes!'''\nTu ha installate MediaWiki con successo.\n\nLe installator ha generate un file <code>LocalSettings.php</code>.\nIste contine tote le configuration.\n\nEs necessari discargar lo e poner lo in le base del installation wiki (le mesme directorio que index.php).\nLe discargamento debe haber comenciate automaticamente.\n\nSi le discargamento non ha comenciate, o si illo esseva cancellate, es possibile recomenciar le discargamento con un clic sur le ligamine sequente:\n\n$3\n\n'''Nota''': Si tu non discarga iste file de configuration ora, illo non essera disponibile plus tarde.\n\nPost facer isto, tu pote '''[$2 entrar in tu wiki]'''.",
        "config-download-localsettings": "Discargar <code>LocalSettings.php</code>",
        "config-help": "adjuta",
+       "config-help-tooltip": "clicca pro displicar",
        "config-nofile": "Le file \"$1\" non poteva esser trovate. Ha illo essite delite?",
        "config-extension-link": "Sapeva tu que tu wiki supporta [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensiones]?\n\nTu pote explorar le [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensiones per category] o le [//www.mediawiki.org/wiki/Extension_Matrix matrice de extensiones] pro vider le lista complete de extensiones.",
        "mainpagetext": "'''MediaWiki ha essite installate con successo.'''",
index 5f01e6d..a37ed89 100644 (file)
@@ -7,7 +7,8 @@
                        "Reedy",
                        "아라",
                        "C5st4wr6ch",
-                       "Seb35"
+                       "Seb35",
+                       "Arifin.wijaya"
                ]
        },
        "config-desc": "Penginstal untuk MediaWiki",
@@ -57,7 +58,7 @@
        "config-unicode-using-intl": "Menggunakan [http://pecl.php.net/intl ekstensi PECL intl] untuk normalisasi Unicode.",
        "config-unicode-pure-php-warning": "'''Peringatan''': [http://pecl.php.net/intl Ekstensi intl PECL] untuk menangani normalisasi Unicode tidak tersedia, kembali menggunakan implementasi murni PHP yang lambat.\nJika Anda menjalankan situs berlalu lintas tinggi, Anda harus sedikit membaca [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalisasi Unicode].",
        "config-unicode-update-warning": "'''Peringatan''': Versi terinstal dari pembungkus normalisasi Unicode menggunakan versi lama pustaka [http://site.icu-project.org/ proyek ICU].\nAnda harus [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations memutakhirkannya] jika Anda ingin menggunakan Unicode.",
-       "config-no-db": "Pengandar basis data yang sesuai tidak ditemukan! Anda perlu menginstal pengandar basis data untuk PHP.\nJenis basis data yang didukung: $1.\n\nJika Anda menggunakan inang bersama, mintalah penyedia inang Anda untuk menginstal pengandar basis data yang sesuai.\nJika Anda mengompilasi sendiri PHP, ubahlah konfigurasinya dengan mengaktifkan klien basis data, misalnya menggunakan <code>./configure --with-mysql</code>.\nJika Anda menginstal PHP dari paket Debian atau Ubuntu, maka Anda juga perlu menginstal modul php5-mysql.",
+       "config-no-db": "Pengandar basis data yang sesuai tidak ditemukan! Anda perlu menginstal pengandar basis data untuk PHP.\nJenis basis data yang didukung: $1.\n\nJika Anda mengompilasi sendiri PHP, ubahlah konfigurasinya dengan mengaktifkan klien basis data, misalnya menggunakan <code>./configure --with-mysql</code>.\nJika Anda menginstal PHP dari paket Debian atau Ubuntu, maka Anda juga perlu menginstal modul php5-mysql.",
        "config-outdated-sqlite": "<strong>Peringatan:</strong> Anda menggunakan SQLite $1, yang lebih rendah dari versi minimum yang diperlukan $2. SQLite akan tidak tersedia.",
        "config-no-fts3": "'''Peringatan''': SQLite dikompilasi tanpa [//sqlite.org/fts3.html modul FTS3], fitur pencarian tidak akan tersedia pada konfigurasi ini.",
        "config-register-globals": "'''Peringatan: Opsi <code>[http://php.net/register_globals register_globals]</code> PHP diaktifkan.'''\n'''Nonaktifkan kalau bisa.'''\nMediaWiki akan bekerja, tetapi server Anda memiliki potensi kerentanan keamanan.",
        "config-mbstring": "'''Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] aktif!'' '\nPilihan ini dapat menyebabkan kesalahan dan kerusakan data yang tidak terduga.\nAnda tidak dapat menginstal atau menggunakan MediaWiki kecuali pilihan ini dinonaktifkan.",
        "config-safe-mode": "''' Peringatan:''' [http://www.php.net/features.safe-mode Mode aman] PHP aktif.\nHal ini akan menyebabkan masalah, terutama jika menggunakan pengunggahan berkas dan dukungan <code>math</code>.",
        "config-xml-bad": "Modul XML PHP hilang.\nMediaWiki membutuhkan fungsi dalam modul ini dan tidak akan bekerja dalam konfigurasi ini.\nJika Anda menggunakan Mandrake, instal paket php-xml.",
+       "config-pcre-old": "<strong>Fatal:</strong> PCRE $1 atau kemudian diperlukan.\nBiner PHP Anda dihubungkan dengan PCRE $2. [https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Selengkapnya].",
        "config-pcre-no-utf8": "'''Fatal''': Modul PCRE PHP tampaknya dikompilasi tanpa dukungan PCRE_UTF8.\nMediaWiki memerlukan dukungan UTF-8 untuk berfungsi dengan benar.",
        "config-memory-raised": "<code>memory_limit</code> PHP adalah $1, dinaikkan ke $2.",
        "config-memory-bad": "'''Peringatan:''' <code>memory_limit</code> PHP adalah $1.\nIni terlalu rendah.\nInstalasi terancam gagal!",
+       "config-ctype": "<strong>Fatal:</strong> PHP harus disusun dengan dukungan untuk [http://www.php.net/manual/en/ctype.installation.php ekstensi Ctype].",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] telah diinstal",
        "config-apc": "[http://www.php.net/apc APC] telah diinstal",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] telah diinstal",
        "config-no-cache": "'''Peringatan:''' Tidak dapat menemukan [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache], atau [http://www.iis.net/download/WinCacheForPhp WinCache]. Pinggahan obyek tidak dinonaktifkan.",
        "config-mod-security": "<strong>Peringatan:</strong> Server web Anda memiliki [http://modsecurity.org/ mod_security] yang diaktifkan. Jika salah dalam mengkonfigurasi, ini dapat menyebabkan masalah untuk MediaWiki atau perangkat lunak lain yang memungkinkan pengguna untuk mengirim sembarang konten.\nLihat [http://modsecurity.org/documentation/ dokumentasi mod_security] atau hubungi layanan host Anda jika Anda mengalami kesalahan acak.",
        "config-diff3-bad": "GNU diff3 tidak ditemukan.",
+       "config-git": "Menemukan perangkat lunak kontrol versi Git: <code>$1</code>.",
+       "config-git-bad": "Perangkat lunak kontrol versi Git tidak ditemukan.",
        "config-imagemagick": "ImageMagick ditemukan: <code>$1</code> .\nPembuatan gambar mini akan diaktifkan jika Anda mengaktifkan pengunggahan.",
        "config-gd": "Pustaka grafis GD terpasang ditemukan.\nPembuatan gambar mini akan diaktifkan jika Anda mengaktifkan pengunggahan.",
        "config-no-scaling": "Pustaka GD atau ImageMagick tidak ditemukan.\nPembuatan gambar mini dinonaktifkan.",
        "config-no-uri": "'''Kesalahan:''' URI saat ini tidak dapat ditentukan.\nInstalasi dibatalkan.",
+       "config-no-cli-uri": "<strong>Peringatan:</strong> Tidak ada <code>--scriptpath</code> yang ditentukan, dengan menggunakan standar: <code>$1</code>.",
+       "config-using-server": "Menggunakan nama server \"<nowiki>$1</nowiki>\".",
+       "config-using-uri": "Menggunakan URL server \"<nowiki>$1$2</nowiki>\".",
        "config-uploads-not-safe": "'''Peringatan:''' Direktori bawaan pengunggahan <code>$1</code> Anda rentan terhadap eksekusi skrip yang sewenang-wenang.\nMeskipun MediaWiki memeriksa semua berkas unggahan untuk ancaman keamanan, sangat dianjurkan untuk [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security menutup kerentanan keamanan ini] sebelum mengaktifkan pengunggahan.",
        "config-brokenlibxml": "Sistem Anda memiliki kombinasi versi PHP dan libxml2 yang memiliki bug dan dapat menyebabkan kerusakan data tersembunyi pada MediaWiki dan aplikasi web lain.\nMutakhirkan ke PHP 5.2.9 atau yang lebih baru dan libxml2 2.7.3 atau yang lebih baru ([https://bugs.php.net/bug.php?id=45996 arsip bug di PHP]).\nInstalasi dibatalkan.",
        "config-suhosin-max-value-length": "Suhosin terpasang dan membatasi parameter GET <code>length</code> sebesar $1 bita. Komponen ResourceLoader MediaWiki akan berjalan dalam batasan ini, tetapi penanganannya akan menurunkan kinerja. Jika memungkinkan, Anda sebaiknya menetapkan nilai <code>suhosin.get.max_value_length</code> menjadi 1024 atau lebih tinggi dalam <code>php.ini</code> dan menyetel <code>$wgResourceLoaderMaxQueryLength</code> dengan nilai yang sama dalam <code>LocalSettings.php</code>.",
        "config-db-username": "Nama pengguna basis data:",
        "config-db-password": "Kata sandi basis data:",
        "config-db-password-empty": "Silakan masukkan sandi untuk pengguna basis data baru: $1.\nMeskipun dimungkinkan untuk membuat pengguna tanpa sandi, hal itu tidak aman.",
+       "config-db-username-empty": "Anda harus memasukkan nilai untuk \"{{int:config-db-username}}\".",
        "config-db-install-username": "Masukkan nama pengguna yang akan digunakan untuk terhubung ke basis data selama proses instalasi.\nIni bukan nama pengguna akun MediaWiki, melainkan nama pengguna untuk basis data Anda.",
        "config-db-install-password": "Masukkan sandi yang akan digunakan untuk terhubung ke basis data selama proses instalasi.\nIni bukan sandi untuk akun MediaWiki, melainkan sandi untuk basis data Anda.",
        "config-db-install-help": "Masukkan nama pengguna dan sandi yang akan digunakan untuk terhubung ke basis data pada saat proses instalasi.",
        "config-type-oracle": "Oracle",
        "config-support-info": "MediaWiki mendukung sistem basis data berikut:\n\n$1\n\nJika Anda tidak melihat sistem basis data yang Anda gunakan tercantum di bawah ini, ikuti petunjuk terkait di atas untuk mengaktifkan dukungan.",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] adalah target utama MediaWiki dan memiliki dukungan terbaik. MediaWiki juga berjalan dengan [{{int:version-db-mariadb-url}} MariaDB] dan [{{int:version-db-percona-url}} Server Percona], yang kompatibel dengan MySQL. ([http://www.php.net/manual/en/mysql.installation.php Cara mengompilasi PHP dengan dukungan MySQL])",
-       "config-dbsupport-postgres": "* $1 adalah sistem basis data sumber terbuka populer sebagai alternatif untuk MySQL ([http://www.php.net/manual/en/pgsql.installation.php cara mengompilasi PHP dengan dukungan PostgreSQL]). Mungkin ada beberapa bug terbuka dan alternatif ini tidak direkomendasikan untuk dipakai dalam lingkungan produksi.",
-       "config-dbsupport-sqlite": "* $1 adalah sistem basis data yang ringan yang sangat baik dukungannya. ([http://www.php.net/manual/en/pdo.installation.php cara mengompilasi PHP dengan dukungan SQLite], menggunakan PDO)",
-       "config-dbsupport-oracle": "* $1 adalah basis data komersial untuka perusahaan. ([http://www.php.net/manual/en/oci8.installation.php cara mengompilasi PHP dengan dukungan OCI8])",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] adalah sistem basis data sumber terbuka populer sebagai alternatif untuk MySQL. Mungkin ada beberapa bug terbuka dan alternatif ini tidak direkomendasikan untuk dipakai dalam lingkungan produksi. ([http://www.php.net/manual/en/pgsql.installation.php cara mengompilasi PHP dengan dukungan PostgreSQL])",
+       "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] adalah sistem basis data yang ringan yang sangat baik dukungannya. ([http://www.php.net/manual/en/pdo.installation.php cara mengompilasi PHP dengan dukungan SQLite], menggunakan PDO)",
+       "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] adalah basis data komersial untuk perusahaan. ([http://www.php.net/manual/en/oci8.installation.php cara mengompilasi PHP dengan dukungan OCI8])",
+       "config-dbsupport-mssql": "[{{int:version-db-mssql-url}} Microsoft SQL Server] adalah database perusahaan komersial untuk Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php Bagaimana cara mengkompilasi PHP dengan dukungan SQLSRV])",
        "config-header-mysql": "Pengaturan MySQL",
        "config-header-postgres": "Pengaturan PostgreSQL",
        "config-header-sqlite": "Pengaturan SQLite",
        "config-header-oracle": "Pengaturan Oracle",
        "config-header-mssql": "Setelan Microsoft SQL Server",
        "config-invalid-db-type": "Jenis basis data tidak sah",
-       "config-missing-db-name": "Anda harus memasukkan nilai untuk \"Nama basis data\"",
-       "config-missing-db-host": "Anda harus memasukkan nilai untuk \"Inang basis data\"",
-       "config-missing-db-server-oracle": "Anda harus memasukkan nilai untuk \"TNS basis data\"",
+       "config-missing-db-name": "Anda harus memasukkan nilai untuk \"{{int:config-db-name}}\"",
+       "config-missing-db-host": "Anda harus memasukkan nilai untuk \"{{int:config-db-host}}\"",
+       "config-missing-db-server-oracle": "Anda harus memasukkan nilai untuk \"{{int:config-db-host-oracle}}\"",
        "config-invalid-db-server-oracle": "TNS basis data \"$1\" tidak sah.\nGunakan hanya huruf ASCII (a-z, A-Z), angka (0-9), garis bawah (_), dan titik (.).",
        "config-invalid-db-name": "Nama basis data \"$1\" tidak sah.\nGunakan hanya huruf ASCII (a-z, A-Z), angka (0-9), garis bawah (_), dan tanda hubung (-).",
        "config-invalid-db-prefix": "Prefiks basis data \"$1\" tidak sah.\nGunakan hanya huruf ASCII (a-z, A-Z), angka (0-9), garis bawah (_), dan tanda hubung (-).",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
        "config-mysql-myisam-dep": "<strong>Peringatan:</strong> Anda telah memilih MyISAM sebagai mesin penyimpanan MySQL, yang tidak dianjurkan untuk digunakan dengan MediaWiki, karena:\n * nyaris tidak mendukung operasi bersamaan karena penguncian tabel\n * lebih rentan terhadap korupsi daripada mesin lain\n * basis kode MediaWiki tidak selalu menangani MyISAM sebagaimana mestinya\n\nJika instalasi MySQL Anda mendukung InnoDB, sangat disarankan bagi Anda memilih itu.\nJika instalasi MySQL tidak mendukung InnoDB, mungkin sudah waktunya untuk pemutakhiran.",
+       "config-mysql-only-myisam-dep": "<strong>Peringatan:</strong> MyISAM adalah satu-satunya mesin penyimpanan yang tersedia untuk MySQL pada mesin ini, dan hal ini tidak dianjurkan untuk digunakan dengan MediaWiki, karena:\n* hampir tidak mendukung konkurensi karena penguncian tabel\n* basis kode MediaWiki tidak selalu menangani MyISAM sebagaimana mestinya\n\nInstalasi MySQL Anda tidak mendukung InnoDB, mungkin sudah waktunya untuk peningkatan.",
        "config-mysql-engine-help": "'''InnoDB''' hampir selalu merupakan pilihan terbaik karena memiliki dukungan konkurensi yang baik.\n\n'''MyISAM''' mungkin lebih cepat dalam instalasi pengguna-tunggal atau hanya-baca.\nBasis data MyISAM cenderung lebih sering rusak daripada basis data InnoDB.",
        "config-mysql-charset": "Set karakter basis data:",
        "config-mysql-binary": "Biner",
        "config-mssql-auth": "Jenis otentikasi:",
        "config-mssql-install-auth": "Pilih jenis otentikasi yang akan digunakan untuk menyambung ke database selama proses instalasi.\nJika Anda memilih \"{{int:config-mssql-windowsauth}}\", kredensial dari pengguna apapun pada server web yang berjalan akan digunakan.",
        "config-mssql-web-auth": "Pilih jenis otentikasi yang akan digunakan oleh server web untuk menyambung ke server basis data, selama operasi biasa dari wiki.\nJika Anda memilih \"{{int:config-mssql-windowsauth}}\", kredensial dari pengguna apapun pada server web yang berjalan akan digunakan.",
+       "config-mssql-sqlauth": "Otentikasi Server SQL",
        "config-mssql-windowsauth": "Otentikasi Windows",
        "config-site-name": "Nama wiki:",
        "config-site-name-help": "Ini akan muncul di bilah judul peramban dan di berbagai tempat lainnya.",
        "config-install-pg-plpgsql": "Memeriksa bahasa PL / pgSQL",
        "config-pg-no-plpgsql": "Anda perlu menginstal bahasa PL/pgSQL pada basis data $1",
        "config-pg-no-create-privs": "Akun yang Anda tetapkan untuk instalasi tidak memiliki hak yang cukup untuk membuat akun.",
+       "config-pg-not-in-role": "Akun yang ditentukan untuk pengguna web sudah ada.\nAkun yang ditentukan untuk instalasi tidak superuser dan bukan anggota dari peran pengguna Web, sehingga tidak dapat membuat objek yang dimiliki oleh pengguna web.\n\nMediaWiki saat ini membutuhkan bahwa tabel dimiliki oleh pengguna web. Silakan tentukan nama account web lain, atau klik \"back\" dan tentukan pengguna yang terinstal sesuai istimewa.",
        "config-install-user": "Membuat pengguna basis data",
        "config-install-user-alreadyexists": "Pengguna \"$1\" sudah ada",
        "config-install-user-create-failed": "Pembuatan pengguna \"$1\" gagal: $2",
        "config-install-user-grant-failed": "Memberikan izin untuk pengguna \"$1\" gagal: $2",
        "config-install-user-missing": "Pengguna \"$1\" yang dimaksud tidak ditemukan.",
+       "config-install-user-missing-create": "Akun yang ditentukan \"$1\" tidak ada.\nSilahkan klik kotak centang \"Buat akun\" di bawah ini jika Anda ingin membuatnya.",
        "config-install-tables": "Membuat tabel",
        "config-install-tables-exist": "'''Peringatan''': Tabel MediaWiki sepertinya sudah ada.\nMelompati pembuatan.",
        "config-install-tables-failed": "'''Kesalahan''': Pembuatan tabel gagal dengan kesalahan berikut: $1",
        "config-install-done": "'''Selamat!'''\nAnda telah berhasil menginstal MediaWiki.\n\nPenginstal telah membuat berkas <code>LocalSettings.php</code>.\nBerkas itu berisi semua konfigurasi Anda.\n\nAnda perlu mengunduh berkas itu dan meletakkannya di direktori instalasi wiki (direktori yang sama dengan index.php). Pengunduhan akan dimulai secara otomatis.\n\nJika pengunduhan tidak terjadi, atau jika Anda membatalkannya, Anda dapat mengulangi pengunduhan dengan mengeklik tautan berikut:\n\n$3\n\n'''Catatan''': Jika Anda tidak melakukannya sekarang, berkas konfigurasi yang dihasilkan ini tidak akan tersedia lagi setelah Anda keluar dari proses instalasi tanpa mengunduhnya.\n\nSetelah melakukannya, Anda dapat '''[$2 memasuki wiki Anda]'''.",
        "config-download-localsettings": "Unduh <code>LocalSettings.php</code>",
        "config-help": "bantuan",
+       "config-help-tooltip": "klik untuk memperluas",
        "config-nofile": "Berkas \"$1\" tidak dapat ditemukan. Mungkin sudah dihapus?",
+       "config-extension-link": "Tahukah Anda bahwa wiki Anda mendukung [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions ekstensi]?\n\nAnda dapat menjelajahi [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category ekstensi menurut kategori] atau [//www.mediawiki.org/wiki/Extension_Matrix Ekstensi Matriks] untuk melihat daftar lengkap ekstensi.",
        "mainpagetext": "'''MediaWiki telah terpasang dengan sukses'''.",
        "mainpagedocfooter": "Silakan baca [//www.mediawiki.org/wiki/Help:Contents Panduan Pengguna] untuk cara penggunaan perangkat lunak wiki ini.\n\n== Memulai penggunaan ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings/id Daftar pengaturan konfigurasi]\n* [//www.mediawiki.org/wiki/Manual:FAQ/id Daftar pertanyaan yang sering diajukan mengenai MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Milis rilis MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Terjemahkan MediaWiki ke bahasa Anda]"
 }
index 08d4462..726b74d 100644 (file)
        "config-page-readme": "წამიკითხე",
        "config-page-copying": "ლიცენზია",
        "config-page-upgradedoc": "განახლება",
+       "config-page-existingwiki": "არსებული ვიკი",
        "config-restart": "დიახ, თავიდან დაიწყეთ",
        "config-sidebar": "* [//www.mediawiki.org მედიავიკის ვებ-გვერდი]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/ka მომხმარებლების დახმარება]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/ka ადმინისტრატორების დახმარება]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/ka FAQ]\n----\n* <doclink href=Readme>წამიკითხე</doclink>\n* <doclink href=ReleaseNotes>ინფორმაცია გამოშვებაზე</doclink>\n* <doclink href=Copying>ლიცენზია</doclink>\n* <doclink href=UpgradeDoc>განახლება</doclink>",
+       "config-xcache": "[http://xcache.lighttpd.net/ XCache] დაყენდა",
+       "config-apc": "[http://www.php.net/apc APC] დაყენდა",
+       "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] დაყენდა",
+       "config-diff3-bad": "GNU diff3 ვერ მოიძებნა.",
        "config-db-type": "მონაცემთა ბაზის ტიპი:",
        "config-db-host-oracle": "მონაცემთა ბაზის TNS:",
        "config-db-name": "მონაცემთა ბაზის სახელი:",
@@ -38,6 +43,7 @@
        "config-header-sqlite": "SQLite-ის პარამეტრები",
        "config-header-oracle": "Oracle-ის პარამეტრები",
        "config-invalid-db-type": "არასწორი მონაცემთა ბაზის ტიპი",
+       "config-sqlite-readonly": "ფაილი <code>$1</code> ჩასაწერად მიუწვდომელია.",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
        "config-mysql-binary": "ორობითი",
        "config-admin-password": "პაროლი:",
        "config-admin-password-confirm": "პაროლი ხელმეორედ:",
        "config-admin-name-blank": "შეიყვანეთ ადმინისტრატორის მომხმარებლის სახელი.",
+       "config-admin-password-blank": "შეიყვანეთ ადმინისტრატორის ანგარიშის პაროლი.",
+       "config-admin-password-mismatch": "თქვენ მიერ შეყვანილი პაროლები ერთმანეთს არ ემთხვევა.",
        "config-admin-email": "ელ. ფოსტის მისამართი:",
+       "config-admin-error-bademail": "თქვენ მიერ შეყვანილი ელ.ფოსტა არასწორია.",
+       "config-subscribe": "გამოიწერეთ [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce მედიავიკის ახალი ვერსიის გამოსვლის სიახლეები].",
        "config-profile": "მომხმარებელთა უფლებების პროფილი:",
        "config-profile-wiki": "ღია ვიკი",
+       "config-profile-no-anon": "საჭიროა ანგარიშის შექმნა",
+       "config-profile-fishbowl": "მხოლოდ ავტორიზებული რედაქტორებისათვის",
        "config-profile-private": "დახურული ვიკი",
        "config-license": "საავტორო უფლები და ლიცენზია:",
        "config-license-cc-by-sa": "Creative Commons Attribution Share Alike",
        "config-upload-enable": "ფაილების ატვირთვის ჩართვა",
        "config-logo": "ლოგოს URL:",
        "config-cc-again": "აირჩიეთ კიდევ ერთხელ...",
+       "config-advanced-settings": "დამატებითი კონფიგურაცია",
        "config-extensions": "გაფართოებები",
        "config-install-step-done": "შესრულდა",
        "config-install-step-failed": "ვერ მოხერხდა",
+       "config-install-schema": "სქემის შექმნა",
        "config-install-tables": "ცხრილების შექმნა",
        "config-install-interwiki-list": "ვერ მოიძებნა ფაილი <code>interwiki.list</code>.",
        "config-download-localsettings": "<code>LocalSettings.php</code>-ის გადმოწერა",
        "config-help": "დახმარება",
+       "config-help-tooltip": "გასაშლელად დააწკაპუნეთ",
        "mainpagetext": "'''მედიავიკი წარმატებით ჩაიტვირთა.'''",
        "mainpagedocfooter": "ვიკი პროგრამის გამოყენების ინფორმაციისთვის იხილეთ [//meta.wikimedia.org/wiki/Help:Contents მომხმარებლის მეგზური].\n\n== დაწყება ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings კონფიგურაციის მაჩვენებლების სია]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce მედიავიკის გამოცემის დაგზავნის სია]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources მედიავიკის ლოკალიზება თქვენ ენაზე]"
 }
index 4e3e31c..eb66bbb 100644 (file)
@@ -22,6 +22,9 @@
        "config-page-restart": "Pārstartēt instalāciju",
        "config-page-readme": "Lasīt mani",
        "config-page-releasenotes": "Informācija par laidienu",
+       "config-page-copying": "Kopē",
+       "config-env-php": "PHP $1 ir uzstādīts.",
+       "config-diff3-bad": "GNU diff3 nav atrasts.",
        "config-db-charset": "Datubāzes rakstzīmju kopa",
        "config-charset-mysql5-binary": "MySQL 4.1/5.0 binārs",
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
index 33817c2..26f1cc7 100644 (file)
        "config-license-cc-by": "Creative Commons Attribution",
        "config-license-cc-by-nc-sa": "Creative Commons Attribution Non-Commercial Share Alike",
        "config-license-cc-0": "Creative Commons Zero (Domain Awam)",
-       "config-license-gfdl": "Lesen Dokumentasi Bebas GNU 1.3 atau ke atas",
+       "config-license-gfdl": "Lesen Pendokumenan Bebas GNU 1.3 atau ke atas",
        "config-license-pd": "Domain Awam",
        "config-email-settings": "Tetapan e-mel",
        "config-install-step-done": "siap",
index 2b80e15..fbc2bbc 100644 (file)
        "config-help-restart": "你敢欲共你拍的佮保存的資料攏清掉,並且重開始安裝的動作?",
        "config-restart": "是,重來",
        "config-welcome": "=== 環境檢測 ===\n這馬欲做基本的檢測,看環境是毋是適合裝 MediaWiki。\n若你愛有支援,才裝會起來,請共遮的資訊記起來。",
+       "config-copyright": "=== 版權聲明佮授權條款 ===\n\n$1\n\n本程式是自由軟體;你會當照自由軟體基金會所發表的 GNU 通用公共授權條款規定,共本程式重新發佈抑是修改;無論你是照本授權條款的第二版抑第二版以後的任何版本(你會當家己選) 。\n\n本程式發佈的目的是希望會當提供幫助,但是 <strong>無負任何擔保責任</strong>;抑無表示講對 <strong>販賣性</strong> 抑 <strong>特定用途的適用性</strong> 的情形擔保。詳情請參照 GNU 通用公共授權。\n\n你應該已隨本程式收著 <doclink href=\"Copying\">GNU 通用公共授權條款的副本</doclink>;若無,請寫批通知自由軟體基金會,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA,或 [http://www.gnu.org/copyleft/gpl.html 線頂看]。",
+       "config-sidebar": "* [www.mediawiki.org/wiki/MediaWiki/zh-hant MediaWiki 頭頁]\n* [www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/zh 使用者指南]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/zh 管理者指南]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/zh-hant 四常問題集]\n----\n* <doclink href=Readme>讀我說明</doclink>\n* <doclink href=ReleaseNotes>發行說明</doclink>\n* <doclink href=Copying>版權聲明</doclink>\n* <doclink href=UpgradeDoc>升級</doclink>",
+       "config-env-good": "環境檢查已完成。\n你會當安裝 MediaWiki。",
+       "config-env-bad": "環境檢查已完成。\n你無法度安裝 MediaWiki。",
+       "config-env-php": "PHP $1 已經安裝。",
+       "config-env-php-toolow": "已經安裝 PHP $1。\n但是 MediaWiki 愛 PHP $2 抑較新的版本。",
+       "config-unicode-using-utf8": "用 Brion Vibber 的 utf8_normalize.so 做 Unicode 正規化。",
+       "config-unicode-using-intl": "用 [http://pecl.php.net/intl intl PECL 擴充套件] 做 Unicode 正規化。",
+       "config-unicode-pure-php-warning": "<strong>警告:</strong> 無法度用 [http://pecl.php.net/intl intl PECL 擴充套件] 處理 Unicode 正規化,所以退回用純 PHP 實作的正規化程式,這種方式處理速度較慢。\n\n若你的網站瀏覽人數誠濟,你應該先看 [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations/zh Unicode 正規化]。",
+       "config-unicode-update-warning": "<strong>警告</strong>:這馬安裝的 Unicode 正規化包裝程式用舊版 [http://site.icu-project.org/ ICU 計劃] 的程式庫。\n若你需要用 Unicode,你應該先進行 [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations 升級]。",
+       "config-no-db": "揣無適合的資料庫驅動程式!你需要安裝 PHP 資料庫驅動程式。\n這馬支援下跤類型的資料庫: $1 。\n\n若你是家己編譯 PHP,你需要重新設定並且開資料庫客戶端,譬如:用 <code>./configure --with-mysqli</code> 指令參數。\n如你是用 Debian 或 Ubuntu 的套件安裝,你著需要閣另外安裝,例:<code>php5-mysql</code> 套件。",
+       "config-outdated-sqlite": "<strong>警告:</strong>你已經安裝 SQLite $1,毋閣伊的版本比會當裝的版本 $2閣較舊。所以你無法度用 SQLite。",
+       "config-no-fts3": "<strong>警告:</strong> SQLite 佇編譯的時陣無包括 [//sqlite.org/fts3.html FTS3 模組],後台搜揣功能就會無法度用。",
        "mainpagetext": "'''MediaWiki已經裝好矣。'''",
        "mainpagedocfooter": "請查看[//meta.wikimedia.org/wiki/Help:Contents 用者說明書]的資料通使用wiki 軟體\n\n== 入門 ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings 配置的設定]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki時常問答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki的公布列單]"
 }
index 998389b..b2d4a04 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Bhawani Gautam",
                        "RajeshPandey",
-                       "सरोज कुमार ढकाल"
+                       "सरोज कुमार ढकाल",
+                       "Ganesh Paudel"
                ]
        },
        "config-page-name": "नाम",
@@ -13,6 +14,7 @@
        "config-page-restart": "स्थापना फेरि सुरु गर्ने",
        "config-page-readme": "पढ्नुहोस्",
        "config-page-releasenotes": "प्रकाशन टिप्पणी",
+       "config-help-tooltip": "विस्तार गर्न क्लीक गर्नुहोस्",
        "mainpagetext": "'''मीडिया सफलतापूर्वक कम्प्यूटरमा स्थापित भयो ।'''",
        "mainpagedocfooter": " विकी अनुप्रयोग कसरी प्रयोग गर्ने भन्ने जानकारीको लागि  [//meta.wikimedia.org/wiki/Help:Contents प्रयोगकर्ता सहायता] हेर्नुहोस्\n\n== सुरू गर्नको लागि  ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings विन्यास सेटिङ्ग सूची]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ मेडियाविकि सामान्य प्रश्नका उत्तरहरु]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce मेडियाविकि सुचना मेलिङ्ग सूची]"
 }
index dda3d41..14321ff 100644 (file)
        "config-header-sqlite": "SQLite-instellingen",
        "config-header-oracle": "Oracle-instellingen",
        "config-header-mssql": "Instellingen voor Microsoft SQL Server",
-       "config-invalid-db-type": "Ongeldig databasetype",
+       "config-invalid-db-type": "Ongeldig databasetype.",
        "config-missing-db-name": "U moet een waarde opgeven voor \"{{int:config-db-name}}\".",
        "config-missing-db-host": "U moet een waarde invoeren voor \"{{int:config-db-host}}\".",
        "config-missing-db-server-oracle": "U moet een waarde opgeven voor \"{{int:config-db-host-oracle}}\".",
        "config-admin-email": "E-mailadres:",
        "config-admin-email-help": "Voer hier een e-mailadres in om e-mail te kunnen ontvangen van andere gebruikers op de wiki, uw wachtwoord opnieuw in te kunnen stellen en op de hoogte te worden gehouden van wijzigingen van pagina's op uw volglijst. U kunt het veld leeg laten.",
        "config-admin-error-user": "Interne fout bij het aanmaken van een beheerder met de naam \"<nowiki>$1</nowiki>\".",
-       "config-admin-error-password": "Interne fout bij het instellen van een wachtwoord voor de bejeerder \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
-       "config-admin-error-bademail": "U hebt een ongeldig e-mailadres opgegeven",
+       "config-admin-error-password": "Interne fout bij het instellen van een wachtwoord voor de beheerder \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
+       "config-admin-error-bademail": "U hebt een ongeldig e-mailadres opgegeven.",
        "config-subscribe": "Abonneren op de [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce mailinglijst releaseaankondigen].",
        "config-subscribe-help": "Dit is een mailinglijst met een laag volume voor aankondigingen van nieuwe versies, inclusief belangrijke aankondigingen met betrekking tot beveiliging.\nAbonneer uzelf erop en werk uw MediaWiki-installatie bij als er nieuwe versies uitkomen.",
        "config-subscribe-noemail": "U hebt geprobeerd zich te abonneren op de mailinglijst voor release-aankondigingen zonder een e-mailadres op te geven.\nGeef een e-mailadres op als u zich wilt abonneren op de mailinglijst.",
        "config-email-watchlist": "Volglijstmeldingen inschakelen",
        "config-email-watchlist-help": "Gebruikers toestaan meldingen te ontvangen bij wijzigingen van pagina's op hun volglijst, als dit in de voorkeuren is ingesteld.",
        "config-email-auth": "E-mailbevestiging inschakelen",
-       "config-email-auth-help": "Als deze instelling actief is, moeten gebruikers hun e-mailadres bevestigen via een verwijziging die ze per e-mail wordt toegezonden.\nAlleen bevestigde e-mailadressen kunnen e-mail ontvangen van andere gebruikers of wijzigingsnotificaties ontvangen.\nHet inschakelen van deze instelling wordt '''aangeraden''' voor openbare wiki's vanwege de mogelijkheden voor misbruik van e-mailmogelijkheden.",
+       "config-email-auth-help": "Als deze instelling actief is, moeten gebruikers hun e-mailadres bevestigen via een verwijziging die zij per e-mail wordt toegezonden.\nAlleen bevestigde e-mailadressen kunnen e-mail ontvangen van andere gebruikers of wijzigingsnotificaties ontvangen.\nHet inschakelen van deze instelling wordt '''aangeraden''' voor openbare wiki's vanwege de mogelijkheden voor misbruik van e-mailmogelijkheden.",
        "config-email-sender": "E-mailadres voor antwoorden:",
        "config-email-sender-help": "Voer het e-mailadres in dat u wilt gebruiken als antwoordadres voor uitgaande e-mail.\nAls een e-mail niet bezorgd kan worden, wordt dat op dit e-mailadres gemeld.\nVeel mailservers vereisen dat tenminste het domein bestaat.",
        "config-upload-settings": "Afbeeldingen en bestanden uploaden",
index 2790f6c..20f0b3e 100644 (file)
@@ -11,7 +11,8 @@
                        "Anaclaudiaml",
                        "Cybermandrake",
                        "Fabsouza1",
-                       "Rodrigo codignoli"
+                       "Rodrigo codignoli",
+                       "Tuliouel"
                ]
        },
        "config-desc": "O instalador do MediaWiki",
        "config-git": "Foi encontrado o software de controle de versão Git: <code>$1</code>.",
        "config-git-bad": "Não foi encontrado o software de controle de versão Git.",
        "config-imagemagick": "ImageMagick encontrado: <code>$1</code> .\nRedimensionamento de imagem será ativado se você permitir uploads.",
+       "config-gd": "Encontrada biblioteca gráfica GD embutida\nO redimensionamento de imagens será habilitado se você permitir uploads.",
+       "config-no-scaling": "Não foi possível encontrar biblioteca GD ou ImageMagick. \nO redimensionamento de imagens será desabilitado.",
        "config-no-uri": "<strong>Erro:</strong> Não foi possível determinar a URI atual. A instalação foi abortada.",
+       "config-no-cli-uri": "<strong>Aviso:</strong> Nenhum <code>--scriptpath</code> foi especificado, usando o padrão: <code>$1</code>.",
        "config-using-server": "Utilizando o nome do servidor \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Usando URL do servidor \"<nowiki>$1$2</nowiki>\".",
        "config-db-type": "Tipo de base de dados:",
        "config-db-install-username": "Digite o nome de usuário que será utilizado para conectar com o banco de dados durante o processo de instalação.\nEste não é a conta de usuário do MediaWiki; este é o nome de usuário para sua base de dados.",
        "config-db-install-password": "Digite a senha que será utilizada para conectar com o banco de dados durante o processo de instalação.\nEsta não é a senha de usuário da conta do MediaWiki; esta será a senha para seu banco de dados.",
        "config-db-install-help": "Digite o nome de usuário e a senha que serão utilizados para conectar com o banco de dados durante o processo de instalação.",
+       "config-db-wiki-account": "Conta de usuário para operação normal",
+       "config-db-wiki-help": "Digite o nome de usuário e senha que será usada para se conectar ao banco de dados durante a operação normal wiki.\nSe a conta não existir, e a conta de instalação tiver privilégios suficientes, a conta do usuário será criada com os privilégios mínimos necessários para o funcionamento do wiki.",
        "config-db-prefix": "Prefixo da tabela de banco de dados:",
        "config-db-prefix-help": "Se você precisar compartilhar a base de dados entre várias wikis, ou entre o MediaWiki e uma outra aplicação web, você pode deve escolher adicionar um prefixo ao nome de todas as tabelas para evitar conflitos.\nNão utilize espaços.\n\nEste campo é habitualmente deixado em branco.",
        "config-db-charset": "Conjunto de caracteres do banco de dados",
        "config-charset-mysql5-binary": "MySQL 4.1/5.0 binary",
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
+       "config-charset-mysql4": "MySQL 4.0 compatível com versões anteriores UTF-8",
        "config-mysql-old": "MySQL $1 ou posterior é necessário. Você tem $2.",
        "config-db-port": "Porta da base de dados:",
        "config-db-schema": "Esquema para MediaWiki",
        "config-missing-db-name": "Você deve inserir um valor para \"{{int:config-db-name}}\".",
        "config-missing-db-host": "Você deve inserir um valor para \"{{int:config-db-host}}\".",
        "config-missing-db-server-oracle": "Você deve inserir um valor para \"{{int:config-db-host-oracle}}\".",
-       "config-connection-error": "$1\n\nVerifique o servidor hospedeiro, nome de usuário e senha e tente novamente.",
+       "config-connection-error": "$1\n\nVerifique o servidor, nome de usuário e senha e tente novamente.",
        "config-db-sys-user-exists-oracle": "A conta de usuário $1 já existe. SYSDBA somente pode ser utilizado na criação de uma nova conta!",
        "config-postgres-old": "PostgreSQL $1 ou posterior é necessário. Você tem $2.",
        "config-mssql-old": "Microsoft SQL Server $1 ou posterior é necessário.Você tem $2.",
        "config-sqlite-connection-error": "$1\n\nVerifique o diretório de dados e nome da base de dados abaixo e tente novamente.",
        "config-sqlite-readonly": "Não é possível escrever no arquivo <code>$1</code>.",
        "config-sqlite-cant-create-db": "Não foi possível criar o arquivo da base de dados <code>$1</code>.",
+       "config-regenerate": "Regenerar arquivo LocalSettings.php →",
+       "config-show-table-status": "Consulta <code>SHOW TABLE STATUS</code> falhou!",
+       "config-unknown-collation": "<strong>Aviso:</strong> O banco de dados está usando agrupamento não reconhecido.",
        "config-db-web-account": "Conta da base de dados para acesso web",
        "config-db-web-help": "Escolha um nome de usuário e uma senha que o servidor web irá utilizar para se conectar ao servidor da base de dados durante o funcionamento normal da wiki.",
        "config-db-web-account-same": "Use a mesma conta usada na instalação",
        "config-advanced-settings": "Configuração avançada",
        "config-extensions": "Extensões",
        "config-install-step-done": "feito",
+       "config-install-extensions": "Incluindo extensões",
        "config-install-database": "Criando base de dados",
+       "config-install-schema": "Criando esquema",
+       "config-install-pg-commit": "Enviando alterações",
+       "config-install-user": "Criando usuário de banco de dados",
+       "config-install-user-alreadyexists": "O usuário \"$1\" já existe!",
        "config-install-user-missing-create": "O usuário especificado \" $1 \" não existe.\nPor favor, clique na opção de \"criar conta\" abaixo se você deseja criá-lo.",
        "config-install-tables": "Criando tabelas",
        "config-install-tables-exist": "'''Aviso''': As tabelas do MediaWiki parecem já existir.\nA criação das tabelas será pulada.",
        "config-install-done": "<strong>Parabéns!</strong>\nVocê concluiu a instalação do MediaWiki.\n\nO instalador gerou um arquivo <code>LocalSettings.php</code>.\nEste arquivo contém todas as suas configurações.\n\nVocê precisa fazer o download desse arquivo e colocá-lo na raiz da sua instalação (o mesmo diretório onde está o arquivo <code>index.php</code>). Este download deve ter sido iniciado automaticamente.\n\nSe o download não foi iniciado, ou se ele foi cancelado, pode recomeçá-lo clicando no link abaixo:\n\n$3\n\n<strong>Nota</strong>: Se não fizer isto agora, o arquivo que foi gerado não estará disponível depois que você sair do processo de instalação sem baixá-lo.\n\nQuando isso tiver sido feito, pode <strong>[$2 entrar na sua wiki]</strong>.",
        "config-download-localsettings": "Baixar <code>LocalSettings.php</code>",
        "config-help": "ajuda",
-       "config-nofile": "O arquivo \"$1\" não pode ser encontrado. Este arquivo foi apagado?",
+       "config-nofile": "O arquivo \"$1\" não foi encontrado. Ele foi apagado?",
        "config-extension-link": "Você sabia que sua wiki suporta [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensões]?\n\nVocê pode explorar as  [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensões por categoria] ou visitar a [//www.mediawiki.org/wiki/Extension_Matrix Matriz de Extensões] para ver a lista completa.",
        "mainpagetext": "<strong>O MediaWiki foi instalado com sucesso.</strong>",
        "mainpagedocfooter": "Consulte o [//meta.wikimedia.org/wiki/Help:Contents Manual de Usuário] para informações de como usar o software wiki.\n\n== Começando ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de opções de configuração]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ do MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussão com avisos de novas versões do MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traduza o MediaWiki para seu idioma]"
index 2fcf9a5..7725734 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Firilacroco",
                        "Minisarm",
-                       "Stelistcristi"
+                       "Stelistcristi",
+                       "XXN"
                ]
        },
        "config-desc": "Programul de instalare pentru MediaWiki",
@@ -62,6 +63,7 @@
        "config-header-postgres": "Setări PostgreSQL",
        "config-header-sqlite": "Setări SQLite",
        "config-header-oracle": "Setări Oracle",
+       "config-header-mssql": "Setări Microsoft SQL Server",
        "config-invalid-db-type": "Tip de bază de date incorect",
        "config-missing-db-name": "Trebuie să introduci o valoare pentru „Numele bazei de date”",
        "config-connection-error": "$1.\n\nVerificați gazda, numele de utilizator și parola și reîncercați.",
index bee8498..950ee44 100644 (file)
@@ -56,6 +56,7 @@
        "config-mssql-auth": "Тип провере идентитета:",
        "config-mssql-sqlauth": "Провера идентитета за SQL Server",
        "config-mssql-windowsauth": "Провера идентитета Windows-а",
+       "config-site-name": "Име викија:",
        "config-admin-name": "Корисничко име:",
        "config-admin-password": "Лозинка:",
        "config-admin-email": "Адреса е-поште:",
@@ -64,6 +65,7 @@
        "config-license-cc-by-sa": "Creative Commons Ауторство-Делити под истим условима (CC BY-SA)",
        "config-license-cc-by": "Creative Commons Ауторство (CC BY)",
        "config-license-cc-by-nc-sa": "Creative Commons Ауторство-Некомерцијално-Делити под истим условима (CC BY-NC-SA)",
+       "config-license-cc-0": "Creative Commons Zero (јавно власништво)",
        "config-license-gfdl": "ГНУ-ова лиценца за слободну документацију верзија 1.3 или новија верзија",
        "config-license-pd": "Јавно власништво",
        "mainpagetext": "'''Медијавики је успешно инсталиран.'''",
index 9ef85db..a0cd5f5 100644 (file)
@@ -1,5 +1,9 @@
 {
-       "@metadata": [],
+       "@metadata": {
+               "authors": [
+                       "Milicevic01"
+               ]
+       },
        "config-session-error": "Greška pri započinjanju sesije: $1",
        "config-session-expired": "Vaši podaci o sesiji su istekli.\nSesije su podešene da traju $1.\nNjihov rok možete povećati postavljanjem <code>session.gc_maxlifetime</code> u php.ini.\nPonovo pokrenite instalaciju.",
        "config-no-session": "Vaši podaci o sesiji su izgubljeni!\nProverite Vaš php.ini i obezbedite da je <code>session.save_path</code> postavljen na odgovarajući direktorijum.",
@@ -28,6 +32,8 @@
        "config-type-postgres": "PostgreSQL",
        "config-type-sqlite": "SQLite",
        "config-type-oracle": "Oracle",
+       "config-site-name": "Ime vikija:",
+       "config-license-cc-0": "Creative Commons Zero (javno vlasništvo)",
        "mainpagetext": "'''MedijaViki je uspešno instaliran.'''",
        "mainpagedocfooter": "Molimo vidite [//meta.wikimedia.org/wiki/Help:Contents korisnički vodič] za informacije o upotrebi viki softvera.\n\n== Za početak ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Pomoć u vezi sa podešavanjima]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Najčešće postavljena pitanja]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mejling lista o izdanjima MedijaVikija]"
 }
index b53706d..c04765b 100644 (file)
@@ -65,6 +65,7 @@
        "config-mbstring": "'''Kritiskt: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] är aktiv!'''\nDetta alternativ orsakar fel och kan korrumpera data oförutsägbart.\nDu kan inte installera eller använda MediaWiki om detta alternativ är aktiverat.",
        "config-safe-mode": "''' Varning:''' PHP:s [http://www.php.net/features.safe-mode felsäkra läge] är aktivt.\nDet kan orsaka problem, särskilt om du använder filuppladdningar och <code>math</code>-stöd.",
        "config-xml-bad": "PHP:s XML-modul saknas.\nMediaWiki kräver funktioner i denna modul och kommer inte att fungera i den här konfigurationen.\nOm du kör Mandrake, installera php-xml-paketet.",
+       "config-pcre-old": "'''Kritiskt:''' PCRE $1 eller senare krävs.\nDin PHP-binär är länkad till PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mer information].",
        "config-pcre-no-utf8": "'''Kritiskt:''' PHP:s PCRE-modul verkar vara kompilerat utan PCRE_UTF8-stöd.\nMediaWiki kräver stöd för UTF-8 för att fungera korrekt.",
        "config-memory-raised": "PHPs <code>memory_limit</code> är $1, ökad till $2.",
        "config-memory-bad": "''' Varning:''' PHP:s <code>memory_limit</code> är $1.\nDetta är förmodligen för lågt.\nInstallationen kan misslyckas!",
        "config-header-postgres": "PostgreSQL-inställningar",
        "config-header-sqlite": "SQLite-inställningar",
        "config-header-oracle": "Oracle-inställningar",
+       "config-header-mssql": "Inställningar för Microsoft SQL Server",
        "config-invalid-db-type": "Ogiltig databastyp",
        "config-missing-db-name": "Du måste ange ett värde för \"{{int:config-db-name}}\".",
        "config-missing-db-host": "Du måste ange ett värde för \"{{int:config-db-host}}\".",
        "config-ns-generic": "Projekt",
        "config-ns-site-name": "Samma som wikinamnet: $1",
        "config-ns-other": "Annan (specificera)",
+       "config-ns-other-default": "MinWiki",
        "config-ns-invalid": "Den angivna namnrymden \"<nowiki>$1</nowiki>\" är ogiltig.\nAnge en annan namnrymd för projektet.",
        "config-ns-conflict": "Den angivna namnrymden \"<nowiki>$1</nowiki>\" står i konflikt med en standardnamnrymd för MediaWiki.\nAnge en annan namnrymd för projektet.",
        "config-admin-box": "Administratörskonto",
index 5d795e7..9a894c2 100644 (file)
        "config-db-install-account": "Account ng tagagamit para sa pagluluklok",
        "config-db-username": "Pangalang pangtagagamit ng kalipunan ng dato:",
        "config-db-password": "Password sa kalipunan ng dato:",
-       "config-db-password-empty": "Paki magpasok ng isang hudyat para sa bagong tagagamit ng kalipunan ng dato: $1.\nHabang maging maaari na makalikha ng mga tagagamit na walang mga hudyat, hindi ito ligtas.",
+       "config-db-password-empty": "Paki magpasok ng isang password para sa bagong tagagamit ng databas: $1.\nHabang maging maaari na makalikha ng mga tagagamit na walang mga passwrod, hindi ito ligtas.",
        "config-db-install-username": "Ipasok ang pangalan ng tagagamit na gagamitin upang kumabit sa database habang isinasagawa ang pag-install.\nHindi ito ang pangalan ng tagagamit ng account ng MediaWiki; ito ang pangalan ng tagagamit para sa iyong database.",
        "config-db-install-password": "Ipasok ang password na gagamitin upang maka-connect sa database habang isinasagawa ang pag-install.\nHindi ito ang password para sa account ng MediaWiki; ito ang password para sa iyong database.",
-       "config-db-install-help": "Ipasok ang pangalan ng tagagamit at hudyat na gagamitin upang umugnay sa kalipunan ng dato habang isinasagawa ang pagluluklok.",
+       "config-db-install-help": "Ipasok ang pangalan ng tagagamit at password na gagamitin upang umugnay sa databasehabang isinasagawa ang pag-install.",
        "config-db-account-lock": "Gamitin ang kaparehong pangalan at password habang nasa normal na operasyon",
        "config-db-wiki-account": "Account ng tagagamit para sa pangkaraniwang pagpapaandar",
        "config-db-wiki-help": "Ipasok ang pangalan ng tagagamit at password na gagamitin upang kumabit sa database habang nasa karaniwang pagtakbo ng wiki.\nKung hindi umiiral ang account, at ang pag-install ng account ay mayroong sapat na mga pribilehiyo, ang account na ito ng tagagamit ay lilikhain na mayroong pinaka mababang mga pribilehiyo na kailangan upang mapatakbo ang wiki.",
        "config-db-schema-help": "Ang nasa itaas na panukala ay pangkaraniwang magiging maayos.\nBaguhin lamang ito kung alam mong kinakailangan.",
        "config-pg-test-error": "Hindi makakabit sa kalipunan ng dato na '''$1''': $2",
        "config-sqlite-dir": "Direktoryo ng dato ng SQLite:",
-       "config-sqlite-dir-help": "Iniimbak ng SQLite ang lahat ng dato sa loob ng isang nag-iisang talaksan.\n\nAng ibibigay mong direktoryo ay dapat na maging masusulatan ng tagapaghain ng kasaputan habang nagluluklok.\n\n'''Hindi''' ito dapat na mapuntahan sa pamamagitan ng kasaputan, ito ang dahilan kung bakit hindi namin ito inilalagay sa kung nasaan ang iyong mga talaksan ng PHP.\n\nAng tagapagluklok ay magsusulat ng isang talaksang <code>.htaccess</code> na kasama ito, subalit kapag nabigo iyon mayroong isang tao na maaaring makakuha ng pagka nakakapunta sa iyong hilaw na kalipunan ng dato.\nKasama riyan ang hilaw na dato ng tagagamit (mga tirahan ng e-liham, pinaghalong mga hudyat) pati na ang nabura nang mga pagbabago at iba pang may pagbabawal na dato sa ibabaw ng wiki.\n\nIsaalang-alang ang paglalagay na magkakasama ang kalipunan ng dato sa ibang lugar, halimbawa na ang sa loob ng <code>/var/lib/mediawiki/yourwiki</code>.",
+       "config-sqlite-dir-help": "Iniimbak ng SQLite ang lahat ng dato sa loob ng isang nag-iisang file.\n\nAng ibibigay mong directory ay dapat na maging masusulatan ng tagapaghain ng kasaputan habang nag-i-install.\n\n'''Hindi''' ito dapat na mapuntahan sa pamamagitan ng web server, ito ang dahilan kung bakit hindi namin ito inilalagay sa kung nasaan ang iyong mga file ng PHP.\n\nAng installer ay magsusulat ng isang file na <code>.htaccess</code> na kasama ito, subalit kapag nabigo iyon mayroong isang tao na maaaring makakuha ng pagka nakakapunta sa iyong hilaw na database.\nKasama riyan ang hilaw na dato ng tagagamit (mga email address, pinaghalong mga password) pati na ang nabura nang mga pagbabago at iba pang may pagbabawal na dato ng wiki.\n\nIsaalang-alang ang paglalagay na magkakasama ang database sa ibang lugar, halimbawa na ang sa loob ng <code>/var/lib/mediawiki/yourwiki</code>.",
        "config-oracle-def-ts": "Likas na nakatakdang puwang ng talahanayan:",
        "config-oracle-temp-ts": "Pansamantalang puwang ng talahanayan:",
        "config-type-mysql": "MySQL",
        "config-show-table-status": "Nabigo ang pagtatanong na IPAKITA ANG KALAGAYAN NG TALAHANAYAN!",
        "config-unknown-collation": "'''Babala:''' Ang kalipunan ng dato ay gumagagamit ng hindi nakikilalang pag-iipon.",
        "config-db-web-account": "Account ng kalipunan ng dato para sa pagpunta sa web",
-       "config-db-web-help": "Piliin ang pangalan ng tagagamit at hudyat na gagamitin ng tagapaghain ng web upang umugnay sa tagapaghain ng kalipunan ng dato, habang nasa pangkaraniwang pagtakbo ng wiki.",
+       "config-db-web-help": "Piliin ang pangalan ng tagagamit at password na gagamitin ng tagapaghain ng web upang umugnay sa tagapaghain ng database, habang nasa pangkaraniwang pagtakbo ng wiki.",
        "config-db-web-account-same": "Gamitin ang gayun din account katulad ng sa pag-install",
        "config-db-web-create": "Likhain ang account kung hindi pa ito umiiral",
        "config-db-web-no-create-privs": "Ang tinukoy mong account na iluluklok ay walang sapat na mga pribilehiyo upang makalikha ng isang account.\nAng account na tutukuyin mo rito ay umiiral na dapat.",
        "config-admin-password-blank": "Magpasok ng isang password para sa account ng tagapangasiwa.",
        "config-admin-password-mismatch": "Hindi magkatugma ang ipinasok mong dalawang mga password.",
        "config-admin-email": "Tirahan ng e-liham:",
-       "config-admin-email-help": "Magpasok dito ng isang tirahan ng e-liham upang mapahintulutan kang makatanggap ng e-liham mula sa iba pang mga tagagamit sa ibabaw ng wiki, itakdang muli ang hudyat mo, at mapabatiran ng mga pagbabago sa mga pahinang nasa ibabaw ng iyong tala ng mga binabantayan. Maiiwanan mo na walang laman ang hanay na ito.",
+       "config-admin-email-help": "Magpasok dito ng isang email address upang mapahintulutan kang makatanggap ng email mula sa iba pang mga tagagamit ng wiki, itakdang muli ang password mo, at mabatid ang mga pagbabago sa mga pahinang nasa ibabaw ng iyong tala ng mga binabantayan. Maiiwanan mo na walang laman ang field na ito.",
        "config-admin-error-user": "Panloob na kamalian kapag nililikha ang isang tagapangasiwa na may pangalang \"<nowiki>$1</nowiki>\".",
-       "config-admin-error-password": "Panloob na kamalian kapag nagtatakda ng isang hudyat na para sa tagapangasiwang \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
+       "config-admin-error-password": "Panloob na kamalian kapag nagtatakda ng isang password na para sa tagapangasiwang \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
        "config-admin-error-bademail": "Nagpasok ka ng isang hindi katanggap-tanggap na tirahan ng e-liham.",
        "config-subscribe": "Tumanggap mula sa [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce talaan ng mga pinadadalhan ng mga nilalabas na mga pabatid].",
        "config-subscribe-help": "Isang itong tala ng pagliliham na mababa ang dami na ginagamit para sa pagpapakawala ng mga pahayag, kabilang na ang mahahalagang mga pahayag na pangkatiwasayan. Dapat kang magpasipi nito at isapanahon ang iyong nakaluklok na MediaWiki kapag lumalabas ang bagong mga bersiyon.",
index d4f7e18..6ec8860 100644 (file)
@@ -5,7 +5,8 @@
                        "Joseph",
                        "Rhinestorm",
                        "SiLveRLeaD",
-                       "Trncmvsr"
+                       "Trncmvsr",
+                       "Sayginer"
                ]
        },
        "config-desc": "MediaWiki yükleyicisi",
@@ -71,6 +72,7 @@
        "config-db-install-account": "Yükleme için kullanıcı hesabı",
        "config-db-username": "Veritabanı kullanıcı adı:",
        "config-db-password": "Veritabanı parolası:",
+       "config-db-username-empty": "\"{{int:config-db-username}}\" için bir değer girmelisiniz.",
        "config-db-install-username": "Yükleme sırasında veritabanına bağlanmak için kullanılan kullanıcı adını girin.\nBu MediaWiki hesabının kullanıcı adı değildir; Bu veritabanın kullanıcı adıdır.",
        "config-db-wiki-account": "Kullanıcı hesabı için normal işlem",
        "config-db-prefix": "Veritabanı Tablo öneki:",
        "config-admin-name": "Kullanıcı adınız:",
        "config-admin-password": "Şifre:",
        "config-admin-password-confirm": "Şifre tekrar:",
+       "config-admin-help": "Buraya tercih ettiğiniz kullanıcı adını girin; örneğin \"Joe Bloggs\". Bu vikide oturum açmak için kullanacağınız addır.",
        "config-admin-name-blank": "Bir yönetici kullanıcı adını giriniz.",
        "config-admin-name-invalid": "Belirtilen ad \"<nowiki> $1 </nowiki>\" geçersiz.\nFarklı bir kullanıcı adı belirtin.",
        "config-admin-password-blank": "Yönetici hesabı için bir parola girin.",
        "config-optional-skip": "Şimdiden sıkıldım, sadece wikiyi yükle.",
        "config-profile": "Kullanıcı hakları profili:",
        "config-profile-wiki": "Açık wiki",
+       "config-profile-no-anon": "Hesap oluşturmak gerekli",
        "config-profile-fishbowl": "Yalnızca yetkili editörler",
        "config-profile-private": "Özel wiki",
+       "config-profile-help": "Vikiler, mümkün olan en fazla kişiye değişiklik imkânı verdiğinizde, en iyi şekilde çalışır.\nMediaWiki'de son değişiklikleri incelemek ve tecrübesiz veya kötü niyetli kullanıcıların verdiği zararları geri almak kolaydır.\n\nAncak birçok kişi MediaWiki'yi farklı şekillerde kullanışlı bulmaktadır ve bazen herkesi viki yolunun faydalarına ikna etmek zordur.\nYani seçim sizin.\n\n<strong>{{int:config-profile-wiki}}</strong> modeli, giriş yapmamış olsa bile herkese değişiklik izni verir.\n\n<strong>{{int:config-profile-no-anon}}</strong> kullanan bir viki ise daha izlenebilirdir ancak sıradan, basit, gündelik katkı yapan kullanıcıları caydırabilir.\n\n<strong>{{int:config-profile-fishbowl}}</strong> onaylanmış kullanıcıların değişikliklerine izin verir ama herkes sayfaları ve sayfa geçmişlerini görebilir.\n\n<strong>{{int:config-profile-private}}</strong> sadece onaylanmış kullanıcıları değişiklik yapma ve sayfaları görme imkânı tanır.\n\nDaha karmaşık kullanıcı hakkı ayarları, yüklemeden sonra görülebilir; [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights ilgili kılavuza] bakınız.",
        "config-license": "Telif Hakkı ve Lisans",
        "config-license-gfdl": "GNU Free Documentation License 1.3 veya üstü",
        "config-license-pd": "Kamu Malı",
        "config-email-settings": "E-posta ayarları",
        "config-enable-email": "Giden e-posta etkinleştirme",
        "config-email-user": "Kullanıcıdan kullanıcıya e-posta gönderimini etkinleştir",
+       "config-email-user-help": "Eğer tercihlerinde etkinleştirmişlerse, kullanıcıların birbirlerine e-posta göndermesine izin ver.",
+       "config-email-usertalk": "Kullanıcı mesaj sayfası bildirimlerini etkinleştir",
        "config-email-watchlist": "Watchlist bildirimini etkinleştirmek",
        "config-email-auth": "E-posta kimlik doğrulamasını etkinleştir",
        "config-email-sender": "E-posta adresini ayarlayın",
index d5f06a0..fcb7a3e 100644 (file)
@@ -18,7 +18,8 @@
                        "Liuxinyu970226",
                        "Qiyue2001",
                        "Kuailong",
-                       "Zjzengdongyang"
+                       "Zjzengdongyang",
+                       "Mywood"
                ]
        },
        "config-desc": "MediaWiki安装程序",
        "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons 即时共享资源]可以让wiki使用来自[//commons.wikimedia.org/ 维基共享资源]网站的图像、音频和其他媒体文件。要启用该功能,MediaWiki必须能够访问互联网。\n\n有关此功能的详细信息,包括如何将其他wiki网站设为具有类似共享功能的方法,请参考[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos 手册]。",
        "config-cc-error": "知识共享许可证挑选器无法找到结果,请手动输入许可证的名称。",
        "config-cc-again": "重新挑选……",
-       "config-cc-not-chosen": "选择您希望使用的知识共享许可证,并点击“继续”。",
+       "config-cc-not-chosen": "选择你想要的知识共享许可协议并单击“proceed”。",
        "config-advanced-settings": "高级设置",
        "config-cache-options": "对象缓存设置:",
        "config-cache-help": "对象缓存可通过缓存频繁使用的数据来提高MediaWiki的速度。高度推荐中到大型的网站启用该功能,小型网站亦能从其中受益。",
index 16908a7..98a78c5 100644 (file)
@@ -389,6 +389,10 @@ class JobQueueGroup {
                        }
                }
 
+               if ( $count === 0 ) {
+                       return $count; // nothing to update
+               }
+
                $wgMemc->merge( $key, function ( $cache, $key, $lastRuns ) use ( $tasksRun ) {
                        if ( is_array( $lastRuns ) ) {
                                foreach ( $tasksRun as $type => $tasks ) {
index 2aec3c9..df9ae39 100644 (file)
@@ -75,7 +75,10 @@ class JobQueueAggregatorRedis extends JobQueueAggregator {
                        return false;
                }
                try {
+                       $conn->multi( Redis::PIPELINE );
+                       $conn->hSetNx( $this->getQueueTypesKey(), $type, 'enabled' );
                        $conn->hSet( $this->getReadyQueueKey(), $this->encQueueName( $type, $wiki ), time() );
+                       $conn->exec();
 
                        return true;
                } catch ( RedisException $e ) {
@@ -115,16 +118,19 @@ class JobQueueAggregatorRedis extends JobQueueAggregator {
 
                                $pendingDBs = $this->findPendingWikiQueues(); // (type => list of wikis)
 
-                               $conn->delete( $this->getReadyQueueKey() . ":lock" ); // unlock
-
+                               $conn->multi( Redis::PIPELINE );
                                $now = time();
                                $map = array();
                                foreach ( $pendingDBs as $type => $wikis ) {
+                                       $conn->hSetNx( $this->getQueueTypesKey(), $type, 'enabled' );
                                        foreach ( $wikis as $wiki ) {
                                                $map[$this->encQueueName( $type, $wiki )] = $now;
                                        }
                                }
                                $conn->hMSet( $this->getReadyQueueKey(), $map );
+                               $conn->exec();
+
+                               $conn->delete( $this->getReadyQueueKey() . ":lock" ); // unlock
                        }
 
                        return $pendingDBs;
@@ -142,6 +148,7 @@ class JobQueueAggregatorRedis extends JobQueueAggregator {
                }
                try {
                        $conn->delete( $this->getReadyQueueKey() );
+                       // leave key at getQueueTypesKey() alone
                } catch ( RedisException $e ) {
                        $this->handleException( $conn, $e );
 
@@ -185,6 +192,13 @@ class JobQueueAggregatorRedis extends JobQueueAggregator {
                return "jobqueue:aggregator:h-ready-queues:v1"; // global
        }
 
+       /**
+        * @return string
+        */
+       private function getQueueTypesKey() {
+               return "jobqueue:aggregator:h-queue-types:v1"; // global
+       }
+
        /**
         * @param string $type
         * @param string $wiki
index d893be5..bebe3a9 100644 (file)
@@ -504,6 +504,10 @@ class ManualLogEntry extends LogEntryBase {
                        'log_comment' => $comment,
                        'log_params' => serialize( (array)$this->getParameters() ),
                );
+               if ( isset( $this->deleted ) ) {
+                       $data['log_deleted'] = $this->deleted;
+               }
+
                $dbw->insert( 'logging', $data, __METHOD__ );
                $this->id = !is_null( $id ) ? $id : $dbw->insertId();
 
index f131af4..f6717cd 100644 (file)
@@ -108,10 +108,20 @@ abstract class MediaHandler {
         * Get an image size array like that returned by getimagesize(), or false if it
         * can't be determined.
         *
+        * This function is used for determining the width, height and bitdepth directly
+        * from an image. The results are stored in the database in the img_width,
+        * img_height, img_bits fields.
+        *
+        * @note If this is a multipage file, return the width and height of the
+        *  first page.
+        *
         * @param File $image The image object, or false if there isn't one
         * @param string $path the filename
         * @return array Follow the format of PHP getimagesize() internal function.
-        *   See http://www.php.net/getimagesize
+        *   See http://www.php.net/getimagesize. MediaWiki will only ever use the
+        *   first two array keys (the width and height), and the 'bits' associative
+        *   key. All other array keys are ignored. Returning a 'bits' key is optional
+        *   as not all formats have a notion of "bitdepth".
         */
        abstract function getImageSize( $image, $path );
 
@@ -121,7 +131,7 @@ abstract class MediaHandler {
         * @param File $image The image object, or false if there isn't one.
         *   Warning, FSFile::getPropsFromPath might pass an (object)array() instead (!)
         * @param string $path The filename
-        * @return string
+        * @return string A string of metadata in php serialized form (Run through serialize())
         */
        function getMetadata( $image, $path ) {
                return '';
@@ -132,7 +142,7 @@ abstract class MediaHandler {
         *
         * This is not used for validating metadata, this is used for the api when returning
         * metadata, since api content formats should stay the same over time, and so things
-        * using ForiegnApiRepo can keep backwards compatibility
+        * using ForeignApiRepo can keep backwards compatibility
         *
         * All core media handlers share a common version number, and extensions can
         * use the GetMetadataVersion hook to append to the array (they should append a unique
@@ -175,6 +185,8 @@ abstract class MediaHandler {
 
        /**
         * Get a string describing the type of metadata, for display purposes.
+        *
+        * @note This method is currently unused.
         * @param File $image
         * @return string
         */
@@ -187,10 +199,15 @@ abstract class MediaHandler {
         * If it returns MediaHandler::METADATA_BAD (or false), Image
         * will reload the metadata from the file and update the database.
         * MediaHandler::METADATA_GOOD for if the metadata is a-ok,
-        * MediaHanlder::METADATA_COMPATIBLE if metadata is old but backwards
+        * MediaHandler::METADATA_COMPATIBLE if metadata is old but backwards
         * compatible (which may or may not trigger a metadata reload).
+        *
+        * @note Returning self::METADATA_BAD will trigger a metadata reload from
+        *  file on page view. Always returning this from a broken file, or suddenly
+        *  triggering as bad metadata for a large number of files can cause
+        *  performance problems.
         * @param File $image
-        * @param array $metadata
+        * @param string $metadata The metadata in serialized form
         * @return bool
         */
        function isMetadataValid( $image, $metadata ) {
@@ -579,9 +596,7 @@ abstract class MediaHandler {
         * @return string
         */
        function getShortDesc( $file ) {
-               global $wgLang;
-
-               return htmlspecialchars( $wgLang->formatSize( $file->getSize() ) );
+               return self::getGeneralShortDesc( $file );
        }
 
        /**
@@ -591,10 +606,7 @@ abstract class MediaHandler {
         * @return string
         */
        function getLongDesc( $file ) {
-               global $wgLang;
-
-               return wfMessage( 'file-info', htmlspecialchars( $wgLang->formatSize( $file->getSize() ) ),
-                       $file->getMimeType() )->parse();
+               return self::getGeneralLongDesc( $file );
        }
 
        /**
@@ -606,7 +618,7 @@ abstract class MediaHandler {
        static function getGeneralShortDesc( $file ) {
                global $wgLang;
 
-               return $wgLang->formatSize( $file->getSize() );
+               return htmlspecialchars( $wgLang->formatSize( $file->getSize() ) );
        }
 
        /**
@@ -616,10 +628,8 @@ abstract class MediaHandler {
         * @return string
         */
        static function getGeneralLongDesc( $file ) {
-               global $wgLang;
-
-               return wfMessage( 'file-info', $wgLang->formatSize( $file->getSize() ),
-                       $file->getMimeType() )->parse();
+               return wfMessage( 'file-info' )->sizeParams( $file->getSize() )
+                       ->params( $file->getMimeType() )->parse();
        }
 
        /**
@@ -812,4 +822,13 @@ abstract class MediaHandler {
        public function getLength( $file ) {
                return 0.0;
        }
+
+       /**
+        * True if creating thumbnails from the file is large or otherwise resource-intensive.
+        * @param File $file
+        * @return bool
+        */
+       public function isExpensiveToThumbnail( $file ) {
+               return false;
+       }
 }
index 5a10741..e28b38f 100644 (file)
@@ -116,7 +116,7 @@ class SvgHandler extends ImageHandler {
        /**
         * We do not support making animated svg thumbnails
         */
-       function canAnimateThumb( $file ) {
+       function canAnimateThumbnail( $file ) {
                return false;
        }
 
index 6964170..bea6cab 100644 (file)
@@ -27,6 +27,8 @@
  * @ingroup Media
  */
 class TiffHandler extends ExifBitmapHandler {
+       const EXPENSIVE_SIZE_LIMIT = 10485760; // TIFF files over 10M are considered expensive to thumbnail
+
        /**
         * Conversion to PNG for inline display can be disabled here...
         * Note scaling should work with ImageMagick, but may not with GD scaling.
@@ -97,4 +99,8 @@ class TiffHandler extends ExifBitmapHandler {
                        return '';
                }
        }
+
+       public function isExpensiveToThumbnail( $file ) {
+               return $file->getSize() > static::EXPENSIVE_SIZE_LIMIT;
+       }
 }
index 9de840b..7990053 100644 (file)
@@ -419,6 +419,12 @@ class MWMemcached {
                        $this->_debugprint( "get($key)\n" );
                }
 
+               if ( !is_array( $key ) && strval( $key ) === '' ) {
+                       $this->_debugprint( "Skipping key which equals to an empty string" );
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+
                if ( !$this->_active ) {
                        wfProfileOut( __METHOD__ );
                        return false;
diff --git a/includes/page/Article.php b/includes/page/Article.php
new file mode 100644 (file)
index 0000000..3244d87
--- /dev/null
@@ -0,0 +1,2100 @@
+<?php
+/**
+ * User interface for page actions.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Class for viewing MediaWiki article and history.
+ *
+ * This maintains WikiPage functions for backwards compatibility.
+ *
+ * @todo Move and rewrite code to an Action class
+ *
+ * See design.txt for an overview.
+ * Note: edit user interface and cache support functions have been
+ * moved to separate EditPage and HTMLFileCache classes.
+ *
+ * @internal documentation reviewed 15 Mar 2010
+ */
+class Article implements Page {
+       /** @var IContextSource The context this Article is executed in */
+       protected $mContext;
+
+       /** @var WikiPage The WikiPage object of this instance */
+       protected $mPage;
+
+       /** @var ParserOptions ParserOptions object for $wgUser articles */
+       public $mParserOptions;
+
+       /**
+        * @var string Text of the revision we are working on
+        * @todo BC cruft
+        */
+       public $mContent;
+
+       /**
+        * @var Content Content of the revision we are working on
+        * @since 1.21
+        */
+       protected $mContentObject;
+
+       /** @var bool Is the content ($mContent) already loaded? */
+       protected $mContentLoaded = false;
+
+       /** @var int|null The oldid of the article that is to be shown, 0 for the current revision */
+       protected $mOldId;
+
+       /** @var Title Title from which we were redirected here */
+       protected $mRedirectedFrom = null;
+
+       /** @var string|bool URL to redirect to or false if none */
+       protected $mRedirectUrl = false;
+
+       /** @var int Revision ID of revision we are working on */
+       protected $mRevIdFetched = 0;
+
+       /** @var Revision Revision we are working on */
+       protected $mRevision = null;
+
+       /** @var ParserOutput */
+       public $mParserOutput;
+
+       /**
+        * Constructor and clear the article
+        * @param Title $title Reference to a Title object.
+        * @param int $oldId Revision ID, null to fetch from request, zero for current
+        */
+       public function __construct( Title $title, $oldId = null ) {
+               $this->mOldId = $oldId;
+               $this->mPage = $this->newPage( $title );
+       }
+
+       /**
+        * @param Title $title
+        * @return WikiPage
+        */
+       protected function newPage( Title $title ) {
+               return new WikiPage( $title );
+       }
+
+       /**
+        * Constructor from a page id
+        * @param int $id Article ID to load
+        * @return Article|null
+        */
+       public static function newFromID( $id ) {
+               $t = Title::newFromID( $id );
+               # @todo FIXME: Doesn't inherit right
+               return $t == null ? null : new self( $t );
+               # return $t == null ? null : new static( $t ); // PHP 5.3
+       }
+
+       /**
+        * Create an Article object of the appropriate class for the given page.
+        *
+        * @param Title $title
+        * @param IContextSource $context
+        * @return Article
+        */
+       public static function newFromTitle( $title, IContextSource $context ) {
+               if ( NS_MEDIA == $title->getNamespace() ) {
+                       // FIXME: where should this go?
+                       $title = Title::makeTitle( NS_FILE, $title->getDBkey() );
+               }
+
+               $page = null;
+               wfRunHooks( 'ArticleFromTitle', array( &$title, &$page, $context ) );
+               if ( !$page ) {
+                       switch ( $title->getNamespace() ) {
+                               case NS_FILE:
+                                       $page = new ImagePage( $title );
+                                       break;
+                               case NS_CATEGORY:
+                                       $page = new CategoryPage( $title );
+                                       break;
+                               default:
+                                       $page = new Article( $title );
+                       }
+               }
+               $page->setContext( $context );
+
+               return $page;
+       }
+
+       /**
+        * Create an Article object of the appropriate class for the given page.
+        *
+        * @param WikiPage $page
+        * @param IContextSource $context
+        * @return Article
+        */
+       public static function newFromWikiPage( WikiPage $page, IContextSource $context ) {
+               $article = self::newFromTitle( $page->getTitle(), $context );
+               $article->mPage = $page; // override to keep process cached vars
+               return $article;
+       }
+
+       /**
+        * Tell the page view functions that this view was redirected
+        * from another page on the wiki.
+        * @param Title $from
+        */
+       public function setRedirectedFrom( Title $from ) {
+               $this->mRedirectedFrom = $from;
+       }
+
+       /**
+        * Get the title object of the article
+        *
+        * @return Title Title object of this page
+        */
+       public function getTitle() {
+               return $this->mPage->getTitle();
+       }
+
+       /**
+        * Get the WikiPage object of this instance
+        *
+        * @since 1.19
+        * @return WikiPage
+        */
+       public function getPage() {
+               return $this->mPage;
+       }
+
+       /**
+        * Clear the object
+        */
+       public function clear() {
+               $this->mContentLoaded = false;
+
+               $this->mRedirectedFrom = null; # Title object if set
+               $this->mRevIdFetched = 0;
+               $this->mRedirectUrl = false;
+
+               $this->mPage->clear();
+       }
+
+       /**
+        * 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.
+        *
+        * @deprecated since 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 ) {
+                       # If this is a MediaWiki:x message, then load the messages
+                       # and return the message value for x.
+                       if ( $this->getTitle()->getNamespace() == NS_MEDIAWIKI ) {
+                               $text = $this->getTitle()->getDefaultMessageText();
+                               if ( $text === false ) {
+                                       $text = '';
+                               }
+
+                               $content = ContentHandler::makeContent( $text, $this->getTitle() );
+                       } else {
+                               $message = $this->getContext()->getUser()->isLoggedIn() ? 'noarticletext' : 'noarticletextanon';
+                               $content = new MessageContent( $message, null, 'parsemag' );
+                       }
+               } else {
+                       $this->fetchContentObject();
+                       $content = $this->mContentObject;
+               }
+
+               wfProfileOut( __METHOD__ );
+               return $content;
+       }
+
+       /**
+        * @return int The oldid of the article that is to be shown, 0 for the current revision
+        */
+       public function getOldID() {
+               if ( is_null( $this->mOldId ) ) {
+                       $this->mOldId = $this->getOldIDFromRequest();
+               }
+
+               return $this->mOldId;
+       }
+
+       /**
+        * Sets $this->mRedirectUrl to a correct URL if the query parameters are incorrect
+        *
+        * @return int The old id for the request
+        */
+       public function getOldIDFromRequest() {
+               $this->mRedirectUrl = false;
+
+               $request = $this->getContext()->getRequest();
+               $oldid = $request->getIntOrNull( 'oldid' );
+
+               if ( $oldid === null ) {
+                       return 0;
+               }
+
+               if ( $oldid !== 0 ) {
+                       # Load the given revision and check whether the page is another one.
+                       # In that case, update this instance to reflect the change.
+                       if ( $oldid === $this->mPage->getLatest() ) {
+                               $this->mRevision = $this->mPage->getRevision();
+                       } else {
+                               $this->mRevision = Revision::newFromId( $oldid );
+                               if ( $this->mRevision !== null ) {
+                                       // Revision title doesn't match the page title given?
+                                       if ( $this->mPage->getID() != $this->mRevision->getPage() ) {
+                                               $function = array( get_class( $this->mPage ), 'newFromID' );
+                                               $this->mPage = call_user_func( $function, $this->mRevision->getPage() );
+                                       }
+                               }
+                       }
+               }
+
+               if ( $request->getVal( 'direction' ) == 'next' ) {
+                       $nextid = $this->getTitle()->getNextRevisionID( $oldid );
+                       if ( $nextid ) {
+                               $oldid = $nextid;
+                               $this->mRevision = null;
+                       } else {
+                               $this->mRedirectUrl = $this->getTitle()->getFullURL( 'redirect=no' );
+                       }
+               } elseif ( $request->getVal( 'direction' ) == 'prev' ) {
+                       $previd = $this->getTitle()->getPreviousRevisionID( $oldid );
+                       if ( $previd ) {
+                               $oldid = $previd;
+                               $this->mRevision = null;
+                       }
+               }
+
+               return $oldid;
+       }
+
+       /**
+        * Load the revision (including text) into this object
+        *
+        * @deprecated since 1.19; use fetchContent()
+        */
+       function loadContent() {
+               wfDeprecated( __METHOD__, '1.19' );
+               $this->fetchContent();
+       }
+
+       /**
+        * 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 string|bool String containing article contents, or false if null
+        * @deprecated since 1.21, use WikiPage::getContent() instead
+        */
+       function fetchContent() { #BC cruft!
+               ContentHandler::deprecated( __METHOD__, '1.21' );
+
+               if ( $this->mContentLoaded && $this->mContent ) {
+                       return $this->mContent;
+               }
+
+               wfProfileIn( __METHOD__ );
+
+               $content = $this->fetchContentObject();
+
+               if ( !$content ) {
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+
+               // @todo Get rid of mContent everywhere!
+               $this->mContent = ContentHandler::getContentText( $content );
+               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|bool
+        *
+        * @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.
+               //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()
+                       if ( !$this->mRevision ) {
+                               $this->mRevision = Revision::newFromId( $oldid );
+                               if ( !$this->mRevision ) {
+                                       wfDebug( __METHOD__ . " failed to retrieve specified revision, id $oldid\n" );
+                                       wfProfileOut( __METHOD__ );
+                                       return false;
+                               }
+                       }
+               } else {
+                       if ( !$this->mPage->getLatest() ) {
+                               wfDebug( __METHOD__ . " failed to find page data for title " .
+                                       $this->getTitle()->getPrefixedText() . "\n" );
+                               wfProfileOut( __METHOD__ );
+                               return false;
+                       }
+
+                       $this->mRevision = $this->mPage->getRevision();
+
+                       if ( !$this->mRevision ) {
+                               wfDebug( __METHOD__ . " failed to retrieve current page, rev_id " .
+                                       $this->mPage->getLatest() . "\n" );
+                               wfProfileOut( __METHOD__ );
+                               return false;
+                       }
+               }
+
+               // @todo FIXME: Horrible, horrible! This content-loading interface just plain sucks.
+               // We should instead work with the Revision object when we need it...
+               // Loads if user is allowed
+               $this->mContentObject = $this->mRevision->getContent(
+                       Revision::FOR_THIS_USER,
+                       $this->getContext()->getUser()
+               );
+               $this->mRevIdFetched = $this->mRevision->getId();
+
+               wfRunHooks( 'ArticleAfterFetchContentObject', array( &$this, &$this->mContentObject ) );
+
+               wfProfileOut( __METHOD__ );
+
+               return $this->mContentObject;
+       }
+
+       /**
+        * Returns true if the currently-referenced revision is the current edit
+        * to this page (and it exists).
+        * @return bool
+        */
+       public function isCurrent() {
+               # If no oldid, this is the current version.
+               if ( $this->getOldID() == 0 ) {
+                       return true;
+               }
+
+               return $this->mPage->exists() && $this->mRevision && $this->mRevision->isCurrent();
+       }
+
+       /**
+        * Get the fetched Revision object depending on request parameters or null
+        * on failure.
+        *
+        * @since 1.19
+        * @return Revision|null
+        */
+       public function getRevisionFetched() {
+               $this->fetchContentObject();
+
+               return $this->mRevision;
+       }
+
+       /**
+        * Use this to fetch the rev ID used on page views
+        *
+        * @return int Revision ID of last article revision
+        */
+       public function getRevIdFetched() {
+               if ( $this->mRevIdFetched ) {
+                       return $this->mRevIdFetched;
+               } else {
+                       return $this->mPage->getLatest();
+               }
+       }
+
+       /**
+        * This is the default action of the index.php entry point: just view the
+        * page of the given title.
+        */
+       public function view() {
+               global $wgUseFileCache, $wgUseETag, $wgDebugToolbar;
+
+               wfProfileIn( __METHOD__ );
+
+               # Get variables from query string
+               # As side effect this will load the revision and update the title
+               # in a revision ID is passed in the request, so this should remain
+               # the first call of this method even if $oldid is used way below.
+               $oldid = $this->getOldID();
+
+               $user = $this->getContext()->getUser();
+               # Another whitelist check in case getOldID() is altering the title
+               $permErrors = $this->getTitle()->getUserPermissionsErrors( 'read', $user );
+               if ( count( $permErrors ) ) {
+                       wfDebug( __METHOD__ . ": denied on secondary read check\n" );
+                       wfProfileOut( __METHOD__ );
+                       throw new PermissionsError( 'read', $permErrors );
+               }
+
+               $outputPage = $this->getContext()->getOutput();
+               # getOldID() may as well want us to redirect somewhere else
+               if ( $this->mRedirectUrl ) {
+                       $outputPage->redirect( $this->mRedirectUrl );
+                       wfDebug( __METHOD__ . ": redirecting due to oldid\n" );
+                       wfProfileOut( __METHOD__ );
+
+                       return;
+               }
+
+               # If we got diff in the query, we want to see a diff page instead of the article.
+               if ( $this->getContext()->getRequest()->getCheck( 'diff' ) ) {
+                       wfDebug( __METHOD__ . ": showing diff page\n" );
+                       $this->showDiffPage();
+                       wfProfileOut( __METHOD__ );
+
+                       return;
+               }
+
+               # Set page title (may be overridden by DISPLAYTITLE)
+               $outputPage->setPageTitle( $this->getTitle()->getPrefixedText() );
+
+               $outputPage->setArticleFlag( true );
+               # Allow frames by default
+               $outputPage->allowClickjacking();
+
+               $parserCache = ParserCache::singleton();
+
+               $parserOptions = $this->getParserOptions();
+               # Render printable version, use printable version cache
+               if ( $outputPage->isPrintable() ) {
+                       $parserOptions->setIsPrintable( true );
+                       $parserOptions->setEditSection( false );
+               } elseif ( !$this->isCurrent() || !$this->getTitle()->quickUserCan( 'edit', $user ) ) {
+                       $parserOptions->setEditSection( false );
+               }
+
+               # Try client and file cache
+               if ( !$wgDebugToolbar && $oldid === 0 && $this->mPage->checkTouched() ) {
+                       if ( $wgUseETag ) {
+                               $outputPage->setETag( $parserCache->getETag( $this, $parserOptions ) );
+                       }
+
+                       # Is it client cached?
+                       if ( $outputPage->checkLastModified( $this->mPage->getTouched() ) ) {
+                               wfDebug( __METHOD__ . ": done 304\n" );
+                               wfProfileOut( __METHOD__ );
+
+                               return;
+                       # Try file cache
+                       } elseif ( $wgUseFileCache && $this->tryFileCache() ) {
+                               wfDebug( __METHOD__ . ": done file cache\n" );
+                               # tell wgOut that output is taken care of
+                               $outputPage->disable();
+                               $this->mPage->doViewUpdates( $user, $oldid );
+                               wfProfileOut( __METHOD__ );
+
+                               return;
+                       }
+               }
+
+               # Should the parser cache be used?
+               $useParserCache = $this->mPage->isParserCacheUsed( $parserOptions, $oldid );
+               wfDebug( 'Article::view using parser cache: ' . ( $useParserCache ? 'yes' : 'no' ) . "\n" );
+               if ( $user->getStubThreshold() ) {
+                       wfIncrStats( 'pcache_miss_stub' );
+               }
+
+               $this->showRedirectedFromHeader();
+               $this->showNamespaceHeader();
+
+               # Iterate through the possible ways of constructing the output text.
+               # Keep going until $outputDone is set, or we run out of things to do.
+               $pass = 0;
+               $outputDone = false;
+               $this->mParserOutput = false;
+
+               while ( !$outputDone && ++$pass ) {
+                       switch ( $pass ) {
+                               case 1:
+                                       wfRunHooks( 'ArticleViewHeader', array( &$this, &$outputDone, &$useParserCache ) );
+                                       break;
+                               case 2:
+                                       # Early abort if the page doesn't exist
+                                       if ( !$this->mPage->exists() ) {
+                                               wfDebug( __METHOD__ . ": showing missing article\n" );
+                                               $this->showMissingArticle();
+                                               $this->mPage->doViewUpdates( $user );
+                                               wfProfileOut( __METHOD__ );
+                                               return;
+                                       }
+
+                                       # Try the parser cache
+                                       if ( $useParserCache ) {
+                                               $this->mParserOutput = $parserCache->get( $this, $parserOptions );
+
+                                               if ( $this->mParserOutput !== false ) {
+                                                       if ( $oldid ) {
+                                                               wfDebug( __METHOD__ . ": showing parser cache contents for current rev permalink\n" );
+                                                               $this->setOldSubtitle( $oldid );
+                                                       } else {
+                                                               wfDebug( __METHOD__ . ": showing parser cache contents\n" );
+                                                       }
+                                                       $outputPage->addParserOutput( $this->mParserOutput );
+                                                       # Ensure that UI elements requiring revision ID have
+                                                       # the correct version information.
+                                                       $outputPage->setRevisionId( $this->mPage->getLatest() );
+                                                       # Preload timestamp to avoid a DB hit
+                                                       $cachedTimestamp = $this->mParserOutput->getTimestamp();
+                                                       if ( $cachedTimestamp !== null ) {
+                                                               $outputPage->setRevisionTimestamp( $cachedTimestamp );
+                                                               $this->mPage->setTimestamp( $cachedTimestamp );
+                                                       }
+                                                       $outputDone = true;
+                                               }
+                                       }
+                                       break;
+                               case 3:
+                                       # This will set $this->mRevision if needed
+                                       $this->fetchContentObject();
+
+                                       # Are we looking at an old revision
+                                       if ( $oldid && $this->mRevision ) {
+                                               $this->setOldSubtitle( $oldid );
+
+                                               if ( !$this->showDeletedRevisionHeader() ) {
+                                                       wfDebug( __METHOD__ . ": cannot view deleted revision\n" );
+                                                       wfProfileOut( __METHOD__ );
+                                                       return;
+                                               }
+                                       }
+
+                                       # Ensure that UI elements requiring revision ID have
+                                       # the correct version information.
+                                       $outputPage->setRevisionId( $this->getRevIdFetched() );
+                                       # Preload timestamp to avoid a DB hit
+                                       $outputPage->setRevisionTimestamp( $this->getTimestamp() );
+
+                                       # Pages containing custom CSS or JavaScript get special treatment
+                                       if ( $this->getTitle()->isCssOrJsPage() || $this->getTitle()->isCssJsSubpage() ) {
+                                               wfDebug( __METHOD__ . ": showing CSS/JS source\n" );
+                                               $this->showCssOrJsPage();
+                                               $outputDone = true;
+                                       } 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;
+                                       }
+                                       break;
+                               case 4:
+                                       # Run the parse, protected by a pool counter
+                                       wfDebug( __METHOD__ . ": doing uncached parse\n" );
+
+                                       $content = $this->getContentObject();
+                                       $poolArticleView = new PoolWorkArticleView( $this->getPage(), $parserOptions,
+                                               $this->getRevIdFetched(), $useParserCache, $content );
+
+                                       if ( !$poolArticleView->execute() ) {
+                                               $error = $poolArticleView->getError();
+                                               if ( $error ) {
+                                                       $outputPage->clearHTML(); // for release() errors
+                                                       $outputPage->enableClientCache( false );
+                                                       $outputPage->setRobotPolicy( 'noindex,nofollow' );
+
+                                                       $errortext = $error->getWikiText( false, 'view-pool-error' );
+                                                       $outputPage->addWikiText( '<div class="errorbox">' . $errortext . '</div>' );
+                                               }
+                                               # Connection or timeout error
+                                               wfProfileOut( __METHOD__ );
+                                               return;
+                                       }
+
+                                       $this->mParserOutput = $poolArticleView->getParserOutput();
+                                       $outputPage->addParserOutput( $this->mParserOutput );
+                                       if ( $content->getRedirectTarget() ) {
+                                               $outputPage->addSubtitle( wfMessage( 'redirectpagesub' )->parse() );
+                                       }
+
+                                       # Don't cache a dirty ParserOutput object
+                                       if ( $poolArticleView->getIsDirty() ) {
+                                               $outputPage->setSquidMaxage( 0 );
+                                               $outputPage->addHTML( "<!-- parser cache is expired, " .
+                                                       "sending anyway due to pool overload-->\n" );
+                                       }
+
+                                       $outputDone = true;
+                                       break;
+                               # Should be unreachable, but just in case...
+                               default:
+                                       break 2;
+                       }
+               }
+
+               # Get the ParserOutput actually *displayed* here.
+               # Note that $this->mParserOutput is the *current* version output.
+               $pOutput = ( $outputDone instanceof ParserOutput )
+                       ? $outputDone // object fetched by hook
+                       : $this->mParserOutput;
+
+               # Adjust title for main page & pages with displaytitle
+               if ( $pOutput ) {
+                       $this->adjustDisplayTitle( $pOutput );
+               }
+
+               # For the main page, overwrite the <title> element with the con-
+               # tents of 'pagetitle-view-mainpage' instead of the default (if
+               # that's not empty).
+               # This message always exists because it is in the i18n files
+               if ( $this->getTitle()->isMainPage() ) {
+                       $msg = wfMessage( 'pagetitle-view-mainpage' )->inContentLanguage();
+                       if ( !$msg->isDisabled() ) {
+                               $outputPage->setHTMLTitle( $msg->title( $this->getTitle() )->text() );
+                       }
+               }
+
+               # Check for any __NOINDEX__ tags on the page using $pOutput
+               $policy = $this->getRobotPolicy( 'view', $pOutput );
+               $outputPage->setIndexPolicy( $policy['index'] );
+               $outputPage->setFollowPolicy( $policy['follow'] );
+
+               $this->showViewFooter();
+               $this->mPage->doViewUpdates( $user, $oldid );
+
+               $outputPage->addModules( 'mediawiki.action.view.postEdit' );
+
+               wfProfileOut( __METHOD__ );
+       }
+
+       /**
+        * Adjust title for pages with displaytitle, -{T|}- or language conversion
+        * @param ParserOutput $pOutput
+        */
+       public function adjustDisplayTitle( ParserOutput $pOutput ) {
+               # Adjust the title if it was set by displaytitle, -{T|}- or language conversion
+               $titleText = $pOutput->getTitleText();
+               if ( strval( $titleText ) !== '' ) {
+                       $this->getContext()->getOutput()->setPageTitle( $titleText );
+               }
+       }
+
+       /**
+        * 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();
+               $user = $this->getContext()->getUser();
+               $diff = $request->getVal( 'diff' );
+               $rcid = $request->getVal( 'rcid' );
+               $diffOnly = $request->getBool( 'diffonly', $user->getOption( 'diffonly' ) );
+               $purge = $request->getVal( 'action' ) == 'purge';
+               $unhide = $request->getInt( 'unhide' ) == 1;
+               $oldid = $this->getOldID();
+
+               $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 );
+
+               // Run view updates for the newer revision being diffed (and shown
+               // below the diff if not $diffOnly).
+               list( $old, $new ) = $de->mapDiffPrevNext( $oldid, $diff );
+               // New can be false, convert it to 0 - this conveniently means the latest revision
+               $this->mPage->doViewUpdates( $user, (int)$new );
+       }
+
+       /**
+        * Show a page view for a page formatted as CSS or JavaScript. To be called by
+        * Article::view() only.
+        *
+        * This exists mostly to serve the deprecated ShowRawCssJs hook (used to customize these views).
+        * It has been replaced by the ContentGetParserOutput hook, which lets you do the same but with
+        * more flexibility.
+        *
+        * @param bool $showCacheHint Whether to show a message telling the user
+        *   to clear the browser cache (default: true).
+        */
+       protected function showCssOrJsPage( $showCacheHint = true ) {
+               $outputPage = $this->getContext()->getOutput();
+
+               if ( $showCacheHint ) {
+                       $dir = $this->getContext()->getLanguage()->getDir();
+                       $lang = $this->getContext()->getLanguage()->getCode();
+
+                       $outputPage->wrapWikiMsg(
+                               "<div id='mw-clearyourcache' lang='$lang' dir='$dir' class='mw-content-$dir'>\n$1\n</div>",
+                               'clearyourcache'
+                       );
+               }
+
+               $this->fetchContentObject();
+
+               if ( $this->mContentObject ) {
+                       // Give hooks a chance to customise the output
+                       if ( ContentHandler::runLegacyHooks(
+                               'ShowRawCssJs',
+                               array( $this->mContentObject, $this->getTitle(), $outputPage ) )
+                       ) {
+                               // If no legacy hooks ran, display the content of the parser output, including RL modules,
+                               // but excluding metadata like categories and language links
+                               $po = $this->mContentObject->getParserOutput( $this->getTitle() );
+                               $outputPage->addParserOutputContent( $po );
+                       }
+               }
+       }
+
+       /**
+        * Get the robot policy to be used for the current view
+        * @param string $action The action= GET parameter
+        * @param ParserOutput|null $pOutput
+        * @return array The policy that should be set
+        * @todo: actions other than 'view'
+        */
+       public function getRobotPolicy( $action, $pOutput = null ) {
+               global $wgArticleRobotPolicies, $wgNamespaceRobotPolicies, $wgDefaultRobotPolicy;
+
+               $ns = $this->getTitle()->getNamespace();
+
+               # Don't index user and user talk pages for blocked users (bug 11443)
+               if ( ( $ns == NS_USER || $ns == NS_USER_TALK ) && !$this->getTitle()->isSubpage() ) {
+                       $specificTarget = null;
+                       $vagueTarget = null;
+                       $titleText = $this->getTitle()->getText();
+                       if ( IP::isValid( $titleText ) ) {
+                               $vagueTarget = $titleText;
+                       } else {
+                               $specificTarget = $titleText;
+                       }
+                       if ( Block::newFromTarget( $specificTarget, $vagueTarget ) instanceof Block ) {
+                               return array(
+                                       'index' => 'noindex',
+                                       'follow' => 'nofollow'
+                               );
+                       }
+               }
+
+               if ( $this->mPage->getID() === 0 || $this->getOldID() ) {
+                       # Non-articles (special pages etc), and old revisions
+                       return array(
+                               'index' => 'noindex',
+                               'follow' => 'nofollow'
+                       );
+               } elseif ( $this->getContext()->getOutput()->isPrintable() ) {
+                       # Discourage indexing of printable versions, but encourage following
+                       return array(
+                               'index' => 'noindex',
+                               'follow' => 'follow'
+                       );
+               } elseif ( $this->getContext()->getRequest()->getInt( 'curid' ) ) {
+                       # For ?curid=x urls, disallow indexing
+                       return array(
+                               'index' => 'noindex',
+                               'follow' => 'follow'
+                       );
+               }
+
+               # Otherwise, construct the policy based on the various config variables.
+               $policy = self::formatRobotPolicy( $wgDefaultRobotPolicy );
+
+               if ( isset( $wgNamespaceRobotPolicies[$ns] ) ) {
+                       # Honour customised robot policies for this namespace
+                       $policy = array_merge(
+                               $policy,
+                               self::formatRobotPolicy( $wgNamespaceRobotPolicies[$ns] )
+                       );
+               }
+               if ( $this->getTitle()->canUseNoindex() && is_object( $pOutput ) && $pOutput->getIndexPolicy() ) {
+                       # __INDEX__ and __NOINDEX__ magic words, if allowed. Incorporates
+                       # a final sanity check that we have really got the parser output.
+                       $policy = array_merge(
+                               $policy,
+                               array( 'index' => $pOutput->getIndexPolicy() )
+                       );
+               }
+
+               if ( isset( $wgArticleRobotPolicies[$this->getTitle()->getPrefixedText()] ) ) {
+                       # (bug 14900) site config can override user-defined __INDEX__ or __NOINDEX__
+                       $policy = array_merge(
+                               $policy,
+                               self::formatRobotPolicy( $wgArticleRobotPolicies[$this->getTitle()->getPrefixedText()] )
+                       );
+               }
+
+               return $policy;
+       }
+
+       /**
+        * Converts a String robot policy into an associative array, to allow
+        * merging of several policies using array_merge().
+        * @param array|string $policy Returns empty array on null/false/'', transparent
+        *   to already-converted arrays, converts string.
+        * @return array 'index' => \<indexpolicy\>, 'follow' => \<followpolicy\>
+        */
+       public static function formatRobotPolicy( $policy ) {
+               if ( is_array( $policy ) ) {
+                       return $policy;
+               } elseif ( !$policy ) {
+                       return array();
+               }
+
+               $policy = explode( ',', $policy );
+               $policy = array_map( 'trim', $policy );
+
+               $arr = array();
+               foreach ( $policy as $var ) {
+                       if ( in_array( $var, array( 'index', 'noindex' ) ) ) {
+                               $arr['index'] = $var;
+                       } elseif ( in_array( $var, array( 'follow', 'nofollow' ) ) ) {
+                               $arr['follow'] = $var;
+                       }
+               }
+
+               return $arr;
+       }
+
+       /**
+        * If this request is a redirect view, send "redirected from" subtitle to
+        * the output. Returns true if the header was needed, false if this is not
+        * a redirect view. Handles both local and remote redirects.
+        *
+        * @return bool
+        */
+       public function showRedirectedFromHeader() {
+               global $wgRedirectSources;
+               $outputPage = $this->getContext()->getOutput();
+
+               $rdfrom = $this->getContext()->getRequest()->getVal( 'rdfrom' );
+
+               if ( isset( $this->mRedirectedFrom ) ) {
+                       // This is an internally redirected page view.
+                       // We'll need a backlink to the source page for navigation.
+                       if ( wfRunHooks( 'ArticleViewRedirect', array( &$this ) ) ) {
+                               $redir = Linker::linkKnown(
+                                       $this->mRedirectedFrom,
+                                       null,
+                                       array(),
+                                       array( 'redirect' => 'no' )
+                               );
+
+                               $outputPage->addSubtitle( wfMessage( 'redirectedfrom' )->rawParams( $redir ) );
+
+                               // Set the fragment if one was specified in the redirect
+                               if ( $this->getTitle()->hasFragment() ) {
+                                       $outputPage->addJsConfigVars( 'wgRedirectToFragment', $this->getTitle()->getFragmentForURL() );
+                                       $outputPage->addModules( 'mediawiki.action.view.redirectToFragment' );
+                               }
+
+                               // Add a <link rel="canonical"> tag
+                               $outputPage->setCanonicalUrl( $this->getTitle()->getLocalURL() );
+
+                               // Tell the output object that the user arrived at this article through a redirect
+                               $outputPage->setRedirectedFrom( $this->mRedirectedFrom );
+
+                               return true;
+                       }
+               } elseif ( $rdfrom ) {
+                       // This is an externally redirected view, from some other wiki.
+                       // If it was reported from a trusted site, supply a backlink.
+                       if ( $wgRedirectSources && preg_match( $wgRedirectSources, $rdfrom ) ) {
+                               $redir = Linker::makeExternalLink( $rdfrom, $rdfrom );
+                               $outputPage->addSubtitle( wfMessage( 'redirectedfrom' )->rawParams( $redir ) );
+
+                               return true;
+                       }
+               }
+
+               return false;
+       }
+
+       /**
+        * Show a header specific to the namespace currently being viewed, like
+        * [[MediaWiki:Talkpagetext]]. For Article::view().
+        */
+       public function showNamespaceHeader() {
+               if ( $this->getTitle()->isTalkPage() ) {
+                       if ( !wfMessage( 'talkpageheader' )->isDisabled() ) {
+                               $this->getContext()->getOutput()->wrapWikiMsg(
+                                       "<div class=\"mw-talkpageheader\">\n$1\n</div>",
+                                       array( 'talkpageheader' )
+                               );
+                       }
+               }
+       }
+
+       /**
+        * Show the footer section of an ordinary page view
+        */
+       public function showViewFooter() {
+               # check if we're displaying a [[User talk:x.x.x.x]] anonymous talk page
+               if ( $this->getTitle()->getNamespace() == NS_USER_TALK
+                       && IP::isValid( $this->getTitle()->getText() )
+               ) {
+                       $this->getContext()->getOutput()->addWikiMsg( 'anontalkpagetext' );
+               }
+
+               // Show a footer allowing the user to patrol the shown revision or page if possible
+               $patrolFooterShown = $this->showPatrolFooter();
+
+               wfRunHooks( 'ArticleViewFooter', array( $this, $patrolFooterShown ) );
+       }
+
+       /**
+        * If patrol is possible, output a patrol UI box. This is called from the
+        * footer section of ordinary page views. If patrol is not possible or not
+        * desired, does nothing.
+        * Side effect: When the patrol link is build, this method will call
+        * OutputPage::preventClickjacking() and load mediawiki.page.patrol.ajax.
+        *
+        * @return bool
+        */
+       public function showPatrolFooter() {
+               global $wgUseNPPatrol, $wgUseRCPatrol, $wgEnableAPI, $wgEnableWriteAPI;
+
+               $outputPage = $this->getContext()->getOutput();
+               $user = $this->getContext()->getUser();
+               $cache = wfGetMainCache();
+               $rc = false;
+
+               if ( !$this->getTitle()->quickUserCan( 'patrol', $user )
+                       || !( $wgUseRCPatrol || $wgUseNPPatrol )
+               ) {
+                       // Patrolling is disabled or the user isn't allowed to
+                       return false;
+               }
+
+               wfProfileIn( __METHOD__ );
+
+               // New page patrol: Get the timestamp of the oldest revison which
+               // the revision table holds for the given page. Then we look
+               // whether it's within the RC lifespan and if it is, we try
+               // to get the recentchanges row belonging to that entry
+               // (with rc_new = 1).
+
+               // Check for cached results
+               if ( $cache->get( wfMemcKey( 'NotPatrollablePage', $this->getTitle()->getArticleID() ) ) ) {
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+
+               if ( $this->mRevision
+                       && !RecentChange::isInRCLifespan( $this->mRevision->getTimestamp(), 21600 )
+               ) {
+                       // The current revision is already older than what could be in the RC table
+                       // 6h tolerance because the RC might not be cleaned out regularly
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+
+               $dbr = wfGetDB( DB_SLAVE );
+               $oldestRevisionTimestamp = $dbr->selectField(
+                       'revision',
+                       'MIN( rev_timestamp )',
+                       array( 'rev_page' => $this->getTitle()->getArticleID() ),
+                       __METHOD__
+               );
+
+               if ( $oldestRevisionTimestamp
+                       && RecentChange::isInRCLifespan( $oldestRevisionTimestamp, 21600 )
+               ) {
+                       // 6h tolerance because the RC might not be cleaned out regularly
+                       $rc = RecentChange::newFromConds(
+                               array(
+                                       'rc_new' => 1,
+                                       'rc_timestamp' => $oldestRevisionTimestamp,
+                                       'rc_namespace' => $this->getTitle()->getNamespace(),
+                                       'rc_cur_id' => $this->getTitle()->getArticleID(),
+                                       'rc_patrolled' => 0
+                               ),
+                               __METHOD__,
+                               array( 'USE INDEX' => 'new_name_timestamp' )
+                       );
+               }
+
+               if ( !$rc ) {
+                       // No RC entry around
+
+                       // Cache the information we gathered above in case we can't patrol
+                       // Don't cache in case we can patrol as this could change
+                       $cache->set( wfMemcKey( 'NotPatrollablePage', $this->getTitle()->getArticleID() ), '1' );
+
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+
+               if ( $rc->getPerformer()->getName() == $user->getName() ) {
+                       // Don't show a patrol link for own creations. If the user could
+                       // patrol them, they already would be patrolled
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+
+               $rcid = $rc->getAttribute( 'rc_id' );
+
+               $token = $user->getEditToken( $rcid );
+
+               $outputPage->preventClickjacking();
+               if ( $wgEnableAPI && $wgEnableWriteAPI && $user->isAllowed( 'writeapi' ) ) {
+                       $outputPage->addModules( 'mediawiki.page.patrol.ajax' );
+               }
+
+               $link = Linker::linkKnown(
+                       $this->getTitle(),
+                       wfMessage( 'markaspatrolledtext' )->escaped(),
+                       array(),
+                       array(
+                               'action' => 'markpatrolled',
+                               'rcid' => $rcid,
+                               'token' => $token,
+                       )
+               );
+
+               $outputPage->addHTML(
+                       "<div class='patrollink'>" .
+                               wfMessage( 'markaspatrolledlink' )->rawParams( $link )->escaped() .
+                       '</div>'
+               );
+
+               wfProfileOut( __METHOD__ );
+               return true;
+       }
+
+       /**
+        * Show the error text for a missing article. For articles in the MediaWiki
+        * namespace, show the default message text. To be called from Article::view().
+        */
+       public function showMissingArticle() {
+               global $wgSend404Code;
+               $outputPage = $this->getContext()->getOutput();
+               // Whether the page is a root user page of an existing user (but not a subpage)
+               $validUserPage = false;
+
+               # Show info in user (talk) namespace. Does the user exist? Is he blocked?
+               if ( $this->getTitle()->getNamespace() == NS_USER
+                       || $this->getTitle()->getNamespace() == NS_USER_TALK
+               ) {
+                       $parts = explode( '/', $this->getTitle()->getText() );
+                       $rootPart = $parts[0];
+                       $user = User::newFromName( $rootPart, false /* allow IP users*/ );
+                       $ip = User::isIP( $rootPart );
+
+                       if ( !( $user && $user->isLoggedIn() ) && !$ip ) { # User does not exist
+                               $outputPage->wrapWikiMsg( "<div class=\"mw-userpage-userdoesnotexist error\">\n\$1\n</div>",
+                                       array( 'userpage-userdoesnotexist-view', wfEscapeWikiText( $rootPart ) ) );
+                       } elseif ( $user->isBlocked() ) { # Show log extract if the user is currently blocked
+                               LogEventsList::showLogExtract(
+                                       $outputPage,
+                                       'block',
+                                       $user->getUserPage(),
+                                       '',
+                                       array(
+                                               'lim' => 1,
+                                               'showIfEmpty' => false,
+                                               'msgKey' => array(
+                                                       'blocked-notice-logextract',
+                                                       $user->getName() # Support GENDER in notice
+                                               )
+                                       )
+                               );
+                               $validUserPage = !$this->getTitle()->isSubpage();
+                       } else {
+                               $validUserPage = !$this->getTitle()->isSubpage();
+                       }
+               }
+
+               wfRunHooks( 'ShowMissingArticle', array( $this ) );
+
+               // Give extensions a chance to hide their (unrelated) log entries
+               $logTypes = array( 'delete', 'move' );
+               $conds = array( "log_action != 'revision'" );
+               wfRunHooks( 'Article::MissingArticleConditions', array( &$conds, $logTypes ) );
+
+               # Show delete and move logs
+               LogEventsList::showLogExtract( $outputPage, $logTypes, $this->getTitle(), '',
+                       array( 'lim' => 10,
+                               'conds' => $conds,
+                               'showIfEmpty' => false,
+                               'msgKey' => array( 'moveddeleted-notice' ) )
+               );
+
+               if ( !$this->mPage->hasViewableContent() && $wgSend404Code && !$validUserPage ) {
+                       // If there's no backing content, send a 404 Not Found
+                       // for better machine handling of broken links.
+                       $this->getContext()->getRequest()->response()->header( "HTTP/1.1 404 Not Found" );
+               }
+
+               if ( $validUserPage ) {
+                       // Also apply the robot policy for nonexisting user pages (as those aren't served as 404)
+                       $policy = $this->getRobotPolicy( 'view' );
+                       $outputPage->setIndexPolicy( $policy['index'] );
+                       $outputPage->setFollowPolicy( $policy['follow'] );
+               }
+
+               $hookResult = wfRunHooks( 'BeforeDisplayNoArticleText', array( $this ) );
+
+               if ( ! $hookResult ) {
+                       return;
+               }
+
+               # Show error message
+               $oldid = $this->getOldID();
+               if ( $oldid ) {
+                       $text = wfMessage( 'missing-revision', $oldid )->plain();
+               } elseif ( $this->getTitle()->getNamespace() === NS_MEDIAWIKI ) {
+                       // Use the default message text
+                       $text = $this->getTitle()->getDefaultMessageText();
+               } elseif ( $this->getTitle()->quickUserCan( 'create', $this->getContext()->getUser() )
+                       && $this->getTitle()->quickUserCan( 'edit', $this->getContext()->getUser() )
+               ) {
+                       $message = $this->getContext()->getUser()->isLoggedIn() ? 'noarticletext' : 'noarticletextanon';
+                       $text = wfMessage( $message )->plain();
+               } else {
+                       $text = wfMessage( 'noarticletext-nopermission' )->plain();
+               }
+               $text = "<div class='noarticletext'>\n$text\n</div>";
+
+               $outputPage->addWikiText( $text );
+       }
+
+       /**
+        * If the revision requested for view is deleted, check permissions.
+        * Send either an error message or a warning header to the output.
+        *
+        * @return bool true if the view is allowed, false if not.
+        */
+       public function showDeletedRevisionHeader() {
+               if ( !$this->mRevision->isDeleted( Revision::DELETED_TEXT ) ) {
+                       // Not deleted
+                       return true;
+               }
+
+               $outputPage = $this->getContext()->getOutput();
+               $user = $this->getContext()->getUser();
+               // If the user is not allowed to see it...
+               if ( !$this->mRevision->userCan( Revision::DELETED_TEXT, $user ) ) {
+                       $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
+                               'rev-deleted-text-permission' );
+
+                       return false;
+               // If the user needs to confirm that they want to see it...
+               } elseif ( $this->getContext()->getRequest()->getInt( 'unhide' ) != 1 ) {
+                       # Give explanation and add a link to view the revision...
+                       $oldid = intval( $this->getOldID() );
+                       $link = $this->getTitle()->getFullURL( "oldid={$oldid}&unhide=1" );
+                       $msg = $this->mRevision->isDeleted( Revision::DELETED_RESTRICTED ) ?
+                               'rev-suppressed-text-unhide' : 'rev-deleted-text-unhide';
+                       $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
+                               array( $msg, $link ) );
+
+                       return false;
+               // We are allowed to see...
+               } else {
+                       $msg = $this->mRevision->isDeleted( Revision::DELETED_RESTRICTED ) ?
+                               'rev-suppressed-text-view' : 'rev-deleted-text-view';
+                       $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", $msg );
+
+                       return true;
+               }
+       }
+
+       /**
+        * Generate the navigation links when browsing through an article revisions
+        * It shows the information as:
+        *   Revision as of \<date\>; view current revision
+        *   \<- Previous version | Next Version -\>
+        *
+        * @param int $oldid Revision ID of this article revision
+        */
+       public function setOldSubtitle( $oldid = 0 ) {
+               if ( !wfRunHooks( 'DisplayOldSubtitle', array( &$this, &$oldid ) ) ) {
+                       return;
+               }
+
+               $unhide = $this->getContext()->getRequest()->getInt( 'unhide' ) == 1;
+
+               # Cascade unhide param in links for easy deletion browsing
+               $extraParams = array();
+               if ( $unhide ) {
+                       $extraParams['unhide'] = 1;
+               }
+
+               if ( $this->mRevision && $this->mRevision->getId() === $oldid ) {
+                       $revision = $this->mRevision;
+               } else {
+                       $revision = Revision::newFromId( $oldid );
+               }
+
+               $timestamp = $revision->getTimestamp();
+
+               $current = ( $oldid == $this->mPage->getLatest() );
+               $language = $this->getContext()->getLanguage();
+               $user = $this->getContext()->getUser();
+
+               $td = $language->userTimeAndDate( $timestamp, $user );
+               $tddate = $language->userDate( $timestamp, $user );
+               $tdtime = $language->userTime( $timestamp, $user );
+
+               # Show user links if allowed to see them. If hidden, then show them only if requested...
+               $userlinks = Linker::revUserTools( $revision, !$unhide );
+
+               $infomsg = $current && !wfMessage( 'revision-info-current' )->isDisabled()
+                       ? 'revision-info-current'
+                       : 'revision-info';
+
+               $outputPage = $this->getContext()->getOutput();
+               $outputPage->addSubtitle( "<div id=\"mw-{$infomsg}\">" . wfMessage( $infomsg,
+                       $td )->rawParams( $userlinks )->params( $revision->getID(), $tddate,
+                       $tdtime, $revision->getUserText() )->rawParams( Linker::revComment( $revision, true, true ) )->parse() . "</div>" );
+
+               $lnk = $current
+                       ? wfMessage( 'currentrevisionlink' )->escaped()
+                       : Linker::linkKnown(
+                               $this->getTitle(),
+                               wfMessage( 'currentrevisionlink' )->escaped(),
+                               array(),
+                               $extraParams
+                       );
+               $curdiff = $current
+                       ? wfMessage( 'diff' )->escaped()
+                       : Linker::linkKnown(
+                               $this->getTitle(),
+                               wfMessage( 'diff' )->escaped(),
+                               array(),
+                               array(
+                                       'diff' => 'cur',
+                                       'oldid' => $oldid
+                               ) + $extraParams
+                       );
+               $prev = $this->getTitle()->getPreviousRevisionID( $oldid );
+               $prevlink = $prev
+                       ? Linker::linkKnown(
+                               $this->getTitle(),
+                               wfMessage( 'previousrevision' )->escaped(),
+                               array(),
+                               array(
+                                       'direction' => 'prev',
+                                       'oldid' => $oldid
+                               ) + $extraParams
+                       )
+                       : wfMessage( 'previousrevision' )->escaped();
+               $prevdiff = $prev
+                       ? Linker::linkKnown(
+                               $this->getTitle(),
+                               wfMessage( 'diff' )->escaped(),
+                               array(),
+                               array(
+                                       'diff' => 'prev',
+                                       'oldid' => $oldid
+                               ) + $extraParams
+                       )
+                       : wfMessage( 'diff' )->escaped();
+               $nextlink = $current
+                       ? wfMessage( 'nextrevision' )->escaped()
+                       : Linker::linkKnown(
+                               $this->getTitle(),
+                               wfMessage( 'nextrevision' )->escaped(),
+                               array(),
+                               array(
+                                       'direction' => 'next',
+                                       'oldid' => $oldid
+                               ) + $extraParams
+                       );
+               $nextdiff = $current
+                       ? wfMessage( 'diff' )->escaped()
+                       : Linker::linkKnown(
+                               $this->getTitle(),
+                               wfMessage( 'diff' )->escaped(),
+                               array(),
+                               array(
+                                       'diff' => 'next',
+                                       'oldid' => $oldid
+                               ) + $extraParams
+                       );
+
+               $cdel = Linker::getRevDeleteLink( $user, $revision, $this->getTitle() );
+               if ( $cdel !== '' ) {
+                       $cdel .= ' ';
+               }
+
+               $outputPage->addSubtitle( "<div id=\"mw-revision-nav\">" . $cdel .
+                       wfMessage( 'revision-nav' )->rawParams(
+                               $prevdiff, $prevlink, $lnk, $curdiff, $nextlink, $nextdiff
+                       )->escaped() . "</div>" );
+       }
+
+       /**
+        * Return the HTML for the top of a redirect page
+        *
+        * Chances are you should just be using the ParserOutput from
+        * WikitextContent::getParserOutput instead of calling this for redirects.
+        *
+        * @param Title|array $target Destination(s) to redirect
+        * @param bool $appendSubtitle [optional]
+        * @param bool $forceKnown Should the image be shown as a bluelink regardless of existence?
+        * @return string Containing HMTL with redirect link
+        */
+       public function viewRedirect( $target, $appendSubtitle = true, $forceKnown = false ) {
+               $lang = $this->getTitle()->getPageLanguage();
+               if ( $appendSubtitle ) {
+                       $out = $this->getContext()->getOutput();
+                       $out->addSubtitle( wfMessage( 'redirectpagesub' )->parse() );
+               }
+               return static::getRedirectHeaderHtml( $lang, $target, $forceKnown );
+       }
+
+       /**
+        * Return the HTML for the top of a redirect page
+        *
+        * Chances are you should just be using the ParserOutput from
+        * WikitextContent::getParserOutput instead of calling this for redirects.
+        *
+        * @since 1.23
+        * @param Language $lang
+        * @param Title|array $target Destination(s) to redirect
+        * @param bool $forceKnown Should the image be shown as a bluelink regardless of existence?
+        * @return string Containing HMTL with redirect link
+        */
+       public static function getRedirectHeaderHtml( Language $lang, $target, $forceKnown = false ) {
+               global $wgStylePath;
+
+               if ( !is_array( $target ) ) {
+                       $target = array( $target );
+               }
+
+               $imageDir = $lang->getDir();
+
+               // the loop prepends the arrow image before the link, so the first case needs to be outside
+
+               /** @var $title Title */
+               $title = array_shift( $target );
+
+               if ( $forceKnown ) {
+                       $link = Linker::linkKnown( $title, htmlspecialchars( $title->getFullText() ) );
+               } else {
+                       $link = Linker::link( $title, htmlspecialchars( $title->getFullText() ) );
+               }
+
+               $nextRedirect = $wgStylePath . '/common/images/nextredirect' . $imageDir . '.png';
+               $alt = $lang->isRTL() ? '←' : '→';
+
+               // Automatically append redirect=no to each link, since most of them are
+               // redirect pages themselves.
+               /** @var Title $rt */
+               foreach ( $target as $rt ) {
+                       $link .= Html::element( 'img', array( 'src' => $nextRedirect, 'alt' => $alt ) );
+                       if ( $forceKnown ) {
+                               $link .= Linker::linkKnown(
+                                       $rt,
+                                       htmlspecialchars( $rt->getFullText(),
+                                       array(),
+                                       array( 'redirect' => 'no' )
+                               )
+                               );
+                       } else {
+                               $link .= Linker::link(
+                                       $rt,
+                                       htmlspecialchars( $rt->getFullText() ),
+                                       array(),
+                                       array( 'redirect' => 'no' )
+                               );
+                       }
+               }
+
+               $imageUrl = $wgStylePath . '/common/images/redirect' . $imageDir . '.png';
+               return '<div class="redirectMsg">' .
+                       Html::element( 'img', array( 'src' => $imageUrl, 'alt' => '#REDIRECT' ) ) .
+                       '<span class="redirectText">' . $link . '</span></div>';
+       }
+
+       /**
+        * Handle action=render
+        */
+       public function render() {
+               $this->getContext()->getRequest()->response()->header( 'X-Robots-Tag: noindex' );
+               $this->getContext()->getOutput()->setArticleBodyOnly( true );
+               $this->getContext()->getOutput()->enableSectionEditLinks( false );
+               $this->view();
+       }
+
+       /**
+        * action=protect handler
+        */
+       public function protect() {
+               $form = new ProtectionForm( $this );
+               $form->execute();
+       }
+
+       /**
+        * action=unprotect handler (alias)
+        */
+       public function unprotect() {
+               $this->protect();
+       }
+
+       /**
+        * UI entry point for page deletion
+        */
+       public function delete() {
+               # This code desperately needs to be totally rewritten
+
+               $title = $this->getTitle();
+               $user = $this->getContext()->getUser();
+
+               # Check permissions
+               $permission_errors = $title->getUserPermissionsErrors( 'delete', $user );
+               if ( count( $permission_errors ) ) {
+                       throw new PermissionsError( 'delete', $permission_errors );
+               }
+
+               # Read-only check...
+               if ( wfReadOnly() ) {
+                       throw new ReadOnlyError;
+               }
+
+               # Better double-check that it hasn't been deleted yet!
+               $this->mPage->loadPageData( 'fromdbmaster' );
+               if ( !$this->mPage->exists() ) {
+                       $deleteLogPage = new LogPage( 'delete' );
+                       $outputPage = $this->getContext()->getOutput();
+                       $outputPage->setPageTitle( wfMessage( 'cannotdelete-title', $title->getPrefixedText() ) );
+                       $outputPage->wrapWikiMsg( "<div class=\"error mw-error-cannotdelete\">\n$1\n</div>",
+                                       array( 'cannotdelete', wfEscapeWikiText( $title->getPrefixedText() ) )
+                               );
+                       $outputPage->addHTML(
+                               Xml::element( 'h2', null, $deleteLogPage->getName()->text() )
+                       );
+                       LogEventsList::showLogExtract(
+                               $outputPage,
+                               'delete',
+                               $title
+                       );
+
+                       return;
+               }
+
+               $request = $this->getContext()->getRequest();
+               $deleteReasonList = $request->getText( 'wpDeleteReasonList', 'other' );
+               $deleteReason = $request->getText( 'wpReason' );
+
+               if ( $deleteReasonList == 'other' ) {
+                       $reason = $deleteReason;
+               } elseif ( $deleteReason != '' ) {
+                       // Entry from drop down menu + additional comment
+                       $colonseparator = wfMessage( 'colon-separator' )->inContentLanguage()->text();
+                       $reason = $deleteReasonList . $colonseparator . $deleteReason;
+               } else {
+                       $reason = $deleteReasonList;
+               }
+
+               if ( $request->wasPosted() && $user->matchEditToken( $request->getVal( 'wpEditToken' ),
+                       array( 'delete', $this->getTitle()->getPrefixedText() ) )
+               ) {
+                       # Flag to hide all contents of the archived revisions
+                       $suppress = $request->getVal( 'wpSuppress' ) && $user->isAllowed( 'suppressrevision' );
+
+                       $this->doDelete( $reason, $suppress );
+
+                       WatchAction::doWatchOrUnwatch( $request->getCheck( 'wpWatch' ), $title, $user );
+
+                       return;
+               }
+
+               // Generate deletion reason
+               $hasHistory = false;
+               if ( !$reason ) {
+                       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
+               if ( $hasHistory ) {
+                       $revisions = $this->mTitle->estimateRevisionCount();
+                       // @todo FIXME: i18n issue/patchwork message
+                       $this->getContext()->getOutput()->addHTML( '<strong class="mw-delete-warning-revisions">' .
+                               wfMessage( 'historywarning' )->numParams( $revisions )->parse() .
+                               wfMessage( 'word-separator' )->plain() . Linker::linkKnown( $title,
+                                       wfMessage( 'history' )->escaped(),
+                                       array( 'rel' => 'archives' ),
+                                       array( 'action' => 'history' ) ) .
+                               '</strong>'
+                       );
+
+                       if ( $this->mTitle->isBigDeletion() ) {
+                               global $wgDeleteRevisionsLimit;
+                               $this->getContext()->getOutput()->wrapWikiMsg( "<div class='error'>\n$1\n</div>\n",
+                                       array(
+                                               'delete-warning-toobig',
+                                               $this->getContext()->getLanguage()->formatNum( $wgDeleteRevisionsLimit )
+                                       )
+                               );
+                       }
+               }
+
+               $this->confirmDelete( $reason );
+       }
+
+       /**
+        * Output deletion confirmation dialog
+        * @todo FIXME: Move to another file?
+        * @param string $reason Prefilled reason
+        */
+       public function confirmDelete( $reason ) {
+               wfDebug( "Article::confirmDelete\n" );
+
+               $outputPage = $this->getContext()->getOutput();
+               $outputPage->setPageTitle( wfMessage( 'delete-confirm', $this->getTitle()->getPrefixedText() ) );
+               $outputPage->addBacklinkSubtitle( $this->getTitle() );
+               $outputPage->setRobotPolicy( 'noindex,nofollow' );
+               $backlinkCache = $this->getTitle()->getBacklinkCache();
+               if ( $backlinkCache->hasLinks( 'pagelinks' ) || $backlinkCache->hasLinks( 'templatelinks' ) ) {
+                       $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
+                               'deleting-backlinks-warning' );
+               }
+               $outputPage->addWikiMsg( 'confirmdeletetext' );
+
+               wfRunHooks( 'ArticleConfirmDelete', array( $this, $outputPage, &$reason ) );
+
+               $user = $this->getContext()->getUser();
+
+               if ( $user->isAllowed( 'suppressrevision' ) ) {
+                       $suppress = "<tr id=\"wpDeleteSuppressRow\">
+                                       <td></td>
+                                       <td class='mw-input'><strong>" .
+                                               Xml::checkLabel( wfMessage( 'revdelete-suppress' )->text(),
+                                                       'wpSuppress', 'wpSuppress', false, array( 'tabindex' => '4' ) ) .
+                                       "</strong></td>
+                               </tr>";
+               } else {
+                       $suppress = '';
+               }
+               $checkWatch = $user->getBoolOption( 'watchdeletion' ) || $user->isWatched( $this->getTitle() );
+
+               $form = Xml::openElement( 'form', array( 'method' => 'post',
+                       'action' => $this->getTitle()->getLocalURL( 'action=delete' ), 'id' => 'deleteconfirm' ) ) .
+                       Xml::openElement( 'fieldset', array( 'id' => 'mw-delete-table' ) ) .
+                       Xml::tags( 'legend', null, wfMessage( 'delete-legend' )->escaped() ) .
+                       Xml::openElement( 'table', array( 'id' => 'mw-deleteconfirm-table' ) ) .
+                       "<tr id=\"wpDeleteReasonListRow\">
+                               <td class='mw-label'>" .
+                                       Xml::label( wfMessage( 'deletecomment' )->text(), 'wpDeleteReasonList' ) .
+                               "</td>
+                               <td class='mw-input'>" .
+                                       Xml::listDropDown(
+                                               'wpDeleteReasonList',
+                                               wfMessage( 'deletereason-dropdown' )->inContentLanguage()->text(),
+                                               wfMessage( 'deletereasonotherlist' )->inContentLanguage()->text(),
+                                               '',
+                                               'wpReasonDropDown',
+                                               1
+                                       ) .
+                               "</td>
+                       </tr>
+                       <tr id=\"wpDeleteReasonRow\">
+                               <td class='mw-label'>" .
+                                       Xml::label( wfMessage( 'deleteotherreason' )->text(), 'wpReason' ) .
+                               "</td>
+                               <td class='mw-input'>" .
+                               Html::input( 'wpReason', $reason, 'text', array(
+                                       'size' => '60',
+                                       'maxlength' => '255',
+                                       'tabindex' => '2',
+                                       'id' => 'wpReason',
+                                       'autofocus'
+                               ) ) .
+                               "</td>
+                       </tr>";
+
+               # Disallow watching if user is not logged in
+               if ( $user->isLoggedIn() ) {
+                       $form .= "
+                       <tr>
+                               <td></td>
+                               <td class='mw-input'>" .
+                                       Xml::checkLabel( wfMessage( 'watchthis' )->text(),
+                                               'wpWatch', 'wpWatch', $checkWatch, array( 'tabindex' => '3' ) ) .
+                               "</td>
+                       </tr>";
+               }
+
+               $form .= "
+                       $suppress
+                       <tr>
+                               <td></td>
+                               <td class='mw-submit'>" .
+                                       Xml::submitButton( wfMessage( 'deletepage' )->text(),
+                                               array( 'name' => 'wpConfirmB', 'id' => 'wpConfirmB', 'tabindex' => '5' ) ) .
+                               "</td>
+                       </tr>" .
+                       Xml::closeElement( 'table' ) .
+                       Xml::closeElement( 'fieldset' ) .
+                       Html::hidden(
+                               'wpEditToken',
+                               $user->getEditToken( array( 'delete', $this->getTitle()->getPrefixedText() ) )
+                       ) .
+                       Xml::closeElement( 'form' );
+
+                       if ( $user->isAllowed( 'editinterface' ) ) {
+                               $title = Title::makeTitle( NS_MEDIAWIKI, 'Deletereason-dropdown' );
+                               $link = Linker::link(
+                                       $title,
+                                       wfMessage( 'delete-edit-reasonlist' )->escaped(),
+                                       array(),
+                                       array( 'action' => 'edit' )
+                               );
+                               $form .= '<p class="mw-delete-editreasons">' . $link . '</p>';
+                       }
+
+               $outputPage->addHTML( $form );
+
+               $deleteLogPage = new LogPage( 'delete' );
+               $outputPage->addHTML( Xml::element( 'h2', null, $deleteLogPage->getName()->text() ) );
+               LogEventsList::showLogExtract( $outputPage, 'delete',
+                       $this->getTitle()
+               );
+       }
+
+       /**
+        * Perform a deletion and output success or failure messages
+        * @param string $reason
+        * @param bool $suppress
+        */
+       public function doDelete( $reason, $suppress = false ) {
+               $error = '';
+               $outputPage = $this->getContext()->getOutput();
+               $status = $this->mPage->doDeleteArticleReal( $reason, $suppress, 0, true, $error );
+
+               if ( $status->isGood() ) {
+                       $deleted = $this->getTitle()->getPrefixedText();
+
+                       $outputPage->setPageTitle( wfMessage( 'actioncomplete' ) );
+                       $outputPage->setRobotPolicy( 'noindex,nofollow' );
+
+                       $loglink = '[[Special:Log/delete|' . wfMessage( 'deletionlog' )->text() . ']]';
+
+                       $outputPage->addWikiMsg( 'deletedtext', wfEscapeWikiText( $deleted ), $loglink );
+                       $outputPage->returnToMain( false );
+               } else {
+                       $outputPage->setPageTitle(
+                               wfMessage( 'cannotdelete-title',
+                                       $this->getTitle()->getPrefixedText() )
+                       );
+
+                       if ( $error == '' ) {
+                               $outputPage->addWikiText(
+                                       "<div class=\"error mw-error-cannotdelete\">\n" . $status->getWikiText() . "\n</div>"
+                               );
+                               $deleteLogPage = new LogPage( 'delete' );
+                               $outputPage->addHTML( Xml::element( 'h2', null, $deleteLogPage->getName()->text() ) );
+
+                               LogEventsList::showLogExtract(
+                                       $outputPage,
+                                       'delete',
+                                       $this->getTitle()
+                               );
+                       } else {
+                               $outputPage->addHTML( $error );
+                       }
+               }
+       }
+
+       /* Caching functions */
+
+       /**
+        * checkLastModified returns true if it has taken care of all
+        * output to the client that is necessary for this request.
+        * (that is, it has sent a cached version of the page)
+        *
+        * @return bool true if cached version send, false otherwise
+        */
+       protected function tryFileCache() {
+               static $called = false;
+
+               if ( $called ) {
+                       wfDebug( "Article::tryFileCache(): called twice!?\n" );
+                       return false;
+               }
+
+               $called = true;
+               if ( $this->isFileCacheable() ) {
+                       $cache = HTMLFileCache::newFromTitle( $this->getTitle(), 'view' );
+                       if ( $cache->isCacheGood( $this->mPage->getTouched() ) ) {
+                               wfDebug( "Article::tryFileCache(): about to load file\n" );
+                               $cache->loadFromFileCache( $this->getContext() );
+                               return true;
+                       } else {
+                               wfDebug( "Article::tryFileCache(): starting buffer\n" );
+                               ob_start( array( &$cache, 'saveToFileCache' ) );
+                       }
+               } else {
+                       wfDebug( "Article::tryFileCache(): not cacheable\n" );
+               }
+
+               return false;
+       }
+
+       /**
+        * Check if the page can be cached
+        * @return bool
+        */
+       public function isFileCacheable() {
+               $cacheable = false;
+
+               if ( HTMLFileCache::useFileCache( $this->getContext() ) ) {
+                       $cacheable = $this->mPage->getID()
+                               && !$this->mRedirectedFrom && !$this->getTitle()->isRedirect();
+                       // Extension may have reason to disable file caching on some pages.
+                       if ( $cacheable ) {
+                               $cacheable = wfRunHooks( 'IsFileCacheable', array( &$this ) );
+                       }
+               }
+
+               return $cacheable;
+       }
+
+       /**#@-*/
+
+       /**
+        * Lightweight method to get the parser output for a page, checking the parser cache
+        * and so on. Doesn't consider most of the stuff that WikiPage::view is forced to
+        * consider, so it's not appropriate to use there.
+        *
+        * @since 1.16 (r52326) for LiquidThreads
+        *
+        * @param int|null $oldid Revision ID or null
+        * @param User $user The relevant user
+        * @return ParserOutput|bool ParserOutput or false if the given revision 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 {
+                       $parserOptions = $this->mPage->makeParserOptions( $user );
+               }
+
+               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
+        */
+       public function getParserOptions() {
+               if ( !$this->mParserOptions ) {
+                       $this->mParserOptions = $this->mPage->makeParserOptions( $this->getContext() );
+               }
+               // Clone to allow modifications of the return value without affecting cache
+               return clone $this->mParserOptions;
+       }
+
+       /**
+        * Sets the context this Article is executed in
+        *
+        * @param IContextSource $context
+        * @since 1.18
+        */
+       public function setContext( $context ) {
+               $this->mContext = $context;
+       }
+
+       /**
+        * Gets the context this Article is executed in
+        *
+        * @return IContextSource
+        * @since 1.18
+        */
+       public function getContext() {
+               if ( $this->mContext instanceof IContextSource ) {
+                       return $this->mContext;
+               } else {
+                       wfDebug( __METHOD__ . " called and \$mContext is null. " .
+                               "Return RequestContext::getMain(); for sanity\n" );
+                       return RequestContext::getMain();
+               }
+       }
+
+       /**
+        * Use PHP's magic __get handler to handle accessing of
+        * raw WikiPage fields for backwards compatibility.
+        *
+        * @param string $fname Field name
+        */
+       public function __get( $fname ) {
+               if ( property_exists( $this->mPage, $fname ) ) {
+                       #wfWarn( "Access to raw $fname field " . __CLASS__ );
+                       return $this->mPage->$fname;
+               }
+               trigger_error( 'Inaccessible property via __get(): ' . $fname, E_USER_NOTICE );
+       }
+
+       /**
+        * Use PHP's magic __set handler to handle setting of
+        * raw WikiPage fields for backwards compatibility.
+        *
+        * @param string $fname Field name
+        * @param mixed $fvalue New value
+        */
+       public function __set( $fname, $fvalue ) {
+               if ( property_exists( $this->mPage, $fname ) ) {
+                       #wfWarn( "Access to raw $fname field of " . __CLASS__ );
+                       $this->mPage->$fname = $fvalue;
+               // Note: extensions may want to toss on new fields
+               } elseif ( !in_array( $fname, array( 'mContext', 'mPage' ) ) ) {
+                       $this->mPage->$fname = $fvalue;
+               } else {
+                       trigger_error( 'Inaccessible property via __set(): ' . $fname, E_USER_NOTICE );
+               }
+       }
+
+       /**
+        * Use PHP's magic __call handler to transform instance calls to
+        * WikiPage functions for backwards compatibility.
+        *
+        * @param string $fname Name of called method
+        * @param array $args Arguments to the method
+        * @return mixed
+        */
+       public function __call( $fname, $args ) {
+               if ( is_callable( array( $this->mPage, $fname ) ) ) {
+                       #wfWarn( "Call to " . __CLASS__ . "::$fname; please use WikiPage instead" );
+                       return call_user_func_array( array( $this->mPage, $fname ), $args );
+               }
+               trigger_error( 'Inaccessible function via __call(): ' . $fname, E_USER_ERROR );
+       }
+
+       // ****** B/C functions to work-around PHP silliness with __call and references ****** //
+
+       /**
+        * @param array $limit
+        * @param array $expiry
+        * @param bool $cascade
+        * @param string $reason
+        * @param User $user
+        * @return Status
+        */
+       public function doUpdateRestrictions( array $limit, array $expiry, &$cascade,
+               $reason, User $user
+       ) {
+               return $this->mPage->doUpdateRestrictions( $limit, $expiry, $cascade, $reason, $user );
+       }
+
+       /**
+        * @param array $limit
+        * @param string $reason
+        * @param int $cascade
+        * @param array $expiry
+        * @return bool
+        */
+       public function updateRestrictions( $limit = array(), $reason = '',
+               &$cascade = 0, $expiry = array()
+       ) {
+               return $this->mPage->doUpdateRestrictions(
+                       $limit,
+                       $expiry,
+                       $cascade,
+                       $reason,
+                       $this->getContext()->getUser()
+               );
+       }
+
+       /**
+        * @param string $reason
+        * @param bool $suppress
+        * @param int $id
+        * @param bool $commit
+        * @param string $error
+        * @return bool
+        */
+       public function doDeleteArticle( $reason, $suppress = false, $id = 0,
+               $commit = true, &$error = ''
+       ) {
+               return $this->mPage->doDeleteArticle( $reason, $suppress, $id, $commit, $error );
+       }
+
+       /**
+        * @param string $fromP
+        * @param string $summary
+        * @param string $token
+        * @param bool $bot
+        * @param array $resultDetails
+        * @param User|null $user
+        * @return array
+        */
+       public function doRollback( $fromP, $summary, $token, $bot, &$resultDetails, User $user = null ) {
+               $user = is_null( $user ) ? $this->getContext()->getUser() : $user;
+               return $this->mPage->doRollback( $fromP, $summary, $token, $bot, $resultDetails, $user );
+       }
+
+       /**
+        * @param string $fromP
+        * @param string $summary
+        * @param bool $bot
+        * @param array $resultDetails
+        * @param User|null $guser
+        * @return array
+        */
+       public function commitRollback( $fromP, $summary, $bot, &$resultDetails, User $guser = null ) {
+               $guser = is_null( $guser ) ? $this->getContext()->getUser() : $guser;
+               return $this->mPage->commitRollback( $fromP, $summary, $bot, $resultDetails, $guser );
+       }
+
+       /**
+        * @param bool $hasHistory
+        * @return mixed
+        */
+       public function generateReason( &$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 ) ****** //
+
+       /**
+        * @return array
+        */
+       public static function selectFields() {
+               return WikiPage::selectFields();
+       }
+
+       /**
+        * @param Title $title
+        */
+       public static function onArticleCreate( $title ) {
+               WikiPage::onArticleCreate( $title );
+       }
+
+       /**
+        * @param Title $title
+        */
+       public static function onArticleDelete( $title ) {
+               WikiPage::onArticleDelete( $title );
+       }
+
+       /**
+        * @param Title $title
+        */
+       public static function onArticleEdit( $title ) {
+               WikiPage::onArticleEdit( $title );
+       }
+
+       /**
+        * @param string $oldtext
+        * @param string $newtext
+        * @param int $flags
+        * @return string
+        * @deprecated since 1.21, use ContentHandler::getAutosummary() instead
+        */
+       public static function getAutosummary( $oldtext, $newtext, $flags ) {
+               return WikiPage::getAutosummary( $oldtext, $newtext, $flags );
+       }
+       // ******
+}
diff --git a/includes/page/CategoryPage.php b/includes/page/CategoryPage.php
new file mode 100644 (file)
index 0000000..9abc6a8
--- /dev/null
@@ -0,0 +1,118 @@
+<?php
+/**
+ * Special handling for category description pages.
+ * Modelled after ImagePage.php.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Special handling for category description pages, showing pages,
+ * subcategories and file that belong to the category
+ */
+class CategoryPage extends Article {
+       # Subclasses can change this to override the viewer class.
+       protected $mCategoryViewerClass = 'CategoryViewer';
+
+       /**
+        * @param Title $title
+        * @return WikiCategoryPage
+        */
+       protected function newPage( Title $title ) {
+               // Overload mPage with a category-specific page
+               return new WikiCategoryPage( $title );
+       }
+
+       /**
+        * Constructor from a page id
+        * @param int $id Article ID to load
+        * @return CategoryPage|null
+        */
+       public static function newFromID( $id ) {
+               $t = Title::newFromID( $id );
+               # @todo FIXME: Doesn't inherit right
+               return $t == null ? null : new self( $t );
+               # return $t == null ? null : new static( $t ); // PHP 5.3
+       }
+
+       function view() {
+               $request = $this->getContext()->getRequest();
+               $diff = $request->getVal( 'diff' );
+               $diffOnly = $request->getBool( 'diffonly',
+                       $this->getContext()->getUser()->getOption( 'diffonly' ) );
+
+               if ( $diff !== null && $diffOnly ) {
+                       parent::view();
+                       return;
+               }
+
+               if ( !wfRunHooks( 'CategoryPageView', array( &$this ) ) ) {
+                       return;
+               }
+
+               $title = $this->getTitle();
+               if ( NS_CATEGORY == $title->getNamespace() ) {
+                       $this->openShowCategory();
+               }
+
+               parent::view();
+
+               if ( NS_CATEGORY == $title->getNamespace() ) {
+                       $this->closeShowCategory();
+               }
+       }
+
+       function openShowCategory() {
+               # For overloading
+       }
+
+       function closeShowCategory() {
+               // Use these as defaults for back compat --catrope
+               $request = $this->getContext()->getRequest();
+               $oldFrom = $request->getVal( 'from' );
+               $oldUntil = $request->getVal( 'until' );
+
+               $reqArray = $request->getValues();
+
+               $from = $until = array();
+               foreach ( array( 'page', 'subcat', 'file' ) as $type ) {
+                       $from[$type] = $request->getVal( "{$type}from", $oldFrom );
+                       $until[$type] = $request->getVal( "{$type}until", $oldUntil );
+
+                       // Do not want old-style from/until propagating in nav links.
+                       if ( !isset( $reqArray["{$type}from"] ) && isset( $reqArray["from"] ) ) {
+                               $reqArray["{$type}from"] = $reqArray["from"];
+                       }
+                       if ( !isset( $reqArray["{$type}to"] ) && isset( $reqArray["to"] ) ) {
+                               $reqArray["{$type}to"] = $reqArray["to"];
+                       }
+               }
+
+               unset( $reqArray["from"] );
+               unset( $reqArray["to"] );
+
+               $viewer = new $this->mCategoryViewerClass(
+                       $this->getContext()->getTitle(),
+                       $this->getContext(),
+                       $from,
+                       $until,
+                       $reqArray
+               );
+               $this->getContext()->getOutput()->addHTML( $viewer->getHTML() );
+       }
+}
diff --git a/includes/page/ImagePage.php b/includes/page/ImagePage.php
new file mode 100644 (file)
index 0000000..60db202
--- /dev/null
@@ -0,0 +1,1567 @@
+<?php
+/**
+ * Special handling for file description 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
+ *
+ * @file
+ */
+
+/**
+ * Class for viewing MediaWiki file description pages
+ *
+ * @ingroup Media
+ */
+class ImagePage extends Article {
+       /** @var File */
+       private $displayImg;
+
+       /** @var FileRepo */
+       private $repo;
+
+       /** @var bool */
+       private $fileLoaded;
+
+       /** @var bool */
+       protected $mExtraDescription = false;
+
+       /**
+        * @param Title $title
+        * @return WikiFilePage
+        */
+       protected function newPage( Title $title ) {
+               // Overload mPage with a file-specific page
+               return new WikiFilePage( $title );
+       }
+
+       /**
+        * Constructor from a page id
+        * @param int $id Article ID to load
+        * @return ImagePage|null
+        */
+       public static function newFromID( $id ) {
+               $t = Title::newFromID( $id );
+               # @todo FIXME: Doesn't inherit right
+               return $t == null ? null : new self( $t );
+               # return $t == null ? null : new static( $t ); // PHP 5.3
+       }
+
+       /**
+        * @param File $file
+        * @return void
+        */
+       public function setFile( $file ) {
+               $this->mPage->setFile( $file );
+               $this->displayImg = $file;
+               $this->fileLoaded = true;
+       }
+
+       protected function loadFile() {
+               if ( $this->fileLoaded ) {
+                       return;
+               }
+               $this->fileLoaded = true;
+
+               $this->displayImg = $img = false;
+               wfRunHooks( 'ImagePageFindFile', array( $this, &$img, &$this->displayImg ) );
+               if ( !$img ) { // not set by hook?
+                       $img = wfFindFile( $this->getTitle() );
+                       if ( !$img ) {
+                               $img = wfLocalFile( $this->getTitle() );
+                       }
+               }
+               $this->mPage->setFile( $img );
+               if ( !$this->displayImg ) { // not set by hook?
+                       $this->displayImg = $img;
+               }
+               $this->repo = $img->getRepo();
+       }
+
+       /**
+        * Handler for action=render
+        * Include body text only; none of the image extras
+        */
+       public function render() {
+               $this->getContext()->getOutput()->setArticleBodyOnly( true );
+               parent::view();
+       }
+
+       public function view() {
+               global $wgShowEXIF;
+
+               $out = $this->getContext()->getOutput();
+               $request = $this->getContext()->getRequest();
+               $diff = $request->getVal( 'diff' );
+               $diffOnly = $request->getBool(
+                       'diffonly',
+                       $this->getContext()->getUser()->getOption( 'diffonly' )
+               );
+
+               if ( $this->getTitle()->getNamespace() != NS_FILE || ( $diff !== null && $diffOnly ) ) {
+                       parent::view();
+                       return;
+               }
+
+               $this->loadFile();
+
+               if ( $this->getTitle()->getNamespace() == NS_FILE && $this->mPage->getFile()->getRedirected() ) {
+                       if ( $this->getTitle()->getDBkey() == $this->mPage->getFile()->getName() || $diff !== null ) {
+                               // mTitle is the same as the redirect target so ask Article
+                               // to perform the redirect for us.
+                               $request->setVal( 'diffonly', 'true' );
+                               parent::view();
+                               return;
+                       } else {
+                               // mTitle is not the same as the redirect target so it is
+                               // probably the redirect page itself. Fake the redirect symbol
+                               $out->setPageTitle( $this->getTitle()->getPrefixedText() );
+                               $out->addHTML( $this->viewRedirect(
+                                       Title::makeTitle( NS_FILE, $this->mPage->getFile()->getName() ),
+                                       /* $appendSubtitle */ true,
+                                       /* $forceKnown */ true )
+                               );
+                               $this->mPage->doViewUpdates( $this->getContext()->getUser(), $this->getOldID() );
+                               return;
+                       }
+               }
+
+               if ( $wgShowEXIF && $this->displayImg->exists() ) {
+                       // @todo FIXME: Bad interface, see note on MediaHandler::formatMetadata().
+                       $formattedMetadata = $this->displayImg->formatMetadata();
+                       $showmeta = $formattedMetadata !== false;
+               } else {
+                       $showmeta = false;
+               }
+
+               if ( !$diff && $this->displayImg->exists() ) {
+                       $out->addHTML( $this->showTOC( $showmeta ) );
+               }
+
+               if ( !$diff ) {
+                       $this->openShowImage();
+               }
+
+               # No need to display noarticletext, we use our own message, output in openShowImage()
+               if ( $this->mPage->getID() ) {
+                       # NS_FILE is in the user language, but this section (the actual wikitext)
+                       # should be in page content language
+                       $pageLang = $this->getTitle()->getPageViewLanguage();
+                       $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
+                       $out->setArticleFlag( true );
+                       $out->setPageTitle( $this->getTitle()->getPrefixedText() );
+                       $this->mPage->doViewUpdates( $this->getContext()->getUser(), $this->getOldID() );
+               }
+
+               # Show shared description, if needed
+               if ( $this->mExtraDescription ) {
+                       $fol = wfMessage( 'shareddescriptionfollows' );
+                       if ( !$fol->isDisabled() ) {
+                               $out->addWikiText( $fol->plain() );
+                       }
+                       $out->addHTML( '<div id="shared-image-desc">' . $this->mExtraDescription . "</div>\n" );
+               }
+
+               $this->closeShowImage();
+               $this->imageHistory();
+               // TODO: Cleanup the following
+
+               $out->addHTML( Xml::element( 'h2',
+                       array( 'id' => 'filelinks' ),
+                       wfMessage( 'imagelinks' )->text() ) . "\n" );
+               $this->imageDupes();
+               # @todo FIXME: For some freaky reason, we can't redirect to foreign images.
+               # Yet we return metadata about the target. Definitely an issue in the FileRepo
+               $this->imageLinks();
+
+               # Allow extensions to add something after the image links
+               $html = '';
+               wfRunHooks( 'ImagePageAfterImageLinks', array( $this, &$html ) );
+               if ( $html ) {
+                       $out->addHTML( $html );
+               }
+
+               if ( $showmeta ) {
+                       $out->addHTML( Xml::element(
+                               'h2',
+                               array( 'id' => 'metadata' ),
+                               wfMessage( 'metadata' )->text() ) . "\n" );
+                       $out->addWikiText( $this->makeMetadataTable( $formattedMetadata ) );
+                       $out->addModules( array( 'mediawiki.action.view.metadata' ) );
+               }
+
+               // Add remote Filepage.css
+               if ( !$this->repo->isLocal() ) {
+                       $css = $this->repo->getDescriptionStylesheetUrl();
+                       if ( $css ) {
+                               $out->addStyle( $css );
+                       }
+               }
+               // always show the local local Filepage.css, bug 29277
+               $out->addModuleStyles( 'filepage' );
+       }
+
+       /**
+        * @return File
+        */
+       public function getDisplayedFile() {
+               $this->loadFile();
+               return $this->displayImg;
+       }
+
+       /**
+        * Create the TOC
+        *
+        * @param bool $metadata Whether or not to show the metadata link
+        * @return string
+        */
+       protected function showTOC( $metadata ) {
+               $r = array(
+                       '<li><a href="#file">' . wfMessage( 'file-anchor-link' )->escaped() . '</a></li>',
+                       '<li><a href="#filehistory">' . wfMessage( 'filehist' )->escaped() . '</a></li>',
+                       '<li><a href="#filelinks">' . wfMessage( 'imagelinks' )->escaped() . '</a></li>',
+               );
+               if ( $metadata ) {
+                       $r[] = '<li><a href="#metadata">' . wfMessage( 'metadata' )->escaped() . '</a></li>';
+               }
+
+               wfRunHooks( 'ImagePageShowTOC', array( $this, &$r ) );
+
+               return '<ul id="filetoc">' . implode( "\n", $r ) . '</ul>';
+       }
+
+       /**
+        * Make a table with metadata to be shown in the output page.
+        *
+        * @todo FIXME: Bad interface, see note on MediaHandler::formatMetadata().
+        *
+        * @param array $metadata The array containing the Exif data
+        * @return string The metadata table. This is treated as Wikitext (!)
+        */
+       protected function makeMetadataTable( $metadata ) {
+               $r = "<div class=\"mw-imagepage-section-metadata\">";
+               $r .= wfMessage( 'metadata-help' )->plain();
+               $r .= "<table id=\"mw_metadata\" class=\"mw_metadata\">\n";
+               foreach ( $metadata as $type => $stuff ) {
+                       foreach ( $stuff as $v ) {
+                               # @todo FIXME: Why is this using escapeId for a class?!
+                               $class = Sanitizer::escapeId( $v['id'] );
+                               if ( $type == 'collapsed' ) {
+                                       // Handled by mediawiki.action.view.metadata module
+                                       // and skins/common/shared.css.
+                                       $class .= ' collapsable';
+                               }
+                               $r .= "<tr class=\"$class\">\n";
+                               $r .= "<th>{$v['name']}</th>\n";
+                               $r .= "<td>{$v['value']}</td>\n</tr>";
+                       }
+               }
+               $r .= "</table>\n</div>\n";
+               return $r;
+       }
+
+       /**
+        * Overloading Article's getContentObject method.
+        *
+        * Omit noarticletext if sharedupload; text will be fetched from the
+        * shared upload server if possible.
+        * @return string
+        */
+       public function getContentObject() {
+               $this->loadFile();
+               if ( $this->mPage->getFile() && !$this->mPage->getFile()->isLocal() && 0 == $this->getID() ) {
+                       return null;
+               }
+               return parent::getContentObject();
+       }
+
+       protected function openShowImage() {
+               global $wgImageLimits, $wgEnableUploads, $wgSend404Code;
+
+               $this->loadFile();
+               $out = $this->getContext()->getOutput();
+               $user = $this->getContext()->getUser();
+               $lang = $this->getContext()->getLanguage();
+               $dirmark = $lang->getDirMarkEntity();
+               $request = $this->getContext()->getRequest();
+
+               $max = $this->getImageLimitsFromOption( $user, 'imagesize' );
+               $maxWidth = $max[0];
+               $maxHeight = $max[1];
+
+               if ( $this->displayImg->exists() ) {
+                       # image
+                       $page = $request->getIntOrNull( 'page' );
+                       if ( is_null( $page ) ) {
+                               $params = array();
+                               $page = 1;
+                       } else {
+                               $params = array( 'page' => $page );
+                       }
+
+                       $renderLang = $request->getVal( 'lang' );
+                       if ( !is_null( $renderLang ) ) {
+                               $handler = $this->displayImg->getHandler();
+                               if ( $handler && $handler->validateParam( 'lang', $renderLang ) ) {
+                                       $params['lang'] = $renderLang;
+                               } else {
+                                       $renderLang = null;
+                               }
+                       }
+
+                       $width_orig = $this->displayImg->getWidth( $page );
+                       $width = $width_orig;
+                       $height_orig = $this->displayImg->getHeight( $page );
+                       $height = $height_orig;
+
+                       $filename = wfEscapeWikiText( $this->displayImg->getName() );
+                       $linktext = $filename;
+
+                       wfRunHooks( 'ImageOpenShowImageInlineBefore', array( &$this, &$out ) );
+
+                       if ( $this->displayImg->allowInlineDisplay() ) {
+                               # image
+
+                               # "Download high res version" link below the image
+                               # $msgsize = wfMessage( 'file-info-size', $width_orig, $height_orig,
+                               #   Linker::formatSize( $this->displayImg->getSize() ), $mime )->escaped();
+                               # We'll show a thumbnail of this image
+                               if ( $width > $maxWidth || $height > $maxHeight ) {
+                                       # Calculate the thumbnail size.
+                                       # First case, the limiting factor is the width, not the height.
+                                       /** @todo // FIXME: Possible division by 0. bug 36911 */
+                                       if ( $width / $height >= $maxWidth / $maxHeight ) {
+                                               /** @todo // FIXME: Possible division by 0. bug 36911 */
+                                               $height = round( $height * $maxWidth / $width );
+                                               $width = $maxWidth;
+                                               # Note that $height <= $maxHeight now.
+                                       } else {
+                                               /** @todo // FIXME: Possible division by 0. bug 36911 */
+                                               $newwidth = floor( $width * $maxHeight / $height );
+                                               /** @todo // FIXME: Possible division by 0. bug 36911 */
+                                               $height = round( $height * $newwidth / $width );
+                                               $width = $newwidth;
+                                               # Note that $height <= $maxHeight now, but might not be identical
+                                               # because of rounding.
+                                       }
+                                       $linktext = wfMessage( 'show-big-image' )->escaped();
+                                       if ( $this->displayImg->getRepo()->canTransformVia404() ) {
+                                               $thumbSizes = $wgImageLimits;
+                                               // Also include the full sized resolution in the list, so
+                                               // that users know they can get it. This will link to the
+                                               // original file asset if mustRender() === false. In the case
+                                               // that we mustRender, some users have indicated that they would
+                                               // find it useful to have the full size image in the rendered
+                                               // image format.
+                                               $thumbSizes[] = array( $width_orig, $height_orig );
+                                       } else {
+                                               # Creating thumb links triggers thumbnail generation.
+                                               # Just generate the thumb for the current users prefs.
+                                               $thumbSizes = array( $this->getImageLimitsFromOption( $user, 'thumbsize' ) );
+                                               if ( !$this->displayImg->mustRender() ) {
+                                                       // We can safely include a link to the "full-size" preview,
+                                                       // without actually rendering.
+                                                       $thumbSizes[] = array( $width_orig, $height_orig );
+                                               }
+                                       }
+                                       # Generate thumbnails or thumbnail links as needed...
+                                       $otherSizes = array();
+                                       foreach ( $thumbSizes as $size ) {
+                                               // We include a thumbnail size in the list, if it is
+                                               // less than or equal to the original size of the image
+                                               // asset ($width_orig/$height_orig). We also exclude
+                                               // the current thumbnail's size ($width/$height)
+                                               // since that is added to the message separately, so
+                                               // it can be denoted as the current size being shown.
+                                               if ( $size[0] <= $width_orig && $size[1] <= $height_orig
+                                                       && $size[0] != $width && $size[1] != $height
+                                               ) {
+                                                       $sizeLink = $this->makeSizeLink( $params, $size[0], $size[1] );
+                                                       if ( $sizeLink ) {
+                                                               $otherSizes[] = $sizeLink;
+                                                       }
+                                               }
+                                       }
+                                       $otherSizes = array_unique( $otherSizes );
+                                       $msgsmall = '';
+                                       $sizeLinkBigImagePreview = $this->makeSizeLink( $params, $width, $height );
+                                       if ( $sizeLinkBigImagePreview ) {
+                                               $msgsmall .= wfMessage( 'show-big-image-preview' )->
+                                                       rawParams( $sizeLinkBigImagePreview )->
+                                                       parse();
+                                       }
+                                       if ( count( $otherSizes ) ) {
+                                               $msgsmall .= ' ' .
+                                               Html::rawElement( 'span', array( 'class' => 'mw-filepage-other-resolutions' ),
+                                                       wfMessage( 'show-big-image-other' )->rawParams( $lang->pipeList( $otherSizes ) )->
+                                                       params( count( $otherSizes ) )->parse()
+                                               );
+                                       }
+                               } elseif ( $width == 0 && $height == 0 ) {
+                                       # Some sort of audio file that doesn't have dimensions
+                                       # Don't output a no hi res message for such a file
+                                       $msgsmall = '';
+                               } elseif ( $this->displayImg->isVectorized() ) {
+                                       # For vectorized images, full size is just the frame size
+                                       $msgsmall = '';
+                               } else {
+                                       # Image is small enough to show full size on image page
+                                       $msgsmall = wfMessage( 'file-nohires' )->parse();
+                               }
+
+                               $params['width'] = $width;
+                               $params['height'] = $height;
+                               $thumbnail = $this->displayImg->transform( $params );
+                               Linker::processResponsiveImages( $this->displayImg, $thumbnail, $params );
+
+                               $anchorclose = Html::rawElement(
+                                       'div',
+                                       array( 'class' => 'mw-filepage-resolutioninfo' ),
+                                       $msgsmall
+                               );
+
+                               $isMulti = $this->displayImg->isMultipage() && $this->displayImg->pageCount() > 1;
+                               if ( $isMulti ) {
+                                       $out->addModules( 'mediawiki.page.image.pagination' );
+                                       $out->addHTML( '<table class="multipageimage"><tr><td>' );
+                               }
+
+                               if ( $thumbnail ) {
+                                       $options = array(
+                                               'alt' => $this->displayImg->getTitle()->getPrefixedText(),
+                                               'file-link' => true,
+                                       );
+                                       $out->addHTML( '<div class="fullImageLink" id="file">' .
+                                               $thumbnail->toHtml( $options ) .
+                                               $anchorclose . "</div>\n" );
+                               }
+
+                               if ( $isMulti ) {
+                                       $count = $this->displayImg->pageCount();
+
+                                       if ( $page > 1 ) {
+                                               $label = $out->parse( wfMessage( 'imgmultipageprev' )->text(), false );
+                                               $link = Linker::linkKnown(
+                                                       $this->getTitle(),
+                                                       $label,
+                                                       array(),
+                                                       array( 'page' => $page - 1 )
+                                               );
+                                               $thumb1 = Linker::makeThumbLinkObj(
+                                                       $this->getTitle(),
+                                                       $this->displayImg,
+                                                       $link,
+                                                       $label,
+                                                       'none',
+                                                       array( 'page' => $page - 1 )
+                                               );
+                                       } else {
+                                               $thumb1 = '';
+                                       }
+
+                                       if ( $page < $count ) {
+                                               $label = wfMessage( 'imgmultipagenext' )->text();
+                                               $link = Linker::linkKnown(
+                                                       $this->getTitle(),
+                                                       $label,
+                                                       array(),
+                                                       array( 'page' => $page + 1 )
+                                               );
+                                               $thumb2 = Linker::makeThumbLinkObj(
+                                                       $this->getTitle(),
+                                                       $this->displayImg,
+                                                       $link,
+                                                       $label,
+                                                       'none',
+                                                       array( 'page' => $page + 1 )
+                                               );
+                                       } else {
+                                               $thumb2 = '';
+                                       }
+
+                                       global $wgScript;
+
+                                       $formParams = array(
+                                               'name' => 'pageselector',
+                                               'action' => $wgScript,
+                                       );
+                                       $options = array();
+                                       for ( $i = 1; $i <= $count; $i++ ) {
+                                               $options[] = Xml::option( $lang->formatNum( $i ), $i, $i == $page );
+                                       }
+                                       $select = Xml::tags( 'select',
+                                               array( 'id' => 'pageselector', 'name' => 'page' ),
+                                               implode( "\n", $options ) );
+
+                                       $out->addHTML(
+                                               '</td><td><div class="multipageimagenavbox">' .
+                                               Xml::openElement( 'form', $formParams ) .
+                                               Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
+                                                       wfMessage( 'imgmultigoto' )->rawParams( $select )->parse() .
+                                               Xml::submitButton( wfMessage( 'imgmultigo' )->text() ) .
+                                               Xml::closeElement( 'form' ) .
+                                               "<hr />$thumb1\n$thumb2<br style=\"clear: both\" /></div></td></tr></table>"
+                                       );
+                               }
+                       } elseif ( $this->displayImg->isSafeFile() ) {
+                               # if direct link is allowed but it's not a renderable image, show an icon.
+                               $icon = $this->displayImg->iconThumb();
+
+                               $out->addHTML( '<div class="fullImageLink" id="file">' .
+                                       $icon->toHtml( array( 'file-link' => true ) ) .
+                                       "</div>\n" );
+                       }
+
+                       $longDesc = wfMessage( 'parentheses', $this->displayImg->getLongDesc() )->text();
+
+                       $medialink = "[[Media:$filename|$linktext]]";
+
+                       if ( !$this->displayImg->isSafeFile() ) {
+                               $warning = wfMessage( 'mediawarning' )->plain();
+                               // dirmark is needed here to separate the file name, which
+                               // most likely ends in Latin characters, from the description,
+                               // which may begin with the file type. In RTL environment
+                               // this will get messy.
+                               // The dirmark, however, must not be immediately adjacent
+                               // to the filename, because it can get copied with it.
+                               // See bug 25277.
+                               // @codingStandardsIgnoreStart Ignore long line
+                               $out->addWikiText( <<<EOT
+<div class="fullMedia"><span class="dangerousLink">{$medialink}</span> $dirmark<span class="fileInfo">$longDesc</span></div>
+<div class="mediaWarning">$warning</div>
+EOT
+                               );
+                               // @codingStandardsIgnoreEnd
+                       } else {
+                               $out->addWikiText( <<<EOT
+<div class="fullMedia">{$medialink} {$dirmark}<span class="fileInfo">$longDesc</span>
+</div>
+EOT
+                               );
+                       }
+
+                       $renderLangOptions = $this->displayImg->getAvailableLanguages();
+                       if ( count( $renderLangOptions ) >= 1 ) {
+                               $currentLanguage = $renderLang;
+                               $defaultLang = $this->displayImg->getDefaultRenderLanguage();
+                               if ( is_null( $currentLanguage ) ) {
+                                       $currentLanguage = $defaultLang;
+                               }
+                               $out->addHtml( $this->doRenderLangOpt( $renderLangOptions, $currentLanguage, $defaultLang ) );
+                       }
+
+                       // Add cannot animate thumbnail warning
+                       if ( !$this->displayImg->canAnimateThumbIfAppropriate() ) {
+                               // Include the extension so wiki admins can
+                               // customize it on a per file-type basis
+                               // (aka say things like use format X instead).
+                               // additionally have a specific message for
+                               // file-no-thumb-animation-gif
+                               $ext = $this->displayImg->getExtension();
+                               $noAnimMesg = wfMessageFallback(
+                                       'file-no-thumb-animation-' . $ext,
+                                       'file-no-thumb-animation'
+                               )->plain();
+
+                               $out->addWikiText( <<<EOT
+<div class="mw-noanimatethumb">{$noAnimMesg}</div>
+EOT
+                               );
+                       }
+
+                       if ( !$this->displayImg->isLocal() ) {
+                               $this->printSharedImageText();
+                       }
+               } else {
+                       # Image does not exist
+                       if ( !$this->getID() ) {
+                               # No article exists either
+                               # Show deletion log to be consistent with normal articles
+                               LogEventsList::showLogExtract(
+                                       $out,
+                                       array( 'delete', 'move' ),
+                                       $this->getTitle()->getPrefixedText(),
+                                       '',
+                                       array( 'lim' => 10,
+                                               'conds' => array( "log_action != 'revision'" ),
+                                               'showIfEmpty' => false,
+                                               'msgKey' => array( 'moveddeleted-notice' )
+                                       )
+                               );
+                       }
+
+                       if ( $wgEnableUploads && $user->isAllowed( 'upload' ) ) {
+                               // Only show an upload link if the user can upload
+                               $uploadTitle = SpecialPage::getTitleFor( 'Upload' );
+                               $nofile = array(
+                                       'filepage-nofile-link',
+                                       $uploadTitle->getFullURL( array( 'wpDestFile' => $this->mPage->getFile()->getName() ) )
+                               );
+                       } else {
+                               $nofile = 'filepage-nofile';
+                       }
+                       // Note, if there is an image description page, but
+                       // no image, then this setRobotPolicy is overridden
+                       // by Article::View().
+                       $out->setRobotPolicy( 'noindex,nofollow' );
+                       $out->wrapWikiMsg( "<div id='mw-imagepage-nofile' class='plainlinks'>\n$1\n</div>", $nofile );
+                       if ( !$this->getID() && $wgSend404Code ) {
+                               // If there is no image, no shared image, and no description page,
+                               // output a 404, to be consistent with articles.
+                               $request->response()->header( 'HTTP/1.1 404 Not Found' );
+                       }
+               }
+               $out->setFileVersion( $this->displayImg );
+       }
+
+       /**
+        * Creates an thumbnail of specified size and returns an HTML link to it
+        * @param array $params Scaler parameters
+        * @param int $width
+        * @param int $height
+        * @return string
+        */
+       private function makeSizeLink( $params, $width, $height ) {
+               $params['width'] = $width;
+               $params['height'] = $height;
+               $thumbnail = $this->displayImg->transform( $params );
+               if ( $thumbnail && !$thumbnail->isError() ) {
+                       return Html::rawElement( 'a', array(
+                               'href' => $thumbnail->getUrl(),
+                               'class' => 'mw-thumbnail-link'
+                               ), wfMessage( 'show-big-image-size' )->numParams(
+                                       $thumbnail->getWidth(), $thumbnail->getHeight()
+                               )->parse() );
+               } else {
+                       return '';
+               }
+       }
+
+       /**
+        * Show a notice that the file is from a shared repository
+        */
+       protected function printSharedImageText() {
+               $out = $this->getContext()->getOutput();
+               $this->loadFile();
+
+               $descUrl = $this->mPage->getFile()->getDescriptionUrl();
+               $descText = $this->mPage->getFile()->getDescriptionText( $this->getContext()->getLanguage() );
+
+               /* Add canonical to head if there is no local page for this shared file */
+               if ( $descUrl && $this->mPage->getID() == 0 ) {
+                       $out->setCanonicalUrl( $descUrl );
+               }
+
+               $wrap = "<div class=\"sharedUploadNotice\">\n$1\n</div>\n";
+               $repo = $this->mPage->getFile()->getRepo()->getDisplayName();
+
+               if ( $descUrl && $descText && wfMessage( 'sharedupload-desc-here' )->plain() !== '-' ) {
+                       $out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-here', $repo, $descUrl ) );
+               } elseif ( $descUrl && wfMessage( 'sharedupload-desc-there' )->plain() !== '-' ) {
+                       $out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-there', $repo, $descUrl ) );
+               } else {
+                       $out->wrapWikiMsg( $wrap, array( 'sharedupload', $repo ), ''/*BACKCOMPAT*/ );
+               }
+
+               if ( $descText ) {
+                       $this->mExtraDescription = $descText;
+               }
+       }
+
+       public function getUploadUrl() {
+               $this->loadFile();
+               $uploadTitle = SpecialPage::getTitleFor( 'Upload' );
+               return $uploadTitle->getFullURL( array(
+                       'wpDestFile' => $this->mPage->getFile()->getName(),
+                       'wpForReUpload' => 1
+               ) );
+       }
+
+       /**
+        * Print out the various links at the bottom of the image page, e.g. reupload,
+        * external editing (and instructions link) etc.
+        */
+       protected function uploadLinksBox() {
+               global $wgEnableUploads;
+
+               if ( !$wgEnableUploads ) {
+                       return;
+               }
+
+               $this->loadFile();
+               if ( !$this->mPage->getFile()->isLocal() ) {
+                       return;
+               }
+
+               $out = $this->getContext()->getOutput();
+               $out->addHTML( "<ul>\n" );
+
+               # "Upload a new version of this file" link
+               $canUpload = $this->getTitle()->userCan( 'upload', $this->getContext()->getUser() );
+               if ( $canUpload && UploadBase::userCanReUpload(
+                               $this->getContext()->getUser(),
+                               $this->mPage->getFile()->name )
+               ) {
+                       $ulink = Linker::makeExternalLink(
+                               $this->getUploadUrl(),
+                               wfMessage( 'uploadnewversion-linktext' )->text()
+                       );
+                       $out->addHTML( "<li id=\"mw-imagepage-reupload-link\">"
+                               . "<div class=\"plainlinks\">{$ulink}</div></li>\n" );
+               } else {
+                       $out->addHTML( "<li id=\"mw-imagepage-upload-disallowed\">"
+                               . $this->getContext()->msg( 'upload-disallowed-here' )->escaped() . "</li>\n" );
+               }
+
+               $out->addHTML( "</ul>\n" );
+       }
+
+       /**
+        * For overloading
+        */
+       protected function closeShowImage() {
+       }
+
+       /**
+        * If the page we've just displayed is in the "Image" namespace,
+        * we follow it with an upload history of the image and its usage.
+        */
+       protected function imageHistory() {
+               $this->loadFile();
+               $out = $this->getContext()->getOutput();
+               $pager = new ImageHistoryPseudoPager( $this );
+               $out->addHTML( $pager->getBody() );
+               $out->preventClickjacking( $pager->getPreventClickjacking() );
+
+               $this->mPage->getFile()->resetHistory(); // free db resources
+
+               # Exist check because we don't want to show this on pages where an image
+               # doesn't exist along with the noimage message, that would suck. -ævar
+               if ( $this->mPage->getFile()->exists() ) {
+                       $this->uploadLinksBox();
+               }
+       }
+
+       /**
+        * @param string $target
+        * @param int $limit
+        * @return ResultWrapper
+        */
+       protected function queryImageLinks( $target, $limit ) {
+               $dbr = wfGetDB( DB_SLAVE );
+
+               return $dbr->select(
+                       array( 'imagelinks', 'page' ),
+                       array( 'page_namespace', 'page_title', 'il_to' ),
+                       array( 'il_to' => $target, 'il_from = page_id' ),
+                       __METHOD__,
+                       array( 'LIMIT' => $limit + 1, 'ORDER BY' => 'il_from', )
+               );
+       }
+
+       protected function imageLinks() {
+               $limit = 100;
+
+               $out = $this->getContext()->getOutput();
+
+               $rows = array();
+               $redirects = array();
+               foreach ( $this->getTitle()->getRedirectsHere( NS_FILE ) as $redir ) {
+                       $redirects[$redir->getDBkey()] = array();
+                       $rows[] = (object)array(
+                               'page_namespace' => NS_FILE,
+                               'page_title' => $redir->getDBkey(),
+                       );
+               }
+
+               $res = $this->queryImageLinks( $this->getTitle()->getDBkey(), $limit + 1 );
+               foreach ( $res as $row ) {
+                       $rows[] = $row;
+               }
+               $count = count( $rows );
+
+               $hasMore = $count > $limit;
+               if ( !$hasMore && count( $redirects ) ) {
+                       $res = $this->queryImageLinks( array_keys( $redirects ),
+                               $limit - count( $rows ) + 1 );
+                       foreach ( $res as $row ) {
+                               $redirects[$row->il_to][] = $row;
+                               $count++;
+                       }
+                       $hasMore = ( $res->numRows() + count( $rows ) ) > $limit;
+               }
+
+               if ( $count == 0 ) {
+                       $out->wrapWikiMsg(
+                               Html::rawElement( 'div',
+                                       array( 'id' => 'mw-imagepage-nolinkstoimage' ), "\n$1\n" ),
+                               'nolinkstoimage'
+                       );
+                       return;
+               }
+
+               $out->addHTML( "<div id='mw-imagepage-section-linkstoimage'>\n" );
+               if ( !$hasMore ) {
+                       $out->addWikiMsg( 'linkstoimage', $count );
+               } else {
+                       // More links than the limit. Add a link to [[Special:Whatlinkshere]]
+                       $out->addWikiMsg( 'linkstoimage-more',
+                               $this->getContext()->getLanguage()->formatNum( $limit ),
+                               $this->getTitle()->getPrefixedDBkey()
+                       );
+               }
+
+               $out->addHTML(
+                       Html::openElement( 'ul',
+                               array( 'class' => 'mw-imagepage-linkstoimage' ) ) . "\n"
+               );
+               $count = 0;
+
+               // Sort the list by namespace:title
+               usort( $rows, array( $this, 'compare' ) );
+
+               // Create links for every element
+               $currentCount = 0;
+               foreach ( $rows as $element ) {
+                       $currentCount++;
+                       if ( $currentCount > $limit ) {
+                               break;
+                       }
+
+                       $query = array();
+                       # Add a redirect=no to make redirect pages reachable
+                       if ( isset( $redirects[$element->page_title] ) ) {
+                               $query['redirect'] = 'no';
+                       }
+                       $link = Linker::linkKnown(
+                               Title::makeTitle( $element->page_namespace, $element->page_title ),
+                               null, array(), $query
+                       );
+                       if ( !isset( $redirects[$element->page_title] ) ) {
+                               # No redirects
+                               $liContents = $link;
+                       } elseif ( count( $redirects[$element->page_title] ) === 0 ) {
+                               # Redirect without usages
+                               $liContents = wfMessage( 'linkstoimage-redirect' )->rawParams( $link, '' )->parse();
+                       } else {
+                               # Redirect with usages
+                               $li = '';
+                               foreach ( $redirects[$element->page_title] as $row ) {
+                                       $currentCount++;
+                                       if ( $currentCount > $limit ) {
+                                               break;
+                                       }
+
+                                       $link2 = Linker::linkKnown( Title::makeTitle( $row->page_namespace, $row->page_title ) );
+                                       $li .= Html::rawElement(
+                                               'li',
+                                               array( 'class' => 'mw-imagepage-linkstoimage-ns' . $element->page_namespace ),
+                                               $link2
+                                               ) . "\n";
+                               }
+
+                               $ul = Html::rawElement(
+                                       'ul',
+                                       array( 'class' => 'mw-imagepage-redirectstofile' ),
+                                       $li
+                                       ) . "\n";
+                               $liContents = wfMessage( 'linkstoimage-redirect' )->rawParams(
+                                       $link, $ul )->parse();
+                       }
+                       $out->addHTML( Html::rawElement(
+                                       'li',
+                                       array( 'class' => 'mw-imagepage-linkstoimage-ns' . $element->page_namespace ),
+                                       $liContents
+                               ) . "\n"
+                       );
+
+               };
+               $out->addHTML( Html::closeElement( 'ul' ) . "\n" );
+               $res->free();
+
+               // Add a links to [[Special:Whatlinkshere]]
+               if ( $count > $limit ) {
+                       $out->addWikiMsg( 'morelinkstoimage', $this->getTitle()->getPrefixedDBkey() );
+               }
+               $out->addHTML( Html::closeElement( 'div' ) . "\n" );
+       }
+
+       protected function imageDupes() {
+               $this->loadFile();
+               $out = $this->getContext()->getOutput();
+
+               $dupes = $this->mPage->getDuplicates();
+               if ( count( $dupes ) == 0 ) {
+                       return;
+               }
+
+               $out->addHTML( "<div id='mw-imagepage-section-duplicates'>\n" );
+               $out->addWikiMsg( 'duplicatesoffile',
+                       $this->getContext()->getLanguage()->formatNum( count( $dupes ) ), $this->getTitle()->getDBkey()
+               );
+               $out->addHTML( "<ul class='mw-imagepage-duplicates'>\n" );
+
+               /**
+                * @var $file File
+                */
+               foreach ( $dupes as $file ) {
+                       $fromSrc = '';
+                       if ( $file->isLocal() ) {
+                               $link = Linker::linkKnown( $file->getTitle() );
+                       } else {
+                               $link = Linker::makeExternalLink( $file->getDescriptionUrl(),
+                                       $file->getTitle()->getPrefixedText() );
+                               $fromSrc = wfMessage( 'shared-repo-from', $file->getRepo()->getDisplayName() )->text();
+                       }
+                       $out->addHTML( "<li>{$link} {$fromSrc}</li>\n" );
+               }
+               $out->addHTML( "</ul></div>\n" );
+       }
+
+       /**
+        * Delete the file, or an earlier version of it
+        */
+       public function delete() {
+               $file = $this->mPage->getFile();
+               if ( !$file->exists() || !$file->isLocal() || $file->getRedirected() ) {
+                       // Standard article deletion
+                       parent::delete();
+                       return;
+               }
+
+               $deleter = new FileDeleteForm( $file );
+               $deleter->execute();
+       }
+
+       /**
+        * Display an error with a wikitext description
+        *
+        * @param string $description
+        */
+       function showError( $description ) {
+               $out = $this->getContext()->getOutput();
+               $out->setPageTitle( wfMessage( 'internalerror' ) );
+               $out->setRobotPolicy( 'noindex,nofollow' );
+               $out->setArticleRelated( false );
+               $out->enableClientCache( false );
+               $out->addWikiText( $description );
+       }
+
+       /**
+        * Callback for usort() to do link sorts by (namespace, title)
+        * Function copied from Title::compare()
+        *
+        * @param object $a Object page to compare with
+        * @param object $b Object page to compare with
+        * @return int Result of string comparison, or namespace comparison
+        */
+       protected function compare( $a, $b ) {
+               if ( $a->page_namespace == $b->page_namespace ) {
+                       return strcmp( $a->page_title, $b->page_title );
+               } else {
+                       return $a->page_namespace - $b->page_namespace;
+               }
+       }
+
+       /**
+        * Returns the corresponding $wgImageLimits entry for the selected user option
+        *
+        * @param User $user
+        * @param string $optionName Name of a option to check, typically imagesize or thumbsize
+        * @return array
+        * @since 1.21
+        */
+       public function getImageLimitsFromOption( $user, $optionName ) {
+               global $wgImageLimits;
+
+               $option = $user->getIntOption( $optionName );
+               if ( !isset( $wgImageLimits[$option] ) ) {
+                       $option = User::getDefaultOption( $optionName );
+               }
+
+               // The user offset might still be incorrect, specially if
+               // $wgImageLimits got changed (see bug #8858).
+               if ( !isset( $wgImageLimits[$option] ) ) {
+                       // Default to the first offset in $wgImageLimits
+                       $option = 0;
+               }
+
+               return isset( $wgImageLimits[$option] )
+                       ? $wgImageLimits[$option]
+                       : array( 800, 600 ); // if nothing is set, fallback to a hardcoded default
+       }
+
+       /**
+        * Output a drop-down box for language options for the file
+        *
+        * @param array $langChoices Array of string language codes
+        * @param string $curLang Language code file is being viewed in.
+        * @param string $defaultLang Language code that image is rendered in by default
+        * @return string HTML to insert underneath image.
+        */
+       protected function doRenderLangOpt( array $langChoices, $curLang, $defaultLang ) {
+               global $wgScript;
+               sort( $langChoices );
+               $curLang = wfBCP47( $curLang );
+               $defaultLang = wfBCP47( $defaultLang );
+               $opts = '';
+               $haveCurrentLang = false;
+               $haveDefaultLang = false;
+
+               // We make a list of all the language choices in the file.
+               // Additionally if the default language to render this file
+               // is not included as being in this file (for example, in svgs
+               // usually the fallback content is the english content) also
+               // include a choice for that. Last of all, if we're viewing
+               // the file in a language not on the list, add it as a choice.
+               foreach ( $langChoices as $lang ) {
+                       $code = wfBCP47( $lang );
+                       $name = Language::fetchLanguageName( $code, $this->getContext()->getLanguage()->getCode() );
+                       if ( $name !== '' ) {
+                               $display = wfMessage( 'img-lang-opt', $code, $name )->text();
+                       } else {
+                               $display = $code;
+                       }
+                       $opts .= "\n" . Xml::option( $display, $code, $curLang === $code );
+                       if ( $curLang === $code ) {
+                               $haveCurrentLang = true;
+                       }
+                       if ( $defaultLang === $code ) {
+                               $haveDefaultLang = true;
+                       }
+               }
+               if ( !$haveDefaultLang ) {
+                       // Its hard to know if the content is really in the default language, or
+                       // if its just unmarked content that could be in any language.
+                       $opts = Xml::option(
+                               wfMessage( 'img-lang-default' )->text(),
+                               $defaultLang,
+                               $defaultLang === $curLang
+                       ) . $opts;
+               }
+               if ( !$haveCurrentLang && $defaultLang !== $curLang ) {
+                       $name = Language::fetchLanguageName( $curLang, $this->getContext()->getLanguage()->getCode() );
+                       if ( $name !== '' ) {
+                               $display = wfMessage( 'img-lang-opt', $curLang, $name )->text();
+                       } else {
+                               $display = $curLang;
+                       }
+                       $opts = Xml::option( $display, $curLang, true ) . $opts;
+               }
+
+               $select = Html::rawElement(
+                       'select',
+                       array( 'id' => 'mw-imglangselector', 'name' => 'lang' ),
+                       $opts
+               );
+               $submit = Xml::submitButton( wfMessage( 'img-lang-go' )->text() );
+
+               $formContents = wfMessage( 'img-lang-info' )->rawParams( $select, $submit )->parse()
+                       . Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() );
+
+               $langSelectLine = Html::rawElement( 'div', array( 'id' => 'mw-imglangselector-line' ),
+                       Html::rawElement( 'form', array( 'action' => $wgScript ), $formContents )
+               );
+               return $langSelectLine;
+       }
+}
+
+/**
+ * Builds the image revision log shown on image pages
+ *
+ * @ingroup Media
+ */
+class ImageHistoryList extends ContextSource {
+
+       /**
+        * @var Title
+        */
+       protected $title;
+
+       /**
+        * @var File
+        */
+       protected $img;
+
+       /**
+        * @var ImagePage
+        */
+       protected $imagePage;
+
+       /**
+        * @var File
+        */
+       protected $current;
+
+       protected $repo, $showThumb;
+       protected $preventClickjacking = false;
+
+       /**
+        * @param ImagePage $imagePage
+        */
+       public function __construct( $imagePage ) {
+               global $wgShowArchiveThumbnails;
+               $this->current = $imagePage->getFile();
+               $this->img = $imagePage->getDisplayedFile();
+               $this->title = $imagePage->getTitle();
+               $this->imagePage = $imagePage;
+               $this->showThumb = $wgShowArchiveThumbnails && $this->img->canRender();
+               $this->setContext( $imagePage->getContext() );
+       }
+
+       /**
+        * @return ImagePage
+        */
+       public function getImagePage() {
+               return $this->imagePage;
+       }
+
+       /**
+        * @return File
+        */
+       public function getFile() {
+               return $this->img;
+       }
+
+       /**
+        * @param string $navLinks
+        * @return string
+        */
+       public function beginImageHistoryList( $navLinks = '' ) {
+               return Xml::element( 'h2', array( 'id' => 'filehistory' ), $this->msg( 'filehist' )->text() )
+                       . "\n"
+                       . "<div id=\"mw-imagepage-section-filehistory\">\n"
+                       . $this->msg( 'filehist-help' )->parseAsBlock()
+                       . $navLinks . "\n"
+                       . Xml::openElement( 'table', array( 'class' => 'wikitable filehistory' ) ) . "\n"
+                       . '<tr><td></td>'
+                       . ( $this->current->isLocal()
+                               && ( $this->getUser()->isAllowedAny( 'delete', 'deletedhistory' ) ) ? '<td></td>' : '' )
+                       . '<th>' . $this->msg( 'filehist-datetime' )->escaped() . '</th>'
+                       . ( $this->showThumb ? '<th>' . $this->msg( 'filehist-thumb' )->escaped() . '</th>' : '' )
+                       . '<th>' . $this->msg( 'filehist-dimensions' )->escaped() . '</th>'
+                       . '<th>' . $this->msg( 'filehist-user' )->escaped() . '</th>'
+                       . '<th>' . $this->msg( 'filehist-comment' )->escaped() . '</th>'
+                       . "</tr>\n";
+       }
+
+       /**
+        * @param string $navLinks
+        * @return string
+        */
+       public function endImageHistoryList( $navLinks = '' ) {
+               return "</table>\n$navLinks\n</div>\n";
+       }
+
+       /**
+        * @param bool $iscur
+        * @param File $file
+        * @return string
+        */
+       public function imageHistoryLine( $iscur, $file ) {
+               global $wgContLang;
+
+               $user = $this->getUser();
+               $lang = $this->getLanguage();
+               $timestamp = wfTimestamp( TS_MW, $file->getTimestamp() );
+               $img = $iscur ? $file->getName() : $file->getArchiveName();
+               $userId = $file->getUser( 'id' );
+               $userText = $file->getUser( 'text' );
+               $description = $file->getDescription( File::FOR_THIS_USER, $user );
+
+               $local = $this->current->isLocal();
+               $row = $selected = '';
+
+               // Deletion link
+               if ( $local && ( $user->isAllowedAny( 'delete', 'deletedhistory' ) ) ) {
+                       $row .= '<td>';
+                       # Link to remove from history
+                       if ( $user->isAllowed( 'delete' ) ) {
+                               $q = array( 'action' => 'delete' );
+                               if ( !$iscur ) {
+                                       $q['oldimage'] = $img;
+                               }
+                               $row .= Linker::linkKnown(
+                                       $this->title,
+                                       $this->msg( $iscur ? 'filehist-deleteall' : 'filehist-deleteone' )->escaped(),
+                                       array(), $q
+                               );
+                       }
+                       # Link to hide content. Don't show useless link to people who cannot hide revisions.
+                       $canHide = $user->isAllowed( 'deleterevision' );
+                       if ( $canHide || ( $user->isAllowed( 'deletedhistory' ) && $file->getVisibility() ) ) {
+                               if ( $user->isAllowed( 'delete' ) ) {
+                                       $row .= '<br />';
+                               }
+                               // If file is top revision or locked from this user, don't link
+                               if ( $iscur || !$file->userCan( File::DELETED_RESTRICTED, $user ) ) {
+                                       $del = Linker::revDeleteLinkDisabled( $canHide );
+                               } else {
+                                       list( $ts, ) = explode( '!', $img, 2 );
+                                       $query = array(
+                                               'type' => 'oldimage',
+                                               'target' => $this->title->getPrefixedText(),
+                                               'ids' => $ts,
+                                       );
+                                       $del = Linker::revDeleteLink( $query,
+                                               $file->isDeleted( File::DELETED_RESTRICTED ), $canHide );
+                               }
+                               $row .= $del;
+                       }
+                       $row .= '</td>';
+               }
+
+               // Reversion link/current indicator
+               $row .= '<td>';
+               if ( $iscur ) {
+                       $row .= $this->msg( 'filehist-current' )->escaped();
+               } elseif ( $local && $this->title->quickUserCan( 'edit', $user )
+                       && $this->title->quickUserCan( 'upload', $user )
+               ) {
+                       if ( $file->isDeleted( File::DELETED_FILE ) ) {
+                               $row .= $this->msg( 'filehist-revert' )->escaped();
+                       } else {
+                               $row .= Linker::linkKnown(
+                                       $this->title,
+                                       $this->msg( 'filehist-revert' )->escaped(),
+                                       array(),
+                                       array(
+                                               'action' => 'revert',
+                                               'oldimage' => $img,
+                                               'wpEditToken' => $user->getEditToken( $img )
+                                       )
+                               );
+                       }
+               }
+               $row .= '</td>';
+
+               // Date/time and image link
+               if ( $file->getTimestamp() === $this->img->getTimestamp() ) {
+                       $selected = "class='filehistory-selected'";
+               }
+               $row .= "<td $selected style='white-space: nowrap;'>";
+               if ( !$file->userCan( File::DELETED_FILE, $user ) ) {
+                       # Don't link to unviewable files
+                       $row .= '<span class="history-deleted">'
+                               . $lang->userTimeAndDate( $timestamp, $user ) . '</span>';
+               } elseif ( $file->isDeleted( File::DELETED_FILE ) ) {
+                       if ( $local ) {
+                               $this->preventClickjacking();
+                               $revdel = SpecialPage::getTitleFor( 'Revisiondelete' );
+                               # Make a link to review the image
+                               $url = Linker::linkKnown(
+                                       $revdel,
+                                       $lang->userTimeAndDate( $timestamp, $user ),
+                                       array(),
+                                       array(
+                                               'target' => $this->title->getPrefixedText(),
+                                               'file' => $img,
+                                               'token' => $user->getEditToken( $img )
+                                       )
+                               );
+                       } else {
+                               $url = $lang->userTimeAndDate( $timestamp, $user );
+                       }
+                       $row .= '<span class="history-deleted">' . $url . '</span>';
+               } else {
+                       $url = $iscur ? $this->current->getUrl() : $this->current->getArchiveUrl( $img );
+                       $row .= Xml::element(
+                               'a',
+                               array( 'href' => $url ),
+                               $lang->userTimeAndDate( $timestamp, $user )
+                       );
+               }
+               $row .= "</td>";
+
+               // Thumbnail
+               if ( $this->showThumb ) {
+                       $row .= '<td>' . $this->getThumbForLine( $file ) . '</td>';
+               }
+
+               // Image dimensions + size
+               $row .= '<td>';
+               $row .= htmlspecialchars( $file->getDimensionsString() );
+               $row .= $this->msg( 'word-separator' )->escaped();
+               $row .= '<span style="white-space: nowrap;">';
+               $row .= $this->msg( 'parentheses' )->sizeParams( $file->getSize() )->escaped();
+               $row .= '</span>';
+               $row .= '</td>';
+
+               // Uploading user
+               $row .= '<td>';
+               // Hide deleted usernames
+               if ( $file->isDeleted( File::DELETED_USER ) ) {
+                       $row .= '<span class="history-deleted">'
+                               . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
+               } else {
+                       if ( $local ) {
+                               $row .= Linker::userLink( $userId, $userText );
+                               $row .= $this->msg( 'word-separator' )->escaped();
+                               $row .= '<span style="white-space: nowrap;">';
+                               $row .= Linker::userToolLinks( $userId, $userText );
+                               $row .= '</span>';
+                       } else {
+                               $row .= htmlspecialchars( $userText );
+                       }
+               }
+               $row .= '</td>';
+
+               // Don't show deleted descriptions
+               if ( $file->isDeleted( File::DELETED_COMMENT ) ) {
+                       $row .= '<td><span class="history-deleted">' .
+                               $this->msg( 'rev-deleted-comment' )->escaped() . '</span></td>';
+               } else {
+                       $row .= '<td dir="' . $wgContLang->getDir() . '">' .
+                               Linker::formatComment( $description, $this->title ) . '</td>';
+               }
+
+               $rowClass = null;
+               wfRunHooks( 'ImagePageFileHistoryLine', array( $this, $file, &$row, &$rowClass ) );
+               $classAttr = $rowClass ? " class='$rowClass'" : '';
+
+               return "<tr{$classAttr}>{$row}</tr>\n";
+       }
+
+       /**
+        * @param File $file
+        * @return string
+        */
+       protected function getThumbForLine( $file ) {
+               $lang = $this->getLanguage();
+               $user = $this->getUser();
+               if ( $file->allowInlineDisplay() && $file->userCan( File::DELETED_FILE, $user )
+                       && !$file->isDeleted( File::DELETED_FILE )
+               ) {
+                       $params = array(
+                               'width' => '120',
+                               'height' => '120',
+                       );
+                       $timestamp = wfTimestamp( TS_MW, $file->getTimestamp() );
+
+                       $thumbnail = $file->transform( $params );
+                       $options = array(
+                               'alt' => $this->msg( 'filehist-thumbtext',
+                                       $lang->userTimeAndDate( $timestamp, $user ),
+                                       $lang->userDate( $timestamp, $user ),
+                                       $lang->userTime( $timestamp, $user ) )->text(),
+                               'file-link' => true,
+                       );
+
+                       if ( !$thumbnail ) {
+                               return $this->msg( 'filehist-nothumb' )->escaped();
+                       }
+
+                       return $thumbnail->toHtml( $options );
+               } else {
+                       return $this->msg( 'filehist-nothumb' )->escaped();
+               }
+       }
+
+       /**
+        * @param bool $enable
+        */
+       protected function preventClickjacking( $enable = true ) {
+               $this->preventClickjacking = $enable;
+       }
+
+       /**
+        * @return bool
+        */
+       public function getPreventClickjacking() {
+               return $this->preventClickjacking;
+       }
+}
+
+class ImageHistoryPseudoPager extends ReverseChronologicalPager {
+       protected $preventClickjacking = false;
+
+       /**
+        * @var File
+        */
+       protected $mImg;
+
+       /**
+        * @var Title
+        */
+       protected $mTitle;
+
+       /**
+        * @param ImagePage $imagePage
+        */
+       function __construct( $imagePage ) {
+               parent::__construct( $imagePage->getContext() );
+               $this->mImagePage = $imagePage;
+               $this->mTitle = clone ( $imagePage->getTitle() );
+               $this->mTitle->setFragment( '#filehistory' );
+               $this->mImg = null;
+               $this->mHist = array();
+               $this->mRange = array( 0, 0 ); // display range
+       }
+
+       /**
+        * @return Title
+        */
+       function getTitle() {
+               return $this->mTitle;
+       }
+
+       function getQueryInfo() {
+               return false;
+       }
+
+       /**
+        * @return string
+        */
+       function getIndexField() {
+               return '';
+       }
+
+       /**
+        * @param object $row
+        * @return string
+        */
+       function formatRow( $row ) {
+               return '';
+       }
+
+       /**
+        * @return string
+        */
+       function getBody() {
+               $s = '';
+               $this->doQuery();
+               if ( count( $this->mHist ) ) {
+                       $list = new ImageHistoryList( $this->mImagePage );
+                       # Generate prev/next links
+                       $navLink = $this->getNavigationBar();
+                       $s = $list->beginImageHistoryList( $navLink );
+                       // Skip rows there just for paging links
+                       for ( $i = $this->mRange[0]; $i <= $this->mRange[1]; $i++ ) {
+                               $file = $this->mHist[$i];
+                               $s .= $list->imageHistoryLine( !$file->isOld(), $file );
+                       }
+                       $s .= $list->endImageHistoryList( $navLink );
+
+                       if ( $list->getPreventClickjacking() ) {
+                               $this->preventClickjacking();
+                       }
+               }
+               return $s;
+       }
+
+       function doQuery() {
+               if ( $this->mQueryDone ) {
+                       return;
+               }
+               $this->mImg = $this->mImagePage->getFile(); // ensure loading
+               if ( !$this->mImg->exists() ) {
+                       return;
+               }
+               $queryLimit = $this->mLimit + 1; // limit plus extra row
+               if ( $this->mIsBackwards ) {
+                       // Fetch the file history
+                       $this->mHist = $this->mImg->getHistory( $queryLimit, null, $this->mOffset, false );
+                       // The current rev may not meet the offset/limit
+                       $numRows = count( $this->mHist );
+                       if ( $numRows <= $this->mLimit && $this->mImg->getTimestamp() > $this->mOffset ) {
+                               $this->mHist = array_merge( array( $this->mImg ), $this->mHist );
+                       }
+               } else {
+                       // The current rev may not meet the offset
+                       if ( !$this->mOffset || $this->mImg->getTimestamp() < $this->mOffset ) {
+                               $this->mHist[] = $this->mImg;
+                       }
+                       // Old image versions (fetch extra row for nav links)
+                       $oiLimit = count( $this->mHist ) ? $this->mLimit : $this->mLimit + 1;
+                       // Fetch the file history
+                       $this->mHist = array_merge( $this->mHist,
+                               $this->mImg->getHistory( $oiLimit, $this->mOffset, null, false ) );
+               }
+               $numRows = count( $this->mHist ); // Total number of query results
+               if ( $numRows ) {
+                       # Index value of top item in the list
+                       $firstIndex = $this->mIsBackwards ?
+                               $this->mHist[$numRows - 1]->getTimestamp() : $this->mHist[0]->getTimestamp();
+                       # Discard the extra result row if there is one
+                       if ( $numRows > $this->mLimit && $numRows > 1 ) {
+                               if ( $this->mIsBackwards ) {
+                                       # Index value of item past the index
+                                       $this->mPastTheEndIndex = $this->mHist[0]->getTimestamp();
+                                       # Index value of bottom item in the list
+                                       $lastIndex = $this->mHist[1]->getTimestamp();
+                                       # Display range
+                                       $this->mRange = array( 1, $numRows - 1 );
+                               } else {
+                                       # Index value of item past the index
+                                       $this->mPastTheEndIndex = $this->mHist[$numRows - 1]->getTimestamp();
+                                       # Index value of bottom item in the list
+                                       $lastIndex = $this->mHist[$numRows - 2]->getTimestamp();
+                                       # Display range
+                                       $this->mRange = array( 0, $numRows - 2 );
+                               }
+                       } else {
+                               # Setting indexes to an empty string means that they will be
+                               # omitted if they would otherwise appear in URLs. It just so
+                               # happens that this  is the right thing to do in the standard
+                               # UI, in all the relevant cases.
+                               $this->mPastTheEndIndex = '';
+                               # Index value of bottom item in the list
+                               $lastIndex = $this->mIsBackwards ?
+                                       $this->mHist[0]->getTimestamp() : $this->mHist[$numRows - 1]->getTimestamp();
+                               # Display range
+                               $this->mRange = array( 0, $numRows - 1 );
+                       }
+               } else {
+                       $firstIndex = '';
+                       $lastIndex = '';
+                       $this->mPastTheEndIndex = '';
+               }
+               if ( $this->mIsBackwards ) {
+                       $this->mIsFirst = ( $numRows < $queryLimit );
+                       $this->mIsLast = ( $this->mOffset == '' );
+                       $this->mLastShown = $firstIndex;
+                       $this->mFirstShown = $lastIndex;
+               } else {
+                       $this->mIsFirst = ( $this->mOffset == '' );
+                       $this->mIsLast = ( $numRows < $queryLimit );
+                       $this->mLastShown = $lastIndex;
+                       $this->mFirstShown = $firstIndex;
+               }
+               $this->mQueryDone = true;
+       }
+
+       /**
+        * @param bool $enable
+        */
+       protected function preventClickjacking( $enable = true ) {
+               $this->preventClickjacking = $enable;
+       }
+
+       /**
+        * @return bool
+        */
+       public function getPreventClickjacking() {
+               return $this->preventClickjacking;
+       }
+
+}
diff --git a/includes/page/WikiCategoryPage.php b/includes/page/WikiCategoryPage.php
new file mode 100644 (file)
index 0000000..d382001
--- /dev/null
@@ -0,0 +1,50 @@
+<?php
+/**
+ * Special handling for category 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
+ *
+ * @file
+ */
+
+/**
+ * Special handling for category pages
+ */
+class WikiCategoryPage extends WikiPage {
+
+       /**
+        * Don't return a 404 for categories in use.
+        * In use defined as: either the actual page exists
+        * or the category currently has members.
+        *
+        * @return bool
+        */
+       public function hasViewableContent() {
+               if ( parent::hasViewableContent() ) {
+                       return true;
+               } else {
+                       $cat = Category::newFromTitle( $this->mTitle );
+                       // If any of these are not 0, then has members
+                       if ( $cat->getPageCount()
+                               || $cat->getSubcatCount()
+                               || $cat->getFileCount()
+                       ) {
+                               return true;
+                       }
+               }
+               return false;
+       }
+}
diff --git a/includes/page/WikiFilePage.php b/includes/page/WikiFilePage.php
new file mode 100644 (file)
index 0000000..34f15c3
--- /dev/null
@@ -0,0 +1,236 @@
+<?php
+/**
+ * Special handling for file 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
+ *
+ * @file
+ */
+
+/**
+ * Special handling for file pages
+ *
+ * @ingroup Media
+ */
+class WikiFilePage extends WikiPage {
+       /**
+        * @var File
+        */
+       protected $mFile = false;                               // !< File object
+       protected $mRepo = null;                            // !<
+       protected $mFileLoaded = false;             // !<
+       protected $mDupes = null;                               // !<
+
+       public function __construct( $title ) {
+               parent::__construct( $title );
+               $this->mDupes = null;
+               $this->mRepo = null;
+       }
+
+       public function getActionOverrides() {
+               $overrides = parent::getActionOverrides();
+               $overrides['revert'] = 'RevertFileAction';
+               return $overrides;
+       }
+
+       /**
+        * @param File $file
+        */
+       public function setFile( $file ) {
+               $this->mFile = $file;
+               $this->mFileLoaded = true;
+       }
+
+       /**
+        * @return bool
+        */
+       protected function loadFile() {
+               if ( $this->mFileLoaded ) {
+                       return true;
+               }
+               $this->mFileLoaded = true;
+
+               $this->mFile = wfFindFile( $this->mTitle );
+               if ( !$this->mFile ) {
+                       $this->mFile = wfLocalFile( $this->mTitle ); // always a File
+               }
+               $this->mRepo = $this->mFile->getRepo();
+               return true;
+       }
+
+       /**
+        * @return mixed|null|Title
+        */
+       public function getRedirectTarget() {
+               $this->loadFile();
+               if ( $this->mFile->isLocal() ) {
+                       return parent::getRedirectTarget();
+               }
+               // Foreign image page
+               $from = $this->mFile->getRedirected();
+               $to = $this->mFile->getName();
+               if ( $from == $to ) {
+                       return null;
+               }
+               $this->mRedirectTarget = Title::makeTitle( NS_FILE, $to );
+               return $this->mRedirectTarget;
+       }
+
+       /**
+        * @return bool|mixed|Title
+        */
+       public function followRedirect() {
+               $this->loadFile();
+               if ( $this->mFile->isLocal() ) {
+                       return parent::followRedirect();
+               }
+               $from = $this->mFile->getRedirected();
+               $to = $this->mFile->getName();
+               if ( $from == $to ) {
+                       return false;
+               }
+               return Title::makeTitle( NS_FILE, $to );
+       }
+
+       /**
+        * @return bool
+        */
+       public function isRedirect() {
+               $this->loadFile();
+               if ( $this->mFile->isLocal() ) {
+                       return parent::isRedirect();
+               }
+
+               return (bool)$this->mFile->getRedirected();
+       }
+
+       /**
+        * @return bool
+        */
+       public function isLocal() {
+               $this->loadFile();
+               return $this->mFile->isLocal();
+       }
+
+       /**
+        * @return bool|File
+        */
+       public function getFile() {
+               $this->loadFile();
+               return $this->mFile;
+       }
+
+       /**
+        * @return array|null
+        */
+       public function getDuplicates() {
+               $this->loadFile();
+               if ( !is_null( $this->mDupes ) ) {
+                       return $this->mDupes;
+               }
+               $hash = $this->mFile->getSha1();
+               if ( !( $hash ) ) {
+                       $this->mDupes = array();
+                       return $this->mDupes;
+               }
+               $dupes = RepoGroup::singleton()->findBySha1( $hash );
+               // Remove duplicates with self and non matching file sizes
+               $self = $this->mFile->getRepoName() . ':' . $this->mFile->getName();
+               $size = $this->mFile->getSize();
+
+               /**
+                * @var $file File
+                */
+               foreach ( $dupes as $index => $file ) {
+                       $key = $file->getRepoName() . ':' . $file->getName();
+                       if ( $key == $self ) {
+                               unset( $dupes[$index] );
+                       }
+                       if ( $file->getSize() != $size ) {
+                               unset( $dupes[$index] );
+                       }
+               }
+               $this->mDupes = $dupes;
+               return $this->mDupes;
+       }
+
+       /**
+        * Override handling of action=purge
+        * @return bool
+        */
+       public function doPurge() {
+               $this->loadFile();
+               if ( $this->mFile->exists() ) {
+                       wfDebug( 'ImagePage::doPurge purging ' . $this->mFile->getName() . "\n" );
+                       $update = new HTMLCacheUpdate( $this->mTitle, 'imagelinks' );
+                       $update->doUpdate();
+                       $this->mFile->upgradeRow();
+                       $this->mFile->purgeCache( array( 'forThumbRefresh' => true ) );
+               } else {
+                       wfDebug( 'ImagePage::doPurge no image for '
+                               . $this->mFile->getName() . "; limiting purge to cache only\n" );
+                       // even if the file supposedly doesn't exist, force any cached information
+                       // to be updated (in case the cached information is wrong)
+                       $this->mFile->purgeCache( array( 'forThumbRefresh' => true ) );
+               }
+               if ( $this->mRepo ) {
+                       // Purge redirect cache
+                       $this->mRepo->invalidateImageRedirect( $this->mTitle );
+               }
+               return parent::doPurge();
+       }
+
+       /**
+        * Get the categories this file is a member of on the wiki where it was uploaded.
+        * For local files, this is the same as getCategories().
+        * For foreign API files (InstantCommons), this is not supported currently.
+        * Results will include hidden categories.
+        *
+        * @return TitleArray|Title[]
+        * @since 1.23
+        */
+       public function getForeignCategories() {
+               $this->loadFile();
+               $title = $this->mTitle;
+               $file = $this->mFile;
+
+               if ( ! $file instanceof LocalFile ) {
+                       wfDebug( __CLASS__ . '::' . __METHOD__ . " is not supported for this file\n" );
+                       return TitleArray::newFromResult( new FakeResultWrapper( array() ) );
+               }
+
+               /** @var LocalRepo $repo */
+               $repo = $file->getRepo();
+               $dbr = $repo->getSlaveDB();
+
+               $res = $dbr->select(
+                       array( 'page', 'categorylinks' ),
+                       array(
+                               'page_title' => 'cl_to',
+                               'page_namespace' => NS_CATEGORY,
+                       ),
+                       array(
+                               'page_namespace' => $title->getNamespace(),
+                               'page_title' => $title->getDBkey(),
+                       ),
+                       __METHOD__,
+                       array(),
+                       array( 'categorylinks' => array( 'INNER JOIN', 'page_id = cl_from' ) )
+               );
+
+               return TitleArray::newFromResult( $res );
+       }
+}
diff --git a/includes/page/WikiPage.php b/includes/page/WikiPage.php
new file mode 100644 (file)
index 0000000..855de8e
--- /dev/null
@@ -0,0 +1,3570 @@
+<?php
+/**
+ * Base representation for a MediaWiki page.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Abstract class for type hinting (accepts WikiPage, Article, ImagePage, CategoryPage)
+ */
+interface Page {
+}
+
+/**
+ * Class representing a MediaWiki article and history.
+ *
+ * Some fields are public only for backwards-compatibility. Use accessors.
+ * In the past, this class was part of Article.php and everything was public.
+ *
+ * @internal documentation reviewed 15 Mar 2010
+ */
+class WikiPage implements Page, IDBAccessObject {
+       // Constants for $mDataLoadedFrom and related
+
+       /**
+        * @var Title
+        */
+       public $mTitle = null;
+
+       /**@{{
+        * @protected
+        */
+       public $mDataLoaded = false;         // !< Boolean
+       public $mIsRedirect = false;         // !< Boolean
+       public $mLatest = false;             // !< Integer (false means "not loaded")
+       /**@}}*/
+
+       /** @var stdclass Map of cache fields (text, parser output, ect) for a proposed/new edit */
+       public $mPreparedEdit = false;
+
+       /**
+        * @var int
+        */
+       protected $mId = null;
+
+       /**
+        * @var int One of the READ_* constants
+        */
+       protected $mDataLoadedFrom = self::READ_NONE;
+
+       /**
+        * @var Title
+        */
+       protected $mRedirectTarget = null;
+
+       /**
+        * @var Revision
+        */
+       protected $mLastRevision = null;
+
+       /**
+        * @var string Timestamp of the current revision or empty string if not loaded
+        */
+       protected $mTimestamp = '';
+
+       /**
+        * @var string
+        */
+       protected $mTouched = '19700101000000';
+
+       /**
+        * @var string
+        */
+       protected $mLinksUpdated = '19700101000000';
+
+       /**
+        * @var int|null
+        */
+       protected $mCounter = null;
+
+       /**
+        * Constructor and clear the article
+        * @param Title $title Reference to a Title object.
+        */
+       public function __construct( Title $title ) {
+               $this->mTitle = $title;
+       }
+
+       /**
+        * Create a WikiPage object of the appropriate class for the given title.
+        *
+        * @param Title $title
+        *
+        * @throws MWException
+        * @return WikiPage Object of the appropriate type
+        */
+       public static function factory( Title $title ) {
+               $ns = $title->getNamespace();
+
+               if ( $ns == NS_MEDIA ) {
+                       throw new MWException( "NS_MEDIA is a virtual namespace; use NS_FILE." );
+               } elseif ( $ns < 0 ) {
+                       throw new MWException( "Invalid or virtual namespace $ns given." );
+               }
+
+               switch ( $ns ) {
+                       case NS_FILE:
+                               $page = new WikiFilePage( $title );
+                               break;
+                       case NS_CATEGORY:
+                               $page = new WikiCategoryPage( $title );
+                               break;
+                       default:
+                               $page = new WikiPage( $title );
+               }
+
+               return $page;
+       }
+
+       /**
+        * Constructor from a page id
+        *
+        * @param int $id Article ID to load
+        * @param string|int $from One of the following values:
+        *        - "fromdb" or WikiPage::READ_NORMAL to select from a slave database
+        *        - "fromdbmaster" or WikiPage::READ_LATEST to select from the master database
+        *
+        * @return WikiPage|null
+        */
+       public static function newFromID( $id, $from = 'fromdb' ) {
+               // page id's are never 0 or negative, see bug 61166
+               if ( $id < 1 ) {
+                       return null;
+               }
+
+               $from = self::convertSelectType( $from );
+               $db = wfGetDB( $from === self::READ_LATEST ? DB_MASTER : DB_SLAVE );
+               $row = $db->selectRow( 'page', self::selectFields(), array( 'page_id' => $id ), __METHOD__ );
+               if ( !$row ) {
+                       return null;
+               }
+               return self::newFromRow( $row, $from );
+       }
+
+       /**
+        * Constructor from a database row
+        *
+        * @since 1.20
+        * @param object $row Database row containing at least fields returned by selectFields().
+        * @param string|int $from Source of $data:
+        *        - "fromdb" or WikiPage::READ_NORMAL: from a slave DB
+        *        - "fromdbmaster" or WikiPage::READ_LATEST: from the master DB
+        *        - "forupdate" or WikiPage::READ_LOCKING: from the master DB using SELECT FOR UPDATE
+        * @return WikiPage
+        */
+       public static function newFromRow( $row, $from = 'fromdb' ) {
+               $page = self::factory( Title::newFromRow( $row ) );
+               $page->loadFromRow( $row, $from );
+               return $page;
+       }
+
+       /**
+        * Convert 'fromdb', 'fromdbmaster' and 'forupdate' to READ_* constants.
+        *
+        * @param object|string|int $type
+        * @return mixed
+        */
+       private static function convertSelectType( $type ) {
+               switch ( $type ) {
+               case 'fromdb':
+                       return self::READ_NORMAL;
+               case 'fromdbmaster':
+                       return self::READ_LATEST;
+               case 'forupdate':
+                       return self::READ_LOCKING;
+               default:
+                       // It may already be an integer or whatever else
+                       return $type;
+               }
+       }
+
+       /**
+        * 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 behavior.
+        *
+        * @todo Move this UI stuff somewhere else
+        *
+        * @return array
+        */
+       public function getActionOverrides() {
+               $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() );
+       }
+
+       /**
+        * Get the title object of the article
+        * @return Title Title object of this page
+        */
+       public function getTitle() {
+               return $this->mTitle;
+       }
+
+       /**
+        * Clear the object
+        * @return void
+        */
+       public function clear() {
+               $this->mDataLoaded = false;
+               $this->mDataLoadedFrom = self::READ_NONE;
+
+               $this->clearCacheFields();
+       }
+
+       /**
+        * Clear the object cache fields
+        * @return void
+        */
+       protected function clearCacheFields() {
+               $this->mId = null;
+               $this->mCounter = null;
+               $this->mRedirectTarget = null; // Title object if set
+               $this->mLastRevision = null; // Latest revision
+               $this->mTouched = '19700101000000';
+               $this->mLinksUpdated = '19700101000000';
+               $this->mTimestamp = '';
+               $this->mIsRedirect = false;
+               $this->mLatest = false;
+               // Bug 57026: do not clear mPreparedEdit since prepareTextForEdit() already checks
+               // the requested rev ID and content against the cached one for equality. For most
+               // content types, the output should not change during the lifetime of this cache.
+               // Clearing it can cause extra parses on edit for no reason.
+       }
+
+       /**
+        * Clear the mPreparedEdit cache field, as may be needed by mutable content types
+        * @return void
+        * @since 1.23
+        */
+       public function clearPreparedEdit() {
+               $this->mPreparedEdit = false;
+       }
+
+       /**
+        * Return the list of revision fields that should be selected to create
+        * a new page.
+        *
+        * @return array
+        */
+       public static function selectFields() {
+               global $wgContentHandlerUseDB;
+
+               $fields = array(
+                       'page_id',
+                       'page_namespace',
+                       'page_title',
+                       'page_restrictions',
+                       'page_counter',
+                       'page_is_redirect',
+                       'page_is_new',
+                       'page_random',
+                       'page_touched',
+                       'page_links_updated',
+                       'page_latest',
+                       'page_len',
+               );
+
+               if ( $wgContentHandlerUseDB ) {
+                       $fields[] = 'page_content_model';
+               }
+
+               return $fields;
+       }
+
+       /**
+        * Fetch a page record with the given conditions
+        * @param DatabaseBase $dbr
+        * @param array $conditions
+        * @param array $options
+        * @return object|bool Database result resource, or false on failure
+        */
+       protected function pageData( $dbr, $conditions, $options = array() ) {
+               $fields = self::selectFields();
+
+               wfRunHooks( 'ArticlePageDataBefore', array( &$this, &$fields ) );
+
+               $row = $dbr->selectRow( 'page', $fields, $conditions, __METHOD__, $options );
+
+               wfRunHooks( 'ArticlePageDataAfter', array( &$this, &$row ) );
+
+               return $row;
+       }
+
+       /**
+        * Fetch a page record matching the Title object's namespace and title
+        * using a sanitized title string
+        *
+        * @param DatabaseBase $dbr
+        * @param Title $title
+        * @param array $options
+        * @return object|bool Database result resource, or false on failure
+        */
+       public function pageDataFromTitle( $dbr, $title, $options = array() ) {
+               return $this->pageData( $dbr, array(
+                       'page_namespace' => $title->getNamespace(),
+                       'page_title' => $title->getDBkey() ), $options );
+       }
+
+       /**
+        * Fetch a page record matching the requested ID
+        *
+        * @param DatabaseBase $dbr
+        * @param int $id
+        * @param array $options
+        * @return object|bool Database result resource, or false on failure
+        */
+       public function pageDataFromId( $dbr, $id, $options = array() ) {
+               return $this->pageData( $dbr, array( 'page_id' => $id ), $options );
+       }
+
+       /**
+        * Set the general counter, title etc data loaded from
+        * some source.
+        *
+        * @param object|string|int $from One of the following:
+        *   - A DB query result object.
+        *   - "fromdb" or WikiPage::READ_NORMAL to get from a slave DB.
+        *   - "fromdbmaster" or WikiPage::READ_LATEST to get from the master DB.
+        *   - "forupdate"  or WikiPage::READ_LOCKING to get from the master DB
+        *     using SELECT FOR UPDATE.
+        *
+        * @return void
+        */
+       public function loadPageData( $from = 'fromdb' ) {
+               $from = self::convertSelectType( $from );
+               if ( is_int( $from ) && $from <= $this->mDataLoadedFrom ) {
+                       // We already have the data from the correct location, no need to load it twice.
+                       return;
+               }
+
+               if ( $from === self::READ_LOCKING ) {
+                       $data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle, array( 'FOR UPDATE' ) );
+               } elseif ( $from === self::READ_LATEST ) {
+                       $data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle );
+               } elseif ( $from === self::READ_NORMAL ) {
+                       $data = $this->pageDataFromTitle( wfGetDB( DB_SLAVE ), $this->mTitle );
+                       // Use a "last rev inserted" timestamp key to diminish the issue of slave lag.
+                       // Note that DB also stores the master position in the session and checks it.
+                       $touched = $this->getCachedLastEditTime();
+                       if ( $touched ) { // key set
+                               if ( !$data || $touched > wfTimestamp( TS_MW, $data->page_touched ) ) {
+                                       $from = self::READ_LATEST;
+                                       $data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle );
+                               }
+                       }
+               } else {
+                       // No idea from where the caller got this data, assume slave database.
+                       $data = $from;
+                       $from = self::READ_NORMAL;
+               }
+
+               $this->loadFromRow( $data, $from );
+       }
+
+       /**
+        * Load the object from a database row
+        *
+        * @since 1.20
+        * @param object $data Database row containing at least fields returned by selectFields()
+        * @param string|int $from One of the following:
+        *        - "fromdb" or WikiPage::READ_NORMAL if the data comes from a slave DB
+        *        - "fromdbmaster" or WikiPage::READ_LATEST if the data comes from the master DB
+        *        - "forupdate"  or WikiPage::READ_LOCKING if the data comes from from
+        *          the master DB using SELECT FOR UPDATE
+        */
+       public function loadFromRow( $data, $from ) {
+               $lc = LinkCache::singleton();
+               $lc->clearLink( $this->mTitle );
+
+               if ( $data ) {
+                       $lc->addGoodLinkObjFromRow( $this->mTitle, $data );
+
+                       $this->mTitle->loadFromRow( $data );
+
+                       // Old-fashioned restrictions
+                       $this->mTitle->loadRestrictions( $data->page_restrictions );
+
+                       $this->mId = intval( $data->page_id );
+                       $this->mCounter = intval( $data->page_counter );
+                       $this->mTouched = wfTimestamp( TS_MW, $data->page_touched );
+                       $this->mLinksUpdated = wfTimestampOrNull( TS_MW, $data->page_links_updated );
+                       $this->mIsRedirect = intval( $data->page_is_redirect );
+                       $this->mLatest = intval( $data->page_latest );
+                       // Bug 37225: $latest may no longer match the cached latest Revision object.
+                       // Double-check the ID of any cached latest Revision object for consistency.
+                       if ( $this->mLastRevision && $this->mLastRevision->getId() != $this->mLatest ) {
+                               $this->mLastRevision = null;
+                               $this->mTimestamp = '';
+                       }
+               } else {
+                       $lc->addBadLinkObj( $this->mTitle );
+
+                       $this->mTitle->loadFromRow( false );
+
+                       $this->clearCacheFields();
+
+                       $this->mId = 0;
+               }
+
+               $this->mDataLoaded = true;
+               $this->mDataLoadedFrom = self::convertSelectType( $from );
+       }
+
+       /**
+        * @return int Page ID
+        */
+       public function getId() {
+               if ( !$this->mDataLoaded ) {
+                       $this->loadPageData();
+               }
+               return $this->mId;
+       }
+
+       /**
+        * @return bool Whether or not the page exists in the database
+        */
+       public function exists() {
+               if ( !$this->mDataLoaded ) {
+                       $this->loadPageData();
+               }
+               return $this->mId > 0;
+       }
+
+       /**
+        * Check if this page is something we're going to be showing
+        * some sort of sensible content for. If we return false, page
+        * views (plain action=view) will return an HTTP 404 response,
+        * so spiders and robots can know they're following a bad link.
+        *
+        * @return bool
+        */
+       public function hasViewableContent() {
+               return $this->exists() || $this->mTitle->isAlwaysKnown();
+       }
+
+       /**
+        * @return int The view count for the page
+        */
+       public function getCount() {
+               if ( !$this->mDataLoaded ) {
+                       $this->loadPageData();
+               }
+
+               return $this->mCounter;
+       }
+
+       /**
+        * Tests if the article content represents a redirect
+        *
+        * @return bool
+        */
+       public function isRedirect() {
+               $content = $this->getContent();
+               if ( !$content ) {
+                       return false;
+               }
+
+               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();
+       }
+
+       /**
+        * Loads page_touched and returns a value indicating if it should be used
+        * @return bool true if not a redirect
+        */
+       public function checkTouched() {
+               if ( !$this->mDataLoaded ) {
+                       $this->loadPageData();
+               }
+               return !$this->mIsRedirect;
+       }
+
+       /**
+        * Get the page_touched field
+        * @return string Containing GMT timestamp
+        */
+       public function getTouched() {
+               if ( !$this->mDataLoaded ) {
+                       $this->loadPageData();
+               }
+               return $this->mTouched;
+       }
+
+       /**
+        * Get the page_links_updated field
+        * @return string|null Containing GMT timestamp
+        */
+       public function getLinksTimestamp() {
+               if ( !$this->mDataLoaded ) {
+                       $this->loadPageData();
+               }
+               return $this->mLinksUpdated;
+       }
+
+       /**
+        * Get the page_latest field
+        * @return int rev_id of current revision
+        */
+       public function getLatest() {
+               if ( !$this->mDataLoaded ) {
+                       $this->loadPageData();
+               }
+               return (int)$this->mLatest;
+       }
+
+       /**
+        * Get the Revision object of the oldest revision
+        * @return Revision|null
+        */
+       public function getOldestRevision() {
+               wfProfileIn( __METHOD__ );
+
+               // Try using the slave database first, then try the master
+               $continue = 2;
+               $db = wfGetDB( DB_SLAVE );
+               $revSelectFields = Revision::selectFields();
+
+               $row = null;
+               while ( $continue ) {
+                       $row = $db->selectRow(
+                               array( 'page', 'revision' ),
+                               $revSelectFields,
+                               array(
+                                       'page_namespace' => $this->mTitle->getNamespace(),
+                                       'page_title' => $this->mTitle->getDBkey(),
+                                       'rev_page = page_id'
+                               ),
+                               __METHOD__,
+                               array(
+                                       'ORDER BY' => 'rev_timestamp ASC'
+                               )
+                       );
+
+                       if ( $row ) {
+                               $continue = 0;
+                       } else {
+                               $db = wfGetDB( DB_MASTER );
+                               $continue--;
+                       }
+               }
+
+               wfProfileOut( __METHOD__ );
+               return $row ? Revision::newFromRow( $row ) : null;
+       }
+
+       /**
+        * Loads everything except the text
+        * This isn't necessary for all uses, so it's only done if needed.
+        */
+       protected function loadLastEdit() {
+               if ( $this->mLastRevision !== null ) {
+                       return; // already loaded
+               }
+
+               $latest = $this->getLatest();
+               if ( !$latest ) {
+                       return; // page doesn't exist or is missing page_latest info
+               }
+
+               // Bug 37225: if session S1 loads the page row FOR UPDATE, the result always includes the
+               // latest changes committed. This is true even within REPEATABLE-READ transactions, where
+               // S1 normally only sees changes committed before the first S1 SELECT. Thus we need S1 to
+               // also gets the revision row FOR UPDATE; otherwise, it may not find it since a page row
+               // UPDATE and revision row INSERT by S2 may have happened after the first S1 SELECT.
+               // http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html#isolevel_repeatable-read.
+               $flags = ( $this->mDataLoadedFrom == self::READ_LOCKING ) ? Revision::READ_LOCKING : 0;
+               $revision = Revision::newFromPageId( $this->getId(), $latest, $flags );
+               if ( $revision ) { // sanity
+                       $this->setLastEdit( $revision );
+               }
+       }
+
+       /**
+        * Set the latest revision
+        * @param Revision $revision
+        */
+       protected function setLastEdit( Revision $revision ) {
+               $this->mLastRevision = $revision;
+               $this->mTimestamp = $revision->getTimestamp();
+       }
+
+       /**
+        * Get the latest revision
+        * @return Revision|null
+        */
+       public function getRevision() {
+               $this->loadLastEdit();
+               if ( $this->mLastRevision ) {
+                       return $this->mLastRevision;
+               }
+               return null;
+       }
+
+       /**
+        * Get the content of the current revision. No side-effects...
+        *
+        * @param int $audience int 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 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, $user );
+               }
+               return null;
+       }
+
+       /**
+        * Get the text of the current revision. No side-effects...
+        *
+        * @param int $audience One of:
+        *   Revision::FOR_PUBLIC       to be displayed to all users
+        *   Revision::FOR_THIS_USER    to be displayed to the given user
+        *   Revision::RAW              get the text regardless of permissions
+        * @param User $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
+        * @deprecated since 1.21, getContent() should be used instead.
+        */
+       public function getText( $audience = Revision::FOR_PUBLIC, User $user = null ) {
+               ContentHandler::deprecated( __METHOD__, '1.21' );
+
+               $this->loadLastEdit();
+               if ( $this->mLastRevision ) {
+                       return $this->mLastRevision->getText( $audience, $user );
+               }
+               return false;
+       }
+
+       /**
+        * Get the text of the current revision. No side-effects...
+        *
+        * @return string|bool The text of the current revision. False on failure
+        * @deprecated since 1.21, getContent() should be used instead.
+        */
+       public function getRawText() {
+               ContentHandler::deprecated( __METHOD__, '1.21' );
+
+               return $this->getText( Revision::RAW );
+       }
+
+       /**
+        * @return string MW timestamp of last article revision
+        */
+       public function getTimestamp() {
+               // Check if the field has been filled by WikiPage::setTimestamp()
+               if ( !$this->mTimestamp ) {
+                       $this->loadLastEdit();
+               }
+
+               return wfTimestamp( TS_MW, $this->mTimestamp );
+       }
+
+       /**
+        * Set the page timestamp (use only to avoid DB queries)
+        * @param string $ts MW timestamp of last article revision
+        * @return void
+        */
+       public function setTimestamp( $ts ) {
+               $this->mTimestamp = wfTimestamp( TS_MW, $ts );
+       }
+
+       /**
+        * @param int $audience One of:
+        *   Revision::FOR_PUBLIC       to be displayed to all users
+        *   Revision::FOR_THIS_USER    to be displayed to the given user
+        *   Revision::RAW              get the text regardless of permissions
+        * @param User $user User object to check for, only if FOR_THIS_USER is passed
+        *   to the $audience parameter
+        * @return int user ID for the user that made the last article revision
+        */
+       public function getUser( $audience = Revision::FOR_PUBLIC, User $user = null ) {
+               $this->loadLastEdit();
+               if ( $this->mLastRevision ) {
+                       return $this->mLastRevision->getUser( $audience, $user );
+               } else {
+                       return -1;
+               }
+       }
+
+       /**
+        * Get the User object of the user who created the page
+        * @param int $audience One of:
+        *   Revision::FOR_PUBLIC       to be displayed to all users
+        *   Revision::FOR_THIS_USER    to be displayed to the given user
+        *   Revision::RAW              get the text regardless of permissions
+        * @param User $user User object to check for, only if FOR_THIS_USER is passed
+        *   to the $audience parameter
+        * @return User|null
+        */
+       public function getCreator( $audience = Revision::FOR_PUBLIC, User $user = null ) {
+               $revision = $this->getOldestRevision();
+               if ( $revision ) {
+                       $userName = $revision->getUserText( $audience, $user );
+                       return User::newFromName( $userName, false );
+               } else {
+                       return null;
+               }
+       }
+
+       /**
+        * @param int $audience One of:
+        *   Revision::FOR_PUBLIC       to be displayed to all users
+        *   Revision::FOR_THIS_USER    to be displayed to the given user
+        *   Revision::RAW              get the text regardless of permissions
+        * @param User $user User object to check for, only if FOR_THIS_USER is passed
+        *   to the $audience parameter
+        * @return string username of the user that made the last article revision
+        */
+       public function getUserText( $audience = Revision::FOR_PUBLIC, User $user = null ) {
+               $this->loadLastEdit();
+               if ( $this->mLastRevision ) {
+                       return $this->mLastRevision->getUserText( $audience, $user );
+               } else {
+                       return '';
+               }
+       }
+
+       /**
+        * @param int $audience One of:
+        *   Revision::FOR_PUBLIC       to be displayed to all users
+        *   Revision::FOR_THIS_USER    to be displayed to the given user
+        *   Revision::RAW              get the text regardless of permissions
+        * @param User $user User object to check for, only if FOR_THIS_USER is passed
+        *   to the $audience parameter
+        * @return string Comment stored for the last article revision
+        */
+       public function getComment( $audience = Revision::FOR_PUBLIC, User $user = null ) {
+               $this->loadLastEdit();
+               if ( $this->mLastRevision ) {
+                       return $this->mLastRevision->getComment( $audience, $user );
+               } else {
+                       return '';
+               }
+       }
+
+       /**
+        * Returns true if last revision was marked as "minor edit"
+        *
+        * @return bool Minor edit indicator for the last article revision.
+        */
+       public function getMinorEdit() {
+               $this->loadLastEdit();
+               if ( $this->mLastRevision ) {
+                       return $this->mLastRevision->isMinor();
+               } else {
+                       return false;
+               }
+       }
+
+       /**
+        * Get the cached timestamp for the last time the page changed.
+        * This is only used to help handle slave lag by comparing to page_touched.
+        * @return string MW timestamp
+        */
+       protected function getCachedLastEditTime() {
+               global $wgMemc;
+               $key = wfMemcKey( 'page-lastedit', md5( $this->mTitle->getPrefixedDBkey() ) );
+               return $wgMemc->get( $key );
+       }
+
+       /**
+        * Set the cached timestamp for the last time the page changed.
+        * This is only used to help handle slave lag by comparing to page_touched.
+        * @param string $timestamp
+        * @return void
+        */
+       public function setCachedLastEditTime( $timestamp ) {
+               global $wgMemc;
+               $key = wfMemcKey( 'page-lastedit', md5( $this->mTitle->getPrefixedDBkey() ) );
+               $wgMemc->set( $key, wfTimestamp( TS_MW, $timestamp ), 60 * 15 );
+       }
+
+       /**
+        * Determine whether a page would be suitable for being counted as an
+        * article in the site_stats table based on the title & its content
+        *
+        * @param object|bool $editInfo (false): object returned by prepareTextForEdit(),
+        *   if false, the current database state will be used
+        * @return bool
+        */
+       public function isCountable( $editInfo = false ) {
+               global $wgArticleCountMethod;
+
+               if ( !$this->mTitle->isContentPage() ) {
+                       return false;
+               }
+
+               if ( $editInfo ) {
+                       $content = $editInfo->pstContent;
+               } else {
+                       $content = $this->getContent();
+               }
+
+               if ( !$content || $content->isRedirect() ) {
+                       return false;
+               }
+
+               $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.
+                               $hasLinks = (bool)count( $editInfo->output->getLinks() );
+                       } else {
+                               $hasLinks = (bool)wfGetDB( DB_SLAVE )->selectField( 'pagelinks', 1,
+                                       array( 'pl_from' => $this->getId() ), __METHOD__ );
+                       }
+               }
+
+               return $content->isCountable( $hasLinks );
+       }
+
+       /**
+        * If this page is a redirect, get its target
+        *
+        * The target will be fetched from the redirect table if possible.
+        * If this page doesn't have an entry there, call insertRedirect()
+        * @return Title|null Title object, or null if this page is not a redirect
+        */
+       public function getRedirectTarget() {
+               if ( !$this->mTitle->isRedirect() ) {
+                       return null;
+               }
+
+               if ( $this->mRedirectTarget !== null ) {
+                       return $this->mRedirectTarget;
+               }
+
+               // Query the redirect table
+               $dbr = wfGetDB( DB_SLAVE );
+               $row = $dbr->selectRow( 'redirect',
+                       array( 'rd_namespace', 'rd_title', 'rd_fragment', 'rd_interwiki' ),
+                       array( 'rd_from' => $this->getId() ),
+                       __METHOD__
+               );
+
+               // rd_fragment and rd_interwiki were added later, populate them if empty
+               if ( $row && !is_null( $row->rd_fragment ) && !is_null( $row->rd_interwiki ) ) {
+                       $this->mRedirectTarget = Title::makeTitle(
+                               $row->rd_namespace, $row->rd_title,
+                               $row->rd_fragment, $row->rd_interwiki );
+                       return $this->mRedirectTarget;
+               }
+
+               // This page doesn't have an entry in the redirect table
+               $this->mRedirectTarget = $this->insertRedirect();
+               return $this->mRedirectTarget;
+       }
+
+       /**
+        * Insert an entry for this page into the redirect table.
+        *
+        * Don't call this function directly unless you know what you're doing.
+        * @return Title|null Title object or null if not a redirect
+        */
+       public function insertRedirect() {
+               // recurse through to only get the final target
+               $content = $this->getContent();
+               $retval = $content ? $content->getUltimateRedirectTarget() : null;
+               if ( !$retval ) {
+                       return null;
+               }
+               $this->insertRedirectEntry( $retval );
+               return $retval;
+       }
+
+       /**
+        * Insert or update the redirect table entry for this page to indicate
+        * it redirects to $rt .
+        * @param Title $rt Redirect target
+        */
+       public function insertRedirectEntry( $rt ) {
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->replace( 'redirect', array( 'rd_from' ),
+                       array(
+                               'rd_from' => $this->getId(),
+                               'rd_namespace' => $rt->getNamespace(),
+                               'rd_title' => $rt->getDBkey(),
+                               'rd_fragment' => $rt->getFragment(),
+                               'rd_interwiki' => $rt->getInterwiki(),
+                       ),
+                       __METHOD__
+               );
+       }
+
+       /**
+        * Get the Title object or URL this page redirects to
+        *
+        * @return bool|Title|string false, Title of in-wiki target, or string with URL
+        */
+       public function followRedirect() {
+               return $this->getRedirectURL( $this->getRedirectTarget() );
+       }
+
+       /**
+        * Get the Title object or URL to use for a redirect. We use Title
+        * objects for same-wiki, non-special redirects and URLs for everything
+        * else.
+        * @param Title $rt Redirect target
+        * @return bool|Title|string false, Title object of local target, or string with URL
+        */
+       public function getRedirectURL( $rt ) {
+               if ( !$rt ) {
+                       return false;
+               }
+
+               if ( $rt->isExternal() ) {
+                       if ( $rt->isLocal() ) {
+                               // Offsite wikis need an HTTP redirect.
+                               //
+                               // This can be hard to reverse and may produce loops,
+                               // so they may be disabled in the site configuration.
+                               $source = $this->mTitle->getFullURL( 'redirect=no' );
+                               return $rt->getFullURL( array( 'rdfrom' => $source ) );
+                       } else {
+                               // External pages pages without "local" bit set are not valid
+                               // redirect targets
+                               return false;
+                       }
+               }
+
+               if ( $rt->isSpecialPage() ) {
+                       // Gotta handle redirects to special pages differently:
+                       // Fill the HTTP response "Location" header and ignore
+                       // the rest of the page we're on.
+                       //
+                       // Some pages are not valid targets
+                       if ( $rt->isValidRedirectTarget() ) {
+                               return $rt->getFullURL();
+                       } else {
+                               return false;
+                       }
+               }
+
+               return $rt;
+       }
+
+       /**
+        * Get a list of users who have edited this article, not including the user who made
+        * the most recent revision, which you can get from $article->getUser() if you want it
+        * @return UserArrayFromResult
+        */
+       public function getContributors() {
+               // @todo FIXME: This is expensive; cache this info somewhere.
+
+               $dbr = wfGetDB( DB_SLAVE );
+
+               if ( $dbr->implicitGroupby() ) {
+                       $realNameField = 'user_real_name';
+               } else {
+                       $realNameField = 'MIN(user_real_name) AS user_real_name';
+               }
+
+               $tables = array( 'revision', 'user' );
+
+               $fields = array(
+                       'user_id' => 'rev_user',
+                       'user_name' => 'rev_user_text',
+                       $realNameField,
+                       'timestamp' => 'MAX(rev_timestamp)',
+               );
+
+               $conds = array( 'rev_page' => $this->getId() );
+
+               // The user who made the top revision gets credited as "this page was last edited by
+               // John, based on contributions by Tom, Dick and Harry", so don't include them twice.
+               $user = $this->getUser();
+               if ( $user ) {
+                       $conds[] = "rev_user != $user";
+               } else {
+                       $conds[] = "rev_user_text != {$dbr->addQuotes( $this->getUserText() )}";
+               }
+
+               $conds[] = "{$dbr->bitAnd( 'rev_deleted', Revision::DELETED_USER )} = 0"; // username hidden?
+
+               $jconds = array(
+                       'user' => array( 'LEFT JOIN', 'rev_user = user_id' ),
+               );
+
+               $options = array(
+                       'GROUP BY' => array( 'rev_user', 'rev_user_text' ),
+                       'ORDER BY' => 'timestamp DESC',
+               );
+
+               $res = $dbr->select( $tables, $fields, $conds, __METHOD__, $options, $jconds );
+               return new UserArrayFromResult( $res );
+       }
+
+       /**
+        * Get the last N authors
+        * @param int $num Number of revisions to get
+        * @param int|string $revLatest The latest rev_id, selected from the master (optional)
+        * @return array Array of authors, duplicates not removed
+        */
+       public function getLastNAuthors( $num, $revLatest = 0 ) {
+               wfProfileIn( __METHOD__ );
+               // First try the slave
+               // If that doesn't have the latest revision, try the master
+               $continue = 2;
+               $db = wfGetDB( DB_SLAVE );
+
+               do {
+                       $res = $db->select( array( 'page', 'revision' ),
+                               array( 'rev_id', 'rev_user_text' ),
+                               array(
+                                       'page_namespace' => $this->mTitle->getNamespace(),
+                                       'page_title' => $this->mTitle->getDBkey(),
+                                       'rev_page = page_id'
+                               ), __METHOD__,
+                               array(
+                                       'ORDER BY' => 'rev_timestamp DESC',
+                                       'LIMIT' => $num
+                               )
+                       );
+
+                       if ( !$res ) {
+                               wfProfileOut( __METHOD__ );
+                               return array();
+                       }
+
+                       $row = $db->fetchObject( $res );
+
+                       if ( $continue == 2 && $revLatest && $row->rev_id != $revLatest ) {
+                               $db = wfGetDB( DB_MASTER );
+                               $continue--;
+                       } else {
+                               $continue = 0;
+                       }
+               } while ( $continue );
+
+               $authors = array( $row->rev_user_text );
+
+               foreach ( $res as $row ) {
+                       $authors[] = $row->rev_user_text;
+               }
+
+               wfProfileOut( __METHOD__ );
+               return $authors;
+       }
+
+       /**
+        * Should the parser cache be used?
+        *
+        * @param ParserOptions $parserOptions ParserOptions to check
+        * @param int $oldid
+        * @return bool
+        */
+       public function isParserCacheUsed( ParserOptions $parserOptions, $oldid ) {
+               global $wgEnableParserCache;
+
+               return $wgEnableParserCache
+                       && $parserOptions->getStubThreshold() == 0
+                       && $this->exists()
+                       && ( $oldid === null || $oldid === 0 || $oldid === $this->getLatest() )
+                       && $this->getContentHandler()->isParserCacheSupported();
+       }
+
+       /**
+        * Get a ParserOutput for the given ParserOptions and revision ID.
+        * The parser cache will be used if possible.
+        *
+        * @since 1.19
+        * @param ParserOptions $parserOptions ParserOptions to use for the parse operation
+        * @param null|int $oldid Revision ID to get the text from, passing null or 0 will
+        *   get the current revision (default value)
+        *
+        * @return ParserOutput|bool ParserOutput or false if the revision was not found
+        */
+       public function getParserOutput( ParserOptions $parserOptions, $oldid = null ) {
+               wfProfileIn( __METHOD__ );
+
+               $useParserCache = $this->isParserCacheUsed( $parserOptions, $oldid );
+               wfDebug( __METHOD__ . ': using parser cache: ' . ( $useParserCache ? 'yes' : 'no' ) . "\n" );
+               if ( $parserOptions->getStubThreshold() ) {
+                       wfIncrStats( 'pcache_miss_stub' );
+               }
+
+               if ( $useParserCache ) {
+                       $parserOutput = ParserCache::singleton()->get( $this, $parserOptions );
+                       if ( $parserOutput !== false ) {
+                               wfProfileOut( __METHOD__ );
+                               return $parserOutput;
+                       }
+               }
+
+               if ( $oldid === null || $oldid === 0 ) {
+                       $oldid = $this->getLatest();
+               }
+
+               $pool = new PoolWorkArticleView( $this, $parserOptions, $oldid, $useParserCache );
+               $pool->execute();
+
+               wfProfileOut( __METHOD__ );
+
+               return $pool->getParserOutput();
+       }
+
+       /**
+        * Do standard deferred updates after page view (existing or missing page)
+        * @param User $user The relevant user
+        * @param int $oldid The revision id being viewed. If not given or 0, latest revision is assumed.
+        */
+       public function doViewUpdates( User $user, $oldid = 0 ) {
+               global $wgDisableCounters;
+               if ( wfReadOnly() ) {
+                       return;
+               }
+
+               // Don't update page view counters on views from bot users (bug 14044)
+               if ( !$wgDisableCounters && !$user->isAllowed( 'bot' ) && $this->exists() ) {
+                       DeferredUpdates::addUpdate( new ViewCountUpdate( $this->getId() ) );
+                       DeferredUpdates::addUpdate( new SiteStatsUpdate( 1, 0, 0 ) );
+               }
+
+               // Update newtalk / watchlist notification status
+               $user->clearNotification( $this->mTitle, $oldid );
+       }
+
+       /**
+        * Perform the actions of a page purging
+        * @return bool
+        */
+       public function doPurge() {
+               global $wgUseSquid;
+
+               if ( !wfRunHooks( 'ArticlePurge', array( &$this ) ) ) {
+                       return false;
+               }
+
+               // Invalidate the cache
+               $this->mTitle->invalidateCache();
+
+               if ( $wgUseSquid ) {
+                       // Commit the transaction before the purge is sent
+                       $dbw = wfGetDB( DB_MASTER );
+                       $dbw->commit( __METHOD__ );
+
+                       // Send purge
+                       $update = SquidUpdate::newSimplePurge( $this->mTitle );
+                       $update->doUpdate();
+               }
+
+               if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
+                       // @todo move this logic to MessageCache
+
+                       if ( $this->exists() ) {
+                               // 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;
+                       }
+
+                       MessageCache::singleton()->replace( $this->mTitle->getDBkey(), $text );
+               }
+               return true;
+       }
+
+       /**
+        * Insert a new empty page record for this article.
+        * This *must* be followed up by creating a revision
+        * and running $this->updateRevisionOn( ... );
+        * or else the record will be left in a funky state.
+        * Best if all done inside a transaction.
+        *
+        * @param DatabaseBase $dbw
+        * @return int The newly created page_id key, or false if the title already existed
+        */
+       public function insertOn( $dbw ) {
+               wfProfileIn( __METHOD__ );
+
+               $page_id = $dbw->nextSequenceValue( 'page_page_id_seq' );
+               $dbw->insert( 'page', array(
+                       'page_id'           => $page_id,
+                       'page_namespace'    => $this->mTitle->getNamespace(),
+                       'page_title'        => $this->mTitle->getDBkey(),
+                       'page_counter'      => 0,
+                       'page_restrictions' => '',
+                       'page_is_redirect'  => 0, // Will set this shortly...
+                       'page_is_new'       => 1,
+                       'page_random'       => wfRandom(),
+                       'page_touched'      => $dbw->timestamp(),
+                       'page_latest'       => 0, // Fill this in shortly...
+                       'page_len'          => 0, // Fill this in shortly...
+               ), __METHOD__, 'IGNORE' );
+
+               $affected = $dbw->affectedRows();
+
+               if ( $affected ) {
+                       $newid = $dbw->insertId();
+                       $this->mId = $newid;
+                       $this->mTitle->resetArticleID( $newid );
+               }
+               wfProfileOut( __METHOD__ );
+
+               return $affected ? $newid : false;
+       }
+
+       /**
+        * Update the page record to point to a newly saved revision.
+        *
+        * @param DatabaseBase $dbw
+        * @param Revision $revision For ID number, and text used to set
+        *   length and redirect status fields
+        * @param int $lastRevision If given, will not overwrite the page field
+        *   when different from the currently set value.
+        *   Giving 0 indicates the new page flag should be set on.
+        * @param bool $lastRevIsRedirect If given, will optimize adding and
+        *   removing rows in redirect table.
+        * @return bool true on success, false on failure
+        */
+       public function updateRevisionOn( $dbw, $revision, $lastRevision = null,
+               $lastRevIsRedirect = null
+       ) {
+               global $wgContentHandlerUseDB;
+
+               wfProfileIn( __METHOD__ );
+
+               $content = $revision->getContent();
+               $len = $content ? $content->getSize() : 0;
+               $rt = $content ? $content->getUltimateRedirectTarget() : null;
+
+               $conditions = array( 'page_id' => $this->getId() );
+
+               if ( !is_null( $lastRevision ) ) {
+                       // An extra check against threads stepping on each other
+                       $conditions['page_latest'] = $lastRevision;
+               }
+
+               $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',
+                       $row,
+                       $conditions,
+                       __METHOD__ );
+
+               $result = $dbw->affectedRows() > 0;
+               if ( $result ) {
+                       $this->updateRedirectOn( $dbw, $rt, $lastRevIsRedirect );
+                       $this->setLastEdit( $revision );
+                       $this->setCachedLastEditTime( $now );
+                       $this->mLatest = $revision->getId();
+                       $this->mIsRedirect = (bool)$rt;
+                       // Update the LinkCache.
+                       LinkCache::singleton()->addGoodLinkObj( $this->getId(), $this->mTitle, $len, $this->mIsRedirect,
+                                                                                                       $this->mLatest, $revision->getContentModel() );
+               }
+
+               wfProfileOut( __METHOD__ );
+               return $result;
+       }
+
+       /**
+        * Add row to the redirect table if this is a redirect, remove otherwise.
+        *
+        * @param DatabaseBase $dbw
+        * @param Title $redirectTitle Title object pointing to the redirect target,
+        *   or NULL if this is not a redirect
+        * @param null|bool $lastRevIsRedirect If given, will optimize adding and
+        *   removing rows in redirect table.
+        * @return bool true on success, false on failure
+        * @private
+        */
+       public function updateRedirectOn( $dbw, $redirectTitle, $lastRevIsRedirect = null ) {
+               // Always update redirects (target link might have changed)
+               // Update/Insert if we don't know if the last revision was a redirect or not
+               // Delete if changing from redirect to non-redirect
+               $isRedirect = !is_null( $redirectTitle );
+
+               if ( !$isRedirect && $lastRevIsRedirect === false ) {
+                       return true;
+               }
+
+               wfProfileIn( __METHOD__ );
+               if ( $isRedirect ) {
+                       $this->insertRedirectEntry( $redirectTitle );
+               } else {
+                       // This is not a redirect, remove row from redirect table
+                       $where = array( 'rd_from' => $this->getId() );
+                       $dbw->delete( 'redirect', $where, __METHOD__ );
+               }
+
+               if ( $this->getTitle()->getNamespace() == NS_FILE ) {
+                       RepoGroup::singleton()->getLocalRepo()->invalidateImageRedirect( $this->getTitle() );
+               }
+               wfProfileOut( __METHOD__ );
+
+               return ( $dbw->affectedRows() != 0 );
+       }
+
+       /**
+        * If the given revision is newer than the currently set page_latest,
+        * update the page record. Otherwise, do nothing.
+        *
+        * @deprecated since 1.24, use updateRevisionOn instead
+        *
+        * @param DatabaseBase $dbw
+        * @param Revision $revision
+        * @return bool
+        */
+       public function updateIfNewerOn( $dbw, $revision ) {
+               wfProfileIn( __METHOD__ );
+
+               $row = $dbw->selectRow(
+                       array( 'revision', 'page' ),
+                       array( 'rev_id', 'rev_timestamp', 'page_is_redirect' ),
+                       array(
+                               'page_id' => $this->getId(),
+                               'page_latest=rev_id' ),
+                       __METHOD__ );
+
+               if ( $row ) {
+                       if ( wfTimestamp( TS_MW, $row->rev_timestamp ) >= $revision->getTimestamp() ) {
+                               wfProfileOut( __METHOD__ );
+                               return false;
+                       }
+                       $prev = $row->rev_id;
+                       $lastRevIsRedirect = (bool)$row->page_is_redirect;
+               } else {
+                       // No or missing previous revision; mark the page as new
+                       $prev = 0;
+                       $lastRevIsRedirect = null;
+               }
+
+               $ret = $this->updateRevisionOn( $dbw, $revision, $prev, $lastRevIsRedirect );
+
+               wfProfileOut( __METHOD__ );
+               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 Revision $undo
+        * @param Revision $undoafter 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,
+        * must exist and must not be deleted
+        * @param Revision $undo
+        * @param Revision $undoafter Must be an earlier revision than $undo
+        * @return string|bool string on success, false on failure
+        * @deprecated since 1.21: use ContentHandler::getUndoContent() instead.
+        */
+       public function getUndoText( Revision $undo, Revision $undoafter = null ) {
+               ContentHandler::deprecated( __METHOD__, '1.21' );
+
+               $this->loadLastEdit();
+
+               if ( $this->mLastRevision ) {
+                       if ( is_null( $undoafter ) ) {
+                               $undoafter = $undo->getPrevious();
+                       }
+
+                       $handler = $this->getContentHandler();
+                       $undone = $handler->getUndoContent( $this->mLastRevision, $undo, $undoafter );
+
+                       if ( !$undone ) {
+                               return false;
+                       } else {
+                               return ContentHandler::getContentText( $undone );
+                       }
+               }
+
+               return false;
+       }
+
+       /**
+        * @param string|number|null|bool $sectionId Section identifier as a number or string
+        * (e.g. 0, 1 or 'T-1'), null/false or an empty string for the whole page
+        * or 'new' for a new section.
+        * @param string $text New text of the section.
+        * @param string $sectionTitle New section's subject, only if $section is "new".
+        * @param string $edittime Revision timestamp or null to use the current revision.
+        *
+        * @throws MWException
+        * @return string New complete article text, or null if error.
+        *
+        * @deprecated since 1.21, use replaceSectionAtRev() instead
+        */
+       public function replaceSection( $sectionId, $text, $sectionTitle = '',
+               $edittime = null
+       ) {
+               ContentHandler::deprecated( __METHOD__, '1.21' );
+
+               //NOTE: keep condition in sync with condition in replaceSectionContent!
+               if ( strval( $sectionId ) === '' ) {
+                       // 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( $sectionId, $sectionContent, $sectionTitle,
+                       $edittime );
+
+               return ContentHandler::getContentText( $newContent );
+       }
+
+       /**
+        * Returns true if this page's content model supports sections.
+        *
+        * @return bool
+        *
+        * @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 string|number|null|bool $sectionId Section identifier as a number or string
+        * (e.g. 0, 1 or 'T-1'), null/false or an empty string for the whole page
+        * or 'new' for a new section.
+        * @param Content $sectionContent New content of the section.
+        * @param string $sectionTitle New section's subject, only if $section is "new".
+        * @param string $edittime Revision timestamp or null to use the current revision.
+        *
+        * @throws MWException
+        * @return Content New complete article content, or null if error.
+        *
+        * @since 1.21
+        * @deprecated since 1.24, use replaceSectionAtRev instead
+        */
+       public function replaceSectionContent( $sectionId, Content $sectionContent, $sectionTitle = '',
+               $edittime = null ) {
+               wfProfileIn( __METHOD__ );
+
+               $baseRevId = null;
+               if ( $edittime && $sectionId !== 'new' ) {
+                       $dbw = wfGetDB( DB_MASTER );
+                       $rev = Revision::loadFromTimestamp( $dbw, $this->mTitle, $edittime );
+                       if ( $rev ) {
+                               $baseRevId = $rev->getId();
+                       }
+               }
+
+               wfProfileOut( __METHOD__ );
+               return $this->replaceSectionAtRev( $sectionId, $sectionContent, $sectionTitle, $baseRevId );
+       }
+
+       /**
+        * @param string|number|null|bool $sectionId Section identifier as a number or string
+        * (e.g. 0, 1 or 'T-1'), null/false or an empty string for the whole page
+        * or 'new' for a new section.
+        * @param Content $sectionContent New content of the section.
+        * @param string $sectionTitle New section's subject, only if $section is "new".
+        * @param string $baseRevId integer|null
+        *
+        * @throws MWException
+        * @return Content New complete article content, or null if error.
+        *
+        * @since 1.24
+        */
+       public function replaceSectionAtRev( $sectionId, Content $sectionContent,
+               $sectionTitle = '', $baseRevId = null
+       ) {
+               wfProfileIn( __METHOD__ );
+
+               if ( strval( $sectionId ) === '' ) {
+                       // Whole-page edit; let the whole text through
+                       $newContent = $sectionContent;
+               } else {
+                       if ( !$this->supportsSections() ) {
+                               wfProfileOut( __METHOD__ );
+                               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( $baseRevId ) || $sectionId === 'new' ) {
+                               $oldContent = $this->getContent();
+                       } else {
+                               // TODO: try DB_SLAVE first
+                               $dbw = wfGetDB( DB_MASTER );
+                               $rev = Revision::loadFromId( $dbw, $baseRevId );
+
+                               if ( !$rev ) {
+                                       wfDebug( __METHOD__ . " asked for bogus section (page: " .
+                                               $this->getId() . "; section: $sectionId)\n" );
+                                       wfProfileOut( __METHOD__ );
+                                       return null;
+                               }
+
+                               $oldContent = $rev->getContent();
+                       }
+
+                       if ( ! $oldContent ) {
+                               wfDebug( __METHOD__ . ": no page text\n" );
+                               wfProfileOut( __METHOD__ );
+                               return null;
+                       }
+
+                       $newContent = $oldContent->replaceSection( $sectionId, $sectionContent, $sectionTitle );
+               }
+
+               wfProfileOut( __METHOD__ );
+               return $newContent;
+       }
+
+       /**
+        * Check flags and add EDIT_NEW or EDIT_UPDATE to them as needed.
+        * @param int $flags
+        * @return int Updated $flags
+        */
+       public function checkFlags( $flags ) {
+               if ( !( $flags & EDIT_NEW ) && !( $flags & EDIT_UPDATE ) ) {
+                       if ( $this->exists() ) {
+                               $flags |= EDIT_UPDATE;
+                       } else {
+                               $flags |= EDIT_NEW;
+                       }
+               }
+
+               return $flags;
+       }
+
+       /**
+        * Change an existing article or create a new article. Updates RC and all necessary caches,
+        * optionally via the deferred update array.
+        *
+        * @param string $text New text
+        * @param string $summary Edit summary
+        * @param int $flags 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 bool|int $baseRevId The revision ID this edit was based off, if any
+        * @param User $user The user doing the edit
+        *
+        * @throws MWException
+        * @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.
+        *
+        * 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 string $summary Edit summary
+        * @param int $flags 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 bool|int $baseRevId The revision ID this edit was based off, if any
+        * @param User $user The user doing the edit
+        * @param string $serialisation_format Format for storing the content in the
+        *   database.
+        *
+        * @throws MWException
+        * @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
+               if ( $this->mTitle->getText() === '' ) {
+                       throw new MWException( 'Something is trying to edit an article with an empty title' );
+               }
+
+               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() );
+
+               // Load the data from the master database if needed.
+               // The caller may already loaded it from the master or even loaded it using
+               // SELECT FOR UPDATE, so do not override that using clear().
+               $this->loadPageData( 'fromdbmaster' );
+
+               $flags = $this->checkFlags( $flags );
+
+               // 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' );
+                       }
+
+                       wfProfileOut( __METHOD__ );
+                       return $status;
+               }
+
+               // Silently ignore EDIT_MINOR if not allowed
+               $isminor = ( $flags & EDIT_MINOR ) && $user->isAllowed( 'minoredit' );
+               $bot = $flags & EDIT_FORCE_BOT;
+
+               $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 == '' ) {
+                       if ( !$old_content ) {
+                               $old_content = null;
+                       }
+                       $summary = $handler->getAutosummary( $old_content, $content, $flags );
+               }
+
+               $editInfo = $this->prepareContentForEdit( $content, null, $user, $serialisation_format );
+               $serialized = $editInfo->pst;
+
+               /**
+                * @var Content $content
+                */
+               $content = $editInfo->pstContent;
+               $newsize = $content->getSize();
+
+               $dbw = wfGetDB( DB_MASTER );
+               $now = wfTimestampNow();
+               $this->mTimestamp = $now;
+
+               if ( $flags & EDIT_UPDATE ) {
+                       // Update article, but only if changed.
+                       $status->value['new'] = false;
+
+                       if ( !$oldid ) {
+                               // Article gone missing
+                               wfDebug( __METHOD__ . ": EDIT_UPDATE specified but article doesn't exist\n" );
+                               $status->fatal( 'edit-gone-missing' );
+
+                               wfProfileOut( __METHOD__ );
+                               return $status;
+                       } elseif ( !$old_content ) {
+                               // Sanity check for bug 37225
+                               wfProfileOut( __METHOD__ );
+                               throw new MWException( "Could not find text for current revision {$oldid}." );
+                       }
+
+                       $revision = new Revision( array(
+                               'page'       => $this->getId(),
+                               'title'      => $this->getTitle(), // for determining the default content model
+                               'comment'    => $summary,
+                               'minor_edit' => $isminor,
+                               'text'       => $serialized,
+                               'len'        => $newsize,
+                               'parent_id'  => $oldid,
+                               'user'       => $user->getId(),
+                               'user_text'  => $user->getName(),
+                               'timestamp'  => $now,
+                               'content_model' => $content->getModel(),
+                               'content_format' => $serialisation_format,
+                       ) ); // XXX: pass content object?!
+
+                       $changed = !$content->equals( $old_content );
+
+                       if ( $changed ) {
+                               if ( !$content->isValid() ) {
+                                       wfProfileOut( __METHOD__ );
+                                       throw new MWException( "New content failed validity check!" );
+                               }
+
+                               $dbw->begin( __METHOD__ );
+                               try {
+
+                                       $prepStatus = $content->prepareSave( $this, $flags, $baseRevId, $user );
+                                       $status->merge( $prepStatus );
+
+                                       if ( !$status->isOK() ) {
+                                               $dbw->rollback( __METHOD__ );
+
+                                               wfProfileOut( __METHOD__ );
+                                               return $status;
+                                       }
+                                       $revisionId = $revision->insertOn( $dbw );
+
+                                       // Update page
+                                       //
+                                       // We check for conflicts by comparing $oldid with the current latest revision ID.
+                                       $ok = $this->updateRevisionOn( $dbw, $revision, $oldid, $oldIsRedirect );
+
+                                       if ( !$ok ) {
+                                               // Belated edit conflict! Run away!!
+                                               $status->fatal( 'edit-conflict' );
+
+                                               $dbw->rollback( __METHOD__ );
+
+                                               wfProfileOut( __METHOD__ );
+                                               return $status;
+                                       }
+
+                                       wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $revision, $baseRevId, $user ) );
+                                       // Update recentchanges
+                                       if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
+                                               // Mark as patrolled if the user can do so
+                                               $patrolled = $wgUseRCPatrol && !count(
+                                               $this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
+                                               // Add RC row to the DB
+                                               $rc = RecentChange::notifyEdit( $now, $this->mTitle, $isminor, $user, $summary,
+                                                       $oldid, $this->getTimestamp(), $bot, '', $oldsize, $newsize,
+                                                       $revisionId, $patrolled
+                                               );
+
+                                               // Log auto-patrolled edits
+                                               if ( $patrolled ) {
+                                                       PatrolLog::record( $rc, true, $user );
+                                               }
+                                       }
+                                       $user->incEditCount();
+                               } catch ( MWException $e ) {
+                                       $dbw->rollback( __METHOD__ );
+                                       // Question: Would it perhaps be better if this method turned all
+                                       // exceptions into $status's?
+                                       throw $e;
+                               }
+                               $dbw->commit( __METHOD__ );
+                       } else {
+                               // Bug 32948: revision ID must be set to page {{REVISIONID}} and
+                               // related variables correctly
+                               $revision->setId( $this->getLatest() );
+                       }
+
+                       // Update links tables, site stats, etc.
+                       $this->doEditUpdates(
+                               $revision,
+                               $user,
+                               array(
+                                       'changed' => $changed,
+                                       'oldcountable' => $oldcountable
+                               )
+                       );
+
+                       if ( !$changed ) {
+                               $status->warning( 'edit-no-change' );
+                               $revision = null;
+                               // Update page_touched, this is usually implicit in the page update
+                               // Other cache updates are done in onArticleEdit()
+                               $this->mTitle->invalidateCache();
+                       }
+               } else {
+                       // Create new article
+                       $status->value['new'] = true;
+
+                       $dbw->begin( __METHOD__ );
+                       try {
+
+                               $prepStatus = $content->prepareSave( $this, $flags, $baseRevId, $user );
+                               $status->merge( $prepStatus );
+
+                               if ( !$status->isOK() ) {
+                                       $dbw->rollback( __METHOD__ );
+
+                                       wfProfileOut( __METHOD__ );
+                                       return $status;
+                               }
+
+                               $status->merge( $prepStatus );
+
+                               // Add the page record; stake our claim on this title!
+                               // This will return false if the article already exists
+                               $newid = $this->insertOn( $dbw );
+
+                               if ( $newid === false ) {
+                                       $dbw->rollback( __METHOD__ );
+                                       $status->fatal( 'edit-already-exists' );
+
+                                       wfProfileOut( __METHOD__ );
+                                       return $status;
+                               }
+
+                               // Save the revision text...
+                               $revision = new Revision( array(
+                                       'page'       => $newid,
+                                       'title'      => $this->getTitle(), // for determining the default content model
+                                       'comment'    => $summary,
+                                       'minor_edit' => $isminor,
+                                       'text'       => $serialized,
+                                       'len'        => $newsize,
+                                       'user'       => $user->getId(),
+                                       'user_text'  => $user->getName(),
+                                       '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
+                               $content = $revision->getContent(); // sanity; get normalized version
+
+                               if ( $content ) {
+                                       $newsize = $content->getSize();
+                               }
+
+                               // Update the page record with revision data
+                               $this->updateRevisionOn( $dbw, $revision, 0 );
+
+                               wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $revision, false, $user ) );
+
+                               // Update recentchanges
+                               if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
+                                       // Mark as patrolled if the user can do so
+                                       $patrolled = ( $wgUseRCPatrol || $wgUseNPPatrol ) && !count(
+                                               $this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
+                                       // Add RC row to the DB
+                                       $rc = RecentChange::notifyNew( $now, $this->mTitle, $isminor, $user, $summary, $bot,
+                                               '', $newsize, $revisionId, $patrolled );
+
+                                       // Log auto-patrolled edits
+                                       if ( $patrolled ) {
+                                               PatrolLog::record( $rc, true, $user );
+                                       }
+                               }
+                               $user->incEditCount();
+
+                       } catch ( MWException $e ) {
+                               $dbw->rollback( __METHOD__ );
+                               throw $e;
+                       }
+                       $dbw->commit( __METHOD__ );
+
+                       // Update links, etc.
+                       $this->doEditUpdates( $revision, $user, array( 'created' => true ) );
+
+                       $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
+               if ( !( $flags & EDIT_DEFER_UPDATES ) ) {
+                       DeferredUpdates::doUpdates();
+               }
+
+               // Return the new revision (or null) to the caller
+               $status->value['revision'] = $revision;
+
+               $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' );
+
+               wfProfileOut( __METHOD__ );
+               return $status;
+       }
+
+       /**
+        * 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
+        *        - 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).
+        * @return ParserOptions
+        */
+       public function makeParserOptions( $context ) {
+               $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();
+               }
+
+               return $options;
+       }
+
+       /**
+        * Prepare text which is about to be saved.
+        * Returns a stdclass with source, pst and output members
+        *
+        * @deprecated since 1.21: use prepareContentForEdit instead.
+        * @return object
+        */
+       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 int|null $revid
+        * @param User|null $user
+        * @param string|null $serialization_format
+        *
+        * @return bool|object
+        *
+        * @since 1.21
+        */
+       public function prepareContentForEdit( Content $content, $revid = null, User $user = null,
+               $serialization_format = null
+       ) {
+               global $wgContLang, $wgUser;
+               $user = is_null( $user ) ? $wgUser : $user;
+               //XXX: check $user->getId() here???
+
+               // Use a sane default for $serialization_format, see bug 57026
+               if ( $serialization_format === null ) {
+                       $serialization_format = $content->getContentHandler()->getDefaultFormat();
+               }
+
+               if ( $this->mPreparedEdit
+                       && $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;
+               }
+
+               $popts = ParserOptions::newFromUserAndLang( $user, $wgContLang );
+               wfRunHooks( 'ArticlePrepareTextForEdit', array( $this, $popts ) );
+
+               $edit = (object)array();
+               $edit->revid = $revid;
+               $edit->timestamp = wfTimestampNow();
+
+               $edit->pstContent = $content ? $content->preSaveTransform( $this->mTitle, $user, $popts ) : null;
+
+               $edit->format = $serialization_format;
+               $edit->popts = $this->makeParserOptions( 'canonical' );
+               $edit->output = $edit->pstContent
+                       ? $edit->pstContent->getParserOutput( $this->mTitle, $revid, $edit->popts )
+                       : null;
+
+               $edit->newContent = $content;
+               $edit->oldContent = $this->getContent( Revision::RAW );
+
+               // NOTE: B/C for hooks! don't use these fields!
+               $edit->newText = $edit->newContent ? ContentHandler::getContentText( $edit->newContent ) : '';
+               $edit->oldText = $edit->oldContent ? ContentHandler::getContentText( $edit->oldContent ) : '';
+               $edit->pst = $edit->pstContent ? $edit->pstContent->serialize( $serialization_format ) : '';
+
+               $this->mPreparedEdit = $edit;
+               return $edit;
+       }
+
+       /**
+        * Do standard deferred updates after page edit.
+        * Update links tables, site stats, search index and message cache.
+        * Purges pages that include this page if the text was changed here.
+        * Every 100th edit, prune the recent changes table.
+        *
+        * @param Revision $revision
+        * @param User $user User object that did the revision
+        * @param array $options Array of options, following indexes are used:
+        * - changed: boolean, whether the revision changed the content (default true)
+        * - created: boolean, whether the revision created the page (default false)
+        * - oldcountable: boolean or null (default null):
+        *   - boolean: whether the page was counted as an article before that
+        *     revision, only used in changed is true and created is false
+        *   - null: don't change the article count
+        */
+       public function doEditUpdates( Revision $revision, User $user, array $options = array() ) {
+               global $wgEnableParserCache;
+
+               wfProfileIn( __METHOD__ );
+
+               $options += array( 'changed' => true, 'created' => false, 'oldcountable' => null );
+               $content = $revision->getContent();
+
+               // Parse the text
+               // Be careful not to do pre-save transform twice: $text is usually
+               // already pre-save transformed once.
+               if ( !$this->mPreparedEdit || $this->mPreparedEdit->output->getFlag( 'vary-revision' ) ) {
+                       wfDebug( __METHOD__ . ": No prepared edit or vary-revision is set...\n" );
+                       $editInfo = $this->prepareContentForEdit( $content, $revision->getId(), $user );
+               } else {
+                       wfDebug( __METHOD__ . ": No vary-revision, using prepared edit...\n" );
+                       $editInfo = $this->mPreparedEdit;
+               }
+
+               // Save it to the parser cache
+               if ( $wgEnableParserCache ) {
+                       $parserCache = ParserCache::singleton();
+                       $parserCache->save(
+                               $editInfo->output, $this, $editInfo->popts, $editInfo->timestamp, $editInfo->revid
+                       );
+               }
+
+               // Update the links tables and other secondary data
+               if ( $content ) {
+                       $recursive = $options['changed']; // bug 50785
+                       $updates = $content->getSecondaryDataUpdates(
+                               $this->getTitle(), null, $recursive, $editInfo->output );
+                       DataUpdate::runUpdates( $updates );
+               }
+
+               wfRunHooks( 'ArticleEditUpdates', array( &$this, &$editInfo, $options['changed'] ) );
+
+               if ( wfRunHooks( 'ArticleEditUpdatesDeleteFromRecentchanges', array( &$this ) ) ) {
+                       if ( 0 == mt_rand( 0, 99 ) ) {
+                               // Flush old entries from the `recentchanges` table; we do this on
+                               // random requests so as to avoid an increase in writes for no good reason
+                               RecentChange::purgeExpiredChanges();
+                       }
+               }
+
+               if ( !$this->exists() ) {
+                       wfProfileOut( __METHOD__ );
+                       return;
+               }
+
+               $id = $this->getId();
+               $title = $this->mTitle->getPrefixedDBkey();
+               $shortTitle = $this->mTitle->getDBkey();
+
+               if ( !$options['changed'] ) {
+                       $good = 0;
+               } elseif ( $options['created'] ) {
+                       $good = (int)$this->isCountable( $editInfo );
+               } elseif ( $options['oldcountable'] !== null ) {
+                       $good = (int)$this->isCountable( $editInfo ) - (int)$options['oldcountable'];
+               } else {
+                       $good = 0;
+               }
+               $edits = $options['changed'] ? 1 : 0;
+               $total = $options['created'] ? 1 : 0;
+
+               DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, $edits, $good, $total ) );
+               DeferredUpdates::addUpdate( new SearchUpdate( $id, $title, $content ) );
+
+               // If this is another user's talk page, update newtalk.
+               // Don't do this if $options['changed'] = false (null-edits) nor if
+               // it's a minor edit and the user doesn't want notifications for those.
+               if ( $options['changed']
+                       && $this->mTitle->getNamespace() == NS_USER_TALK
+                       && $shortTitle != $user->getTitleKey()
+                       && !( $revision->isMinor() && $user->isAllowed( 'nominornewtalk' ) )
+               ) {
+                       $recipient = User::newFromName( $shortTitle, false );
+                       if ( !$recipient ) {
+                               wfDebug( __METHOD__ . ": invalid username\n" );
+                       } else {
+                               // Allow extensions to prevent user notification when a new message is added to their talk page
+                               if ( wfRunHooks( 'ArticleEditUpdateNewTalk', array( &$this, $recipient ) ) ) {
+                                       if ( User::isIP( $shortTitle ) ) {
+                                               // An anonymous user
+                                               $recipient->setNewtalk( true, $revision );
+                                       } elseif ( $recipient->isLoggedIn() ) {
+                                               $recipient->setNewtalk( true, $revision );
+                                       } else {
+                                               wfDebug( __METHOD__ . ": don't need to notify a nonexistent user\n" );
+                                       }
+                               }
+                       }
+               }
+
+               if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
+                       // XXX: could skip pseudo-messages like js/css here, based on content model.
+                       $msgtext = $content ? $content->getWikitextForTransclusion() : null;
+                       if ( $msgtext === false || $msgtext === null ) {
+                               $msgtext = '';
+                       }
+
+                       MessageCache::singleton()->replace( $shortTitle, $msgtext );
+               }
+
+               if ( $options['created'] ) {
+                       self::onArticleCreate( $this->mTitle );
+               } elseif ( $options['changed'] ) { // bug 50785
+                       self::onArticleEdit( $this->mTitle );
+               }
+
+               wfProfileOut( __METHOD__ );
+       }
+
+       /**
+        * 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 string $text Text submitted
+        * @param User $user The relevant user
+        * @param string $comment Comment submitted
+        * @param bool $minor 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() );
+               $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 string $comment comment submitted
+        * @param string $serialisation_format Format for storing the content in the database
+        * @param bool $minor Whereas it's a minor modification
+        */
+       public function doQuickEditContent( Content $content, User $user, $comment = '', $minor = false,
+               $serialisation_format = null
+       ) {
+               wfProfileIn( __METHOD__ );
+
+               $serialized = $content->serialize( $serialisation_format );
+
+               $dbw = wfGetDB( DB_MASTER );
+               $revision = new Revision( array(
+                       'title'      => $this->getTitle(), // for determining the default content model
+                       'page'       => $this->getId(),
+                       'user_text'  => $user->getName(),
+                       'user'       => $user->getId(),
+                       'text'       => $serialized,
+                       'length'     => $content->getSize(),
+                       'comment'    => $comment,
+                       'minor_edit' => $minor ? 1 : 0,
+               ) ); // XXX: set the content object?
+               $revision->insertOn( $dbw );
+               $this->updateRevisionOn( $dbw, $revision );
+
+               wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $revision, false, $user ) );
+
+               wfProfileOut( __METHOD__ );
+       }
+
+       /**
+        * Update the article's restriction field, and leave a log entry.
+        * This works for protection both existing and non-existing pages.
+        *
+        * @param array $limit Set of restriction keys
+        * @param array $expiry Per restriction type expiration
+        * @param int &$cascade Set to false if cascading protection isn't allowed.
+        * @param string $reason
+        * @param User $user The user updating the restrictions
+        * @return Status
+        */
+       public function doUpdateRestrictions( array $limit, array $expiry,
+               &$cascade, $reason, User $user
+       ) {
+               global $wgCascadingRestrictionLevels, $wgContLang;
+
+               if ( wfReadOnly() ) {
+                       return Status::newFatal( 'readonlytext', wfReadOnlyReason() );
+               }
+
+               $this->loadPageData( 'fromdbmaster' );
+               $restrictionTypes = $this->mTitle->getRestrictionTypes();
+               $id = $this->getId();
+
+               if ( !$cascade ) {
+                       $cascade = false;
+               }
+
+               // Take this opportunity to purge out expired restrictions
+               Title::purgeExpiredRestrictions();
+
+               // @todo FIXME: Same limitations as described in ProtectionForm.php (line 37);
+               // we expect a single selection, but the schema allows otherwise.
+               $isProtected = false;
+               $protect = false;
+               $changed = false;
+
+               $dbw = wfGetDB( DB_MASTER );
+
+               foreach ( $restrictionTypes as $action ) {
+                       if ( !isset( $expiry[$action] ) ) {
+                               $expiry[$action] = $dbw->getInfinity();
+                       }
+                       if ( !isset( $limit[$action] ) ) {
+                               $limit[$action] = '';
+                       } elseif ( $limit[$action] != '' ) {
+                               $protect = true;
+                       }
+
+                       // Get current restrictions on $action
+                       $current = implode( '', $this->mTitle->getRestrictions( $action ) );
+                       if ( $current != '' ) {
+                               $isProtected = true;
+                       }
+
+                       if ( $limit[$action] != $current ) {
+                               $changed = true;
+                       } elseif ( $limit[$action] != '' ) {
+                               // Only check expiry change if the action is actually being
+                               // protected, since expiry does nothing on an not-protected
+                               // action.
+                               if ( $this->mTitle->getRestrictionExpiry( $action ) != $expiry[$action] ) {
+                                       $changed = true;
+                               }
+                       }
+               }
+
+               if ( !$changed && $protect && $this->mTitle->areRestrictionsCascading() != $cascade ) {
+                       $changed = true;
+               }
+
+               // If nothing has changed, do nothing
+               if ( !$changed ) {
+                       return Status::newGood();
+               }
+
+               if ( !$protect ) { // No protection at all means unprotection
+                       $revCommentMsg = 'unprotectedarticle';
+                       $logAction = 'unprotect';
+               } elseif ( $isProtected ) {
+                       $revCommentMsg = 'modifiedarticleprotection';
+                       $logAction = 'modify';
+               } else {
+                       $revCommentMsg = 'protectedarticle';
+                       $logAction = 'protect';
+               }
+
+               // Truncate for whole multibyte characters
+               $reason = $wgContLang->truncate( $reason, 255 );
+
+               $logRelationsValues = array();
+               $logRelationsField = null;
+
+               if ( $id ) { // Protection of existing page
+                       if ( !wfRunHooks( 'ArticleProtect', array( &$this, &$user, $limit, $reason ) ) ) {
+                               return Status::newGood();
+                       }
+
+                       // Only certain restrictions can cascade...
+                       $editrestriction = isset( $limit['edit'] )
+                               ? array( $limit['edit'] )
+                               : $this->mTitle->getRestrictions( 'edit' );
+                       foreach ( array_keys( $editrestriction, 'sysop' ) as $key ) {
+                               $editrestriction[$key] = 'editprotected'; // backwards compatibility
+                       }
+                       foreach ( array_keys( $editrestriction, 'autoconfirmed' ) as $key ) {
+                               $editrestriction[$key] = 'editsemiprotected'; // backwards compatibility
+                       }
+
+                       $cascadingRestrictionLevels = $wgCascadingRestrictionLevels;
+                       foreach ( array_keys( $cascadingRestrictionLevels, 'sysop' ) as $key ) {
+                               $cascadingRestrictionLevels[$key] = 'editprotected'; // backwards compatibility
+                       }
+                       foreach ( array_keys( $cascadingRestrictionLevels, 'autoconfirmed' ) as $key ) {
+                               $cascadingRestrictionLevels[$key] = 'editsemiprotected'; // backwards compatibility
+                       }
+
+                       // The schema allows multiple restrictions
+                       if ( !array_intersect( $editrestriction, $cascadingRestrictionLevels ) ) {
+                               $cascade = false;
+                       }
+
+                       // insert null revision to identify the page protection change as edit summary
+                       $latest = $this->getLatest();
+                       $nullRevision = $this->insertProtectNullRevision(
+                               $revCommentMsg,
+                               $limit,
+                               $expiry,
+                               $cascade,
+                               $reason,
+                               $user
+                       );
+
+                       if ( $nullRevision === null ) {
+                               return Status::newFatal( 'no-null-revision', $this->mTitle->getPrefixedText() );
+                       }
+
+                       $logRelationsField = 'pr_id';
+
+                       // Update restrictions table
+                       foreach ( $limit as $action => $restrictions ) {
+                               $dbw->delete(
+                                       'page_restrictions',
+                                       array(
+                                               'pr_page' => $id,
+                                               'pr_type' => $action
+                                       ),
+                                       __METHOD__
+                               );
+                               if ( $restrictions != '' ) {
+                                       $dbw->insert(
+                                               'page_restrictions',
+                                               array(
+                                                       'pr_id' => $dbw->nextSequenceValue( 'page_restrictions_pr_id_seq' ),
+                                                       'pr_page' => $id,
+                                                       'pr_type' => $action,
+                                                       'pr_level' => $restrictions,
+                                                       'pr_cascade' => ( $cascade && $action == 'edit' ) ? 1 : 0,
+                                                       'pr_expiry' => $dbw->encodeExpiry( $expiry[$action] )
+                                               ),
+                                               __METHOD__
+                                       );
+                                       $logRelationsValues[] = $dbw->insertId();
+                               }
+                       }
+
+                       // Clear out legacy restriction fields
+                       $dbw->update(
+                               'page',
+                               array( 'page_restrictions' => '' ),
+                               array( 'page_id' => $id ),
+                               __METHOD__
+                       );
+
+                       wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $nullRevision, $latest, $user ) );
+                       wfRunHooks( 'ArticleProtectComplete', array( &$this, &$user, $limit, $reason ) );
+               } else { // Protection of non-existing page (also known as "title protection")
+                       // Cascade protection is meaningless in this case
+                       $cascade = false;
+
+                       if ( $limit['create'] != '' ) {
+                               $dbw->replace( 'protected_titles',
+                                       array( array( 'pt_namespace', 'pt_title' ) ),
+                                       array(
+                                               'pt_namespace' => $this->mTitle->getNamespace(),
+                                               'pt_title' => $this->mTitle->getDBkey(),
+                                               'pt_create_perm' => $limit['create'],
+                                               'pt_timestamp' => $dbw->timestamp(),
+                                               'pt_expiry' => $dbw->encodeExpiry( $expiry['create'] ),
+                                               'pt_user' => $user->getId(),
+                                               'pt_reason' => $reason,
+                                       ), __METHOD__
+                               );
+                       } else {
+                               $dbw->delete( 'protected_titles',
+                                       array(
+                                               'pt_namespace' => $this->mTitle->getNamespace(),
+                                               'pt_title' => $this->mTitle->getDBkey()
+                                       ), __METHOD__
+                               );
+                       }
+               }
+
+               $this->mTitle->flushRestrictions();
+               InfoAction::invalidateCache( $this->mTitle );
+
+               if ( $logAction == 'unprotect' ) {
+                       $params = array();
+               } else {
+                       $protectDescriptionLog = $this->protectDescriptionLog( $limit, $expiry );
+                       $params = array( $protectDescriptionLog, $cascade ? 'cascade' : '' );
+               }
+
+               // Update the protection log
+               $log = new LogPage( 'protect' );
+               $logId = $log->addEntry( $logAction, $this->mTitle, $reason, $params, $user );
+               if ( $logRelationsField !== null && count( $logRelationsValues ) ) {
+                       $log->addRelations( $logRelationsField, $logRelationsValues, $logId );
+               }
+
+               return Status::newGood();
+       }
+
+       /**
+        * Insert a new null revision for this page.
+        *
+        * @param string $revCommentMsg Comment message key for the revision
+        * @param array $limit Set of restriction keys
+        * @param array $expiry Per restriction type expiration
+        * @param int $cascade Set to false if cascading protection isn't allowed.
+        * @param string $reason
+        * @param User|null $user
+        * @return Revision|null Null on error
+        */
+       public function insertProtectNullRevision( $revCommentMsg, array $limit,
+               array $expiry, $cascade, $reason, $user = null
+       ) {
+               global $wgContLang;
+               $dbw = wfGetDB( DB_MASTER );
+
+               // Prepare a null revision to be added to the history
+               $editComment = $wgContLang->ucfirst(
+                       wfMessage(
+                               $revCommentMsg,
+                               $this->mTitle->getPrefixedText()
+                       )->inContentLanguage()->text()
+               );
+               if ( $reason ) {
+                       $editComment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $reason;
+               }
+               $protectDescription = $this->protectDescription( $limit, $expiry );
+               if ( $protectDescription ) {
+                       $editComment .= wfMessage( 'word-separator' )->inContentLanguage()->text();
+                       $editComment .= wfMessage( 'parentheses' )->params( $protectDescription )
+                               ->inContentLanguage()->text();
+               }
+               if ( $cascade ) {
+                       $editComment .= wfMessage( 'word-separator' )->inContentLanguage()->text();
+                       $editComment .= wfMessage( 'brackets' )->params(
+                               wfMessage( 'protect-summary-cascade' )->inContentLanguage()->text()
+                       )->inContentLanguage()->text();
+               }
+
+               $nullRev = Revision::newNullRevision( $dbw, $this->getId(), $editComment, true, $user );
+               if ( $nullRev ) {
+                       $nullRev->insertOn( $dbw );
+
+                       // Update page record and touch page
+                       $oldLatest = $nullRev->getParentId();
+                       $this->updateRevisionOn( $dbw, $nullRev, $oldLatest );
+               }
+
+               return $nullRev;
+       }
+
+       /**
+        * @param string $expiry 14-char timestamp or "infinity", or false if the input was invalid
+        * @return string
+        */
+       protected function formatExpiry( $expiry ) {
+               global $wgContLang;
+               $dbr = wfGetDB( DB_SLAVE );
+
+               $encodedExpiry = $dbr->encodeExpiry( $expiry );
+               if ( $encodedExpiry != 'infinity' ) {
+                       return wfMessage(
+                               'protect-expiring',
+                               $wgContLang->timeanddate( $expiry, false, false ),
+                               $wgContLang->date( $expiry, false, false ),
+                               $wgContLang->time( $expiry, false, false )
+                       )->inContentLanguage()->text();
+               } else {
+                       return wfMessage( 'protect-expiry-indefinite' )
+                               ->inContentLanguage()->text();
+               }
+       }
+
+       /**
+        * Builds the description to serve as comment for the edit.
+        *
+        * @param array $limit Set of restriction keys
+        * @param array $expiry Per restriction type expiration
+        * @return string
+        */
+       public function protectDescription( array $limit, array $expiry ) {
+               $protectDescription = '';
+
+               foreach ( array_filter( $limit ) as $action => $restrictions ) {
+                       # $action is one of $wgRestrictionTypes = array( 'create', 'edit', 'move', 'upload' ).
+                       # All possible message keys are listed here for easier grepping:
+                       # * restriction-create
+                       # * restriction-edit
+                       # * restriction-move
+                       # * restriction-upload
+                       $actionText = wfMessage( 'restriction-' . $action )->inContentLanguage()->text();
+                       # $restrictions is one of $wgRestrictionLevels = array( '', 'autoconfirmed', 'sysop' ),
+                       # with '' filtered out. All possible message keys are listed below:
+                       # * protect-level-autoconfirmed
+                       # * protect-level-sysop
+                       $restrictionsText = wfMessage( 'protect-level-' . $restrictions )->inContentLanguage()->text();
+
+                       $expiryText = $this->formatExpiry( $expiry[$action] );
+
+                       if ( $protectDescription !== '' ) {
+                               $protectDescription .= wfMessage( 'word-separator' )->inContentLanguage()->text();
+                       }
+                       $protectDescription .= wfMessage( 'protect-summary-desc' )
+                               ->params( $actionText, $restrictionsText, $expiryText )
+                               ->inContentLanguage()->text();
+               }
+
+               return $protectDescription;
+       }
+
+       /**
+        * Builds the description to serve as comment for the log entry.
+        *
+        * Some bots may parse IRC lines, which are generated from log entries which contain plain
+        * protect description text. Keep them in old format to avoid breaking compatibility.
+        * TODO: Fix protection log to store structured description and format it on-the-fly.
+        *
+        * @param array $limit Set of restriction keys
+        * @param array $expiry Per restriction type expiration
+        * @return string
+        */
+       public function protectDescriptionLog( array $limit, array $expiry ) {
+               global $wgContLang;
+
+               $protectDescriptionLog = '';
+
+               foreach ( array_filter( $limit ) as $action => $restrictions ) {
+                       $expiryText = $this->formatExpiry( $expiry[$action] );
+                       $protectDescriptionLog .= $wgContLang->getDirMark() . "[$action=$restrictions] ($expiryText)";
+               }
+
+               return trim( $protectDescriptionLog );
+       }
+
+       /**
+        * Take an array of page restrictions and flatten it to a string
+        * suitable for insertion into the page_restrictions field.
+        *
+        * @param string[] $limit
+        *
+        * @throws MWException
+        * @return string
+        */
+       protected static function flattenRestrictions( $limit ) {
+               if ( !is_array( $limit ) ) {
+                       throw new MWException( 'WikiPage::flattenRestrictions given non-array restriction set' );
+               }
+
+               $bits = array();
+               ksort( $limit );
+
+               foreach ( array_filter( $limit ) as $action => $restrictions ) {
+                       $bits[] = "$action=$restrictions";
+               }
+
+               return implode( ':', $bits );
+       }
+
+       /**
+        * Same as doDeleteArticleReal(), but returns a simple boolean. This is kept around for
+        * backwards compatibility, if you care about error reporting you should use
+        * doDeleteArticleReal() instead.
+        *
+        * Deletes the article with database consistency, writes logs, purges caches
+        *
+        * @param string $reason Delete reason for deletion log
+        * @param bool $suppress Suppress all revisions and log the deletion in
+        *        the suppression log instead of the deletion log
+        * @param int $id Article ID
+        * @param bool $commit Defaults to true, triggers transaction end
+        * @param array &$error Array of errors to append to
+        * @param User $user The deleting user
+        * @return bool true if successful
+        */
+       public function doDeleteArticle(
+               $reason, $suppress = false, $id = 0, $commit = true, &$error = '', User $user = null
+       ) {
+               $status = $this->doDeleteArticleReal( $reason, $suppress, $id, $commit, $error, $user );
+               return $status->isGood();
+       }
+
+       /**
+        * Back-end article deletion
+        * Deletes the article with database consistency, writes logs, purges caches
+        *
+        * @since 1.19
+        *
+        * @param string $reason Delete reason for deletion log
+        * @param bool $suppress Suppress all revisions and log the deletion in
+        *   the suppression log instead of the deletion log
+        * @param int $id Article ID
+        * @param bool $commit Defaults to true, triggers transaction end
+        * @param array &$error Array of errors to append to
+        * @param User $user The deleting user
+        * @return Status Status object; if successful, $status->value is the log_id of the
+        *   deletion log entry. If the page couldn't be deleted because it wasn't
+        *   found, $status is a non-fatal 'cannotdelete' error
+        */
+       public function doDeleteArticleReal(
+               $reason, $suppress = false, $id = 0, $commit = true, &$error = '', User $user = null
+       ) {
+               global $wgUser, $wgContentHandlerUseDB;
+
+               wfDebug( __METHOD__ . "\n" );
+
+               $status = Status::newGood();
+
+               if ( $this->mTitle->getDBkey() === '' ) {
+                       $status->error( 'cannotdelete', wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
+                       return $status;
+               }
+
+               $user = is_null( $user ) ? $wgUser : $user;
+               if ( ! wfRunHooks( 'ArticleDelete', array( &$this, &$user, &$reason, &$error, &$status ) ) ) {
+                       if ( $status->isOK() ) {
+                               // Hook aborted but didn't set a fatal status
+                               $status->fatal( 'delete-hook-aborted' );
+                       }
+                       return $status;
+               }
+
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->begin( __METHOD__ );
+
+               if ( $id == 0 ) {
+                       $this->loadPageData( 'forupdate' );
+                       $id = $this->getID();
+                       if ( $id == 0 ) {
+                               $dbw->rollback( __METHOD__ );
+                               $status->error( 'cannotdelete', wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
+                               return $status;
+                       }
+               }
+
+               // we need to remember the old content so we can use it to generate all deletion updates.
+               $content = $this->getContent( Revision::RAW );
+
+               // Bitfields to further suppress the content
+               if ( $suppress ) {
+                       $bitfield = 0;
+                       // This should be 15...
+                       $bitfield |= Revision::DELETED_TEXT;
+                       $bitfield |= Revision::DELETED_COMMENT;
+                       $bitfield |= Revision::DELETED_USER;
+                       $bitfield |= Revision::DELETED_RESTRICTED;
+               } else {
+                       $bitfield = 'rev_deleted';
+               }
+
+               // For now, shunt the revision data into the archive table.
+               // Text is *not* removed from the text table; bulk storage
+               // is left intact to avoid breaking block-compression or
+               // immutable storage schemes.
+               //
+               // For backwards compatibility, note that some older archive
+               // table entries will have ar_text and ar_flags fields still.
+               //
+               // 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(
+                               'page_id' => $id,
+                               'page_id = rev_page'
+                       ), __METHOD__
+               );
+
+               // Now that it's safely backed up, delete it
+               $dbw->delete( 'page', array( 'page_id' => $id ), __METHOD__ );
+               $ok = ( $dbw->affectedRows() > 0 ); // $id could be laggy
+
+               if ( !$ok ) {
+                       $dbw->rollback( __METHOD__ );
+                       $status->error( 'cannotdelete', wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
+                       return $status;
+               }
+
+               if ( !$dbw->cascadingDeletes() ) {
+                       $dbw->delete( 'revision', array( 'rev_page' => $id ), __METHOD__ );
+               }
+
+               // Clone the title, so we have the information we need when we log
+               $logTitle = clone $this->mTitle;
+
+               $this->doDeleteUpdates( $id, $content );
+
+               // Log the deletion, if the page was suppressed, log it at Oversight instead
+               $logtype = $suppress ? 'suppress' : 'delete';
+
+               $logEntry = new ManualLogEntry( $logtype, 'delete' );
+               $logEntry->setPerformer( $user );
+               $logEntry->setTarget( $logTitle );
+               $logEntry->setComment( $reason );
+               $logid = $logEntry->insert();
+
+               $dbw->onTransactionPreCommitOrIdle( function() use ( $dbw, $logEntry, $logid ) {
+                       // Bug 56776: avoid deadlocks (especially from FileDeleteForm)
+                       $logEntry->publish( $logid );
+               } );
+
+               if ( $commit ) {
+                       $dbw->commit( __METHOD__ );
+               }
+
+               wfRunHooks( 'ArticleDeleteComplete', array( &$this, &$user, $reason, $id, $content, $logEntry ) );
+               $status->value = $logid;
+               return $status;
+       }
+
+       /**
+        * Do some database updates after deletion
+        *
+        * @param int $id page_id value of the page being deleted
+        * @param Content $content Optional page content to be used when determining
+        *   the required updates. This may be needed because $this->getContent()
+        *   may already return null when the page proper was deleted.
+        */
+       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( $content );
+               DataUpdate::runUpdates( $updates );
+
+               // Reparse any pages transcluding this page
+               LinksUpdate::queueRecursiveJobsForTable( $this->mTitle, 'templatelinks' );
+
+               // Reparse any pages including this image
+               if ( $this->mTitle->getNamespace() == NS_FILE ) {
+                       LinksUpdate::queueRecursiveJobsForTable( $this->mTitle, 'imagelinks' );
+               }
+
+               // Clear caches
+               WikiPage::onArticleDelete( $this->mTitle );
+
+               // Reset this object and the Title object
+               $this->loadFromRow( false, self::READ_LATEST );
+
+               // Search engine
+               DeferredUpdates::addUpdate( new SearchUpdate( $id, $this->mTitle ) );
+       }
+
+       /**
+        * Roll back the most recent consecutive set of edits to a page
+        * from the same user; fails if there are no eligible edits to
+        * roll back to, e.g. user is the sole contributor. This function
+        * performs permissions checks on $user, then calls commitRollback()
+        * to do the dirty work
+        *
+        * @todo Separate the business/permission stuff out from backend code
+        *
+        * @param string $fromP Name of the user whose edits to rollback.
+        * @param string $summary Custom summary. Set to default summary if empty.
+        * @param string $token Rollback token.
+        * @param bool $bot If true, mark all reverted edits as bot.
+        *
+        * @param array $resultDetails contains result-specific array of additional values
+        *    'alreadyrolled' : 'current' (rev)
+        *    success        : 'summary' (str), 'current' (rev), 'target' (rev)
+        *
+        * @param User $user The user performing the rollback
+        * @return array Array of errors, each error formatted as
+        *   array(messagekey, param1, param2, ...).
+        * On success, the array is empty.  This array can also be passed to
+        * OutputPage::showPermissionsErrorPage().
+        */
+       public function doRollback(
+               $fromP, $summary, $token, $bot, &$resultDetails, User $user
+       ) {
+               $resultDetails = null;
+
+               // Check permissions
+               $editErrors = $this->mTitle->getUserPermissionsErrors( 'edit', $user );
+               $rollbackErrors = $this->mTitle->getUserPermissionsErrors( 'rollback', $user );
+               $errors = array_merge( $editErrors, wfArrayDiff2( $rollbackErrors, $editErrors ) );
+
+               if ( !$user->matchEditToken( $token, array( $this->mTitle->getPrefixedText(), $fromP ) ) ) {
+                       $errors[] = array( 'sessionfailure' );
+               }
+
+               if ( $user->pingLimiter( 'rollback' ) || $user->pingLimiter() ) {
+                       $errors[] = array( 'actionthrottledtext' );
+               }
+
+               // If there were errors, bail out now
+               if ( !empty( $errors ) ) {
+                       return $errors;
+               }
+
+               return $this->commitRollback( $fromP, $summary, $bot, $resultDetails, $user );
+       }
+
+       /**
+        * Backend implementation of doRollback(), please refer there for parameter
+        * and return value documentation
+        *
+        * NOTE: This function does NOT check ANY permissions, it just commits the
+        * rollback to the DB. Therefore, you should only call this function direct-
+        * ly if you want to use custom permissions checks. If you don't, use
+        * doRollback() instead.
+        * @param string $fromP Name of the user whose edits to rollback.
+        * @param string $summary Custom summary. Set to default summary if empty.
+        * @param bool $bot If true, mark all reverted edits as bot.
+        *
+        * @param array $resultDetails Contains result-specific array of additional values
+        * @param User $guser The user performing the rollback
+        * @return array
+        */
+       public function commitRollback( $fromP, $summary, $bot, &$resultDetails, User $guser ) {
+               global $wgUseRCPatrol, $wgContLang;
+
+               $dbw = wfGetDB( DB_MASTER );
+
+               if ( wfReadOnly() ) {
+                       return array( array( 'readonlytext' ) );
+               }
+
+               // Get the last editor
+               $current = $this->getRevision();
+               if ( is_null( $current ) ) {
+                       // Something wrong... no page?
+                       return array( array( 'notanarticle' ) );
+               }
+
+               $from = str_replace( '_', ' ', $fromP );
+               // User name given should match up with the top revision.
+               // If the user was deleted then $from should be empty.
+               if ( $from != $current->getUserText() ) {
+                       $resultDetails = array( 'current' => $current );
+                       return array( array( 'alreadyrolled',
+                               htmlspecialchars( $this->mTitle->getPrefixedText() ),
+                               htmlspecialchars( $fromP ),
+                               htmlspecialchars( $current->getUserText() )
+                       ) );
+               }
+
+               // Get the last edit not by this guy...
+               // Note: these may not be public values
+               $user = intval( $current->getRawUser() );
+               $user_text = $dbw->addQuotes( $current->getRawUserText() );
+               $s = $dbw->selectRow( 'revision',
+                       array( 'rev_id', 'rev_timestamp', 'rev_deleted' ),
+                       array( 'rev_page' => $current->getPage(),
+                               "rev_user != {$user} OR rev_user_text != {$user_text}"
+                       ), __METHOD__,
+                       array( 'USE INDEX' => 'page_timestamp',
+                               'ORDER BY' => 'rev_timestamp DESC' )
+                       );
+               if ( $s === false ) {
+                       // No one else ever edited this page
+                       return array( array( 'cantrollback' ) );
+               } elseif ( $s->rev_deleted & Revision::DELETED_TEXT
+                       || $s->rev_deleted & Revision::DELETED_USER
+               ) {
+                       // Only admins can see this text
+                       return array( array( 'notvisiblerev' ) );
+               }
+
+               // Set patrolling and bot flag on the edits, which gets rollbacked.
+               // This is done before the rollback edit to have patrolling also on failure (bug 62157).
+               $set = array();
+               if ( $bot && $guser->isAllowed( 'markbotedits' ) ) {
+                       // Mark all reverted edits as bot
+                       $set['rc_bot'] = 1;
+               }
+
+               if ( $wgUseRCPatrol ) {
+                       // Mark all reverted edits as patrolled
+                       $set['rc_patrolled'] = 1;
+               }
+
+               if ( count( $set ) ) {
+                       $dbw->update( 'recentchanges', $set,
+                               array( /* WHERE */
+                                       'rc_cur_id' => $current->getPage(),
+                                       'rc_user_text' => $current->getUserText(),
+                                       'rc_timestamp > ' . $dbw->addQuotes( $s->rev_timestamp ),
+                               ), __METHOD__
+                       );
+               }
+
+               // Generate the edit summary if necessary
+               $target = Revision::newFromId( $s->rev_id );
+               if ( empty( $summary ) ) {
+                       if ( $from == '' ) { // no public user name
+                               $summary = wfMessage( 'revertpage-nouser' );
+                       } else {
+                               $summary = wfMessage( 'revertpage' );
+                       }
+               }
+
+               // Allow the custom summary to use the same args as the default message
+               $args = array(
+                       $target->getUserText(), $from, $s->rev_id,
+                       $wgContLang->timeanddate( wfTimestamp( TS_MW, $s->rev_timestamp ) ),
+                       $current->getId(), $wgContLang->timeanddate( $current->getTimestamp() )
+               );
+               if ( $summary instanceof Message ) {
+                       $summary = $summary->params( $args )->inContentLanguage()->text();
+               } else {
+                       $summary = wfMsgReplaceArgs( $summary, $args );
+               }
+
+               // Trim spaces on user supplied text
+               $summary = trim( $summary );
+
+               // Truncate for whole multibyte characters.
+               $summary = $wgContLang->truncate( $summary, 255 );
+
+               // Save
+               $flags = EDIT_UPDATE;
+
+               if ( $guser->isAllowed( 'minoredit' ) ) {
+                       $flags |= EDIT_MINOR;
+               }
+
+               if ( $bot && ( $guser->isAllowedAny( 'markbotedits', 'bot' ) ) ) {
+                       $flags |= EDIT_FORCE_BOT;
+               }
+
+               // Actually store the edit
+               $status = $this->doEditContent(
+                       $target->getContent(),
+                       $summary,
+                       $flags,
+                       $target->getId(),
+                       $guser
+               );
+
+               if ( !$status->isOK() ) {
+                       return $status->getErrorsArray();
+               }
+
+               // raise error, when the edit is an edit without a new version
+               if ( empty( $status->value['revision'] ) ) {
+                       $resultDetails = array( 'current' => $current );
+                       return array( array( 'alreadyrolled',
+                                       htmlspecialchars( $this->mTitle->getPrefixedText() ),
+                                       htmlspecialchars( $fromP ),
+                                       htmlspecialchars( $current->getUserText() )
+                       ) );
+               }
+
+               $revId = $status->value['revision']->getId();
+
+               wfRunHooks( 'ArticleRollbackComplete', array( $this, $guser, $target, $current ) );
+
+               $resultDetails = array(
+                       'summary' => $summary,
+                       'current' => $current,
+                       'target' => $target,
+                       'newid' => $revId
+               );
+
+               return array();
+       }
+
+       /**
+        * The onArticle*() functions are supposed to be a kind of hooks
+        * which should be called whenever any of the specified actions
+        * are done.
+        *
+        * This is a good place to put code to clear caches, for instance.
+        *
+        * This is called on page move and undelete, as well as edit
+        *
+        * @param Title $title
+        */
+       public static function onArticleCreate( $title ) {
+               // Update existence markers on article/talk tabs...
+               if ( $title->isTalkPage() ) {
+                       $other = $title->getSubjectPage();
+               } else {
+                       $other = $title->getTalkPage();
+               }
+
+               $other->invalidateCache();
+               $other->purgeSquid();
+
+               $title->touchLinks();
+               $title->purgeSquid();
+               $title->deleteTitleProtection();
+       }
+
+       /**
+        * Clears caches when article is deleted
+        *
+        * @param Title $title
+        */
+       public static function onArticleDelete( $title ) {
+               // Update existence markers on article/talk tabs...
+               if ( $title->isTalkPage() ) {
+                       $other = $title->getSubjectPage();
+               } else {
+                       $other = $title->getTalkPage();
+               }
+
+               $other->invalidateCache();
+               $other->purgeSquid();
+
+               $title->touchLinks();
+               $title->purgeSquid();
+
+               // File cache
+               HTMLFileCache::clearFileCache( $title );
+               InfoAction::invalidateCache( $title );
+
+               // Messages
+               if ( $title->getNamespace() == NS_MEDIAWIKI ) {
+                       MessageCache::singleton()->replace( $title->getDBkey(), false );
+               }
+
+               // Images
+               if ( $title->getNamespace() == NS_FILE ) {
+                       $update = new HTMLCacheUpdate( $title, 'imagelinks' );
+                       $update->doUpdate();
+               }
+
+               // User talk pages
+               if ( $title->getNamespace() == NS_USER_TALK ) {
+                       $user = User::newFromName( $title->getText(), false );
+                       if ( $user ) {
+                               $user->setNewtalk( false );
+                       }
+               }
+
+               // Image redirects
+               RepoGroup::singleton()->getLocalRepo()->invalidateImageRedirect( $title );
+       }
+
+       /**
+        * Purge caches on page update etc
+        *
+        * @param Title $title
+        * @todo Verify that $title is always a Title object (and never false or
+        *   null), add Title hint to parameter $title.
+        */
+       public static function onArticleEdit( $title ) {
+               // Invalidate caches of articles which include this page
+               DeferredUpdates::addHTMLCacheUpdate( $title, 'templatelinks' );
+
+               // Invalidate the caches of all pages which redirect here
+               DeferredUpdates::addHTMLCacheUpdate( $title, 'redirect' );
+
+               // Purge squid for this page only
+               $title->purgeSquid();
+
+               // Clear file cache for this page only
+               HTMLFileCache::clearFileCache( $title );
+               InfoAction::invalidateCache( $title );
+       }
+
+       /**#@-*/
+
+       /**
+        * Returns a list of categories this page is a member of.
+        * Results will include hidden categories
+        *
+        * @return TitleArray
+        */
+       public function getCategories() {
+               $id = $this->getId();
+               if ( $id == 0 ) {
+                       return TitleArray::newFromResult( new FakeResultWrapper( array() ) );
+               }
+
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( 'categorylinks',
+                       array( 'cl_to AS page_title, ' . NS_CATEGORY . ' AS page_namespace' ),
+                       // Have to do that since DatabaseBase::fieldNamesWithAlias treats numeric indexes
+                       // as not being aliases, and NS_CATEGORY is numeric
+                       array( 'cl_from' => $id ),
+                       __METHOD__ );
+
+               return TitleArray::newFromResult( $res );
+       }
+
+       /**
+        * Returns a list of hidden categories this page is a member of.
+        * Uses the page_props and categorylinks tables.
+        *
+        * @return array Array of Title objects
+        */
+       public function getHiddenCategories() {
+               $result = array();
+               $id = $this->getId();
+
+               if ( $id == 0 ) {
+                       return array();
+               }
+
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( array( 'categorylinks', 'page_props', 'page' ),
+                       array( 'cl_to' ),
+                       array( 'cl_from' => $id, 'pp_page=page_id', 'pp_propname' => 'hiddencat',
+                               'page_namespace' => NS_CATEGORY, 'page_title=cl_to' ),
+                       __METHOD__ );
+
+               if ( $res !== false ) {
+                       foreach ( $res as $row ) {
+                               $result[] = Title::makeTitle( NS_CATEGORY, $row->cl_to );
+                       }
+               }
+
+               return $result;
+       }
+
+       /**
+        * Return an applicable autosummary if one exists for the given edit.
+        * @param string|null $oldtext The previous text of the page.
+        * @param string|null $newtext The submitted text of the page.
+        * @param int $flags 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 ) {
+               // NOTE: stub for backwards-compatibility. assumes the given text is
+               // wikitext. will break horribly if it isn't.
+
+               ContentHandler::deprecated( __METHOD__, '1.21' );
+
+               $handler = ContentHandler::getForModelID( CONTENT_MODEL_WIKITEXT );
+               $oldContent = is_null( $oldtext ) ? null : $handler->unserializeContent( $oldtext );
+               $newContent = is_null( $newtext ) ? null : $handler->unserializeContent( $newtext );
+
+               return $handler->getAutosummary( $oldContent, $newContent, $flags );
+       }
+
+       /**
+        * Auto-generates a deletion reason
+        *
+        * @param bool &$hasHistory Whether the page has a history
+        * @return string|bool String containing deletion reason or empty string, or boolean false
+        *    if no revision occurred
+        */
+       public function getAutoDeleteReason( &$hasHistory ) {
+               return $this->getContentHandler()->getAutoDeleteReason( $this->getTitle(), $hasHistory );
+       }
+
+       /**
+        * Update all the appropriate counts in the category table, given that
+        * we've added the categories $added and deleted the categories $deleted.
+        *
+        * @param array $added The names of categories that were added
+        * @param array $deleted The names of categories that were deleted
+        */
+       public function updateCategoryCounts( array $added, array $deleted ) {
+               $that = $this;
+               $method = __METHOD__;
+               $dbw = wfGetDB( DB_MASTER );
+
+               // Do this at the end of the commit to reduce lock wait timeouts
+               $dbw->onTransactionPreCommitOrIdle(
+                       function() use ( $dbw, $that, $method, $added, $deleted ) {
+                               $ns = $that->getTitle()->getNamespace();
+
+                               $addFields = array( 'cat_pages = cat_pages + 1' );
+                               $removeFields = array( 'cat_pages = cat_pages - 1' );
+                               if ( $ns == NS_CATEGORY ) {
+                                       $addFields[] = 'cat_subcats = cat_subcats + 1';
+                                       $removeFields[] = 'cat_subcats = cat_subcats - 1';
+                               } elseif ( $ns == NS_FILE ) {
+                                       $addFields[] = 'cat_files = cat_files + 1';
+                                       $removeFields[] = 'cat_files = cat_files - 1';
+                               }
+
+                               if ( count( $added ) ) {
+                                       $insertRows = array();
+                                       foreach ( $added as $cat ) {
+                                               $insertRows[] = array(
+                                                       'cat_title'   => $cat,
+                                                       'cat_pages'   => 1,
+                                                       'cat_subcats' => ( $ns == NS_CATEGORY ) ? 1 : 0,
+                                                       'cat_files'   => ( $ns == NS_FILE ) ? 1 : 0,
+                                               );
+                                       }
+                                       $dbw->upsert(
+                                               'category',
+                                               $insertRows,
+                                               array( 'cat_title' ),
+                                               $addFields,
+                                               $method
+                                       );
+                               }
+
+                               if ( count( $deleted ) ) {
+                                       $dbw->update(
+                                               'category',
+                                               $removeFields,
+                                               array( 'cat_title' => $deleted ),
+                                               $method
+                                       );
+                               }
+
+                               foreach ( $added as $catName ) {
+                                       $cat = Category::newFromName( $catName );
+                                       wfRunHooks( 'CategoryAfterPageAdded', array( $cat, $that ) );
+                               }
+
+                               foreach ( $deleted as $catName ) {
+                                       $cat = Category::newFromName( $catName );
+                                       wfRunHooks( 'CategoryAfterPageRemoved', array( $cat, $that ) );
+                               }
+                       }
+               );
+       }
+
+       /**
+        * Updates cascading protections
+        *
+        * @param ParserOutput $parserOutput ParserOutput object for the current version
+        */
+       public function doCascadeProtectionUpdates( ParserOutput $parserOutput ) {
+               if ( wfReadOnly() || !$this->mTitle->areRestrictionsCascading() ) {
+                       return;
+               }
+
+               // templatelinks or imagelinks tables may have become out of sync,
+               // especially if using variable-based transclusions.
+               // For paranoia, check if things have changed and if
+               // so apply updates to the database. This will ensure
+               // that cascaded protections apply as soon as the changes
+               // are visible.
+
+               // Get templates from templatelinks and images from imagelinks
+               $id = $this->getId();
+
+               $dbLinks = array();
+
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( array( 'templatelinks' ),
+                       array( 'tl_namespace', 'tl_title' ),
+                       array( 'tl_from' => $id ),
+                       __METHOD__
+               );
+
+               foreach ( $res as $row ) {
+                       $dbLinks["{$row->tl_namespace}:{$row->tl_title}"] = true;
+               }
+
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( array( 'imagelinks' ),
+                       array( 'il_to' ),
+                       array( 'il_from' => $id ),
+                       __METHOD__
+               );
+
+               foreach ( $res as $row ) {
+                       $dbLinks[NS_FILE . ":{$row->il_to}"] = true;
+               }
+
+               // Get templates and images from parser output.
+               $poLinks = array();
+               foreach ( $parserOutput->getTemplates() as $ns => $templates ) {
+                       foreach ( $templates as $dbk => $id ) {
+                               $poLinks["$ns:$dbk"] = true;
+                       }
+               }
+               foreach ( $parserOutput->getImages() as $dbk => $id ) {
+                       $poLinks[NS_FILE . ":$dbk"] = true;
+               }
+
+               // Get the diff
+               $links_diff = array_diff_key( $poLinks, $dbLinks );
+
+               if ( count( $links_diff ) > 0 ) {
+                       // Whee, link updates time.
+                       // Note: we are only interested in links here. We don't need to get
+                       // other DataUpdate items from the parser output.
+                       $u = new LinksUpdate( $this->mTitle, $parserOutput, false );
+                       $u->doUpdate();
+               }
+       }
+
+       /**
+        * Return a list of templates used by this article.
+        * Uses the templatelinks table
+        *
+        * @deprecated since 1.19; use Title::getTemplateLinksFrom()
+        * @return array Array of Title objects
+        */
+       public function getUsedTemplates() {
+               return $this->mTitle->getTemplateLinksFrom();
+       }
+
+       /**
+        * This function is called right before saving the wikitext,
+        * so we can do things like signatures and links-in-context.
+        *
+        * @deprecated since 1.19; use Parser::preSaveTransform() instead
+        * @param string $text Article contents
+        * @param User $user User doing the edit
+        * @param ParserOptions $popts Parser options, default options for
+        *   the user loaded if null given
+        * @return string Article contents with altered wikitext markup (signatures
+        *      converted, {{subst:}}, templates, etc.)
+        */
+       public function preSaveTransform( $text, User $user = null, ParserOptions $popts = null ) {
+               global $wgParser, $wgUser;
+
+               wfDeprecated( __METHOD__, '1.19' );
+
+               $user = is_null( $user ) ? $wgUser : $user;
+
+               if ( $popts === null ) {
+                       $popts = ParserOptions::newFromUser( $user );
+               }
+
+               return $wgParser->preSaveTransform( $text, $this->mTitle, $user, $popts );
+       }
+
+       /**
+        * Check whether the number of revisions of this page surpasses $wgDeleteRevisionsLimit
+        *
+        * @deprecated since 1.19; use Title::isBigDeletion() instead.
+        * @return bool
+        */
+       public function isBigDeletion() {
+               wfDeprecated( __METHOD__, '1.19' );
+               return $this->mTitle->isBigDeletion();
+       }
+
+       /**
+        * Get the  approximate revision count of this page.
+        *
+        * @deprecated since 1.19; use Title::estimateRevisionCount() instead.
+        * @return int
+        */
+       public function estimateRevisionCount() {
+               wfDeprecated( __METHOD__, '1.19' );
+               return $this->mTitle->estimateRevisionCount();
+       }
+
+       /**
+        * Update the article's restriction field, and leave a log entry.
+        *
+        * @deprecated since 1.19
+        * @param array $limit Set of restriction keys
+        * @param string $reason
+        * @param int &$cascade Set to false if cascading protection isn't allowed.
+        * @param array $expiry Per restriction type expiration
+        * @param User $user The user updating the restrictions
+        * @return bool true on success
+        */
+       public function updateRestrictions(
+               $limit = array(), $reason = '', &$cascade = 0, $expiry = array(), User $user = null
+       ) {
+               global $wgUser;
+
+               $user = is_null( $user ) ? $wgUser : $user;
+
+               return $this->doUpdateRestrictions( $limit, $expiry, $cascade, $reason, $user )->isOK();
+       }
+
+       /**
+        * 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;
+       }
+}
index d2a20df..61fd9cc 100644 (file)
@@ -167,7 +167,6 @@ class Parser {
        var $mLinkID;
        var $mIncludeSizes, $mPPNodeCount, $mGeneratedPPNodeCount, $mHighestExpansionDepth;
        var $mDefaultSort;
-       var $mTplExpandCache; # empty-frame expansion cache
        var $mTplRedirCache, $mTplDomCache, $mHeadings, $mDoubleUnderscores;
        var $mExpensiveFunctionCount; # number of expensive parser function calls
        var $mShowToc, $mForceTocPosition;
@@ -321,7 +320,7 @@ class Parser {
                $this->mStripState = new StripState( $this->mUniqPrefix );
 
                # Clear these on every parse, bug 4549
-               $this->mTplExpandCache = $this->mTplRedirCache = $this->mTplDomCache = array();
+               $this->mTplRedirCache = $this->mTplDomCache = array();
 
                $this->mShowToc = true;
                $this->mForceTocPosition = false;
@@ -618,13 +617,15 @@ class Parser {
        /**
         * Expand templates and variables in the text, producing valid, static wikitext.
         * Also removes comments.
+        * Do not call this function recursively.
         * @param string $text
         * @param Title $title
         * @param ParserOptions $options
         * @param int|null $revid
+        * @param bool|PPFrame $frame
         * @return mixed|string
         */
-       function preprocess( $text, Title $title = null, ParserOptions $options, $revid = null ) {
+       function preprocess( $text, Title $title = null, ParserOptions $options, $revid = null, $frame = false ) {
                wfProfileIn( __METHOD__ );
                $magicScopeVariable = $this->lock();
                $this->startParse( $title, $options, self::OT_PREPROCESS, true );
@@ -633,7 +634,7 @@ class Parser {
                }
                wfRunHooks( 'ParserBeforeStrip', array( &$this, &$text, &$this->mStripState ) );
                wfRunHooks( 'ParserAfterStrip', array( &$this, &$text, &$this->mStripState ) );
-               $text = $this->replaceVariables( $text );
+               $text = $this->replaceVariables( $text, $frame );
                $text = $this->mStripState->unstripBoth( $text );
                wfProfileOut( __METHOD__ );
                return $text;
@@ -1875,6 +1876,7 @@ class Parser {
         * @private
         */
        function replaceInternalLinks2( &$s ) {
+               global $wgExtraInterlanguageLinkPrefixes;
                wfProfileIn( __METHOD__ );
 
                wfProfileIn( __METHOD__ . '-setup' );
@@ -2095,11 +2097,12 @@ class Parser {
                        if ( $noforce ) {
                                # Interwikis
                                wfProfileIn( __METHOD__ . "-interwiki" );
-                               if ( $iw && $this->mOptions->getInterwikiMagic()
-                                       && $nottalk && Language::fetchLanguageName( $iw, null, 'mw' )
+                               if (
+                                       $iw && $this->mOptions->getInterwikiMagic() && $nottalk && (
+                                               Language::fetchLanguageName( $iw, null, 'mw' ) ||
+                                               in_array( $iw, $wgExtraInterlanguageLinkPrefixes )
+                                       )
                                ) {
-                                       // 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;
@@ -2327,13 +2330,13 @@ class Parser {
                $result = $this->closeParagraph();
 
                if ( '*' === $char ) {
-                       $result .= "<ul>\n<li>";
+                       $result .= "<ul><li>";
                } elseif ( '#' === $char ) {
-                       $result .= "<ol>\n<li>";
+                       $result .= "<ol><li>";
                } elseif ( ':' === $char ) {
-                       $result .= "<dl>\n<dd>";
+                       $result .= "<dl><dd>";
                } elseif ( ';' === $char ) {
-                       $result .= "<dl>\n<dt>";
+                       $result .= "<dl><dt>";
                        $this->mDTopen = true;
                } else {
                        $result = '<!-- ERR 1 -->';
@@ -2377,20 +2380,20 @@ class Parser {
         */
        function closeList( $char ) {
                if ( '*' === $char ) {
-                       $text = "</li>\n</ul>";
+                       $text = "</li></ul>";
                } elseif ( '#' === $char ) {
-                       $text = "</li>\n</ol>";
+                       $text = "</li></ol>";
                } elseif ( ':' === $char ) {
                        if ( $this->mDTopen ) {
                                $this->mDTopen = false;
-                               $text = "</dt>\n</dl>";
+                               $text = "</dt></dl>";
                        } else {
-                               $text = "</dd>\n</dl>";
+                               $text = "</dd></dl>";
                        }
                } else {
                        return '<!-- ERR 3 -->';
                }
-               return $text . "\n";
+               return $text;
        }
        /**#@-*/
 
@@ -2488,6 +2491,9 @@ class Parser {
                                }
 
                                # Open prefixes where appropriate.
+                               if (  $lastPrefix && $prefixLength > $commonPrefixLength ) {
+                                       $output .= "\n";
+                               }
                                while ( $prefixLength > $commonPrefixLength ) {
                                        $char = substr( $prefix, $commonPrefixLength, 1 );
                                        $output .= $this->openList( $char );
@@ -2501,6 +2507,9 @@ class Parser {
                                        }
                                        ++$commonPrefixLength;
                                }
+                               if ( !$prefixLength && $lastPrefix ) {
+                                       $output .= "\n";
+                               }
                                $lastPrefix = $prefix2;
                        }
 
@@ -2582,12 +2591,18 @@ class Parser {
                                $this->mInPre = false;
                        }
                        if ( $paragraphStack === false ) {
-                               $output .= $t . "\n";
+                               $output .= $t;
+                               if ( $prefixLength === 0 ) {
+                                       $output .= "\n";
+                               }
                        }
                }
                while ( $prefixLength ) {
                        $output .= $this->closeList( $prefix2[$prefixLength - 1] );
                        --$prefixLength;
+                       if ( !$prefixLength ) {
+                               $output .= "\n";
+                       }
                }
                if ( $this->mLastSection != '' ) {
                        $output .= '</' . $this->mLastSection . '>';
@@ -3562,12 +3577,7 @@ class Parser {
                                $text = $newFrame->expand( $text, PPFrame::RECOVER_ORIG );
                        } elseif ( $titleText !== false && $newFrame->isEmpty() ) {
                                # Expansion is eligible for the empty-frame cache
-                               if ( isset( $this->mTplExpandCache[$titleText] ) ) {
-                                       $text = $this->mTplExpandCache[$titleText];
-                               } else {
-                                       $text = $newFrame->expand( $text );
-                                       $this->mTplExpandCache[$titleText] = $text;
-                               }
+                               $text = $newFrame->cachedExpand( $titleText, $text );
                        } else {
                                # Uncached expansion
                                $text = $newFrame->expand( $text );
@@ -5329,7 +5339,7 @@ class Parser {
                                                        } else {
                                                                $localLinkTitle = Title::newFromText( $linkValue );
                                                                if ( $localLinkTitle !== null ) {
-                                                                       $link = $localLinkTitle->getLocalURL();
+                                                                       $link = $localLinkTitle->getLinkURL();
                                                                }
                                                        }
                                                        break;
@@ -5727,7 +5737,7 @@ class Parser {
         * External callers should use the getSection and replaceSection methods.
         *
         * @param string $text Page wikitext
-        * @param string $section A section identifier string of the form:
+        * @param string|number $sectionId A section identifier string of the form:
         *   "<flag1> - <flag2> - ... - <section number>"
         *
         * Currently the only recognised flag is "T", which means the target section number
@@ -5749,7 +5759,7 @@ class Parser {
         * @return string For "get", the extracted section text.
         *   for "replace", the whole page with the section replaced.
         */
-       private function extractSections( $text, $section, $mode, $newText = '' ) {
+       private function extractSections( $text, $sectionId, $mode, $newText = '' ) {
                global $wgTitle; # not generally used but removes an ugly failure mode
 
                $magicScopeVariable = $this->lock();
@@ -5759,7 +5769,7 @@ class Parser {
 
                # Process section extraction flags
                $flags = 0;
-               $sectionParts = explode( '-', $section );
+               $sectionParts = explode( '-', $sectionId );
                $sectionIndex = array_pop( $sectionParts );
                foreach ( $sectionParts as $part ) {
                        if ( $part === 'T' ) {
@@ -5868,12 +5878,14 @@ class Parser {
         * If a section contains subsections, these are also returned.
         *
         * @param string $text Text to look in
-        * @param string $section Section identifier
-        * @param string $deftext Default to return if section is not found
+        * @param string|number $sectionId Section identifier as a number or string
+        * (e.g. 0, 1 or 'T-1').
+        * @param string $defaultText Default to return if section is not found
+        *
         * @return string Text of the requested section
         */
-       public function getSection( $text, $section, $deftext = '' ) {
-               return $this->extractSections( $text, $section, "get", $deftext );
+       public function getSection( $text, $sectionId, $defaultText = '' ) {
+               return $this->extractSections( $text, $sectionId, 'get', $defaultText );
        }
 
        /**
@@ -5881,13 +5893,15 @@ class Parser {
         * specified by $section has been replaced with $text. If the target
         * section does not exist, $oldtext is returned unchanged.
         *
-        * @param string $oldtext Former text of the article
-        * @param int $section Section identifier
-        * @param string $text Replacing text
+        * @param string $oldText Former text of the article
+        * @param string|number $sectionId Section identifier as a number or string
+        * (e.g. 0, 1 or 'T-1').
+        * @param string $newText Replacing text
+        *
         * @return string Modified text
         */
-       public function replaceSection( $oldtext, $section, $text ) {
-               return $this->extractSections( $oldtext, $section, "replace", $text );
+       public function replaceSection( $oldText, $sectionId, $newText ) {
+               return $this->extractSections( $oldText, $sectionId, 'replace', $newText );
        }
 
        /**
diff --git a/includes/parser/ParserDiffTest.php b/includes/parser/ParserDiffTest.php
new file mode 100644 (file)
index 0000000..2db0597
--- /dev/null
@@ -0,0 +1,143 @@
+<?php
+/**
+ * Fake parser that output the difference of two different parsers
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Parser
+ */
+
+/**
+ * @ingroup Parser
+ */
+class ParserDiffTest
+{
+       var $parsers, $conf;
+       var $shortOutput = false;
+
+       var $dtUniqPrefix;
+
+       function __construct( $conf ) {
+               if ( !isset( $conf['parsers'] ) ) {
+                       throw new MWException( __METHOD__ . ': no parsers specified' );
+               }
+               $this->conf = $conf;
+       }
+
+       function init() {
+               if ( !is_null( $this->parsers ) ) {
+                       return;
+               }
+
+               global $wgHooks;
+               static $doneHook = false;
+               if ( !$doneHook ) {
+                       $doneHook = true;
+                       $wgHooks['ParserClearState'][] = array( $this, 'onClearState' );
+               }
+               if ( isset( $this->conf['shortOutput'] ) ) {
+                       $this->shortOutput = $this->conf['shortOutput'];
+               }
+
+               foreach ( $this->conf['parsers'] as $i => $parserConf ) {
+                       if ( !is_array( $parserConf ) ) {
+                               $class = $parserConf;
+                               $parserConf = array( 'class' => $parserConf );
+                       } else {
+                               $class = $parserConf['class'];
+                       }
+                       $this->parsers[$i] = new $class( $parserConf );
+               }
+       }
+
+       function __call( $name, $args ) {
+               $this->init();
+               $results = array();
+               $mismatch = false;
+               $lastResult = null;
+               $first = true;
+               foreach ( $this->parsers as $i => $parser ) {
+                       $currentResult = call_user_func_array( array( &$this->parsers[$i], $name ), $args );
+                       if ( $first ) {
+                               $first = false;
+                       } else {
+                               if ( is_object( $lastResult ) ) {
+                                       if ( $lastResult != $currentResult ) {
+                                               $mismatch = true;
+                                       }
+                               } else {
+                                       if ( $lastResult !== $currentResult ) {
+                                               $mismatch = true;
+                                       }
+                               }
+                       }
+                       $results[$i] = $currentResult;
+                       $lastResult = $currentResult;
+               }
+               if ( $mismatch ) {
+                       if ( count( $results ) == 2 ) {
+                               $resultsList = array();
+                               foreach ( $this->parsers as $i => $parser ) {
+                                       $resultsList[] = var_export( $results[$i], true );
+                               }
+                               $diff = wfDiff( $resultsList[0], $resultsList[1] );
+                       } else {
+                               $diff = '[too many parsers]';
+                       }
+                       $msg = "ParserDiffTest: results mismatch on call to $name\n";
+                       if ( !$this->shortOutput ) {
+                               $msg .= 'Arguments: ' . $this->formatArray( $args ) . "\n";
+                       }
+                       $msg .= 'Results: ' . $this->formatArray( $results ) . "\n" .
+                               "Diff: $diff\n";
+                       throw new MWException( $msg );
+               }
+               return $lastResult;
+       }
+
+       function formatArray( $array ) {
+               if ( $this->shortOutput ) {
+                       foreach ( $array as $key => $value ) {
+                               if ( $value instanceof ParserOutput ) {
+                                       $array[$key] = "ParserOutput: {$value->getText()}";
+                               }
+                       }
+               }
+               return var_export( $array, true );
+       }
+
+       function setFunctionHook( $id, $callback, $flags = 0 ) {
+               $this->init();
+               foreach ( $this->parsers as $parser ) {
+                       $parser->setFunctionHook( $id, $callback, $flags );
+               }
+       }
+
+       /**
+        * @param Parser $parser
+        * @return bool
+        */
+       function onClearState( &$parser ) {
+               // hack marker prefixes to get identical output
+               if ( !isset( $this->dtUniqPrefix ) ) {
+                       $this->dtUniqPrefix = $parser->uniqPrefix();
+               } else {
+                       $parser->mUniqPrefix = $this->dtUniqPrefix;
+               }
+               return true;
+       }
+}
index fa73cf2..90617b3 100644 (file)
@@ -663,7 +663,7 @@ class ParserOptions {
         * Generate a hash string with the values set on these ParserOptions
         * for the keys given in the array.
         * This will be used as part of the hash key for the parser cache,
-        * so users sharign the options with vary for the same page share
+        * so users sharing the options with vary for the same page share
         * the same cached data safely.
         *
         * Extensions which require it should install 'PageRenderingHash' hook,
index 931c088..09f714f 100644 (file)
@@ -573,10 +573,22 @@ class ParserOutput extends CacheTime {
                $this->mProperties[$name] = $value;
        }
 
+       /**
+        * @param string $name The property name to look up.
+        *
+        * @return mixed|false The value previously set using setProperty(). False if null or no value
+        * was set for the given property name.
+        *
+        * @note You need to use getProperties() to check for boolean and null properties.
+        */
        public function getProperty( $name ) {
                return isset( $this->mProperties[$name] ) ? $this->mProperties[$name] : false;
        }
 
+       public function unsetProperty( $name ) {
+               unset( $this->mProperties[$name] );
+       }
+
        public function getProperties() {
                if ( !isset( $this->mProperties ) ) {
                        $this->mProperties = array();
@@ -706,7 +718,7 @@ class ParserOutput extends CacheTime {
         *
         * @param string $key The key to look up.
         *
-        * @return mixed The value previously set for the given key using setExtensionData( $key ),
+        * @return mixed|null The value previously set for the given key using setExtensionData()
         *         or null if no value was set for this key.
         */
        public function getExtensionData( $key ) {
diff --git a/includes/parser/Parser_DiffTest.php b/includes/parser/Parser_DiffTest.php
deleted file mode 100644 (file)
index 920b6f6..0000000
+++ /dev/null
@@ -1,143 +0,0 @@
-<?php
-/**
- * Fake parser that output the difference of two different parsers
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Parser
- */
-
-/**
- * @ingroup Parser
- */
-class Parser_DiffTest
-{
-       var $parsers, $conf;
-       var $shortOutput = false;
-
-       var $dtUniqPrefix;
-
-       function __construct( $conf ) {
-               if ( !isset( $conf['parsers'] ) ) {
-                       throw new MWException( __METHOD__ . ': no parsers specified' );
-               }
-               $this->conf = $conf;
-       }
-
-       function init() {
-               if ( !is_null( $this->parsers ) ) {
-                       return;
-               }
-
-               global $wgHooks;
-               static $doneHook = false;
-               if ( !$doneHook ) {
-                       $doneHook = true;
-                       $wgHooks['ParserClearState'][] = array( $this, 'onClearState' );
-               }
-               if ( isset( $this->conf['shortOutput'] ) ) {
-                       $this->shortOutput = $this->conf['shortOutput'];
-               }
-
-               foreach ( $this->conf['parsers'] as $i => $parserConf ) {
-                       if ( !is_array( $parserConf ) ) {
-                               $class = $parserConf;
-                               $parserConf = array( 'class' => $parserConf );
-                       } else {
-                               $class = $parserConf['class'];
-                       }
-                       $this->parsers[$i] = new $class( $parserConf );
-               }
-       }
-
-       function __call( $name, $args ) {
-               $this->init();
-               $results = array();
-               $mismatch = false;
-               $lastResult = null;
-               $first = true;
-               foreach ( $this->parsers as $i => $parser ) {
-                       $currentResult = call_user_func_array( array( &$this->parsers[$i], $name ), $args );
-                       if ( $first ) {
-                               $first = false;
-                       } else {
-                               if ( is_object( $lastResult ) ) {
-                                       if ( $lastResult != $currentResult ) {
-                                               $mismatch = true;
-                                       }
-                               } else {
-                                       if ( $lastResult !== $currentResult ) {
-                                               $mismatch = true;
-                                       }
-                               }
-                       }
-                       $results[$i] = $currentResult;
-                       $lastResult = $currentResult;
-               }
-               if ( $mismatch ) {
-                       if ( count( $results ) == 2 ) {
-                               $resultsList = array();
-                               foreach ( $this->parsers as $i => $parser ) {
-                                       $resultsList[] = var_export( $results[$i], true );
-                               }
-                               $diff = wfDiff( $resultsList[0], $resultsList[1] );
-                       } else {
-                               $diff = '[too many parsers]';
-                       }
-                       $msg = "Parser_DiffTest: results mismatch on call to $name\n";
-                       if ( !$this->shortOutput ) {
-                               $msg .= 'Arguments: ' . $this->formatArray( $args ) . "\n";
-                       }
-                       $msg .= 'Results: ' . $this->formatArray( $results ) . "\n" .
-                               "Diff: $diff\n";
-                       throw new MWException( $msg );
-               }
-               return $lastResult;
-       }
-
-       function formatArray( $array ) {
-               if ( $this->shortOutput ) {
-                       foreach ( $array as $key => $value ) {
-                               if ( $value instanceof ParserOutput ) {
-                                       $array[$key] = "ParserOutput: {$value->getText()}";
-                               }
-                       }
-               }
-               return var_export( $array, true );
-       }
-
-       function setFunctionHook( $id, $callback, $flags = 0 ) {
-               $this->init();
-               foreach ( $this->parsers as $parser ) {
-                       $parser->setFunctionHook( $id, $callback, $flags );
-               }
-       }
-
-       /**
-        * @param Parser $parser
-        * @return bool
-        */
-       function onClearState( &$parser ) {
-               // hack marker prefixes to get identical output
-               if ( !isset( $this->dtUniqPrefix ) ) {
-                       $this->dtUniqPrefix = $parser->uniqPrefix();
-               } else {
-                       $parser->mUniqPrefix = $this->dtUniqPrefix;
-               }
-               return true;
-       }
-}
index b8e262a..335bd61 100644 (file)
@@ -77,8 +77,9 @@ interface PPFrame {
        const STRIP_COMMENTS = 4;
        const NO_IGNORE = 8;
        const RECOVER_COMMENTS = 16;
+       const NO_TAGS = 32;
 
-       const RECOVER_ORIG = 27; // = 1|2|8|16 no constant expression support in PHP yet
+       const RECOVER_ORIG = 59; // = 1|2|8|16|32 no constant expression support in PHP yet
 
        /** This constant exists when $indexOffset is supported in newChild() */
        const SUPPORTS_INDEX_OFFSET = 1;
@@ -94,6 +95,11 @@ interface PPFrame {
         */
        function newChild( $args = false, $title = false, $indexOffset = 0 );
 
+       /**
+        * Expand a document tree node, caching the result on its parent with the given key
+        */
+       function cachedExpand( $key, $root, $flags = 0 );
+
        /**
         * Expand a document tree node
         */
@@ -160,6 +166,55 @@ interface PPFrame {
         */
        function isTemplate();
 
+       /**
+        * Set the "volatile" flag.
+        *
+        * Note that this is somewhat of a "hack" in order to make extensions
+        * with side effects (such as Cite) work with the PHP parser. New
+        * extensions should be written in a way that they do not need this
+        * function, because other parsers (such as Parsoid) are not guaranteed
+        * to respect it, and it may be removed in the future.
+        *
+        * @param bool $flag
+        */
+       function setVolatile( $flag = true );
+
+       /**
+        * Get the "volatile" flag.
+        *
+        * Callers should avoid caching the result of an expansion if it has the
+        * volatile flag set.
+        *
+        * @see self::setVolatile()
+        * @return bool
+        */
+       function isVolatile();
+
+       /**
+        * Get the TTL of the frame's output.
+        *
+        * This is the maximum amount of time, in seconds, that this frame's
+        * output should be cached for. A value of null indicates that no
+        * maximum has been specified.
+        *
+        * Note that this TTL only applies to caching frames as parts of pages.
+        * It is not relevant to caching the entire rendered output of a page.
+        *
+        * @return int|null
+        */
+       function getTTL();
+
+       /**
+        * Set the TTL of the output of this frame and all of its ancestors.
+        * Has no effect if the new TTL is greater than the one already set.
+        * Note that it is the caller's responsibility to change the cache
+        * expiry of the page as a whole, if such behavior is desired.
+        *
+        * @see self::getTTL()
+        * @param int $ttl
+        */
+       function setTTL( $ttl );
+
        /**
         * Get a title of frame
         *
index d15b43a..f5fc3ec 100644 (file)
@@ -983,6 +983,14 @@ class PPFrame_DOM implements PPFrame {
         */
        var $depth;
 
+       private $volatile = false;
+       private $ttl = null;
+
+       /**
+        * @var array
+        */
+       protected $childExpansionCache;
+
        /**
         * Construct a new preprocessor frame.
         * @param Preprocessor $preprocessor The parent preprocessor
@@ -994,6 +1002,7 @@ class PPFrame_DOM implements PPFrame {
                $this->titleCache = array( $this->title ? $this->title->getPrefixedDBkey() : false );
                $this->loopCheckHash = array();
                $this->depth = 0;
+               $this->childExpansionCache = array();
        }
 
        /**
@@ -1043,6 +1052,18 @@ class PPFrame_DOM implements PPFrame {
                return new PPTemplateFrame_DOM( $this->preprocessor, $this, $numberedArgs, $namedArgs, $title );
        }
 
+       /**
+        * @throws MWException
+        * @param string|int $key
+        * @param string|PPNode_DOM|DOMDocument $root
+        * @param int $flags
+        * @return string
+        */
+       function cachedExpand( $key, $root, $flags = 0 ) {
+               // we don't have a parent, so we don't have a cache
+               return $this->expand( $root, $flags );
+       }
+
        /**
         * @throws MWException
         * @param string|PPNode_DOM|DOMDocument $root
@@ -1213,13 +1234,29 @@ class PPFrame_DOM implements PPFrame {
                                        $attrs = $xpath->query( 'attr', $contextNode );
                                        $inners = $xpath->query( 'inner', $contextNode );
                                        $closes = $xpath->query( 'close', $contextNode );
-                                       $params = array(
-                                               'name' => new PPNode_DOM( $names->item( 0 ) ),
-                                               'attr' => $attrs->length > 0 ? new PPNode_DOM( $attrs->item( 0 ) ) : null,
-                                               'inner' => $inners->length > 0 ? new PPNode_DOM( $inners->item( 0 ) ) : null,
-                                               'close' => $closes->length > 0 ? new PPNode_DOM( $closes->item( 0 ) ) : null,
-                                       );
-                                       $out .= $this->parser->extensionSubstitution( $params, $this );
+                                       if ( $flags & PPFrame::NO_TAGS ) {
+                                               $s = '<' . $this->expand( $names->item( 0 ), $flags );
+                                               if ( $attrs->length > 0 ) {
+                                                       $s .= $this->expand( $attrs->item( 0 ), $flags );
+                                               }
+                                               if ( $inners->length > 0 ) {
+                                                       $s .= '>' . $this->expand( $inners->item( 0 ), $flags );
+                                                       if ( $closes->length > 0 ) {
+                                                               $s .= $this->expand( $closes->item( 0 ), $flags );
+                                                       }
+                                               } else {
+                                                       $s .= '/>';
+                                               }
+                                               $out .= $s;
+                                       } else {
+                                               $params = array(
+                                                       'name' => new PPNode_DOM( $names->item( 0 ) ),
+                                                       'attr' => $attrs->length > 0 ? new PPNode_DOM( $attrs->item( 0 ) ) : null,
+                                                       'inner' => $inners->length > 0 ? new PPNode_DOM( $inners->item( 0 ) ) : null,
+                                                       'close' => $closes->length > 0 ? new PPNode_DOM( $closes->item( 0 ) ) : null,
+                                               );
+                                               $out .= $this->parser->extensionSubstitution( $params, $this );
+                                       }
                                } elseif ( $contextNode->nodeName == 'h' ) {
                                        # Heading
                                        $s = $this->expand( $contextNode->childNodes, $flags );
@@ -1467,6 +1504,44 @@ class PPFrame_DOM implements PPFrame {
        function getTitle() {
                return $this->title;
        }
+
+       /**
+        * Set the volatile flag
+        *
+        * @param bool $flag
+        */
+       function setVolatile( $flag = true ) {
+               $this->volatile = $flag;
+       }
+
+       /**
+        * Get the volatile flag
+        *
+        * @return bool
+        */
+       function isVolatile() {
+               return $this->volatile;
+       }
+
+       /**
+        * Set the TTL
+        *
+        * @param int $ttl
+        */
+       function setTTL( $ttl ) {
+               if ( $ttl !== null && ( $this->ttl === null || $ttl < $this->ttl ) ) {
+                       $this->ttl = $ttl;
+               }
+       }
+
+       /**
+        * Get the TTL
+        *
+        * @return int|null
+        */
+       function getTTL() {
+               return $this->ttl;
+       }
 }
 
 /**
@@ -1526,6 +1601,24 @@ class PPTemplateFrame_DOM extends PPFrame_DOM {
                return $s;
        }
 
+       /**
+        * @throws MWException
+        * @param string|int $key
+        * @param string|PPNode_DOM|DOMDocument $root
+        * @param int $flags
+        * @return string
+        */
+       function cachedExpand( $key, $root, $flags = 0 ) {
+               if ( isset( $this->parent->childExpansionCache[$key] ) ) {
+                       return $this->parent->childExpansionCache[$key];
+               }
+               $retval = $this->expand( $root, $flags );
+               if ( !$this->isVolatile() ) {
+                       $this->parent->childExpansionCache[$key] = $retval;
+               }
+               return $retval;
+       }
+
        /**
         * Returns true if there are no arguments in this frame
         *
@@ -1603,6 +1696,16 @@ class PPTemplateFrame_DOM extends PPFrame_DOM {
        function isTemplate() {
                return true;
        }
+
+       function setVolatile( $flag = true ) {
+               parent::setVolatile( $flag );
+               $this->parent->setVolatile( $flag );
+       }
+
+       function setTTL( $ttl ) {
+               parent::setTTL( $ttl );
+               $this->parent->setTTL( $ttl );
+       }
 }
 
 /**
index a464461..bf2bf61 100644 (file)
@@ -919,6 +919,14 @@ class PPFrame_Hash implements PPFrame {
         */
        var $depth;
 
+       private $volatile = false;
+       private $ttl = null;
+
+       /**
+        * @var array
+        */
+       protected $childExpansionCache;
+
        /**
         * Construct a new preprocessor frame.
         * @param Preprocessor $preprocessor The parent preprocessor
@@ -930,6 +938,7 @@ class PPFrame_Hash implements PPFrame {
                $this->titleCache = array( $this->title ? $this->title->getPrefixedDBkey() : false );
                $this->loopCheckHash = array();
                $this->depth = 0;
+               $this->childExpansionCache = array();
        }
 
        /**
@@ -972,6 +981,18 @@ class PPFrame_Hash implements PPFrame {
                return new PPTemplateFrame_Hash( $this->preprocessor, $this, $numberedArgs, $namedArgs, $title );
        }
 
+       /**
+        * @throws MWException
+        * @param string|int $key
+        * @param string|PPNode_Hash|DOMDocument $root
+        * @param int $flags
+        * @return string
+        */
+       function cachedExpand( $key, $root, $flags = 0 ) {
+               // we don't have a parent, so we don't have a cache
+               return $this->expand( $root, $flags );
+       }
+
        /**
         * @throws MWException
         * @param string|PPNode$root
@@ -1117,7 +1138,23 @@ class PPFrame_Hash implements PPFrame {
                                } elseif ( $contextNode->name == 'ext' ) {
                                        # Extension tag
                                        $bits = $contextNode->splitExt() + array( 'attr' => null, 'inner' => null, 'close' => null );
-                                       $out .= $this->parser->extensionSubstitution( $bits, $this );
+                                       if ( $flags & PPFrame::NO_TAGS ) {
+                                               $s = '<' . $bits['name']->firstChild->value;
+                                               if ( $bits['attr'] ) {
+                                                       $s .= $bits['attr']->firstChild->value;
+                                               }
+                                               if ( $bits['inner'] ) {
+                                                       $s .= '>' . $bits['inner']->firstChild->value;
+                                                       if ( $bits['close'] ) {
+                                                               $s .= $bits['close']->firstChild->value;
+                                                       }
+                                               } else {
+                                                       $s .= '/>';
+                                               }
+                                               $out .= $s;
+                                       } else {
+                                               $out .= $this->parser->extensionSubstitution( $bits, $this );
+                                       }
                                } elseif ( $contextNode->name == 'h' ) {
                                        # Heading
                                        if ( $this->parser->ot['html'] ) {
@@ -1372,6 +1409,44 @@ class PPFrame_Hash implements PPFrame {
        function getTitle() {
                return $this->title;
        }
+
+       /**
+        * Set the volatile flag
+        *
+        * @param bool $flag
+        */
+       function setVolatile( $flag = true ) {
+               $this->volatile = $flag;
+       }
+
+       /**
+        * Get the volatile flag
+        *
+        * @return bool
+        */
+       function isVolatile() {
+               return $this->volatile;
+       }
+
+       /**
+        * Set the TTL
+        *
+        * @param int $ttl
+        */
+       function setTTL( $ttl ) {
+               if ( $ttl !== null && ( $this->ttl === null || $ttl < $this->ttl ) ) {
+                       $this->ttl = $ttl;
+               }
+       }
+
+       /**
+        * Get the TTL
+        *
+        * @return int|null
+        */
+       function getTTL() {
+               return $this->ttl;
+       }
 }
 
 /**
@@ -1426,6 +1501,24 @@ class PPTemplateFrame_Hash extends PPFrame_Hash {
                return $s;
        }
 
+       /**
+        * @throws MWException
+        * @param string|int $key
+        * @param string|PPNode_Hash|DOMDocument $root
+        * @param int $flags
+        * @return string
+        */
+       function cachedExpand( $key, $root, $flags = 0 ) {
+               if ( isset( $this->parent->childExpansionCache[$key] ) ) {
+                       return $this->parent->childExpansionCache[$key];
+               }
+               $retval = $this->expand( $root, $flags );
+               if ( !$this->isVolatile() ) {
+                       $this->parent->childExpansionCache[$key] = $retval;
+               }
+               return $retval;
+       }
+
        /**
         * Returns true if there are no arguments in this frame
         *
@@ -1524,6 +1617,16 @@ class PPTemplateFrame_Hash extends PPFrame_Hash {
        function isTemplate() {
                return true;
        }
+
+       function setVolatile( $flag = true ) {
+               parent::setVolatile( $flag );
+               $this->parent->setVolatile( $flag );
+       }
+
+       function setTTL( $ttl ) {
+               parent::setTTL( $ttl );
+               $this->parent->setTTL( $ttl );
+       }
 }
 
 /**
index 34953c0..f8d48cc 100644 (file)
@@ -53,8 +53,15 @@ abstract class PoolCounter {
 
        /** @var string All workers with the same key share the lock */
        protected $key;
-       /** @var int Maximum number of workers doing the task simultaneously */
+       /** @var int Maximum number of workers working on tasks with the same key simultaneously */
        protected $workers;
+       /**
+        * Maximum number of workers working on this task type, regardless of key.
+        * 0 means unlimited. Max allowed value is 65536.
+        * The way the slot limit is enforced is overzealous - this option should be used with caution.
+        * @var int
+        */
+       protected $slots = 0;
        /** @var int If this number of workers are already working/waiting, fail instead of wait */
        protected $maxqueue;
        /** @var float Maximum time in seconds to wait for the lock */
@@ -66,10 +73,17 @@ abstract class PoolCounter {
         * @param string $key
         */
        protected function __construct( $conf, $type, $key ) {
-               $this->key = $key;
                $this->workers = $conf['workers'];
                $this->maxqueue = $conf['maxqueue'];
                $this->timeout = $conf['timeout'];
+               if ( isset( $conf['slots'] ) ) {
+                       $this->slots = $conf['slots'];
+               }
+
+               if ( $this->slots ) {
+                       $key = $this->hashKeyIntoSlots( $key, $this->slots );
+               }
+               $this->key = $key;
        }
 
        /**
@@ -121,6 +135,20 @@ abstract class PoolCounter {
         * @return Status value is one of Released/NotLocked/Error
         */
        abstract public function release();
+
+       /**
+        * Given a key (any string) and the number of lots, returns a slot number (an integer from the [0..($slots-1)] range).
+        * This is used for a global limit on the number of instances  of a given type that can acquire a lock.
+        * The hashing is deterministic so that PoolCounter::$workers is always an upper limit of how many instances with
+        * the same key can acquire a lock.
+        *
+        * @param string $key PoolCounter instance key (any string)
+        * @param int $slots the number of slots (max allowed value is 65536)
+        * @return int
+        */
+       protected function hashKeyIntoSlots( $key, $slots ) {
+               return hexdec( substr( sha1( $key ), 0, 4 ) ) % $slots;
+       }
 }
 
 // @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
index 523e9e0..1bc1a8b 100644 (file)
@@ -112,6 +112,10 @@ abstract class PoolCounterWork {
                }
 
                switch ( $status->value ) {
+                       case PoolCounter::LOCK_HELD:
+                               // Better to ignore nesting pool counter limits than to fail.
+                               // Assume that the outer pool limiting is reasonable enough.
+                               /* no break */
                        case PoolCounter::LOCKED:
                                $result = $this->doWork();
                                $this->poolCounter->release();
diff --git a/includes/poolcounter/PoolWorkArticleView.php b/includes/poolcounter/PoolWorkArticleView.php
new file mode 100644 (file)
index 0000000..4cdb0ff
--- /dev/null
@@ -0,0 +1,208 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+class PoolWorkArticleView extends PoolCounterWork {
+       /** @var Page */
+       private $page;
+
+       /** @var string */
+       private $cacheKey;
+
+       /** @var int */
+       private $revid;
+
+       /** @var ParserOptions */
+       private $parserOptions;
+
+       /** @var Content|null */
+       private $content = null;
+
+       /** @var ParserOutput|bool */
+       private $parserOutput = false;
+
+       /** @var bool */
+       private $isDirty = false;
+
+       /** @var Status|bool */
+       private $error = false;
+
+       /**
+        * @param Page $page
+        * @param int $revid ID of the revision being parsed.
+        * @param bool $useParserCache Whether to use the parser cache.
+        * @param ParserOptions $parserOptions ParserOptions to use for the parse
+        *   operation.
+        * @param Content|string $content Content to parse or null to load it; may
+        *   also be given as a wikitext string, for BC.
+        */
+       public 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->content = $content;
+               $this->cacheKey = ParserCache::singleton()->getKey( $page, $parserOptions );
+               parent::__construct( 'ArticleView', $this->cacheKey . ':revid:' . $revid );
+       }
+
+       /**
+        * Get the ParserOutput from this object, or false in case of failure
+        *
+        * @return ParserOutput
+        */
+       public function getParserOutput() {
+               return $this->parserOutput;
+       }
+
+       /**
+        * Get whether the ParserOutput is a dirty one (i.e. expired)
+        *
+        * @return bool
+        */
+       public function getIsDirty() {
+               return $this->isDirty;
+       }
+
+       /**
+        * Get a Status object in case of error or false otherwise
+        *
+        * @return Status|bool
+        */
+       public function getError() {
+               return $this->error;
+       }
+
+       /**
+        * @return bool
+        */
+       public function doWork() {
+               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->content !== null ) {
+                       $content = $this->content;
+               } elseif ( $isCurrent ) {
+                       // 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 ) {
+                               $content = null;
+                       } else {
+                               // XXX: why use PUBLIC audience here (default), and RAW above?
+                               $content = $rev->getContent();
+                       }
+               }
+
+               if ( $content === null ) {
+                       return false;
+               }
+
+               // Reduce effects of race conditions for slow parses (bug 46014)
+               $cacheTime = wfTimestampNow();
+
+               $time = - microtime( true );
+               $this->parserOutput = $content->getParserOutput(
+                       $this->page->getTitle(),
+                       $this->revid,
+                       $this->parserOptions
+               );
+               $time += microtime( true );
+
+               // Timing hack
+               if ( $time > 3 ) {
+                       wfDebugLog( 'slow-parse', sprintf( "%-5.2f %s", $time,
+                               $this->page->getTitle()->getPrefixedDBkey() ) );
+               }
+
+               if ( $this->cacheable && $this->parserOutput->isCacheable() && $isCurrent ) {
+                       ParserCache::singleton()->save(
+                               $this->parserOutput, $this->page, $this->parserOptions, $cacheTime, $this->revid );
+               }
+
+               // Make sure file cache is not used on uncacheable content.
+               // Output that has magic words in it can still use the parser cache
+               // (if enabled), though it will generally expire sooner.
+               if ( !$this->parserOutput->isCacheable() || $this->parserOutput->containsOldMagic() ) {
+                       $wgUseFileCache = false;
+               }
+
+               if ( $isCurrent ) {
+                       $this->page->doCascadeProtectionUpdates( $this->parserOutput );
+               }
+
+               return true;
+       }
+
+       /**
+        * @return bool
+        */
+       public function getCachedWork() {
+               $this->parserOutput = ParserCache::singleton()->get( $this->page, $this->parserOptions );
+
+               if ( $this->parserOutput === false ) {
+                       wfDebug( __METHOD__ . ": parser cache miss\n" );
+                       return false;
+               } else {
+                       wfDebug( __METHOD__ . ": parser cache hit\n" );
+                       return true;
+               }
+       }
+
+       /**
+        * @return bool
+        */
+       public function fallback() {
+               $this->parserOutput = ParserCache::singleton()->getDirty( $this->page, $this->parserOptions );
+
+               if ( $this->parserOutput === false ) {
+                       wfDebugLog( 'dirty', 'dirty missing' );
+                       wfDebug( __METHOD__ . ": no dirty cache\n" );
+                       return false;
+               } else {
+                       wfDebug( __METHOD__ . ": sending dirty output\n" );
+                       wfDebugLog( 'dirty', "dirty output {$this->cacheKey}" );
+                       $this->isDirty = true;
+                       return true;
+               }
+       }
+
+       /**
+        * @param Status $status
+        * @return bool
+        */
+       public function error( $status ) {
+               $this->error = $status;
+               return false;
+       }
+}
index f6bafd5..9633d0d 100644 (file)
@@ -357,8 +357,8 @@ abstract class Profiler {
  */
 class TransactionProfiler {
        /** @var float seconds */
-       protected $mDBLockThreshold = 5.0;
-       /** @var array DB/server name => (active trx count,timestamp) */
+       protected $mDBLockThreshold = 3.0;
+       /** @var array DB/server name => (active trx count, time, DBs involved) */
        protected $mDBTrxHoldingLocks = array();
        /** @var array DB/server name => list of (function name, elapsed time) */
        protected $mDBTrxMethodTimes = array();
@@ -377,9 +377,13 @@ class TransactionProfiler {
                if ( isset( $this->mDBTrxHoldingLocks[$name] ) ) {
                        ++$this->mDBTrxHoldingLocks[$name]['refs'];
                } else {
-                       $this->mDBTrxHoldingLocks[$name] = array( 'refs' => 1, 'start' => microtime( true ) );
+                       $this->mDBTrxHoldingLocks[$name] = array(
+                               'refs' => 1, 'start' => microtime( true ), 'conns' => array() );
                        $this->mDBTrxMethodTimes[$name] = array();
                }
+               foreach ( $this->mDBTrxHoldingLocks as $name => &$info ) {
+                       $info['conns'][$name] = 1; // track all DBs in transactions for this transaction
+               }
        }
 
        /**
@@ -424,15 +428,15 @@ class TransactionProfiler {
                if ( --$this->mDBTrxHoldingLocks[$name]['refs'] <= 0 ) {
                        $slow = false;
                        foreach ( $this->mDBTrxMethodTimes[$name] as $info ) {
-                               list( $method, $realtime ) = $info;
+                               $realtime = $info[1];
                                if ( $realtime >= $this->mDBLockThreshold ) {
                                        $slow = true;
                                        break;
                                }
                        }
                        if ( $slow ) {
-                               $dbs = implode( ', ', array_keys( $this->mDBTrxHoldingLocks ) );
-                               $msg = "Sub-optimal transaction on DB(s) {$dbs}:\n";
+                               $dbs = implode( ', ', array_keys( $this->mDBTrxHoldingLocks[$name]['conns'] ) );
+                               $msg = "Sub-optimal transaction on DB(s) [{$dbs}]:\n";
                                foreach ( $this->mDBTrxMethodTimes[$name] as $i => $info ) {
                                        list( $method, $realtime ) = $info;
                                        $msg .= sprintf( "%d\t%.6f\t%s\n", $i, $realtime, $method );
index 3f17bcd..18e6003 100644 (file)
@@ -46,7 +46,7 @@ abstract class MachineReadableRCFeedFormatter implements RCFeedFormatter {
                        // but there is no real reason not to expose it in other cases,
                        // and I can see how this may be potentially useful for clients.
                        'id' => $attrib['rc_id'],
-                       'type' => $attrib['rc_type'],
+                       'type' => RecentChange::parseFromRCType( $attrib['rc_type'] ),
                        'namespace' => $rc->getTitle()->getNamespace(),
                        'title' => $rc->getTitle()->getPrefixedText(),
                        'comment' => $attrib['rc_comment'],
@@ -87,6 +87,7 @@ abstract class MachineReadableRCFeedFormatter implements RCFeedFormatter {
                                break;
 
                        case RC_LOG:
+                               $packet['log_id'] = $attrib['rc_logid'];
                                $packet['log_type'] = $attrib['rc_log_type'];
                                $packet['log_action'] = $attrib['rc_log_action'];
                                if ( $attrib['rc_params'] ) {
index 680bd99..5ac874d 100644 (file)
@@ -35,6 +35,9 @@ class ResourceLoader {
        /** @var array */
        protected static $requiredSourceProperties = array( 'loadScript' );
 
+       /** @var bool */
+       protected static $debugMode = null;
+
        /** @var array Module name/ResourceLoaderModule object pairs */
        protected $modules = array();
 
@@ -145,9 +148,10 @@ class ResourceLoader {
         *
         * @param string $filter Name of filter to run
         * @param string $data Text to filter, such as JavaScript or CSS text
+        * @param string $cacheReport Whether to include the cache key report
         * @return string Filtered data, or a comment containing an error message
         */
-       protected function filter( $filter, $data ) {
+       public function filter( $filter, $data, $cacheReport = true ) {
                global $wgResourceLoaderMinifierStatementsOnOwnLine, $wgResourceLoaderMinifierMaxLineLength;
                wfProfileIn( __METHOD__ );
 
@@ -179,11 +183,15 @@ class ResourceLoader {
                                                $wgResourceLoaderMinifierStatementsOnOwnLine,
                                                $wgResourceLoaderMinifierMaxLineLength
                                        );
-                                       $result .= "\n/* cache key: $key */";
+                                       if ( $cacheReport ) {
+                                               $result .= "\n/* cache key: $key */";
+                                       }
                                        break;
                                case 'minify-css':
                                        $result = CSSMin::minify( $data );
-                                       $result .= "\n/* cache key: $key */";
+                                       if ( $cacheReport ) {
+                                               $result .= "\n/* cache key: $key */";
+                                       }
                                        break;
                        }
 
@@ -814,7 +822,7 @@ class ResourceLoader {
                                        // Don't create empty stylesheets like array( '' => '' ) for modules
                                        // that don't *have* any stylesheets (bug 38024).
                                        $stylePairs = $module->getStyles( $context );
-                                       if ( count ( $stylePairs ) ) {
+                                       if ( count( $stylePairs ) ) {
                                                // If we are in debug mode without &only= set, we'll want to return an array of URLs
                                                // See comment near shouldIncludeScripts() for more details
                                                if ( $context->getDebug() && !$context->getOnly() && $module->supportsURLLoading() ) {
@@ -988,7 +996,7 @@ class ResourceLoader {
         * @param array $stylePairs Array keyed by media type containing (arrays of) CSS strings
         * @return array
         */
-       private static function makeCombinedStyles( array $stylePairs ) {
+       public static function makeCombinedStyles( array $stylePairs ) {
                $out = array();
                foreach ( $stylePairs as $media => $styles ) {
                        // ResourceLoaderFileModule::getStyle can return the styles
@@ -1074,15 +1082,15 @@ class ResourceLoader {
         * Returns JS code which calls mw.loader.register with the given
         * parameters. Has three calling conventions:
         *
-        *   - ResourceLoader::makeLoaderRegisterScript( $name, $version, $dependencies, $group, $source ):
+        *   - ResourceLoader::makeLoaderRegisterScript( $name, $version, $dependencies, $group, $source, $skip ):
         *       Register a single module.
         *
         *   - ResourceLoader::makeLoaderRegisterScript( array( $name1, $name2 ) ):
         *       Register modules with the given names.
         *
         *   - ResourceLoader::makeLoaderRegisterScript( array(
-        *        array( $name1, $version1, $dependencies1, $group1, $source1 ),
-        *        array( $name2, $version2, $dependencies1, $group2, $source2 ),
+        *        array( $name1, $version1, $dependencies1, $group1, $source1, $skip1 ),
+        *        array( $name2, $version2, $dependencies1, $group2, $source2, $skip2 ),
         *        ...
         *     ) ):
         *        Registers modules with the given names and parameters.
@@ -1092,10 +1100,11 @@ class ResourceLoader {
         * @param array $dependencies List of module names on which this module depends
         * @param string $group Group which the module is in
         * @param string $source Source of the module, or 'local' if not foreign
+        * @param string $skip Script body of the skip function
         * @return string
         */
        public static function makeLoaderRegisterScript( $name, $version = null,
-               $dependencies = null, $group = null, $source = null
+               $dependencies = null, $group = null, $source = null, $skip = null
        ) {
                if ( is_array( $name ) ) {
                        return Xml::encodeJsCall(
@@ -1107,7 +1116,7 @@ class ResourceLoader {
                        $version = (int)$version > 1 ? (int)$version : 1;
                        return Xml::encodeJsCall(
                                'mw.loader.register',
-                               array( $name, $version, $dependencies, $group, $source ),
+                               array( $name, $version, $dependencies, $group, $source, $skip ),
                                ResourceLoader::inDebugMode()
                        );
                }
@@ -1201,13 +1210,24 @@ class ResourceLoader {
         * @return bool
         */
        public static function inDebugMode() {
-               global $wgRequest, $wgResourceLoaderDebug;
-               static $retval = null;
-               if ( is_null( $retval ) ) {
-                       $retval = $wgRequest->getFuzzyBool( 'debug',
-                               $wgRequest->getCookie( 'resourceLoaderDebug', '', $wgResourceLoaderDebug ) );
+               if ( self::$debugMode === null ) {
+                       global $wgRequest, $wgResourceLoaderDebug;
+                       self::$debugMode = $wgRequest->getFuzzyBool( 'debug',
+                               $wgRequest->getCookie( 'resourceLoaderDebug', '', $wgResourceLoaderDebug )
+                       );
                }
-               return $retval;
+               return self::$debugMode;
+       }
+
+       /**
+        * Reset static members used for caching.
+        *
+        * Global state and $wgRequest are evil, but we're using it right
+        * now and sometimes we need to be able to force ResourceLoader to
+        * re-evaluate the context because it has changed (e.g. in the test suite).
+        */
+       public static function clearCache() {
+               self::$debugMode = null;
        }
 
        /**
index 382bdd9..3a6d5d2 100644 (file)
@@ -106,6 +106,11 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         */
        protected $dependencies = array();
 
+       /**
+        * @var string File name containing the body of the skip function
+        */
+       protected $skipFunction = null;
+
        /**
         * @var array List of message keys used by this module
         * @par Usage:
@@ -176,6 +181,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         *         'remoteBasePath' => [base path],
         *         // Equivalent of remoteBasePath, but relative to $wgExtensionAssetsPath
         *         'remoteExtPath' => [base path],
+        *         // Equivalent of remoteBasePath, but relative to $wgStylePath
+        *         'remoteSkinPath' => [base path],
         *         // Scripts to always include
         *         'scripts' => [file path string or array of file path strings],
         *         // Scripts to include in specific language contexts
@@ -204,6 +211,10 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         *         'group' => [group name string],
         *         // Position on the page to load this module at
         *         'position' => ['bottom' (default) or 'top']
+        *         // Function that, if it returns true, makes the loader skip this module.
+        *         // The file must contain valid JavaScript for execution in a private function.
+        *         // The file must not contain the "function () {" and "}" wrapper though.
+        *         'skipFunction' => [file path]
         *     )
         * @endcode
         */
@@ -223,6 +234,11 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                        $this->remoteBasePath = $wgExtensionAssetsPath . '/' . $options['remoteExtPath'];
                }
 
+               if ( isset( $options['remoteSkinPath'] ) ) {
+                       global $wgStylePath;
+                       $this->remoteBasePath = $wgStylePath . '/' . $options['remoteSkinPath'];
+               }
+
                foreach ( $options as $member => $option ) {
                        switch ( $member ) {
                                // Lists of file paths
@@ -267,6 +283,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                                case 'position':
                                case 'localBasePath':
                                case 'remoteBasePath':
+                               case 'skipFunction':
                                        $this->{$member} = (string)$option;
                                        break;
                                // Single booleans
@@ -312,22 +329,22 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        }
 
        /**
-        * Gets loader script.
+        * Get loader script.
         *
-        * @return string JavaScript code to be added to startup module
+        * @return string|false JavaScript code to be added to startup module
         */
        public function getLoaderScript() {
-               if ( count( $this->loaderScripts ) == 0 ) {
+               if ( count( $this->loaderScripts ) === 0 ) {
                        return false;
                }
                return $this->readScriptFiles( $this->loaderScripts );
        }
 
        /**
-        * Gets all styles for a given context concatenated together.
+        * Get all styles for a given context.
         *
-        * @param ResourceLoaderContext $context Context in which to generate styles
-        * @return string CSS code for $context
+        * @param ResourceLoaderContext $context
+        * @return array CSS code for $context as an associative array mapping media type to CSS text.
         */
        public function getStyles( ResourceLoaderContext $context ) {
                $styles = $this->readStyleFiles(
@@ -410,6 +427,28 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                return $this->dependencies;
        }
 
+       /**
+        * Get the skip function.
+        *
+        * @return string|null
+        */
+       public function getSkipFunction() {
+               if ( !$this->skipFunction ) {
+                       return null;
+               }
+
+               global $wgResourceLoaderValidateStaticJS;
+               $localPath = $this->getLocalPath( $this->skipFunction );
+               if ( !file_exists( $localPath ) ) {
+                       throw new MWException( __METHOD__ . ": skip function file not found: \"$localPath\"" );
+               }
+               $contents = file_get_contents( $localPath );
+               if ( $wgResourceLoaderValidateStaticJS ) {
+                       $contents = $this->validateScriptFile( $fileName, $contents );
+               }
+               return $contents;
+       }
+
        /**
         * @return bool
         */
@@ -463,6 +502,9 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                        self::tryForKey( $this->skinScripts, $context->getSkin(), 'default' ),
                        $this->loaderScripts
                );
+               if ( $this->skipFunction ) {
+                       $files[] = $this->skipFunction;
+               }
                $files = array_map( array( $this, 'getLocalPath' ), $files );
                // File deps need to be treated separately because they're already prefixed
                $files = array_merge( $files, $this->getFileDependencies( $context->getSkin() ) );
@@ -511,6 +553,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                        'targets',
                        'group',
                        'position',
+                       'skipFunction',
                        'localBasePath',
                        'remoteBasePath',
                        'debugRaw',
@@ -581,13 +624,13 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        }
 
        /**
-        * Gets a list of element that match a key, optionally using a fallback key.
+        * Get a list of element that match a key, optionally using a fallback key.
         *
         * @param array $list List of lists to select from
         * @param string $key Key to look for in $map
         * @param string $fallback Key to look for in $list if $key doesn't exist
         * @return array List of elements from $map which matched $key or $fallback,
-        *     or an empty list in case of no match
+        *  or an empty list in case of no match
         */
        protected static function tryForKey( array $list, $key, $fallback = null ) {
                if ( isset( $list[$key] ) && is_array( $list[$key] ) ) {
@@ -602,7 +645,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        }
 
        /**
-        * Gets a list of file paths for all scripts in this module, in order of propper execution.
+        * Get a list of file paths for all scripts in this module, in order of proper execution.
         *
         * @param ResourceLoaderContext $context
         * @return array List of file paths
@@ -621,12 +664,12 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        }
 
        /**
-        * Gets a list of file paths for all styles in this module, in order of propper inclusion.
+        * Get a list of file paths for all styles in this module, in order of proper inclusion.
         *
         * @param ResourceLoaderContext $context
         * @return array List of file paths
         */
-       protected function getStyleFiles( ResourceLoaderContext $context ) {
+       public function getStyleFiles( ResourceLoaderContext $context ) {
                return array_merge_recursive(
                        self::collateFilePathListByOption( $this->styles, 'media', 'all' ),
                        self::collateFilePathListByOption(
@@ -638,20 +681,61 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        }
 
        /**
-        * Returns all style files used by this module
+        * Gets a list of file paths for all skin styles in the module used by
+        * the skin.
+        *
+        * @param string $skinName The name of the skin
+        * @return array A list of file paths collated by media type
+        */
+       protected function getSkinStyleFiles( $skinName ) {
+               return self::collateFilePathListByOption(
+                       self::tryForKey( $this->skinStyles, $skinName ),
+                       'media',
+                       'all'
+               );
+       }
+
+       /**
+        * Gets a list of file paths for all skin style files in the module,
+        * for all available skins.
+        *
+        * @return array A list of file paths collated by media type
+        */
+       protected function getAllSkinStyleFiles() {
+               $styleFiles = array();
+               $internalSkinNames = array_keys( Skin::getSkinNames() );
+               $internalSkinNames[] = 'default';
+
+               foreach ( $internalSkinNames as $internalSkinName ) {
+                       $styleFiles = array_merge_recursive(
+                               $styleFiles,
+                               $this->getSkinStyleFiles( $internalSkinName )
+                       );
+               }
+
+               return $styleFiles;
+       }
+
+       /**
+        * Returns all style files and all skin style files used by this module.
+        *
         * @return array
         */
        public function getAllStyleFiles() {
-               $files = array();
-               foreach ( (array)$this->styles as $key => $value ) {
-                       if ( is_array( $value ) ) {
-                               $path = $key;
-                       } else {
-                               $path = $value;
+               $collatedStyleFiles = array_merge_recursive(
+                       self::collateFilePathListByOption( $this->styles, 'media', 'all' ),
+                       $this->getAllSkinStyleFiles()
+               );
+
+               $result = array();
+
+               foreach ( $collatedStyleFiles as $media => $styleFiles ) {
+                       foreach ( $styleFiles as $styleFile ) {
+                               $result[] = $this->getLocalPath( $styleFile );
                        }
-                       $files[] = $this->getLocalPath( $path );
                }
-               return $files;
+
+               return $result;
        }
 
        /**
@@ -696,7 +780,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @return array List of concatenated and remapped CSS data from $styles,
         *     keyed by media type
         */
-       protected function readStyleFiles( array $styles, $flip ) {
+       public function readStyleFiles( array $styles, $flip ) {
                if ( empty( $styles ) ) {
                        return array();
                }
index e016a33..eb1461f 100644 (file)
@@ -62,6 +62,6 @@ class ResourceLoaderLESSFunctions {
 
                $data = CSSMin::encodeImageAsDataURI( $file );
                $less->addParsedFile( $file );
-               return 'url(' . $data . ')';
+               return CSSMin::buildUrlValue( $data );
        }
 }
index 9ddd184..f636105 100644 (file)
@@ -293,6 +293,24 @@ abstract class ResourceLoaderModule {
                return $this->targets;
        }
 
+       /**
+        * Get the skip function.
+        *
+        * Modules that provide fallback functionality can provide a "skip function". This
+        * function, if provided, will be passed along to the module registry on the client.
+        * When this module is loaded (either directly or as a dependency of another module),
+        * then this function is executed first. If the function returns true, the module will
+        * instantly be considered "ready" without requesting the associated module resources.
+        *
+        * The value returned here must be valid javascript for execution in a private function.
+        * It must not contain the "function () {" and "}" wrapper though.
+        *
+        * @return string|null A JavaScript function body returning a boolean value, or null
+        */
+       public function getSkipFunction() {
+               return null;
+       }
+
        /**
         * Get the files this module depends on indirectly for a given skin.
         * Currently these are only image files referenced by the module's CSS.
index 63a444b..8a936c6 100644 (file)
@@ -222,12 +222,24 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
 
                        // FIXME: Convert to numbers, wfTimestamp always gives us stings, even for TS_UNIX
 
+                       $skipFunction = $module->getSkipFunction();
+                       if ( $skipFunction !== null && !ResourceLoader::inDebugMode() ) {
+                               $skipFunction = $resourceLoader->filter( 'minify-js',
+                                       $skipFunction,
+                                       // There will potentially be lots of these little string in the registrations
+                                       // manifest, we don't want to blow up the startup module with
+                                       // "/* cache key: ... */" all over it in non-debug mode.
+                                       /* cacheReport = */ false
+                               );
+                       }
+
                        $registryData[ $name ] = array(
                                'version' => $mtime,
                                'dependencies' => $module->getDependencies(),
                                'group' => $module->getGroup(),
                                'source' => $module->getSource(),
                                'loader' => $module->getLoaderScript(),
+                               'skip' => $skipFunction,
                        );
                }
 
@@ -255,17 +267,25 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        if (
                                !count( $data['dependencies'] ) &&
                                $data['group'] === null &&
-                               $data['source'] === 'local'
+                               $data['source'] === 'local' &&
+                               $data['skip'] === null
                        ) {
-                               // Modules without dependencies, a group or a foreign source;
+                               // Modules with no dependencies, group, foreign source or skip function;
                                // call mw.loader.register(name, timestamp)
                                $registrations[] = array( $name, $data['version'] );
-                       } elseif ( $data['group'] === null && $data['source'] === 'local' ) {
-                               // Modules with dependencies but no group or foreign source;
+                       } elseif (
+                               $data['group'] === null &&
+                               $data['source'] === 'local' &&
+                               $data['skip'] === null
+                       ) {
+                               // Modules with dependencies but no group, foreign source or skip function;
                                // call mw.loader.register(name, timestamp, dependencies)
                                $registrations[] = array( $name, $data['version'], $data['dependencies'] );
-                       } elseif ( $data['source'] === 'local' ) {
-                               // Modules with a group but no foreign source;
+                       } elseif (
+                               $data['source'] === 'local' &&
+                               $data['skip'] === null
+                       ) {
+                               // Modules with a group but no foreign source or skip function;
                                // call mw.loader.register(name, timestamp, dependencies, group)
                                $registrations[] = array(
                                        $name,
@@ -273,8 +293,8 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                                        $data['dependencies'],
                                        $data['group']
                                );
-                       } else {
-                               // Modules with a foreign source;
+                       } elseif ( $data['skip'] === null ) {
+                               // Modules with a foreign source but no skip function;
                                // call mw.loader.register(name, timestamp, dependencies, group, source)
                                $registrations[] = array(
                                        $name,
@@ -283,6 +303,17 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                                        $data['group'],
                                        $data['source']
                                );
+                       } else {
+                               // Modules with a skip function;
+                               // call mw.loader.register(name, timestamp, dependencies, group, source, skip)
+                               $registrations[] = array(
+                                       $name,
+                                       $data['version'],
+                                       $data['dependencies'],
+                                       $data['group'],
+                                       $data['source'],
+                                       $data['skip']
+                               );
                        }
                }
 
index fbfe325..e7a09d7 100644 (file)
@@ -31,6 +31,7 @@
  * See RevDelRevisionItem and RevDelArchivedRevisionItem for items.
  */
 class RevDelRevisionList extends RevDelList {
+       /** @var int */
        var $currentRevId;
 
        public function getType() {
@@ -147,6 +148,7 @@ class RevDelRevisionList extends RevDelList {
  * Item class for a live revision table row
  */
 class RevDelRevisionItem extends RevDelItem {
+       /** @var Revision */
        var $revision;
 
        public function __construct( $list, $row ) {
@@ -470,6 +472,15 @@ class RevDelArchivedRevisionItem extends RevDelArchiveItem {
  * List for oldimage table items
  */
 class RevDelFileList extends RevDelList {
+       /** @var array */
+       var $storeBatch;
+
+       /** @var array */
+       var $deleteBatch;
+
+       /** @var array */
+       var $cleanupBatch;
+
        public function getType() {
                return 'oldimage';
        }
@@ -486,8 +497,6 @@ class RevDelFileList extends RevDelList {
                return File::DELETED_FILE;
        }
 
-       var $storeBatch, $deleteBatch, $cleanupBatch;
-
        /**
         * @param DatabaseBase $db
         * @return mixed
@@ -569,10 +578,7 @@ class RevDelFileList extends RevDelList {
  * Item class for an oldimage table row
  */
 class RevDelFileItem extends RevDelItem {
-
-       /**
-        * @var File
-        */
+       /** @var File */
        var $file;
 
        public function __construct( $list, $row ) {
@@ -1037,7 +1043,9 @@ class RevDelLogItem extends RevDelItem {
                // User links and action text
                $action = $formatter->getActionText();
                // Comment
-               $comment = $this->list->getLanguage()->getDirMark() . Linker::commentBlock( $this->row->log_comment );
+               $comment = $this->list->getLanguage()->getDirMark()
+                       . Linker::commentBlock( $this->row->log_comment );
+
                if ( LogEventsList::isDeleted( $this->row, LogPage::DELETED_COMMENT ) ) {
                        $comment = '<span class="history-deleted">' . $comment . '</span>';
                }
@@ -1053,9 +1061,15 @@ class RevDelLogItem extends RevDelItem {
                        'type' => $logEntry->getType(),
                        'action' => $logEntry->getSubtype(),
                );
-               $ret += $logEntry->isDeleted( LogPage::DELETED_USER ) ? array( 'userhidden' => '' ) : array();
-               $ret += $logEntry->isDeleted( LogPage::DELETED_COMMENT ) ? array( 'commenthidden' => '' ) : array();
-               $ret += $logEntry->isDeleted( LogPage::DELETED_ACTION ) ? array( 'actionhidden' => '' ) : array();
+               $ret += $logEntry->isDeleted( LogPage::DELETED_USER )
+                       ? array( 'userhidden' => '' )
+                       : array();
+               $ret += $logEntry->isDeleted( LogPage::DELETED_COMMENT )
+                       ? array( 'commenthidden' => '' )
+                       : array();
+               $ret += $logEntry->isDeleted( LogPage::DELETED_ACTION )
+                       ? array( 'actionhidden' => '' )
+                       : array();
 
                if ( LogEventsList::userCan( $this->row, LogPage::DELETED_ACTION, $user ) ) {
                        ApiQueryLogEvents::addLogParams(
index 4dc9388..086db3a 100644 (file)
@@ -105,7 +105,9 @@ abstract class RevDelList extends RevisionListBase {
                        $status->itemStatuses = array();
                }
 
+               // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
                for ( $this->reset(); $this->current(); $this->next() ) {
+                       // @codingStandardsIgnoreEnd
                        $item = $this->current();
                        unset( $missing[$item->getId()] );
 
index e3aafe8..82d0907 100644 (file)
@@ -43,4 +43,15 @@ class SearchDatabase extends SearchEngine {
                        $this->db = wfGetDB( DB_SLAVE );
                }
        }
+
+       /**
+        * Return a 'cleaned up' search string
+        *
+        * @param string $text
+        * @return string
+        */
+       protected function filter( $text ) {
+               $lc = $this->legalSearchChars();
+               return trim( preg_replace( "/[^{$lc}]/", " ", $text ) );
+       }
 }
index 3d0655b..56bb0ac 100644 (file)
@@ -318,7 +318,6 @@ class SearchEngine {
 
                $parsed = $query;
                if ( strpos( $query, ':' ) === false ) { // nothing to do
-                       wfRunHooks( 'SearchEngineReplacePrefixesComplete', array( $this, $query, &$parsed ) );
                        return $parsed;
                }
 
@@ -338,8 +337,6 @@ class SearchEngine {
                        $parsed = $query; // prefix was the whole query
                }
 
-               wfRunHooks( 'SearchEngineReplacePrefixesComplete', array( $this, $query, &$parsed ) );
-
                return $parsed;
        }
 
@@ -368,20 +365,8 @@ class SearchEngine {
         * @return array
         */
        public static function userNamespaces( $user ) {
-               global $wgSearchEverythingOnlyLoggedIn;
-
-               $searchableNamespaces = SearchEngine::searchableNamespaces();
-
-               // get search everything preference, that can be set to be read for logged-in users
-               // it overrides other options
-               if ( !$wgSearchEverythingOnlyLoggedIn || $user->isLoggedIn() ) {
-                       if ( $user->getOption( 'searcheverything' ) ) {
-                               return array_keys( $searchableNamespaces );
-                       }
-               }
-
                $arr = array();
-               foreach ( $searchableNamespaces as $ns => $name ) {
+               foreach ( SearchEngine::searchableNamespaces() as $ns => $name ) {
                        if ( $user->getOption( 'searchNs' . $ns ) ) {
                                $arr[] = $ns;
                        }
@@ -431,17 +416,6 @@ class SearchEngine {
                return $formatted;
        }
 
-       /**
-        * Return a 'cleaned up' search string
-        *
-        * @param string $text
-        * @return string
-        */
-       function filter( $text ) {
-               $lc = $this->legalSearchChars();
-               return trim( preg_replace( "/[^{$lc}]/", " ", $text ) );
-       }
-
        /**
         * Load up the appropriate search engine class for the currently
         * active database backend, and return a configured instance.
@@ -567,13 +541,6 @@ class SearchEngine {
        }
 }
 
-/**
- * @ingroup Search
- */
-class SearchResultTooMany {
-       # # Some search engines may bail out if too many matches are found
-}
-
 /**
  * Dummy class to be used when non-supported Database engine is present.
  * @todo FIXME: Dummy class should probably try something at least mildly useful,
index 4960c42..0d1663f 100644 (file)
@@ -162,9 +162,9 @@ class SearchMssql extends SearchDatabase {
                        }
                }
 
-               $searchon = $this->db->strencode( join( ',', $q ) );
+               $searchon = $this->db->addQuotes( join( ',', $q ) );
                $field = $this->getIndexField( $fulltext );
-               return "$field, '$searchon'";
+               return "$field, $searchon";
        }
 
        /**
index 77a0c43..8ff2640 100644 (file)
@@ -125,9 +125,9 @@ class SearchMySQL extends SearchDatabase {
                        wfDebug( __METHOD__ . ": Can't understand search query '{$filteredText}'\n" );
                }
 
-               $searchon = $this->db->strencode( $searchon );
+               $searchon = $this->db->addQuotes( $searchon );
                $field = $this->getIndexField( $fulltext );
-               return " MATCH($field) AGAINST('$searchon' IN BOOLEAN MODE) ";
+               return " MATCH($field) AGAINST($searchon IN BOOLEAN MODE) ";
        }
 
        function regexTerm( $string, $wildcard ) {
index 42b67f3..43fb016 100644 (file)
@@ -42,10 +42,6 @@ class SearchPostgres extends SearchDatabase {
                $olderror = error_reporting( E_ERROR );
                $resultSet = $this->db->resultObject( $this->db->query( $q, 'SearchPostgres', true ) );
                error_reporting( $olderror );
-               if ( !$resultSet ) {
-                       // Needed for "Query requires full scan, GIN doesn't support it"
-                       return new SearchResultTooMany();
-               }
                return new PostgresSearchResultSet( $resultSet, $this->searchTerms );
        }
 
@@ -54,9 +50,6 @@ class SearchPostgres extends SearchDatabase {
                $olderror = error_reporting( E_ERROR );
                $resultSet = $this->db->resultObject( $this->db->query( $q, 'SearchPostgres', true ) );
                error_reporting( $olderror );
-               if ( !$resultSet ) {
-                       return new SearchResultTooMany();
-               }
                return new PostgresSearchResultSet( $resultSet, $this->searchTerms );
        }
 
index f753e3d..f430dd0 100644 (file)
@@ -40,16 +40,6 @@ class SearchResultSet {
                return 0;
        }
 
-       /**
-        * Return true if results are included in this result set.
-        * STUB
-        *
-        * @return bool
-        */
-       function hasResults() {
-               return false;
-       }
-
        /**
         * Some search modes return a total hit count for the query
         * in the entire article database. This may include pages
@@ -200,12 +190,8 @@ class SearchNearMatchResultSet extends SearchResultSet {
                $this->result = $match;
        }
 
-       public function hasResult() {
-               return (bool)$this->result;
-       }
-
        public function numRows() {
-               return $this->hasResults() ? 1 : 0;
+               return $this->result ? 1 : 0;
        }
 
        public function next() {
index 62fb236..8e820f3 100644 (file)
@@ -115,9 +115,9 @@ class SearchSqlite extends SearchDatabase {
                        wfDebug( __METHOD__ . ": Can't understand search query '{$filteredText}'\n" );
                }
 
-               $searchon = $this->db->strencode( $searchon );
+               $searchon = $this->db->addQuotes( $searchon );
                $field = $this->getIndexField( $fulltext );
-               return " $field MATCH '$searchon' ";
+               return " $field MATCH $searchon ";
        }
 
        function regexTerm( $string, $wildcard ) {
index f7c95d1..ad1ee36 100644 (file)
@@ -412,23 +412,16 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                        unset( $legendItems['unpatrolled'] );
                }
                foreach ( $legendItems as $key => $item ) { # generate items of the legend
-                       $label = $item['title'];
+                       $label = isset( $item['legend'] ) ? $item['legend'] : $item['title'];
                        $letter = $item['letter'];
                        $cssClass = isset( $item['class'] ) ? $item['class'] : $key;
 
                        $legend .= Html::element( 'dt',
                                array( 'class' => $cssClass ), $context->msg( $letter )->text()
+                       ) . "\n" .
+                       Html::rawElement( 'dd', array(),
+                               $context->msg( $label )->parse()
                        ) . "\n";
-                       if ( $key === 'newpage' ) {
-                               $legend .= Html::openElement( 'dd' );
-                               $legend .= $context->msg( $label )->escaped();
-                               $legend .= ' ' . $context->msg( 'recentchanges-legend-newpage' )->parse();
-                               $legend .= Html::closeElement( 'dd' ) . "\n";
-                       } else {
-                               $legend .= Html::element( 'dd', array(),
-                                       $context->msg( $label )->text()
-                               ) . "\n";
-                       }
                }
                # (+-123)
                $legend .= Html::rawElement( 'dt',
index 82d6177..c062e27 100644 (file)
@@ -45,12 +45,6 @@ class SpecialPage {
        // Listed in Special:Specialpages?
        private $mListed;
 
-       // Function name called by the default execute()
-       private $mFunction;
-
-       // File which needs to be included before the function above can be called
-       private $mFile;
-
        // Whether or not this special page is being included from an article
        protected $mIncluding;
 
@@ -107,30 +101,18 @@ class SpecialPage {
         * @param string $name Name of the special page, as seen in links and URLs
         * @param string $restriction User right required, e.g. "block" or "delete"
         * @param bool $listed Whether the page is listed in Special:Specialpages
-        * @param callable|bool $function Function called by execute(). By default
-        *   it is constructed from $name
-        * @param string $file File which is included by execute(). It is also
-        *   constructed from $name by default
+        * @param callable|bool $function unused
+        * @param string $file unused
         * @param bool $includable Whether the page can be included in normal pages
         */
        public function __construct(
                $name = '', $restriction = '', $listed = true,
-               $function = false, $file = 'default', $includable = false
+               $function = false, $file = '', $includable = false
        ) {
                $this->mName = $name;
                $this->mRestriction = $restriction;
                $this->mListed = $listed;
                $this->mIncludable = $includable;
-               if ( !$function ) {
-                       $this->mFunction = 'wfSpecial' . $name;
-               } else {
-                       $this->mFunction = $function;
-               }
-               if ( $file === 'default' ) {
-                       $this->mFile = __DIR__ . "/specials/Special$name.php";
-               } else {
-                       $this->mFile = $file;
-               }
        }
 
        /**
@@ -149,19 +131,6 @@ class SpecialPage {
                return $this->mRestriction;
        }
 
-       /**
-        * Get the file which will be included by SpecialPage::execute() if your extension is
-        * still stuck in the past and hasn't overridden the execute() method.  No modern code
-        * should want or need to know this.
-        * @return string
-        * @deprecated since 1.18
-        */
-       function getFile() {
-               wfDeprecated( __METHOD__, '1.18' );
-
-               return $this->mFile;
-       }
-
        // @todo FIXME: Decide which syntax to use for this, and stick to it
        /**
         * Whether this special page is listed in Special:SpecialPages
@@ -347,6 +316,25 @@ class SpecialPage {
                }
        }
 
+       /**
+        * Return an array of subpages beginning with $search that this special page will accept.
+        *
+        * For example, if a page supports subpages "foo", "bar" and "baz" (as in Special:PageName/foo,
+        * etc.):
+        *
+        *   - `prefixSearchSubpages( "ba" )` should return `array( "bar", "baz" )`
+        *   - `prefixSearchSubpages( "f" )` should return `array( "foo" )`
+        *   - `prefixSearchSubpages( "z" )` should return `array()`
+        *   - `prefixSearchSubpages( "" )` should return `array( foo", "bar", "baz" )`
+        *
+        * @param string $search Prefix to search for
+        * @param integer $limit Maximum number of results to return
+        * @return string[] Matching subpages
+        */
+       public function prefixSearchSubpages( $search, $limit = 10 ) {
+               return array();
+       }
+
        /**
         * Sets headers - this should be called from the execute() method of all derived classes!
         */
@@ -414,7 +402,7 @@ class SpecialPage {
 
        /**
         * Default execute method
-        * Checks user permissions, calls the function given in mFunction
+        * Checks user permissions
         *
         * This must be overridden by subclasses; it will be made abstract in a future version
         *
@@ -423,14 +411,7 @@ class SpecialPage {
        public function execute( $subPage ) {
                $this->setHeaders();
                $this->checkPermissions();
-
-               $func = $this->mFunction;
-               // only load file if the function does not exist
-               if ( !is_callable( $func ) && $this->mFile ) {
-                       require_once $this->mFile;
-               }
                $this->outputHeader();
-               call_user_func( $func, $subPage, $this );
        }
 
        /**
@@ -560,24 +541,20 @@ class SpecialPage {
        /**
         * Shortcut to get user's language
         *
-        * @deprecated since 1.19 Use getLanguage instead
         * @return Language
-        * @since 1.18
+        * @since 1.19
         */
-       public function getLang() {
-               wfDeprecated( __METHOD__, '1.19' );
-
-               return $this->getLanguage();
+       public function getLanguage() {
+               return $this->getContext()->getLanguage();
        }
 
        /**
-        * Shortcut to get user's language
-        *
-        * @return Language
-        * @since 1.19
+        * Shortcut to get main config object
+        * @return Config
+        * @since 1.24
         */
-       public function getLanguage() {
-               return $this->getContext()->getLanguage();
+       public function getConfig() {
+               return $this->getContext()->getConfig();
        }
 
        /**
index 53cef7f..0ee7f09 100644 (file)
@@ -347,10 +347,10 @@ class SpecialPageFactory {
 
                                return new $className;
                        } elseif ( is_array( $rec ) ) {
-                               // @deprecated, officially since 1.18, unofficially since forever
-                               wfDebug( "Array syntax for \$wgSpecialPages is deprecated, " .
-                                       "define a subclass of SpecialPage instead." );
                                $className = array_shift( $rec );
+                               // @deprecated, officially since 1.18, unofficially since forever
+                               wfDeprecated( "Array syntax for \$wgSpecialPages is deprecated ($className), " .
+                                       "define a subclass of SpecialPage instead.", '1.18' );
                                self::getList()->$realName = MWFunction::newObj( $className, $rec );
                        }
 
@@ -364,8 +364,8 @@ class SpecialPageFactory {
         * Return categorised listable special pages which are available
         * for the current user, and everyone.
         *
-        * @param User $user User object to check permissions, $wgUser will be used if
-        *   if not provided
+        * @param User $user User object to check permissions, $wgUser will be used
+        *        if not provided
         * @return array ( string => Specialpage )
         */
        public static function getUsablePages( User $user = null ) {
diff --git a/includes/specials/SpecialAllMessages.php b/includes/specials/SpecialAllMessages.php
new file mode 100644 (file)
index 0000000..d44b94e
--- /dev/null
@@ -0,0 +1,483 @@
+<?php
+/**
+ * Implements Special:Allmessages
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup SpecialPage
+ */
+
+/**
+ * Use this special page to get a list of the MediaWiki system messages.
+ *
+ * @file
+ * @ingroup SpecialPage
+ */
+class SpecialAllMessages extends SpecialPage {
+       /**
+        * @var AllmessagesTablePager
+        */
+       protected $table;
+
+       /**
+        * Constructor
+        */
+       public function __construct() {
+               parent::__construct( 'Allmessages' );
+       }
+
+       /**
+        * Show the special page
+        *
+        * @param string $par Parameter passed to the page or null
+        */
+       public function execute( $par ) {
+               $request = $this->getRequest();
+               $out = $this->getOutput();
+
+               $this->setHeaders();
+
+               global $wgUseDatabaseMessages;
+               if ( !$wgUseDatabaseMessages ) {
+                       $out->addWikiMsg( 'allmessagesnotsupportedDB' );
+
+                       return;
+               } else {
+                       $this->outputHeader( 'allmessagestext' );
+               }
+
+               $out->addModuleStyles( 'mediawiki.special' );
+
+               $this->table = new AllmessagesTablePager(
+                       $this,
+                       array(),
+                       wfGetLangObj( $request->getVal( 'lang', $par ) )
+               );
+
+               $this->langcode = $this->table->lang->getCode();
+
+               $out->addHTML( $this->table->buildForm() .
+                       $this->table->getNavigationBar() .
+                       $this->table->getBody() .
+                       $this->table->getNavigationBar() );
+       }
+
+       protected function getGroupName() {
+               return 'wiki';
+       }
+}
+
+/**
+ * Use TablePager for prettified output. We have to pretend that we're
+ * getting data from a table when in fact not all of it comes from the database.
+ */
+class AllMessagesTablePager extends TablePager {
+       protected $filter, $prefix, $langcode, $displayPrefix;
+
+       public $mLimitsShown;
+
+       /**
+        * @var Language
+        */
+       public $lang;
+
+       /**
+        * @var null|bool
+        */
+       public $custom;
+
+       function __construct( $page, $conds, $langObj = null ) {
+               parent::__construct( $page->getContext() );
+               $this->mIndexField = 'am_title';
+               $this->mPage = $page;
+               $this->mConds = $conds;
+               $this->mDefaultDirection = true; // always sort ascending
+               $this->mLimitsShown = array( 20, 50, 100, 250, 500, 5000 );
+
+               global $wgContLang;
+
+               $this->talk = $this->msg( 'talkpagelinktext' )->escaped();
+
+               $this->lang = ( $langObj ? $langObj : $wgContLang );
+               $this->langcode = $this->lang->getCode();
+               $this->foreign = $this->langcode !== $wgContLang->getCode();
+
+               $request = $this->getRequest();
+
+               $this->filter = $request->getVal( 'filter', 'all' );
+               if ( $this->filter === 'all' ) {
+                       $this->custom = null; // So won't match in either case
+               } else {
+                       $this->custom = ( $this->filter === 'unmodified' );
+               }
+
+               $prefix = $this->getLanguage()->ucfirst( $request->getVal( 'prefix', '' ) );
+               $prefix = $prefix !== '' ?
+                       Title::makeTitleSafe( NS_MEDIAWIKI, $request->getVal( 'prefix', null ) ) :
+                       null;
+
+               if ( $prefix !== null ) {
+                       $this->displayPrefix = $prefix->getDBkey();
+                       $this->prefix = '/^' . preg_quote( $this->displayPrefix ) . '/i';
+               } else {
+                       $this->displayPrefix = false;
+                       $this->prefix = false;
+               }
+
+               // The suffix that may be needed for message names if we're in a
+               // different language (eg [[MediaWiki:Foo/fr]]: $suffix = '/fr'
+               if ( $this->foreign ) {
+                       $this->suffix = '/' . $this->langcode;
+               } else {
+                       $this->suffix = '';
+               }
+       }
+
+       function buildForm() {
+               global $wgScript;
+
+               $attrs = array( 'id' => 'mw-allmessages-form-lang', 'name' => 'lang' );
+               $msg = wfMessage( 'allmessages-language' );
+               $langSelect = Xml::languageSelector( $this->langcode, false, null, $attrs, $msg );
+
+               $out = Xml::openElement( 'form', array(
+                               'method' => 'get',
+                               'action' => $wgScript,
+                               'id' => 'mw-allmessages-form'
+                       ) ) .
+                       Xml::fieldset( $this->msg( 'allmessages-filter-legend' )->text() ) .
+                       Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
+                       Xml::openElement( 'table', array( 'class' => 'mw-allmessages-table' ) ) . "\n" .
+                       '<tr>
+                               <td class="mw-label">' .
+                       Xml::label( $this->msg( 'allmessages-prefix' )->text(), 'mw-allmessages-form-prefix' ) .
+                       "</td>\n
+                       <td class=\"mw-input\">" .
+                       Xml::input(
+                               'prefix',
+                               20,
+                               str_replace( '_', ' ', $this->displayPrefix ),
+                               array( 'id' => 'mw-allmessages-form-prefix' )
+                       ) .
+                       "</td>\n
+                       </tr>
+                       <tr>\n
+                       <td class='mw-label'>" .
+                       $this->msg( 'allmessages-filter' )->escaped() .
+                       "</td>\n
+                               <td class='mw-input'>" .
+                       Xml::radioLabel( $this->msg( 'allmessages-filter-unmodified' )->text(),
+                               'filter',
+                               'unmodified',
+                               'mw-allmessages-form-filter-unmodified',
+                               ( $this->filter === 'unmodified' )
+                       ) .
+                       Xml::radioLabel( $this->msg( 'allmessages-filter-all' )->text(),
+                               'filter',
+                               'all',
+                               'mw-allmessages-form-filter-all',
+                               ( $this->filter === 'all' )
+                       ) .
+                       Xml::radioLabel( $this->msg( 'allmessages-filter-modified' )->text(),
+                               'filter',
+                               'modified',
+                               'mw-allmessages-form-filter-modified',
+                               ( $this->filter === 'modified' )
+                       ) .
+                       "</td>\n
+                       </tr>
+                       <tr>\n
+                               <td class=\"mw-label\">" . $langSelect[0] . "</td>\n
+                               <td class=\"mw-input\">" . $langSelect[1] . "</td>\n
+                       </tr>" .
+
+                       '<tr>
+                               <td class="mw-label">' .
+                       Xml::label( $this->msg( 'table_pager_limit_label' )->text(), 'mw-table_pager_limit_label' ) .
+                       '</td>
+                       <td class="mw-input">' .
+                       $this->getLimitSelect() .
+                       '</td>
+                       <tr>
+                               <td></td>
+                               <td>' .
+                       Xml::submitButton( $this->msg( 'allmessages-filter-submit' )->text() ) .
+                       "</td>\n
+                       </tr>" .
+
+                       Xml::closeElement( 'table' ) .
+                       $this->getHiddenFields( array( 'title', 'prefix', 'filter', 'lang', 'limit' ) ) .
+                       Xml::closeElement( 'fieldset' ) .
+                       Xml::closeElement( 'form' );
+
+               return $out;
+       }
+
+       function getAllMessages( $descending ) {
+               wfProfileIn( __METHOD__ );
+               $messageNames = Language::getLocalisationCache()->getSubitemList( 'en', 'messages' );
+               if ( $descending ) {
+                       rsort( $messageNames );
+               } else {
+                       asort( $messageNames );
+               }
+
+               // Normalise message names so they look like page titles
+               $messageNames = array_map( array( $this->lang, 'ucfirst' ), $messageNames );
+
+               wfProfileOut( __METHOD__ );
+
+               return $messageNames;
+       }
+
+       /**
+        * Determine which of the MediaWiki and MediaWiki_talk namespace pages exist.
+        * Returns array( 'pages' => ..., 'talks' => ... ), where the subarrays have
+        * an entry for each existing page, with the key being the message name and
+        * value arbitrary.
+        *
+        * @param array $messageNames
+        * @param string $langcode What language code
+        * @param bool $foreign Whether the $langcode is not the content language
+        * @return array A 'pages' and 'talks' array with the keys of existing pages
+        */
+       public static function getCustomisedStatuses( $messageNames, $langcode = 'en', $foreign = false ) {
+               // FIXME: This function should be moved to Language:: or something.
+               wfProfileIn( __METHOD__ . '-db' );
+
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( 'page',
+                       array( 'page_namespace', 'page_title' ),
+                       array( 'page_namespace' => array( NS_MEDIAWIKI, NS_MEDIAWIKI_TALK ) ),
+                       __METHOD__,
+                       array( 'USE INDEX' => 'name_title' )
+               );
+               $xNames = array_flip( $messageNames );
+
+               $pageFlags = $talkFlags = array();
+
+               foreach ( $res as $s ) {
+                       $exists = false;
+
+                       if ( $foreign ) {
+                               $titleParts = explode( '/', $s->page_title );
+                               if ( count( $titleParts ) === 2 &&
+                                       $langcode === $titleParts[1] &&
+                                       isset( $xNames[$titleParts[0]] )
+                               ) {
+                                       $exists = $titleParts[0];
+                               }
+                       } elseif ( isset( $xNames[$s->page_title] ) ) {
+                               $exists = $s->page_title;
+                       }
+
+                       $title = Title::newFromRow( $s );
+                       if ( $exists && $title->inNamespace( NS_MEDIAWIKI ) ) {
+                               $pageFlags[$exists] = true;
+                       } elseif ( $exists && $title->inNamespace( NS_MEDIAWIKI_TALK ) ) {
+                               $talkFlags[$exists] = true;
+                       }
+               }
+
+               wfProfileOut( __METHOD__ . '-db' );
+
+               return array( 'pages' => $pageFlags, 'talks' => $talkFlags );
+       }
+
+       /**
+        *  This function normally does a database query to get the results; we need
+        * to make a pretend result using a FakeResultWrapper.
+        * @param string $offset
+        * @param int $limit
+        * @param bool $descending
+        * @return FakeResultWrapper
+        */
+       function reallyDoQuery( $offset, $limit, $descending ) {
+               $result = new FakeResultWrapper( array() );
+
+               $messageNames = $this->getAllMessages( $descending );
+               $statuses = self::getCustomisedStatuses( $messageNames, $this->langcode, $this->foreign );
+
+               $count = 0;
+               foreach ( $messageNames as $key ) {
+                       $customised = isset( $statuses['pages'][$key] );
+                       if ( $customised !== $this->custom &&
+                               ( $descending && ( $key < $offset || !$offset ) || !$descending && $key > $offset ) &&
+                               ( ( $this->prefix && preg_match( $this->prefix, $key ) ) || $this->prefix === false )
+                       ) {
+                               $actual = wfMessage( $key )->inLanguage( $this->langcode )->plain();
+                               $default = wfMessage( $key )->inLanguage( $this->langcode )->useDatabase( false )->plain();
+                               $result->result[] = array(
+                                       'am_title' => $key,
+                                       'am_actual' => $actual,
+                                       'am_default' => $default,
+                                       'am_customised' => $customised,
+                                       'am_talk_exists' => isset( $statuses['talks'][$key] )
+                               );
+                               $count++;
+                       }
+
+                       if ( $count === $limit ) {
+                               break;
+                       }
+               }
+
+               return $result;
+       }
+
+       function getStartBody() {
+               return Xml::openElement( 'table', array(
+                               'class' => 'mw-datatable TablePager',
+                               'id' => 'mw-allmessagestable'
+                       ) ) .
+                       "\n" .
+                       "<thead><tr>
+                               <th rowspan=\"2\">" .
+                       $this->msg( 'allmessagesname' )->escaped() . "
+                               </th>
+                               <th>" .
+                       $this->msg( 'allmessagesdefault' )->escaped() .
+                       "</th>
+                       </tr>\n
+                       <tr>
+                               <th>" .
+                       $this->msg( 'allmessagescurrent' )->escaped() .
+                       "</th>
+                       </tr></thead><tbody>\n";
+       }
+
+       function formatValue( $field, $value ) {
+               switch ( $field ) {
+                       case 'am_title' :
+                               $title = Title::makeTitle( NS_MEDIAWIKI, $value . $this->suffix );
+                               $talk = Title::makeTitle( NS_MEDIAWIKI_TALK, $value . $this->suffix );
+                               $translation = Linker::makeExternalLink(
+                                       'https://translatewiki.net/w/i.php?' . wfArrayToCgi( array(
+                                               'title' => 'Special:SearchTranslations',
+                                               'group' => 'mediawiki',
+                                               'grouppath' => 'mediawiki',
+                                               'query' => 'language:' . $this->getLanguage()->getCode() . '^25 ' .
+                                                       'messageid:"MediaWiki:' . $value . '"^10 "' .
+                                                       $this->msg( $value )->inLanguage( 'en' )->plain() . '"'
+                                       ) ),
+                                       $this->msg( 'allmessages-filter-translate' )->text()
+                               );
+
+                               if ( $this->mCurrentRow->am_customised ) {
+                                       $title = Linker::linkKnown( $title, $this->getLanguage()->lcfirst( $value ) );
+                               } else {
+                                       $title = Linker::link(
+                                               $title,
+                                               $this->getLanguage()->lcfirst( $value ),
+                                               array(),
+                                               array(),
+                                               array( 'broken' )
+                                       );
+                               }
+                               if ( $this->mCurrentRow->am_talk_exists ) {
+                                       $talk = Linker::linkKnown( $talk, $this->talk );
+                               } else {
+                                       $talk = Linker::link(
+                                               $talk,
+                                               $this->talk,
+                                               array(),
+                                               array(),
+                                               array( 'broken' )
+                                       );
+                               }
+
+                               return $title . ' '
+                               . $this->msg( 'parentheses' )->rawParams( $talk )->escaped()
+                               . ' '
+                               . $this->msg( 'parentheses' )->rawParams( $translation )->escaped();
+
+                       case 'am_default' :
+                       case 'am_actual' :
+                               return Sanitizer::escapeHtmlAllowEntities( $value, ENT_QUOTES );
+               }
+
+               return '';
+       }
+
+       function formatRow( $row ) {
+               // Do all the normal stuff
+               $s = parent::formatRow( $row );
+
+               // But if there's a customised message, add that too.
+               if ( $row->am_customised ) {
+                       $s .= Xml::openElement( 'tr', $this->getRowAttrs( $row, true ) );
+                       $formatted = strval( $this->formatValue( 'am_actual', $row->am_actual ) );
+
+                       if ( $formatted === '' ) {
+                               $formatted = '&#160;';
+                       }
+
+                       $s .= Xml::tags( 'td', $this->getCellAttrs( 'am_actual', $row->am_actual ), $formatted )
+                               . "</tr>\n";
+               }
+
+               return $s;
+       }
+
+       function getRowAttrs( $row, $isSecond = false ) {
+               $arr = array();
+
+               if ( $row->am_customised ) {
+                       $arr['class'] = 'allmessages-customised';
+               }
+
+               if ( !$isSecond ) {
+                       $arr['id'] = Sanitizer::escapeId( 'msg_' . $this->getLanguage()->lcfirst( $row->am_title ) );
+               }
+
+               return $arr;
+       }
+
+       function getCellAttrs( $field, $value ) {
+               if ( $this->mCurrentRow->am_customised && $field === 'am_title' ) {
+                       return array( 'rowspan' => '2', 'class' => $field );
+               } elseif ( $field === 'am_title' ) {
+                       return array( 'class' => $field );
+               } else {
+                       return array( 'lang' => $this->langcode, 'dir' => $this->lang->getDir(), 'class' => $field );
+               }
+       }
+
+       // This is not actually used, as getStartBody is overridden above
+       function getFieldNames() {
+               return array(
+                       'am_title' => $this->msg( 'allmessagesname' )->text(),
+                       'am_default' => $this->msg( 'allmessagesdefault' )->text()
+               );
+       }
+
+       function getTitle() {
+               return SpecialPage::getTitleFor( 'Allmessages', false );
+       }
+
+       function isFieldSortable( $x ) {
+               return false;
+       }
+
+       function getDefaultSort() {
+               return '';
+       }
+
+       function getQueryInfo() {
+               return '';
+       }
+}
diff --git a/includes/specials/SpecialAllPages.php b/includes/specials/SpecialAllPages.php
new file mode 100644 (file)
index 0000000..17e080f
--- /dev/null
@@ -0,0 +1,396 @@
+<?php
+/**
+ * Implements Special:Allpages
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup SpecialPage
+ */
+
+/**
+ * Implements Special:Allpages
+ *
+ * @ingroup SpecialPage
+ */
+class SpecialAllPages extends IncludableSpecialPage {
+
+       /**
+        * Maximum number of pages to show on single subpage.
+        *
+        * @var int $maxPerPage
+        */
+       protected $maxPerPage = 345;
+
+       /**
+        * Determines, which message describes the input field 'nsfrom'.
+        *
+        * @var string $nsfromMsg
+        */
+       protected $nsfromMsg = 'allpagesfrom';
+
+       /**
+        * Constructor
+        *
+        * @param string $name name of the special page, as seen in links and URLs (default: 'Allpages')
+        */
+       function __construct( $name = 'Allpages' ) {
+               parent::__construct( $name );
+       }
+
+       /**
+        * Entry point : initialise variables and call subfunctions.
+        *
+        * @param string $par becomes "FOO" when called like Special:Allpages/FOO (default null)
+        */
+       function execute( $par ) {
+               $request = $this->getRequest();
+               $out = $this->getOutput();
+
+               $this->setHeaders();
+               $this->outputHeader();
+               $out->allowClickjacking();
+
+               # GET values
+               $from = $request->getVal( 'from', null );
+               $to = $request->getVal( 'to', null );
+               $namespace = $request->getInt( 'namespace' );
+               $hideredirects = $request->getBool( 'hideredirects', false );
+
+               $namespaces = $this->getContext()->getLanguage()->getNamespaces();
+
+               $out->setPageTitle(
+                       ( $namespace > 0 && array_key_exists( $namespace, $namespaces ) ) ?
+                               $this->msg( 'allinnamespace', str_replace( '_', ' ', $namespaces[$namespace] ) ) :
+                               $this->msg( 'allarticles' )
+               );
+               $out->addModuleStyles( 'mediawiki.special' );
+
+               if ( $par !== null ) {
+                       $this->showChunk( $namespace, $par, $to, $hideredirects );
+               } elseif ( $from !== null && $to === null ) {
+                       $this->showChunk( $namespace, $from, $to, $hideredirects );
+               } else {
+                       $this->showToplevel( $namespace, $from, $to, $hideredirects );
+               }
+       }
+
+       /**
+        * HTML for the top form
+        *
+        * @param int $namespace A namespace constant (default NS_MAIN).
+        * @param string $from DbKey we are starting listing at.
+        * @param string $to DbKey we are ending listing at.
+        * @param bool $hideredirects Dont show redirects  (default false)
+        * @return string
+        */
+       function namespaceForm( $namespace = NS_MAIN, $from = '', $to = '', $hideredirects = false ) {
+               global $wgScript;
+               $t = $this->getPageTitle();
+
+               $out = Xml::openElement( 'div', array( 'class' => 'namespaceoptions' ) );
+               $out .= Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) );
+               $out .= Html::hidden( 'title', $t->getPrefixedText() );
+               $out .= Xml::openElement( 'fieldset' );
+               $out .= Xml::element( 'legend', null, $this->msg( 'allpages' )->text() );
+               $out .= Xml::openElement( 'table', array( 'id' => 'nsselect', 'class' => 'allpages' ) );
+               $out .= "<tr>
+       <td class='mw-label'>" .
+                       Xml::label( $this->msg( 'allpagesfrom' )->text(), 'nsfrom' ) .
+                       "       </td>
+       <td class='mw-input'>" .
+                       Xml::input( 'from', 30, str_replace( '_', ' ', $from ), array( 'id' => 'nsfrom' ) ) .
+                       "       </td>
+</tr>
+<tr>
+       <td class='mw-label'>" .
+                       Xml::label( $this->msg( 'allpagesto' )->text(), 'nsto' ) .
+                       "       </td>
+                       <td class='mw-input'>" .
+                       Xml::input( 'to', 30, str_replace( '_', ' ', $to ), array( 'id' => 'nsto' ) ) .
+                       "               </td>
+</tr>
+<tr>
+       <td class='mw-label'>" .
+                       Xml::label( $this->msg( 'namespace' )->text(), 'namespace' ) .
+                       "       </td>
+                       <td class='mw-input'>" .
+                       Html::namespaceSelector(
+                               array( 'selected' => $namespace ),
+                               array( 'name' => 'namespace', 'id' => 'namespace' )
+                       ) . ' ' .
+                       Xml::checkLabel(
+                               $this->msg( 'allpages-hide-redirects' )->text(),
+                               'hideredirects',
+                               'hideredirects',
+                               $hideredirects
+                       ) . ' ' .
+                       Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) .
+                       "       </td>
+</tr>";
+               $out .= Xml::closeElement( 'table' );
+               $out .= Xml::closeElement( 'fieldset' );
+               $out .= Xml::closeElement( 'form' );
+               $out .= Xml::closeElement( 'div' );
+
+               return $out;
+       }
+
+       /**
+        * @param int $namespace (default NS_MAIN)
+        * @param string $from List all pages from this name
+        * @param string $to List all pages to this name
+        * @param bool $hideredirects Dont show redirects (default false)
+        */
+       function showToplevel( $namespace = NS_MAIN, $from = '', $to = '', $hideredirects = false ) {
+               $from = Title::makeTitleSafe( $namespace, $from );
+               $to = Title::makeTitleSafe( $namespace, $to );
+               $from = ( $from && $from->isLocal() ) ? $from->getDBkey() : null;
+               $to = ( $to && $to->isLocal() ) ? $to->getDBkey() : null;
+
+               $this->showChunk( $namespace, $from, $to, $hideredirects );
+       }
+
+       /**
+        * @param int $namespace Namespace (Default NS_MAIN)
+        * @param string $from List all pages from this name (default false)
+        * @param string $to List all pages to this name (default false)
+        * @param bool $hideredirects Dont show redirects (default false)
+        */
+       function showChunk( $namespace = NS_MAIN, $from = false, $to = false, $hideredirects = false ) {
+               $output = $this->getOutput();
+
+               $fromList = $this->getNamespaceKeyAndText( $namespace, $from );
+               $toList = $this->getNamespaceKeyAndText( $namespace, $to );
+               $namespaces = $this->getContext()->getLanguage()->getNamespaces();
+               $n = 0;
+
+               if ( !$fromList || !$toList ) {
+                       $out = $this->msg( 'allpagesbadtitle' )->parseAsBlock();
+               } elseif ( !array_key_exists( $namespace, $namespaces ) ) {
+                       // Show errormessage and reset to NS_MAIN
+                       $out = $this->msg( 'allpages-bad-ns', $namespace )->parse();
+                       $namespace = NS_MAIN;
+               } else {
+                       list( $namespace, $fromKey, $from ) = $fromList;
+                       list( , $toKey, $to ) = $toList;
+
+                       $dbr = wfGetDB( DB_SLAVE );
+                       $conds = array(
+                               'page_namespace' => $namespace,
+                               'page_title >= ' . $dbr->addQuotes( $fromKey )
+                       );
+
+                       if ( $hideredirects ) {
+                               $conds['page_is_redirect'] = 0;
+                       }
+
+                       if ( $toKey !== "" ) {
+                               $conds[] = 'page_title <= ' . $dbr->addQuotes( $toKey );
+                       }
+
+                       $res = $dbr->select( 'page',
+                               array( 'page_namespace', 'page_title', 'page_is_redirect', 'page_id' ),
+                               $conds,
+                               __METHOD__,
+                               array(
+                                       'ORDER BY' => 'page_title',
+                                       'LIMIT' => $this->maxPerPage + 1,
+                                       'USE INDEX' => 'name_title',
+                               )
+                       );
+
+                       if ( $res->numRows() > 0 ) {
+                               $out = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-chunk' ) );
+                               while ( ( $n < $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
+                                       $t = Title::newFromRow( $s );
+                                       if ( $t ) {
+                                               $link = ( $s->page_is_redirect ? '<div class="allpagesredirect">' : '' ) .
+                                                       Linker::link( $t ) .
+                                                       ( $s->page_is_redirect ? '</div>' : '' );
+                                       } else {
+                                               $link = '[[' . htmlspecialchars( $s->page_title ) . ']]';
+                                       }
+
+                                       if ( $n % 3 == 0 ) {
+                                               $out .= '<tr>';
+                                       }
+
+                                       $out .= "<td style=\"width:33%\">$link</td>";
+                                       $n++;
+                                       if ( $n % 3 == 0 ) {
+                                               $out .= "</tr>\n";
+                                       }
+                               }
+
+                               if ( ( $n % 3 ) != 0 ) {
+                                       $out .= "</tr>\n";
+                               }
+                               $out .= Xml::closeElement( 'table' );
+                       } else {
+                               $out = '';
+                       }
+               }
+
+               if ( $this->including() ) {
+                       $output->addHTML( $out );
+                       return;
+               }
+
+               if ( $from == '' ) {
+                       // First chunk; no previous link.
+                       $prevTitle = null;
+               } else {
+                       # Get the last title from previous chunk
+                       $dbr = wfGetDB( DB_SLAVE );
+                       $res_prev = $dbr->select(
+                               'page',
+                               'page_title',
+                               array( 'page_namespace' => $namespace, 'page_title < ' . $dbr->addQuotes( $from ) ),
+                               __METHOD__,
+                               array( 'ORDER BY' => 'page_title DESC',
+                                       'LIMIT' => $this->maxPerPage, 'OFFSET' => ( $this->maxPerPage - 1 )
+                               )
+                       );
+
+                       # Get first title of previous complete chunk
+                       if ( $dbr->numrows( $res_prev ) >= $this->maxPerPage ) {
+                               $pt = $dbr->fetchObject( $res_prev );
+                               $prevTitle = Title::makeTitle( $namespace, $pt->page_title );
+                       } else {
+                               # The previous chunk is not complete, need to link to the very first title
+                               # available in the database
+                               $options = array( 'LIMIT' => 1 );
+                               if ( !$dbr->implicitOrderby() ) {
+                                       $options['ORDER BY'] = 'page_title';
+                               }
+                               $reallyFirstPage_title = $dbr->selectField( 'page', 'page_title',
+                                       array( 'page_namespace' => $namespace ), __METHOD__, $options );
+                               # Show the previous link if it s not the current requested chunk
+                               if ( $from != $reallyFirstPage_title ) {
+                                       $prevTitle = Title::makeTitle( $namespace, $reallyFirstPage_title );
+                               } else {
+                                       $prevTitle = null;
+                               }
+                       }
+               }
+
+               $self = $this->getPageTitle();
+
+               $topLinks = array(
+                       Linker::link( $self, $this->msg( 'allpages' )->escaped() )
+               );
+               $bottomLinks = array();
+
+               # Do we put a previous link ?
+               if ( $prevTitle && $pt = $prevTitle->getText() ) {
+                       $query = array( 'from' => $prevTitle->getText() );
+
+                       if ( $namespace ) {
+                               $query['namespace'] = $namespace;
+                       }
+
+                       if ( $hideredirects ) {
+                               $query['hideredirects'] = $hideredirects;
+                       }
+
+                       $prevLink = Linker::linkKnown(
+                               $self,
+                               $this->msg( 'prevpage', $pt )->escaped(),
+                               array(),
+                               $query
+                       );
+                       $topLinks[] = $prevLink;
+                       $bottomLinks[] = $prevLink;
+               }
+
+               if ( $n == $this->maxPerPage && $s = $res->fetchObject() ) {
+                       # $s is the first link of the next chunk
+                       $t = Title::makeTitle( $namespace, $s->page_title );
+                       $query = array( 'from' => $t->getText() );
+
+                       if ( $namespace ) {
+                               $query['namespace'] = $namespace;
+                       }
+
+                       if ( $hideredirects ) {
+                               $query['hideredirects'] = $hideredirects;
+                       }
+
+                       $nextLink = Linker::linkKnown(
+                               $self,
+                               $this->msg( 'nextpage', $t->getText() )->escaped(),
+                               array(),
+                               $query
+                       );
+                       $topLinks[] = $nextLink;
+                       $bottomLinks[] = $nextLink;
+               }
+
+               $nsForm = $this->namespaceForm( $namespace, $from, $to, $hideredirects );
+               $out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ) .
+                       '<tr>
+                                               <td>' .
+                       $nsForm .
+                       '</td>
+                                               <td class="mw-allpages-nav">' .
+                       $this->getLanguage()->pipeList( $topLinks ) .
+                       '</td></tr></table>';
+
+               $output->addHTML( $out2 . $out );
+
+               if ( count( $bottomLinks ) ) {
+                       $output->addHTML(
+                               Html::element( 'hr' ) .
+                                       Html::rawElement( 'div', array( 'class' => 'mw-allpages-nav' ),
+                                               $this->getLanguage()->pipeList( $bottomLinks )
+                                       )
+                       );
+               }
+       }
+
+       /**
+        * @param int $ns The namespace of the article
+        * @param string $text The name of the article
+        * @return array( int namespace, string dbkey, string pagename ) or null on error
+        */
+       protected function getNamespaceKeyAndText( $ns, $text ) {
+               if ( $text == '' ) {
+                       # shortcut for common case
+                       return array( $ns, '', '' );
+               }
+
+               $t = Title::makeTitleSafe( $ns, $text );
+               if ( $t && $t->isLocal() ) {
+                       return array( $t->getNamespace(), $t->getDBkey(), $t->getText() );
+               } elseif ( $t ) {
+                       return null;
+               }
+
+               # try again, in case the problem was an empty pagename
+               $text = preg_replace( '/(#|$)/', 'X$1', $text );
+               $t = Title::makeTitleSafe( $ns, $text );
+               if ( $t && $t->isLocal() ) {
+                       return array( $t->getNamespace(), '', '' );
+               } else {
+                       return null;
+               }
+       }
+
+       protected function getGroupName() {
+               return 'pages';
+       }
+}
diff --git a/includes/specials/SpecialAllmessages.php b/includes/specials/SpecialAllmessages.php
deleted file mode 100644 (file)
index 687cbd0..0000000
+++ /dev/null
@@ -1,483 +0,0 @@
-<?php
-/**
- * Implements Special:Allmessages
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup SpecialPage
- */
-
-/**
- * Use this special page to get a list of the MediaWiki system messages.
- *
- * @file
- * @ingroup SpecialPage
- */
-class SpecialAllmessages extends SpecialPage {
-       /**
-        * @var AllmessagesTablePager
-        */
-       protected $table;
-
-       /**
-        * Constructor
-        */
-       public function __construct() {
-               parent::__construct( 'Allmessages' );
-       }
-
-       /**
-        * Show the special page
-        *
-        * @param string $par Parameter passed to the page or null
-        */
-       public function execute( $par ) {
-               $request = $this->getRequest();
-               $out = $this->getOutput();
-
-               $this->setHeaders();
-
-               global $wgUseDatabaseMessages;
-               if ( !$wgUseDatabaseMessages ) {
-                       $out->addWikiMsg( 'allmessagesnotsupportedDB' );
-
-                       return;
-               } else {
-                       $this->outputHeader( 'allmessagestext' );
-               }
-
-               $out->addModuleStyles( 'mediawiki.special' );
-
-               $this->table = new AllmessagesTablePager(
-                       $this,
-                       array(),
-                       wfGetLangObj( $request->getVal( 'lang', $par ) )
-               );
-
-               $this->langcode = $this->table->lang->getCode();
-
-               $out->addHTML( $this->table->buildForm() .
-                       $this->table->getNavigationBar() .
-                       $this->table->getBody() .
-                       $this->table->getNavigationBar() );
-       }
-
-       protected function getGroupName() {
-               return 'wiki';
-       }
-}
-
-/**
- * Use TablePager for prettified output. We have to pretend that we're
- * getting data from a table when in fact not all of it comes from the database.
- */
-class AllmessagesTablePager extends TablePager {
-       protected $filter, $prefix, $langcode, $displayPrefix;
-
-       public $mLimitsShown;
-
-       /**
-        * @var Language
-        */
-       public $lang;
-
-       /**
-        * @var null|bool
-        */
-       public $custom;
-
-       function __construct( $page, $conds, $langObj = null ) {
-               parent::__construct( $page->getContext() );
-               $this->mIndexField = 'am_title';
-               $this->mPage = $page;
-               $this->mConds = $conds;
-               $this->mDefaultDirection = true; // always sort ascending
-               $this->mLimitsShown = array( 20, 50, 100, 250, 500, 5000 );
-
-               global $wgContLang;
-
-               $this->talk = $this->msg( 'talkpagelinktext' )->escaped();
-
-               $this->lang = ( $langObj ? $langObj : $wgContLang );
-               $this->langcode = $this->lang->getCode();
-               $this->foreign = $this->langcode !== $wgContLang->getCode();
-
-               $request = $this->getRequest();
-
-               $this->filter = $request->getVal( 'filter', 'all' );
-               if ( $this->filter === 'all' ) {
-                       $this->custom = null; // So won't match in either case
-               } else {
-                       $this->custom = ( $this->filter === 'unmodified' );
-               }
-
-               $prefix = $this->getLanguage()->ucfirst( $request->getVal( 'prefix', '' ) );
-               $prefix = $prefix !== '' ?
-                       Title::makeTitleSafe( NS_MEDIAWIKI, $request->getVal( 'prefix', null ) ) :
-                       null;
-
-               if ( $prefix !== null ) {
-                       $this->displayPrefix = $prefix->getDBkey();
-                       $this->prefix = '/^' . preg_quote( $this->displayPrefix ) . '/i';
-               } else {
-                       $this->displayPrefix = false;
-                       $this->prefix = false;
-               }
-
-               // The suffix that may be needed for message names if we're in a
-               // different language (eg [[MediaWiki:Foo/fr]]: $suffix = '/fr'
-               if ( $this->foreign ) {
-                       $this->suffix = '/' . $this->langcode;
-               } else {
-                       $this->suffix = '';
-               }
-       }
-
-       function buildForm() {
-               global $wgScript;
-
-               $attrs = array( 'id' => 'mw-allmessages-form-lang', 'name' => 'lang' );
-               $msg = wfMessage( 'allmessages-language' );
-               $langSelect = Xml::languageSelector( $this->langcode, false, null, $attrs, $msg );
-
-               $out = Xml::openElement( 'form', array(
-                               'method' => 'get',
-                               'action' => $wgScript,
-                               'id' => 'mw-allmessages-form'
-                       ) ) .
-                       Xml::fieldset( $this->msg( 'allmessages-filter-legend' )->text() ) .
-                       Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
-                       Xml::openElement( 'table', array( 'class' => 'mw-allmessages-table' ) ) . "\n" .
-                       '<tr>
-                               <td class="mw-label">' .
-                       Xml::label( $this->msg( 'allmessages-prefix' )->text(), 'mw-allmessages-form-prefix' ) .
-                       "</td>\n
-                       <td class=\"mw-input\">" .
-                       Xml::input(
-                               'prefix',
-                               20,
-                               str_replace( '_', ' ', $this->displayPrefix ),
-                               array( 'id' => 'mw-allmessages-form-prefix' )
-                       ) .
-                       "</td>\n
-                       </tr>
-                       <tr>\n
-                       <td class='mw-label'>" .
-                       $this->msg( 'allmessages-filter' )->escaped() .
-                       "</td>\n
-                               <td class='mw-input'>" .
-                       Xml::radioLabel( $this->msg( 'allmessages-filter-unmodified' )->text(),
-                               'filter',
-                               'unmodified',
-                               'mw-allmessages-form-filter-unmodified',
-                               ( $this->filter === 'unmodified' )
-                       ) .
-                       Xml::radioLabel( $this->msg( 'allmessages-filter-all' )->text(),
-                               'filter',
-                               'all',
-                               'mw-allmessages-form-filter-all',
-                               ( $this->filter === 'all' )
-                       ) .
-                       Xml::radioLabel( $this->msg( 'allmessages-filter-modified' )->text(),
-                               'filter',
-                               'modified',
-                               'mw-allmessages-form-filter-modified',
-                               ( $this->filter === 'modified' )
-                       ) .
-                       "</td>\n
-                       </tr>
-                       <tr>\n
-                               <td class=\"mw-label\">" . $langSelect[0] . "</td>\n
-                               <td class=\"mw-input\">" . $langSelect[1] . "</td>\n
-                       </tr>" .
-
-                       '<tr>
-                               <td class="mw-label">' .
-                       Xml::label( $this->msg( 'table_pager_limit_label' )->text(), 'mw-table_pager_limit_label' ) .
-                       '</td>
-                       <td class="mw-input">' .
-                       $this->getLimitSelect() .
-                       '</td>
-                       <tr>
-                               <td></td>
-                               <td>' .
-                       Xml::submitButton( $this->msg( 'allmessages-filter-submit' )->text() ) .
-                       "</td>\n
-                       </tr>" .
-
-                       Xml::closeElement( 'table' ) .
-                       $this->getHiddenFields( array( 'title', 'prefix', 'filter', 'lang', 'limit' ) ) .
-                       Xml::closeElement( 'fieldset' ) .
-                       Xml::closeElement( 'form' );
-
-               return $out;
-       }
-
-       function getAllMessages( $descending ) {
-               wfProfileIn( __METHOD__ );
-               $messageNames = Language::getLocalisationCache()->getSubitemList( 'en', 'messages' );
-               if ( $descending ) {
-                       rsort( $messageNames );
-               } else {
-                       asort( $messageNames );
-               }
-
-               // Normalise message names so they look like page titles
-               $messageNames = array_map( array( $this->lang, 'ucfirst' ), $messageNames );
-
-               wfProfileOut( __METHOD__ );
-
-               return $messageNames;
-       }
-
-       /**
-        * Determine which of the MediaWiki and MediaWiki_talk namespace pages exist.
-        * Returns array( 'pages' => ..., 'talks' => ... ), where the subarrays have
-        * an entry for each existing page, with the key being the message name and
-        * value arbitrary.
-        *
-        * @param array $messageNames
-        * @param string $langcode What language code
-        * @param bool $foreign Whether the $langcode is not the content language
-        * @return array A 'pages' and 'talks' array with the keys of existing pages
-        */
-       public static function getCustomisedStatuses( $messageNames, $langcode = 'en', $foreign = false ) {
-               // FIXME: This function should be moved to Language:: or something.
-               wfProfileIn( __METHOD__ . '-db' );
-
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( 'page',
-                       array( 'page_namespace', 'page_title' ),
-                       array( 'page_namespace' => array( NS_MEDIAWIKI, NS_MEDIAWIKI_TALK ) ),
-                       __METHOD__,
-                       array( 'USE INDEX' => 'name_title' )
-               );
-               $xNames = array_flip( $messageNames );
-
-               $pageFlags = $talkFlags = array();
-
-               foreach ( $res as $s ) {
-                       $exists = false;
-
-                       if ( $foreign ) {
-                               $titleParts = explode( '/', $s->page_title );
-                               if ( count( $titleParts ) === 2 &&
-                                       $langcode === $titleParts[1] &&
-                                       isset( $xNames[$titleParts[0]] )
-                               ) {
-                                       $exists = $titleParts[0];
-                               }
-                       } elseif ( isset( $xNames[$s->page_title] ) ) {
-                               $exists = $s->page_title;
-                       }
-
-                       $title = Title::newFromRow( $s );
-                       if ( $exists && $title->inNamespace( NS_MEDIAWIKI ) ) {
-                               $pageFlags[$exists] = true;
-                       } elseif ( $exists && $title->inNamespace( NS_MEDIAWIKI_TALK ) ) {
-                               $talkFlags[$exists] = true;
-                       }
-               }
-
-               wfProfileOut( __METHOD__ . '-db' );
-
-               return array( 'pages' => $pageFlags, 'talks' => $talkFlags );
-       }
-
-       /**
-        *  This function normally does a database query to get the results; we need
-        * to make a pretend result using a FakeResultWrapper.
-        * @param string $offset
-        * @param int $limit
-        * @param bool $descending
-        * @return FakeResultWrapper
-        */
-       function reallyDoQuery( $offset, $limit, $descending ) {
-               $result = new FakeResultWrapper( array() );
-
-               $messageNames = $this->getAllMessages( $descending );
-               $statuses = self::getCustomisedStatuses( $messageNames, $this->langcode, $this->foreign );
-
-               $count = 0;
-               foreach ( $messageNames as $key ) {
-                       $customised = isset( $statuses['pages'][$key] );
-                       if ( $customised !== $this->custom &&
-                               ( $descending && ( $key < $offset || !$offset ) || !$descending && $key > $offset ) &&
-                               ( ( $this->prefix && preg_match( $this->prefix, $key ) ) || $this->prefix === false )
-                       ) {
-                               $actual = wfMessage( $key )->inLanguage( $this->langcode )->plain();
-                               $default = wfMessage( $key )->inLanguage( $this->langcode )->useDatabase( false )->plain();
-                               $result->result[] = array(
-                                       'am_title' => $key,
-                                       'am_actual' => $actual,
-                                       'am_default' => $default,
-                                       'am_customised' => $customised,
-                                       'am_talk_exists' => isset( $statuses['talks'][$key] )
-                               );
-                               $count++;
-                       }
-
-                       if ( $count === $limit ) {
-                               break;
-                       }
-               }
-
-               return $result;
-       }
-
-       function getStartBody() {
-               return Xml::openElement( 'table', array(
-                               'class' => 'mw-datatable TablePager',
-                               'id' => 'mw-allmessagestable'
-                       ) ) .
-                       "\n" .
-                       "<thead><tr>
-                               <th rowspan=\"2\">" .
-                       $this->msg( 'allmessagesname' )->escaped() . "
-                               </th>
-                               <th>" .
-                       $this->msg( 'allmessagesdefault' )->escaped() .
-                       "</th>
-                       </tr>\n
-                       <tr>
-                               <th>" .
-                       $this->msg( 'allmessagescurrent' )->escaped() .
-                       "</th>
-                       </tr></thead><tbody>\n";
-       }
-
-       function formatValue( $field, $value ) {
-               switch ( $field ) {
-                       case 'am_title' :
-                               $title = Title::makeTitle( NS_MEDIAWIKI, $value . $this->suffix );
-                               $talk = Title::makeTitle( NS_MEDIAWIKI_TALK, $value . $this->suffix );
-                               $translation = Linker::makeExternalLink(
-                                       'https://translatewiki.net/w/i.php?' . wfArrayToCgi( array(
-                                               'title' => 'Special:SearchTranslations',
-                                               'group' => 'mediawiki',
-                                               'grouppath' => 'mediawiki',
-                                               'query' => 'language:' . $this->getLanguage()->getCode() . '^25 ' .
-                                                       'messageid:"MediaWiki:' . $value . '"^10 "' .
-                                                       $this->msg( $value )->inLanguage( 'en' )->plain() . '"'
-                                       ) ),
-                                       $this->msg( 'allmessages-filter-translate' )->text()
-                               );
-
-                               if ( $this->mCurrentRow->am_customised ) {
-                                       $title = Linker::linkKnown( $title, $this->getLanguage()->lcfirst( $value ) );
-                               } else {
-                                       $title = Linker::link(
-                                               $title,
-                                               $this->getLanguage()->lcfirst( $value ),
-                                               array(),
-                                               array(),
-                                               array( 'broken' )
-                                       );
-                               }
-                               if ( $this->mCurrentRow->am_talk_exists ) {
-                                       $talk = Linker::linkKnown( $talk, $this->talk );
-                               } else {
-                                       $talk = Linker::link(
-                                               $talk,
-                                               $this->talk,
-                                               array(),
-                                               array(),
-                                               array( 'broken' )
-                                       );
-                               }
-
-                               return $title . ' '
-                               . $this->msg( 'parentheses' )->rawParams( $talk )->escaped()
-                               . ' '
-                               . $this->msg( 'parentheses' )->rawParams( $translation )->escaped();
-
-                       case 'am_default' :
-                       case 'am_actual' :
-                               return Sanitizer::escapeHtmlAllowEntities( $value, ENT_QUOTES );
-               }
-
-               return '';
-       }
-
-       function formatRow( $row ) {
-               // Do all the normal stuff
-               $s = parent::formatRow( $row );
-
-               // But if there's a customised message, add that too.
-               if ( $row->am_customised ) {
-                       $s .= Xml::openElement( 'tr', $this->getRowAttrs( $row, true ) );
-                       $formatted = strval( $this->formatValue( 'am_actual', $row->am_actual ) );
-
-                       if ( $formatted === '' ) {
-                               $formatted = '&#160;';
-                       }
-
-                       $s .= Xml::tags( 'td', $this->getCellAttrs( 'am_actual', $row->am_actual ), $formatted )
-                               . "</tr>\n";
-               }
-
-               return $s;
-       }
-
-       function getRowAttrs( $row, $isSecond = false ) {
-               $arr = array();
-
-               if ( $row->am_customised ) {
-                       $arr['class'] = 'allmessages-customised';
-               }
-
-               if ( !$isSecond ) {
-                       $arr['id'] = Sanitizer::escapeId( 'msg_' . $this->getLanguage()->lcfirst( $row->am_title ) );
-               }
-
-               return $arr;
-       }
-
-       function getCellAttrs( $field, $value ) {
-               if ( $this->mCurrentRow->am_customised && $field === 'am_title' ) {
-                       return array( 'rowspan' => '2', 'class' => $field );
-               } elseif ( $field === 'am_title' ) {
-                       return array( 'class' => $field );
-               } else {
-                       return array( 'lang' => $this->langcode, 'dir' => $this->lang->getDir(), 'class' => $field );
-               }
-       }
-
-       // This is not actually used, as getStartBody is overridden above
-       function getFieldNames() {
-               return array(
-                       'am_title' => $this->msg( 'allmessagesname' )->text(),
-                       'am_default' => $this->msg( 'allmessagesdefault' )->text()
-               );
-       }
-
-       function getTitle() {
-               return SpecialPage::getTitleFor( 'Allmessages', false );
-       }
-
-       function isFieldSortable( $x ) {
-               return false;
-       }
-
-       function getDefaultSort() {
-               return '';
-       }
-
-       function getQueryInfo() {
-               return '';
-       }
-}
diff --git a/includes/specials/SpecialAllpages.php b/includes/specials/SpecialAllpages.php
deleted file mode 100644 (file)
index 0490d82..0000000
+++ /dev/null
@@ -1,396 +0,0 @@
-<?php
-/**
- * Implements Special:Allpages
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup SpecialPage
- */
-
-/**
- * Implements Special:Allpages
- *
- * @ingroup SpecialPage
- */
-class SpecialAllpages extends IncludableSpecialPage {
-
-       /**
-        * Maximum number of pages to show on single subpage.
-        *
-        * @var int $maxPerPage
-        */
-       protected $maxPerPage = 345;
-
-       /**
-        * Determines, which message describes the input field 'nsfrom'.
-        *
-        * @var string $nsfromMsg
-        */
-       protected $nsfromMsg = 'allpagesfrom';
-
-       /**
-        * Constructor
-        *
-        * @param string $name name of the special page, as seen in links and URLs (default: 'Allpages')
-        */
-       function __construct( $name = 'Allpages' ) {
-               parent::__construct( $name );
-       }
-
-       /**
-        * Entry point : initialise variables and call subfunctions.
-        *
-        * @param string $par becomes "FOO" when called like Special:Allpages/FOO (default null)
-        */
-       function execute( $par ) {
-               $request = $this->getRequest();
-               $out = $this->getOutput();
-
-               $this->setHeaders();
-               $this->outputHeader();
-               $out->allowClickjacking();
-
-               # GET values
-               $from = $request->getVal( 'from', null );
-               $to = $request->getVal( 'to', null );
-               $namespace = $request->getInt( 'namespace' );
-               $hideredirects = $request->getBool( 'hideredirects', false );
-
-               $namespaces = $this->getContext()->getLanguage()->getNamespaces();
-
-               $out->setPageTitle(
-                       ( $namespace > 0 && array_key_exists( $namespace, $namespaces ) ) ?
-                               $this->msg( 'allinnamespace', str_replace( '_', ' ', $namespaces[$namespace] ) ) :
-                               $this->msg( 'allarticles' )
-               );
-               $out->addModuleStyles( 'mediawiki.special' );
-
-               if ( $par !== null ) {
-                       $this->showChunk( $namespace, $par, $to, $hideredirects );
-               } elseif ( $from !== null && $to === null ) {
-                       $this->showChunk( $namespace, $from, $to, $hideredirects );
-               } else {
-                       $this->showToplevel( $namespace, $from, $to, $hideredirects );
-               }
-       }
-
-       /**
-        * HTML for the top form
-        *
-        * @param int $namespace A namespace constant (default NS_MAIN).
-        * @param string $from DbKey we are starting listing at.
-        * @param string $to DbKey we are ending listing at.
-        * @param bool $hideredirects Dont show redirects  (default false)
-        * @return string
-        */
-       function namespaceForm( $namespace = NS_MAIN, $from = '', $to = '', $hideredirects = false ) {
-               global $wgScript;
-               $t = $this->getPageTitle();
-
-               $out = Xml::openElement( 'div', array( 'class' => 'namespaceoptions' ) );
-               $out .= Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) );
-               $out .= Html::hidden( 'title', $t->getPrefixedText() );
-               $out .= Xml::openElement( 'fieldset' );
-               $out .= Xml::element( 'legend', null, $this->msg( 'allpages' )->text() );
-               $out .= Xml::openElement( 'table', array( 'id' => 'nsselect', 'class' => 'allpages' ) );
-               $out .= "<tr>
-       <td class='mw-label'>" .
-                       Xml::label( $this->msg( 'allpagesfrom' )->text(), 'nsfrom' ) .
-                       "       </td>
-       <td class='mw-input'>" .
-                       Xml::input( 'from', 30, str_replace( '_', ' ', $from ), array( 'id' => 'nsfrom' ) ) .
-                       "       </td>
-</tr>
-<tr>
-       <td class='mw-label'>" .
-                       Xml::label( $this->msg( 'allpagesto' )->text(), 'nsto' ) .
-                       "       </td>
-                       <td class='mw-input'>" .
-                       Xml::input( 'to', 30, str_replace( '_', ' ', $to ), array( 'id' => 'nsto' ) ) .
-                       "               </td>
-</tr>
-<tr>
-       <td class='mw-label'>" .
-                       Xml::label( $this->msg( 'namespace' )->text(), 'namespace' ) .
-                       "       </td>
-                       <td class='mw-input'>" .
-                       Html::namespaceSelector(
-                               array( 'selected' => $namespace ),
-                               array( 'name' => 'namespace', 'id' => 'namespace' )
-                       ) . ' ' .
-                       Xml::checkLabel(
-                               $this->msg( 'allpages-hide-redirects' )->text(),
-                               'hideredirects',
-                               'hideredirects',
-                               $hideredirects
-                       ) . ' ' .
-                       Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) .
-                       "       </td>
-</tr>";
-               $out .= Xml::closeElement( 'table' );
-               $out .= Xml::closeElement( 'fieldset' );
-               $out .= Xml::closeElement( 'form' );
-               $out .= Xml::closeElement( 'div' );
-
-               return $out;
-       }
-
-       /**
-        * @param int $namespace (default NS_MAIN)
-        * @param string $from List all pages from this name
-        * @param string $to List all pages to this name
-        * @param bool $hideredirects Dont show redirects (default false)
-        */
-       function showToplevel( $namespace = NS_MAIN, $from = '', $to = '', $hideredirects = false ) {
-               $from = Title::makeTitleSafe( $namespace, $from );
-               $to = Title::makeTitleSafe( $namespace, $to );
-               $from = ( $from && $from->isLocal() ) ? $from->getDBkey() : null;
-               $to = ( $to && $to->isLocal() ) ? $to->getDBkey() : null;
-
-               $this->showChunk( $namespace, $from, $to, $hideredirects );
-       }
-
-       /**
-        * @param int $namespace Namespace (Default NS_MAIN)
-        * @param string $from List all pages from this name (default false)
-        * @param string $to List all pages to this name (default false)
-        * @param bool $hideredirects Dont show redirects (default false)
-        */
-       function showChunk( $namespace = NS_MAIN, $from = false, $to = false, $hideredirects = false ) {
-               $output = $this->getOutput();
-
-               $fromList = $this->getNamespaceKeyAndText( $namespace, $from );
-               $toList = $this->getNamespaceKeyAndText( $namespace, $to );
-               $namespaces = $this->getContext()->getLanguage()->getNamespaces();
-               $n = 0;
-
-               if ( !$fromList || !$toList ) {
-                       $out = $this->msg( 'allpagesbadtitle' )->parseAsBlock();
-               } elseif ( !array_key_exists( $namespace, $namespaces ) ) {
-                       // Show errormessage and reset to NS_MAIN
-                       $out = $this->msg( 'allpages-bad-ns', $namespace )->parse();
-                       $namespace = NS_MAIN;
-               } else {
-                       list( $namespace, $fromKey, $from ) = $fromList;
-                       list( , $toKey, $to ) = $toList;
-
-                       $dbr = wfGetDB( DB_SLAVE );
-                       $conds = array(
-                               'page_namespace' => $namespace,
-                               'page_title >= ' . $dbr->addQuotes( $fromKey )
-                       );
-
-                       if ( $hideredirects ) {
-                               $conds['page_is_redirect'] = 0;
-                       }
-
-                       if ( $toKey !== "" ) {
-                               $conds[] = 'page_title <= ' . $dbr->addQuotes( $toKey );
-                       }
-
-                       $res = $dbr->select( 'page',
-                               array( 'page_namespace', 'page_title', 'page_is_redirect', 'page_id' ),
-                               $conds,
-                               __METHOD__,
-                               array(
-                                       'ORDER BY' => 'page_title',
-                                       'LIMIT' => $this->maxPerPage + 1,
-                                       'USE INDEX' => 'name_title',
-                               )
-                       );
-
-                       if ( $res->numRows() > 0 ) {
-                               $out = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-chunk' ) );
-                               while ( ( $n < $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
-                                       $t = Title::newFromRow( $s );
-                                       if ( $t ) {
-                                               $link = ( $s->page_is_redirect ? '<div class="allpagesredirect">' : '' ) .
-                                                       Linker::link( $t ) .
-                                                       ( $s->page_is_redirect ? '</div>' : '' );
-                                       } else {
-                                               $link = '[[' . htmlspecialchars( $s->page_title ) . ']]';
-                                       }
-
-                                       if ( $n % 3 == 0 ) {
-                                               $out .= '<tr>';
-                                       }
-
-                                       $out .= "<td style=\"width:33%\">$link</td>";
-                                       $n++;
-                                       if ( $n % 3 == 0 ) {
-                                               $out .= "</tr>\n";
-                                       }
-                               }
-
-                               if ( ( $n % 3 ) != 0 ) {
-                                       $out .= "</tr>\n";
-                               }
-                               $out .= Xml::closeElement( 'table' );
-                       } else {
-                               $out = '';
-                       }
-               }
-
-               if ( $this->including() ) {
-                       $output->addHTML( $out );
-                       return;
-               }
-
-               if ( $from == '' ) {
-                       // First chunk; no previous link.
-                       $prevTitle = null;
-               } else {
-                       # Get the last title from previous chunk
-                       $dbr = wfGetDB( DB_SLAVE );
-                       $res_prev = $dbr->select(
-                               'page',
-                               'page_title',
-                               array( 'page_namespace' => $namespace, 'page_title < ' . $dbr->addQuotes( $from ) ),
-                               __METHOD__,
-                               array( 'ORDER BY' => 'page_title DESC',
-                                       'LIMIT' => $this->maxPerPage, 'OFFSET' => ( $this->maxPerPage - 1 )
-                               )
-                       );
-
-                       # Get first title of previous complete chunk
-                       if ( $dbr->numrows( $res_prev ) >= $this->maxPerPage ) {
-                               $pt = $dbr->fetchObject( $res_prev );
-                               $prevTitle = Title::makeTitle( $namespace, $pt->page_title );
-                       } else {
-                               # The previous chunk is not complete, need to link to the very first title
-                               # available in the database
-                               $options = array( 'LIMIT' => 1 );
-                               if ( !$dbr->implicitOrderby() ) {
-                                       $options['ORDER BY'] = 'page_title';
-                               }
-                               $reallyFirstPage_title = $dbr->selectField( 'page', 'page_title',
-                                       array( 'page_namespace' => $namespace ), __METHOD__, $options );
-                               # Show the previous link if it s not the current requested chunk
-                               if ( $from != $reallyFirstPage_title ) {
-                                       $prevTitle = Title::makeTitle( $namespace, $reallyFirstPage_title );
-                               } else {
-                                       $prevTitle = null;
-                               }
-                       }
-               }
-
-               $self = $this->getPageTitle();
-
-               $topLinks = array(
-                       Linker::link( $self, $this->msg( 'allpages' )->escaped() )
-               );
-               $bottomLinks = array();
-
-               # Do we put a previous link ?
-               if ( $prevTitle && $pt = $prevTitle->getText() ) {
-                       $query = array( 'from' => $prevTitle->getText() );
-
-                       if ( $namespace ) {
-                               $query['namespace'] = $namespace;
-                       }
-
-                       if ( $hideredirects ) {
-                               $query['hideredirects'] = $hideredirects;
-                       }
-
-                       $prevLink = Linker::linkKnown(
-                               $self,
-                               $this->msg( 'prevpage', $pt )->escaped(),
-                               array(),
-                               $query
-                       );
-                       $topLinks[] = $prevLink;
-                       $bottomLinks[] = $prevLink;
-               }
-
-               if ( $n == $this->maxPerPage && $s = $res->fetchObject() ) {
-                       # $s is the first link of the next chunk
-                       $t = Title::makeTitle( $namespace, $s->page_title );
-                       $query = array( 'from' => $t->getText() );
-
-                       if ( $namespace ) {
-                               $query['namespace'] = $namespace;
-                       }
-
-                       if ( $hideredirects ) {
-                               $query['hideredirects'] = $hideredirects;
-                       }
-
-                       $nextLink = Linker::linkKnown(
-                               $self,
-                               $this->msg( 'nextpage', $t->getText() )->escaped(),
-                               array(),
-                               $query
-                       );
-                       $topLinks[] = $nextLink;
-                       $bottomLinks[] = $nextLink;
-               }
-
-               $nsForm = $this->namespaceForm( $namespace, $from, $to, $hideredirects );
-               $out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ) .
-                       '<tr>
-                                               <td>' .
-                       $nsForm .
-                       '</td>
-                                               <td class="mw-allpages-nav">' .
-                       $this->getLanguage()->pipeList( $topLinks ) .
-                       '</td></tr></table>';
-
-               $output->addHTML( $out2 . $out );
-
-               if ( count( $bottomLinks ) ) {
-                       $output->addHTML(
-                               Html::element( 'hr' ) .
-                                       Html::rawElement( 'div', array( 'class' => 'mw-allpages-nav' ),
-                                               $this->getLanguage()->pipeList( $bottomLinks )
-                                       )
-                       );
-               }
-       }
-
-       /**
-        * @param int $ns The namespace of the article
-        * @param string $text The name of the article
-        * @return array( int namespace, string dbkey, string pagename ) or null on error
-        */
-       protected function getNamespaceKeyAndText( $ns, $text ) {
-               if ( $text == '' ) {
-                       # shortcut for common case
-                       return array( $ns, '', '' );
-               }
-
-               $t = Title::makeTitleSafe( $ns, $text );
-               if ( $t && $t->isLocal() ) {
-                       return array( $t->getNamespace(), $t->getDBkey(), $t->getText() );
-               } elseif ( $t ) {
-                       return null;
-               }
-
-               # try again, in case the problem was an empty pagename
-               $text = preg_replace( '/(#|$)/', 'X$1', $text );
-               $t = Title::makeTitleSafe( $ns, $text );
-               if ( $t && $t->isLocal() ) {
-                       return array( $t->getNamespace(), '', '' );
-               } else {
-                       return null;
-               }
-       }
-
-       protected function getGroupName() {
-               return 'pages';
-       }
-}
index 0571d0d..7481b0c 100644 (file)
@@ -203,11 +203,13 @@ class SpecialContributions extends IncludableSpecialPage {
                                        $out->showLagWarning( $lag );
                                }
 
-                               $out->addHTML(
-                                       '<p>' . $pager->getNavigationBar() . '</p>' .
-                                               $pager->getBody() .
-                                               '<p>' . $pager->getNavigationBar() . '</p>'
-                               );
+                               $output = $pager->getBody();
+                               if ( !$this->including() ) {
+                                       $output = '<p>' . $pager->getNavigationBar() . '</p>' .
+                                               $output.
+                                               '<p>' . $pager->getNavigationBar() . '</p>';
+                               }
+                               $out->addHTML( $output );
                        }
                        $out->preventClickjacking( $pager->getPreventClickjacking() );
 
index 448637e..f3af312 100644 (file)
@@ -42,6 +42,14 @@ class SpecialCreateAccount extends SpecialRedirectToSpecial {
                return true;
        }
 
+       public function isRestricted() {
+               return true;
+       }
+
+       public function userCanExecute( User $user ) {
+               return $user->isAllowed( 'createaccount' );
+       }
+
        protected function getGroupName() {
                return 'login';
        }
index ebbef17..02d8d70 100644 (file)
@@ -117,6 +117,21 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                }
        }
 
+       /**
+        * Return an array of subpages beginning with $search that this special page will accept.
+        *
+        * @param string $search Prefix to search for
+        * @param integer $limit Maximum number of results to return
+        * @return string[] Matching subpages
+        */
+       public function prefixSearchSubpages( $search, $limit = 10 ) {
+               // SpecialWatchlist uses SpecialEditWatchlist::getMode, so new types should be added
+               // here and there - no 'edit' here, because that the default for this page
+               $subpages = array( 'clear', 'raw' );
+               $escaped = preg_quote( $search );
+               return array_slice( preg_grep( "/^$escaped/i", $subpages ), 0, $limit );
+       }
+
        /**
         * Extract a list of titles from a blob of text, returning
         * (prefixed) strings; unwatchable titles are ignored
index f89f03c..35a3ba1 100644 (file)
@@ -118,13 +118,13 @@ class SpecialExpandTemplates extends SpecialPage {
 
                        $out->addHTML( $tmp );
 
-                       $rawhtml = $this->generateHtml( $title, $output );
-
+                       $pout = $this->generateHtml( $title, $output );
+                       $rawhtml = $pout->getText();
                        if ( $this->generateRawHtml && strlen( $rawhtml ) > 0 ) {
                                $out->addHTML( $this->makeOutput( $rawhtml, 'expand_templates_html_output' ) );
                        }
 
-                       $this->showHtmlPreview( $title, $rawhtml, $out );
+                       $this->showHtmlPreview( $title, $pout, $out );
                }
        }
 
@@ -222,26 +222,24 @@ class SpecialExpandTemplates extends SpecialPage {
         *
         * @param Title $title
         * @param string $text
-        * @return string
+        * @return ParserOutput
         */
        private function generateHtml( Title $title, $text ) {
                global $wgParser;
 
                $popts = ParserOptions::newFromContext( $this->getContext() );
                $popts->setTargetLanguage( $title->getPageLanguage() );
-               $pout = $wgParser->parse( $text, $title, $popts );
-
-               return $pout->getText();
+               return $wgParser->parse( $text, $title, $popts );
        }
 
        /**
         * Wraps the provided html code in a div and outputs it to the page
         *
         * @param Title $title
-        * @param string $html
+        * @param ParserOutput $pout
         * @param OutputPage $out
         */
-       private function showHtmlPreview( Title $title, $html, OutputPage $out ) {
+       private function showHtmlPreview( Title $title, ParserOutput $pout, OutputPage $out ) {
                $lang = $title->getPageViewLanguage();
                $out->addHTML( "<h2>" . $this->msg( 'expand_templates_preview' )->escaped() . "</h2>\n" );
                $out->addHTML( Html::openElement( 'div', array(
@@ -249,7 +247,7 @@ class SpecialExpandTemplates extends SpecialPage {
                        'dir' => $lang->getDir(),
                        'lang' => $lang->getHtmlCode(),
                ) ) );
-               $out->addHTML( $html );
+               $out->addParserOutputContent( $pout );
                $out->addHTML( Html::closeElement( 'div' ) );
        }
 
index 6da6674..aaa55a3 100644 (file)
@@ -115,6 +115,22 @@ class SpecialLog extends SpecialPage {
                $this->show( $opts, $qc );
        }
 
+       /**
+        * Return an array of subpages beginning with $search that this special page will accept.
+        *
+        * @param string $search Prefix to search for
+        * @param integer $limit Maximum number of results to return
+        * @return string[] Matching subpages
+        */
+       public function prefixSearchSubpages( $search, $limit = 10 ) {
+               global $wgLogTypes;
+               $subpages = $wgLogTypes;
+               $subpages[] = 'all';
+               sort( $subpages );
+               $escaped = preg_quote( $search );
+               return array_slice( preg_grep( "/^$escaped/i", $subpages ), 0, $limit );
+       }
+
        private function parseParams( FormOptions $opts, $par ) {
                global $wgLogTypes;
 
index 013fc26..4d9e7da 100644 (file)
@@ -51,6 +51,11 @@ class MIMEsearchPage extends QueryPage {
        }
 
        public function getQueryInfo() {
+               $minorType = array();
+               if ( $this->minor !== '*' ) {
+                       // Allow wildcard searching
+                       $minorType['img_minor_mime'] = $this->minor;
+               }
                $qi = array(
                        'tables' => array( 'image' ),
                        'fields' => array(
@@ -67,7 +72,6 @@ class MIMEsearchPage extends QueryPage {
                        ),
                        'conds' => array(
                                'img_major_mime' => $this->major,
-                               'img_minor_mime' => $this->minor,
                                // This is in order to trigger using
                                // the img_media_mime index in "range" mode.
                                'img_media_type' => array(
@@ -82,7 +86,7 @@ class MIMEsearchPage extends QueryPage {
                                        MEDIATYPE_EXECUTABLE,
                                        MEDIATYPE_ARCHIVE,
                                ),
-                       ),
+                       ) + $minorType,
                );
 
                return $qi;
@@ -104,6 +108,7 @@ class MIMEsearchPage extends QueryPage {
                global $wgScript;
 
                $mime = $par ? $par : $this->getRequest()->getText( 'mime' );
+               $mime = trim( $mime );
 
                $this->setHeaders();
                $this->outputHeader();
index 097f1b6..a27cf4c 100644 (file)
@@ -283,7 +283,7 @@ class SpecialMergeHistory extends SpecialPage {
                $last = $this->message['last'];
 
                $ts = wfTimestamp( TS_MW, $row->rev_timestamp );
-               $checkBox = Xml::radio( 'mergepoint', $ts, false );
+               $checkBox = Xml::radio( 'mergepoint', $ts, ( $this->mTimestamp === $ts ) );
 
                $user = $this->getUser();
 
@@ -325,6 +325,18 @@ class SpecialMergeHistory extends SpecialPage {
                                ->rawParams( $checkBox, $last, $pageLink, $userLink, $stxt, $comment )->escaped() );
        }
 
+       /**
+        * Actually attempt the history move
+        *
+        * @todo: if all versions of page A are moved to B and then a user
+        * tries to do a reverse-merge via the "unmerge" log link, then page
+        * A will still be a redirect (as it was after the original merge),
+        * though it will have the old revisions back from before (as expected).
+        * The user may have to "undo" the redirect manually to finish the "unmerge".
+        * Maybe this should delete redirects at the target page of merges?
+        *
+        * @return boolean Success
+        */
        function merge() {
                # Get the titles directly from the IDs, in case the target page params
                # were spoofed. The queries are done based on the IDs, so it's best to
@@ -368,7 +380,7 @@ class SpecialMergeHistory extends SpecialPage {
 
                        return false;
                }
-               # Update the revisions
+               # Get the timestamp pivot condition
                if ( $this->mTimestamp ) {
                        $timewhere = "rev_timestamp <= {$this->mTimestamp}";
                        $timestampLimit = wfTimestamp( TS_MW, $this->mTimestamp );
@@ -376,6 +388,18 @@ class SpecialMergeHistory extends SpecialPage {
                        $timewhere = "rev_timestamp <= {$maxtimestamp}";
                        $timestampLimit = wfTimestamp( TS_MW, $lasttimestamp );
                }
+               # Check that there are not too many revisions to move
+               $limit = 5000; // avoid too much slave lag
+               $count = $dbw->select( 'revision', '1',
+                       array( 'rev_page' => $this->mTargetID, $timewhere ),
+                       __METHOD__,
+                       array( 'LIMIT' => $limit + 1 )
+               )->numRows();
+               if ( $count > $limit ) {
+                       $this->getOutput()->addWikiMsg( 'mergehistory-fail-toobig' );
+
+                       return false;
+               }
                # Do the moving...
                $dbw->update(
                        'revision',
@@ -452,6 +476,7 @@ class SpecialMergeHistory extends SpecialPage {
                        array( $destTitle->getPrefixedText(), $timestampLimit ), $this->getUser()
                );
 
+               # @TODO: message should use redirect=no
                $this->getOutput()->addWikiMsg( 'mergehistory-success',
                        $targetTitle->getPrefixedText(), $destTitle->getPrefixedText(), $count );
 
index 8ee583b..8e6a596 100644 (file)
@@ -68,7 +68,6 @@ class MostlinkedTemplatesPage extends QueryPage {
                                'title' => 'tl_title',
                                'value' => 'COUNT(*)'
                        ),
-                       'conds' => array( 'tl_namespace' => NS_TEMPLATE ),
                        'options' => array( 'GROUP BY' => array( 'tl_namespace', 'tl_title' ) )
                );
        }
index 505a1ec..1ec7006 100644 (file)
@@ -40,8 +40,6 @@ class SpecialNewpages extends IncludableSpecialPage {
        }
 
        protected function setup( $par ) {
-               global $wgEnableNewpagesUserFilter;
-
                // Options
                $opts = new FormOptions();
                $this->opts = $opts; // bind
@@ -71,9 +69,6 @@ class SpecialNewpages extends IncludableSpecialPage {
 
                // Validate
                $opts->validateIntBounds( 'limit', 0, 5000 );
-               if ( !$wgEnableNewpagesUserFilter ) {
-                       $opts->setValue( 'username', '' );
-               }
        }
 
        protected function parseParams( $par ) {
@@ -204,7 +199,7 @@ class SpecialNewpages extends IncludableSpecialPage {
        }
 
        protected function form() {
-               global $wgEnableNewpagesUserFilter, $wgScript;
+               global $wgScript;
 
                // Consume values
                $this->opts->consumeValue( 'offset' ); // don't carry offset, DWIW
@@ -265,15 +260,14 @@ class SpecialNewpages extends IncludableSpecialPage {
                                $tagFilterSelector .
                                '</td>
                        </tr>' ) : '' ) .
-                       ( $wgEnableNewpagesUserFilter ?
-                               '<tr>
+                       '<tr>
                                <td class="mw-label">' .
                                        Xml::label( $this->msg( 'newpages-username' )->text(), 'mw-np-username' ) .
                                        '</td>
                                <td class="mw-input">' .
                                        Xml::input( 'username', 30, $userText, array( 'id' => 'mw-np-username' ) ) .
                                        '</td>
-                       </tr>' : '' ) .
+                       </tr>' .
                        '<tr> <td></td>
                                <td class="mw-submit">' .
                        Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) .
@@ -512,7 +506,6 @@ class NewPagesPager extends ReverseChronologicalPager {
        }
 
        function getQueryInfo() {
-               global $wgEnableNewpagesUserFilter;
                $conds = array();
                $conds['rc_new'] = 1;
 
@@ -532,8 +525,7 @@ class NewPagesPager extends ReverseChronologicalPager {
                        }
                }
 
-               # $wgEnableNewpagesUserFilter - temp WMF hack
-               if ( $wgEnableNewpagesUserFilter && $user ) {
+               if ( $user ) {
                        $conds['rc_user_text'] = $user->getText();
                        $rcIndexes = 'rc_user_text';
                } elseif ( User::groupHasPermission( '*', 'createpage' ) &&
index 14f3ccd..c60b347 100644 (file)
@@ -210,7 +210,8 @@ class SpecialPasswordReset extends FormSpecialPage {
                $firstUser = $users[0];
 
                if ( !$firstUser instanceof User || !$firstUser->getID() ) {
-                       return array( array( 'nosuchuser', $data['Username'] ) );
+                       // Don't parse username as wikitext (bug 65501)
+                       return array( array( 'nosuchuser', wfEscapeWikiText( $data['Username'] ) ) );
                }
 
                // Check against the rate limiter
@@ -237,7 +238,7 @@ class SpecialPasswordReset extends FormSpecialPage {
                // All the users will have the same email address
                if ( $firstUser->getEmail() == '' ) {
                        // This won't be reachable from the email route, so safe to expose the username
-                       return array( array( 'noemail', $firstUser->getName() ) );
+                       return array( array( 'noemail', wfEscapeWikiText( $firstUser->getName() ) ) );
                }
 
                // We need to have a valid IP address for the hook, but per bug 18347, we should
index 34e803d..2a1bf11 100644 (file)
@@ -26,7 +26,7 @@
  *
  * @ingroup SpecialPage
  */
-class SpecialPrefixindex extends SpecialAllpages {
+class SpecialPrefixindex extends SpecialAllPages {
 
        /**
         * Whether to remove the searched prefix from the displayed link. Useful
index 63eff36..4c8c8f3 100644 (file)
@@ -64,19 +64,7 @@ class SpecialRunJobs extends UnlistedSpecialPage {
                $cSig = self::getQuerySignature( $squery ); // correct signature
                $rSig = $params['signature']; // provided signature
 
-               // Constant-time signature verification
-               // http://www.emerose.com/timing-attacks-explained
-               // @todo Make a common method for this
-               if ( !is_string( $rSig ) || strlen( $rSig ) !== strlen( $cSig ) ) {
-                       $verified = false;
-               } else {
-                       $result = 0;
-                       $cSigLength = strlen( $cSig );
-                       for ( $i = 0; $i < $cSigLength; $i++ ) {
-                               $result |= ord( $cSig[$i] ) ^ ord( $rSig[$i] );
-                       }
-                       $verified = ( $result == 0 );
-               }
+               $verified = is_string( $rSig ) && hash_equals( $cSig, $rSig );
                if ( !$verified || $params['sigexpiry'] < time() ) {
                        header( "HTTP/1.0 400 Bad Request" );
                        print 'Invalid or stale signature provided';
index 33bd87f..542fc86 100644 (file)
@@ -207,8 +207,10 @@ class SpecialSearch extends SpecialPage {
 
                $profile = new ProfileSection( __METHOD__ );
                $search = $this->getSearchEngine();
-               $search->setLimitOffset( $this->limit, $this->offset );
+               // Request an extra result to determine whether a "next page" link is useful
+               $search->setLimitOffset( $this->limit + 1, $this->offset );
                $search->setNamespaces( $this->namespaces );
+               $this->saveNamespaces();
                $search->prefix = $this->mPrefix;
                $term = $search->transformSearchTerm( $term );
 
@@ -251,9 +253,7 @@ class SpecialSearch extends SpecialPage {
                $rewritten = $search->replacePrefixes( $term );
 
                $titleMatches = $search->searchTitle( $rewritten );
-               if ( !( $titleMatches instanceof SearchResultTooMany ) ) {
-                       $textMatches = $search->searchText( $rewritten );
-               }
+               $textMatches = $search->searchText( $rewritten );
 
                $textStatus = null;
                if ( $textMatches instanceof Status ) {
@@ -317,13 +317,6 @@ class SpecialSearch extends SpecialPage {
                        Xml::closeElement( 'div' )
                );
 
-               // Sometimes the search engine knows there are too many hits
-               if ( $titleMatches instanceof SearchResultTooMany ) {
-                       $out->wrapWikiMsg( "==$1==\n", 'toomanymatches' );
-
-                       return;
-               }
-
                $filePrefix = $wgContLang->getFormattedNsText( NS_FILE ) . ':';
                if ( trim( $term ) === '' || $filePrefix === trim( $term ) ) {
                        $out->addHTML( $this->formHeader( $term, 0, 0 ) );
@@ -373,7 +366,7 @@ class SpecialSearch extends SpecialPage {
                                        $this->offset,
                                        $this->limit,
                                        $this->powerSearchOptions() + array( 'search' => $term ),
-                                       max( $titleMatchesNum, $textMatchesNum ) < $this->limit
+                                       max( $titleMatchesNum, $textMatchesNum ) <= $this->limit
                                );
                        }
                        wfRunHooks( 'SpecialSearchResults', array( $term, &$titleMatches, &$textMatches ) );
@@ -410,7 +403,7 @@ class SpecialSearch extends SpecialPage {
                if ( $num === 0 ) {
                        if ( $textStatus ) {
                                $out->addHTML( '<div class="error">' .
-                                       htmlspecialchars( $textStatus->getWikiText( 'search-error' ) ) . '</div>' );
+                                       $textStatus->getMessage( 'search-error' ) . '</div>' );
                        } else {
                                $out->wrapWikiMsg( "<p class=\"mw-search-nonefound\">\n$1</p>",
                                        array( 'search-nonefound', wfEscapeWikiText( $term ) ) );
@@ -447,7 +440,7 @@ class SpecialSearch extends SpecialPage {
 
                if ( $title->isKnown() ) {
                        $messageName = 'searchmenu-exists';
-               } elseif ( $title->userCan( 'create', $this->getUser() ) ) {
+               } elseif ( $title->quickUserCan( 'create', $this->getUser() ) ) {
                        $messageName = 'searchmenu-new';
                } else {
                        $messageName = 'searchmenu-new-nocreate';
@@ -522,6 +515,37 @@ class SpecialSearch extends SpecialPage {
                return $opt + $this->extraParams;
        }
 
+       /**
+        * Save namespace preferences when we're supposed to
+        *
+        * @return bool Whether we wrote something
+        */
+       protected function saveNamespaces() {
+               $user = $this->getUser();
+               $request = $this->getRequest();
+
+               if ( $user->isLoggedIn() &&
+                       !is_null( $request->getVal( 'nsRemember' ) ) &&
+                       $user->matchEditToken( $request->getVal( 'nsToken' ) )
+               ) {
+                       // Reset namespace preferences: namespaces are not searched
+                       // when they're not mentioned in the URL parameters.
+                       foreach ( MWNamespace::getValidNamespaces() as $n ) {
+                               $user->setOption( 'searchNs' . $n, false );
+                       }
+                       // The request parameters include all the namespaces we just searched.
+                       // Even if they're the same as an existing profile, they're not eaten.
+                       foreach ( $this->namespaces as $n ) {
+                               $user->setOption( 'searchNs' . $n, true );
+                       }
+
+                       $user->saveSettings();
+                       return true;
+               }
+
+               return false;
+       }
+
        /**
         * Show whole set of results
         *
@@ -537,9 +561,11 @@ class SpecialSearch extends SpecialPage {
 
                $out = "<ul class='mw-search-results'>\n";
                $result = $matches->next();
-               while ( $result ) {
+               $count = 0;
+               while ( $result && $count < $this->limit ) {
                        $out .= $this->showHit( $result, $terms );
                        $result = $matches->next();
+                       $count++;
                }
                $out .= "</ul>\n";
 
@@ -940,6 +966,19 @@ class SpecialSearch extends SpecialPage {
                        $hidden .= Html::hidden( $key, $value );
                }
 
+               # Stuff to feed saveNamespaces()
+               $remember = '';
+               $user = $this->getUser();
+               if ( $user->isLoggedIn() ) {
+                       $remember .= Html::hidden( 'nsToken', $user->getEditToken() ) .
+                       Xml::checkLabel(
+                               wfMessage( 'powersearch-remember' )->text(),
+                               'nsRemember',
+                               'mw-search-powersearch-remember',
+                               false
+                       );
+               }
+
                // Return final output
                return Xml::openElement(
                        'fieldset',
@@ -951,6 +990,8 @@ class SpecialSearch extends SpecialPage {
                        Xml::element( 'div', array( 'class' => 'divider' ), '', false ) .
                        implode( Xml::element( 'div', array( 'class' => 'divider' ), '', false ), $showSections ) .
                        $hidden .
+                       Xml::element( 'div', array( 'class' => 'divider' ), '', false ) .
+                       $remember .
                        Xml::closeElement( 'fieldset' );
        }
 
index 8a32ba9..bea65ba 100644 (file)
@@ -69,18 +69,42 @@ class SpecialTrackingCategories extends SpecialPage {
                        $allMsgs = array();
                        $catDesc = $catMsg . '-desc';
                        $catMsgTitle = Title::makeTitleSafe( NS_MEDIAWIKI, $catMsg );
+                       if ( !$catMsgTitle ) {
+                               continue;
+                       }
                        $catMsgTitleText = Linker::link(
                                $catMsgTitle,
                                htmlspecialchars( $catMsg )
                        );
 
-                       if ( strpos( $msgObj->plain(), '{{NAMESPACE}}' ) !== false ) {
+                       // Match things like {{NAMESPACE}} and {{NAMESPACENUMBER}}.
+                       // False positives are ok, this is just an efficiency shortcut
+                       if ( strpos( $msgObj->plain(), '{{' ) !== false ) {
                                $ns = MWNamespace::getValidNamespaces();
                                foreach ( $ns as $namesp ) {
                                        $tempTitle = Title::makeTitleSafe( $namesp, $catMsg );
+                                       if ( !$tempTitle ) {
+                                               continue;
+                                       }
                                        $catName = $msgObj->title( $tempTitle )->text();
-                                       if ( !$msgObj->isDisabled() ) {
+                                       # Allow tracking categories to be disabled by setting them to "-"
+                                       if ( $catName !== '-' ) {
                                                $catTitle = Title::makeTitleSafe( NS_CATEGORY, $catName );
+                                               if ( $catTitle ) {
+                                                       $catTitleText = Linker::link(
+                                                               $catTitle,
+                                                               htmlspecialchars( $catName )
+                                                       );
+                                                       $allMsgs[] = $catTitleText;
+                                               }
+                                       }
+                               }
+                       } else {
+                               $catName = $msgObj->text();
+                               # Allow tracking categories to be disabled by setting them to "-"
+                               if ( $catName !== '-' ) {
+                                       $catTitle = Title::makeTitleSafe( NS_CATEGORY, $catName );
+                                       if ( $catTitle ) {
                                                $catTitleText = Linker::link(
                                                        $catTitle,
                                                        htmlspecialchars( $catName )
@@ -88,18 +112,11 @@ class SpecialTrackingCategories extends SpecialPage {
                                                $allMsgs[] = $catTitleText;
                                        }
                                }
-                       } else {
-                               $catName = $msgObj->text();
-                               if ( !$msgObj->isDisabled() ) {
-                                       $catTitle = Title::makeTitleSafe( NS_CATEGORY, $catName );
-                                       $catTitleText = Linker::link(
-                                               $catTitle,
-                                               htmlspecialchars( $catName )
-                                       );
-                               } else {
-                                       $catTitleText = $this->msg( 'trackingcategories-disabled' )->parse();
-                               }
-                               $allMsgs[] = $catTitleText;
+                       }
+
+                       # Extra message, when no category was found
+                       if ( !count( $allMsgs ) ) {
+                               $allMsgs[] = $this->msg( 'trackingcategories-disabled' )->parse();
                        }
 
                        /*
index 51235ee..04b36c7 100644 (file)
@@ -492,15 +492,12 @@ class PageArchive {
                        $previousTimestamp = 0;
                }
 
-               if ( $restoreAll ) {
-                       $oldones = '1 = 1'; # All revisions...
-               } else {
-                       $oldts = implode( ',',
-                               array_map( array( &$dbw, 'addQuotes' ),
-                                       array_map( array( &$dbw, 'timestamp' ),
-                                               $timestamps ) ) );
-
-                       $oldones = "ar_timestamp IN ( {$oldts} )";
+               $oldWhere = array(
+                       'ar_namespace' => $this->title->getNamespace(),
+                       'ar_title' => $this->title->getDBkey(),
+               );
+               if ( !$restoreAll ) {
+                       $oldWhere['ar_timestamp'] = array_map( array( &$dbw, 'timestamp' ), $timestamps );
                }
 
                $fields = array(
@@ -529,10 +526,7 @@ class PageArchive {
                 */
                $result = $dbw->select( 'archive',
                        $fields,
-                       /* WHERE */ array(
-                               'ar_namespace' => $this->title->getNamespace(),
-                               'ar_title' => $this->title->getDBkey(),
-                               $oldones ),
+                       $oldWhere,
                        __METHOD__,
                        /* options */ array( 'ORDER BY' => 'ar_timestamp' )
                );
@@ -618,10 +612,7 @@ class PageArchive {
                }
                # Now that it's safely stored, take it out of the archive
                $dbw->delete( 'archive',
-                       /* WHERE */ array(
-                               'ar_namespace' => $this->title->getNamespace(),
-                               'ar_title' => $this->title->getDBkey(),
-                               $oldones ),
+                       $oldWhere,
                        __METHOD__ );
 
                // Was anything restored at all?
index bee94f8..1ef96c3 100644 (file)
@@ -929,7 +929,8 @@ class LoginForm extends SpecialPage {
                                break;
                        case self::ABORTED:
                                $error = $this->mAbortLoginErrorMsg ?: 'login-abort-generic';
-                               $this->mainLoginForm( $this->msg( $error )->text() );
+                               $this->mainLoginForm( $this->msg( $error,
+                                               wfEscapeWikiText( $this->mUsername ) )->text() );
                                break;
                        default:
                                throw new MWException( 'Unhandled case value' );
@@ -1009,7 +1010,7 @@ class LoginForm extends SpecialPage {
                wfRunHooks( 'UserLoginComplete', array( &$currentUser, &$injected_html ) );
 
                if ( $injected_html !== '' ) {
-                       $this->displaySuccessfulAction( $this->msg( 'loginsuccesstitle' ),
+                       $this->displaySuccessfulAction( 'success', $this->msg( 'loginsuccesstitle' ),
                                'loginsuccess', $injected_html );
                } else {
                        $this->executeReturnTo( 'successredirect' );
@@ -1037,18 +1038,22 @@ class LoginForm extends SpecialPage {
                 */
                wfRunHooks( 'BeforeWelcomeCreation', array( &$welcome_creation_msg, &$injected_html ) );
 
-               $this->displaySuccessfulAction( $this->msg( 'welcomeuser', $this->getUser()->getName() ),
-                       $welcome_creation_msg, $injected_html );
+               $this->displaySuccessfulAction(
+                       'signup',
+                       $this->msg( 'welcomeuser', $this->getUser()->getName() ),
+                       $welcome_creation_msg, $injected_html
+               );
        }
 
        /**
-        * Display an "successful action" page.
+        * Display a "successful action" page.
         *
+        * @param string $type condition of return to; see `executeReturnTo`
         * @param string|Message $title Page's title
         * @param string $msgname
         * @param string $injected_html
         */
-       private function displaySuccessfulAction( $title, $msgname, $injected_html ) {
+       private function displaySuccessfulAction( $type, $title, $msgname, $injected_html ) {
                $out = $this->getOutput();
                $out->setPageTitle( $title );
                if ( $msgname ) {
@@ -1057,7 +1062,7 @@ class LoginForm extends SpecialPage {
 
                $out->addHTML( $injected_html );
 
-               $this->executeReturnTo( 'success' );
+               $this->executeReturnTo( $type );
        }
 
        /**
@@ -1103,6 +1108,7 @@ class LoginForm extends SpecialPage {
         *
         * @param string $type One of the following:
         *    - error: display a return to link ignoring $wgRedirectOnLogin
+        *    - signup: display a return to link using $wgRedirectOnLogin if needed
         *    - success: display a return to link using $wgRedirectOnLogin if needed
         *    - successredirect: send an HTTP redirect using $wgRedirectOnLogin if needed
         * @param string $returnTo
@@ -1124,6 +1130,7 @@ class LoginForm extends SpecialPage {
         *
         * @param string $type One of the following:
         *    - error: display a return to link ignoring $wgRedirectOnLogin
+        *    - signup: display a return to link using $wgRedirectOnLogin if needed
         *    - success: display a return to link using $wgRedirectOnLogin if needed
         *    - successredirect: send an HTTP redirect using $wgRedirectOnLogin if needed
         */
@@ -1138,6 +1145,9 @@ class LoginForm extends SpecialPage {
                        $returnToQuery = wfCgiToArray( $this->mReturnToQuery );
                }
 
+               // Allow modification of redirect behavior
+               wfRunHooks( 'PostLoginRedirect', array( &$returnTo, &$returnToQuery, &$type ) );
+
                $returnToTitle = Title::newFromText( $returnTo );
                if ( !$returnToTitle ) {
                        $returnToTitle = Title::newMainPage();
index 8a5ba1d..411970e 100644 (file)
@@ -547,7 +547,7 @@ class UserrightsPage extends SpecialPage {
                                ->rawParams( $userToolLinks )->parse() .
                        $this->msg( 'userrights-groups-help', $user->getName() )->parse() .
                        $grouplist .
-                       Xml::tags( 'p', null, $this->groupCheckboxes( $groups, $user ) ) .
+                       $this->groupCheckboxes( $groups, $user ) .
                        Xml::openElement( 'table', array( 'id' => 'mw-userrights-table-outer' ) ) .
                                "<tr>
                                        <td class='mw-label'>" .
index 41847dc..543c8fe 100644 (file)
@@ -377,9 +377,7 @@ class SpecialVersion extends SpecialPage {
         * Returns an array with the base extension types.
         * Type is stored as array key, the message as array value.
         *
-        * TODO: ideally this would return all extension types, including
-        * those added by SpecialVersionExtensionTypes. This is not possible
-        * since this hook is passing along $this though.
+        * TODO: ideally this would return all extension types.
         *
         * @since 1.17
         *
@@ -433,8 +431,6 @@ class SpecialVersion extends SpecialPage {
 
                $extensionTypes = self::getExtensionTypes();
 
-               wfRunHooks( 'SpecialVersionExtensionTypes', array( &$this, &$extensionTypes ), '1.17' );
-
                $out = Xml::element(
                                'h2',
                                array( 'id' => 'mw-version-ext' ),
@@ -591,7 +587,16 @@ class SpecialVersion extends SpecialPage {
 
                // We must obtain the information for all the bits and pieces!
                // ... such as extension names and links
-               $extensionName = isset( $extension['name'] ) ? $extension['name'] : '[no name]';
+               if ( isset( $extension['namemsg'] ) ) {
+                       // Localized name of extension
+                       $extensionName = $this->msg( $extension['namemsg'] )->text();
+               } elseif ( isset( $extension['name'] ) ) {
+                       // Non localized version
+                       $extensionName = $extension['name'];
+               } else {
+                       $extensionName = $this->msg( 'version-no-ext-name' )->text();
+               }
+
                if ( isset( $extension['url'] ) ) {
                        $extensionNameLink = Linker::makeExternalLink(
                                $extension['url'],
index 490e81f..9c28d06 100644 (file)
@@ -79,6 +79,20 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                parent::execute( $subpage );
        }
 
+       /**
+        * Return an array of subpages beginning with $search that this special page will accept.
+        *
+        * @param string $search Prefix to search for
+        * @param integer $limit Maximum number of results to return
+        * @return string[] Matching subpages
+        */
+       public function prefixSearchSubpages( $search, $limit = 10 ) {
+               // See also SpecialEditWatchlist::prefixSearchSubpages
+               $subpages = array( 'clear', 'edit', 'raw' );
+               $escaped = preg_quote( $search );
+               return array_slice( preg_grep( "/^$escaped/i", $subpages ), 0, $limit );
+       }
+
        /**
         * Get a FormOptions object containing the default options
         *
@@ -317,6 +331,14 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                        $output->showLagWarning( $lag );
                }
 
+               # If no rows to display, show message before try to render the list
+               if ( $rows->numRows() == 0 ) {
+                       $output->wrapWikiMsg(
+                               "<div class='mw-changeslist-empty'>\n$1\n</div>", 'recentchanges-noresult'
+                       );
+                       return;
+               }
+
                $dbr->dataSeek( $rows, 0 );
 
                $list = ChangesList::newFromContext( $this->getContext() );
@@ -356,13 +378,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                }
                $s .= $list->endRecentChangesList();
 
-               if ( $rows->numRows() == 0 ) {
-                       $output->wrapWikiMsg(
-                               "<div class='mw-changeslist-empty'>\n$1\n</div>", 'recentchanges-noresult'
-                       );
-               } else {
-                       $output->addHTML( $s );
-               }
+               $output->addHTML( $s );
        }
 
        /**
index b32780f..b8ca434 100644 (file)
@@ -1298,6 +1298,8 @@ abstract class UploadBase {
        public function checkSvgScriptCallback( $element, $attribs ) {
                list( $namespace, $strippedElement ) = $this->splitXmlNamespace( $element );
 
+               // We specifically don't include:
+               // http://www.w3.org/1999/xhtml (bug 60771)
                static $validNamespaces = array(
                        '',
                        'adobe:ns:meta/',
@@ -1328,11 +1330,14 @@ abstract class UploadBase {
                        'http://purl.org/dc/elements/1.1',
                        'http://schemas.microsoft.com/visio/2003/svgextensions/',
                        'http://sodipodi.sourceforge.net/dtd/sodipodi-0.dtd',
+                       'http://taptrix.com/inkpad/svg_extensions',
                        'http://web.resource.org/cc/',
                        'http://www.freesoftware.fsf.org/bkchem/cdml',
                        'http://www.inkscape.org/namespaces/inkscape',
+                       'http://www.opengis.net/gml',
                        'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
                        'http://www.w3.org/2000/svg',
+                       'http://www.w3.org/tr/rec-rdf-syntax/',
                );
 
                if ( !in_array( $namespace, $validNamespaces ) ) {
index 6c95985..e4e1cfd 100644 (file)
@@ -66,7 +66,7 @@ define( 'IP_ADDRESS_STRING',
  */
 class IP {
        /** @var IPSet */
-       private static $ipSet = null;
+       private static $proxyIpSet = null;
 
        /**
         * Determine if a string is as valid IP address or network (CIDR prefix).
@@ -394,11 +394,24 @@ class IP {
        public static function toHex( $ip ) {
                if ( self::isIPv6( $ip ) ) {
                        $n = 'v6-' . self::IPv6ToRawHex( $ip );
-               } else {
-                       $n = self::toUnsigned( $ip );
+               } elseif ( self::isIPv4( $ip ) ) {
+                       // Bug 60035: an IP with leading 0's fails in ip2long sometimes (e.g. *.08)
+                       $ip = preg_replace( '/(?<=\.)0+(?=[1-9])/', '', $ip );
+                       $n = ip2long( $ip );
+                       if ( $n < 0 ) {
+                               $n += pow( 2, 32 );
+                               # On 32-bit platforms (and on Windows), 2^32 does not fit into an int,
+                               # so $n becomes a float. We convert it to string instead.
+                               if ( is_float( $n ) ) {
+                                       $n = (string)$n;
+                               }
+                       }
                        if ( $n !== false ) {
-                               $n = wfBaseConvert( $n, 10, 16, 8, false );
+                               # Floating points can handle the conversion; faster than wfBaseConvert()
+                               $n = strtoupper( str_pad( base_convert( $n, 10, 16 ), 8, '0', STR_PAD_LEFT ) );
                        }
+               } else {
+                       $n = false;
                }
 
                return $n;
@@ -423,33 +436,6 @@ class IP {
                return $r_ip;
        }
 
-       /**
-        * Given an IP address in dotted-quad/octet notation, returns an unsigned integer.
-        * Like ip2long() except that it actually works and has a consistent error return value.
-        *
-        * @param string $ip quad dotted IP address.
-        * @return Mixed: string/int/false
-        */
-       public static function toUnsigned( $ip ) {
-               if ( self::isIPv6( $ip ) ) {
-                       $n = wfBaseConvert( self::IPv6ToRawHex( $ip ), 16, 10 );
-               } else {
-                       // Bug 60035: an IP with leading 0's fails in ip2long sometimes (e.g. *.08)
-                       $ip = preg_replace( '/(?<=\.)0+(?=[1-9])/', '', $ip );
-                       $n = ip2long( $ip );
-                       if ( $n < 0 ) {
-                               $n += pow( 2, 32 );
-                               # On 32-bit platforms (and on Windows), 2^32 does not fit into an int,
-                               # so $n becomes a float. We convert it to string instead.
-                               if ( is_float( $n ) ) {
-                                       $n = (string)$n;
-                               }
-                       }
-               }
-
-               return $n;
-       }
-
        /**
         * Convert a network specification in CIDR notation
         * to an integer network and a number of bits
@@ -608,7 +594,7 @@ class IP {
                                $start = "v6-$start";
                                $end = "v6-$end";
                        }
-       // Explicit range notation...
+               // Explicit range notation...
                } elseif ( strpos( $range, '-' ) !== false ) {
                        list( $start, $end ) = array_map( 'trim', explode( '-', $range, 2 ) );
                        $start = self::toHex( $start );
@@ -732,10 +718,10 @@ class IP {
 
                // Check against addresses and CIDR nets in the NoPurge list
                if ( !$trusted ) {
-                       if ( !self::$ipSet ) {
-                               self::$ipSet = new IPSet( $wgSquidServersNoPurge );
+                       if ( !self::$proxyIpSet ) {
+                               self::$proxyIpSet = new IPSet( $wgSquidServersNoPurge );
                        }
-                       $trusted = self::$ipSet->match( $ip );
+                       $trusted = self::$proxyIpSet->match( $ip );
                }
                wfProfileOut( __METHOD__ );
 
@@ -747,6 +733,6 @@ class IP {
         * Use this only for unit tests.
         */
        public static function clearCaches() {
-               self::$ipSet = null;
+               self::$proxyIpSet = null;
        }
 }
diff --git a/includes/utils/MWCryptHKDF.php b/includes/utils/MWCryptHKDF.php
new file mode 100644 (file)
index 0000000..6b6655e
--- /dev/null
@@ -0,0 +1,331 @@
+<?php
+/**
+ * Extract-and-Expand Key Derivation Function (HKDF). A cryptographicly
+ * secure key expansion function based on RFC 5869.
+ *
+ * This relies on the secrecy of $wgSecretKey (by default), or $wgHKDFSecret.
+ * By default, sha256 is used as the underlying hashing algorithm, but any other
+ * algorithm can be used. Finding the secret key from the output would require
+ * an attacker to discover the input key (the PRK) to the hmac that generated
+ * the output, and discover the particular data, hmac'ed with an evolving key
+ * (salt), to produce the PRK. Even with md5, no publicly known attacks make
+ * this currently feasible.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @author Chris Steipp
+ * @file
+ */
+
+class MWCryptHKDF {
+
+       /**
+        * Singleton instance for public use
+        */
+       protected static $singleton = null;
+
+       /**
+        * The persistant cache
+        */
+       protected $cache = null;
+
+       /**
+        * Cache key we'll use for our salt
+        */
+       protected $cacheKey = null;
+
+       /**
+        * The hash algorithm being used
+        */
+       protected $algorithm = null;
+
+       /**
+        * binary string, the salt for the HKDF
+        */
+       protected $salt;
+
+       /**
+        * The pseudorandom key
+        */
+       private $prk;
+
+       /**
+        * The secret key material. This must be kept secret to preserve
+        * the security properties of this RNG.
+        */
+       private $skm;
+
+       /**
+        * The last block (K(i)) of the most recent expanded key
+        */
+       protected $lastK;
+
+       /**
+        * a "context information" string CTXinfo (which may be null)
+        * See http://eprint.iacr.org/2010/264.pdf Section 4.1
+        */
+       protected $context = array();
+
+       /**
+        * Round count is computed based on the hash'es output length,
+        * which neither php nor openssl seem to provide easily.
+        */
+       public static $hashLength = array(
+               'md5' => 16,
+               'sha1' => 20,
+               'sha224' => 28,
+               'sha256' => 32,
+               'sha384' => 48,
+               'sha512' => 64,
+               'ripemd128' => 16,
+               'ripemd160' => 20,
+               'ripemd256' => 32,
+               'ripemd320' => 40,
+               'whirlpool' => 64,
+       );
+
+
+       /**
+        * @param string $hash Name of hashing algorithm
+        * @param BagOStuff $cache
+        * @param string|array $context to mix into HKDF context
+        */
+       public function __construct( $secretKeyMaterial, $algorithm, $cache, $context ) {
+               if ( strlen( $secretKeyMaterial ) < 16 ) {
+                       throw new MWException( "MWCryptHKDF secret was too short." );
+               }
+               $this->skm = $secretKeyMaterial;
+               $this->algorithm = $algorithm;
+               $this->cache = $cache;
+               $this->salt = ''; // Initialize a blank salt, see getSaltUsingCache()
+               $this->prk = '';
+               $this->context = is_array( $context ) ? $context : array( $context );
+
+               // To prevent every call from hitting the same memcache server, pick
+               // from a set of keys to use. mt_rand is only use to pick a random
+               // server, and does not affect the security of the process.
+               $this->cacheKey = wfMemcKey( 'HKDF', mt_rand( 0, 16 ) );
+       }
+
+       /**
+        * Save the last block generated, so the next user will compute a different PRK
+        * from the same SKM. This should keep things unpredictable even if an attacker
+        * is able to influence CTXinfo.
+        */
+       function __destruct() {
+               if ( $this->lastK ) {
+                       $this->cache->set( $this->cacheKey, $this->lastK );
+               }
+       }
+
+       /**
+        * MW specific salt, cached from last run
+        * @return string binary string
+        */
+       protected function getSaltUsingCache() {
+               if ( $this->salt == '' ) {
+                       $lastSalt = $this->cache->get( $this->cacheKey );
+                       if ( $lastSalt === false ) {
+                               // If we don't have a previous value to use as our salt, we use
+                               // 16 bytes from MWCryptRand, which will use a small amount of
+                               // entropy from our pool. Note, "XTR may be deterministic or keyed
+                               // via an optional “salt value”  (i.e., a non-secret random
+                               // value)..." - http://eprint.iacr.org/2010/264.pdf. However, we
+                               // use a strongly random value since we can.
+                               $lastSalt = MWCryptRand::generate( 16 );
+                       }
+                       // Get a binary string that is hashLen long
+                       $this->salt = hash( $this->algorithm, $lastSalt, true );
+               }
+               return $this->salt;
+       }
+
+       /**
+        * Return a singleton instance, based on the global configs.
+        * @return HKDF
+        */
+       protected static function singleton() {
+               global $wgHKDFAlgorithm, $wgHKDFSecret, $wgSecretKey;
+
+               $secret = $wgHKDFSecret ?: $wgSecretKey;
+               if ( !$secret ) {
+                       throw new MWException( "Cannot use MWCryptHKDF without a secret." );
+               }
+
+               // In HKDF, the context can be known to the attacker, but this will
+               // keep simultaneous runs from producing the same output.
+               $context = array();
+               $context[] = microtime();
+               $context[] = getmypid();
+               $context[] = gethostname();
+
+               // Setup salt cache. Use APC, or fallback to the main cache if it isn't setup
+               try {
+                       $cache = ObjectCache::newAccelerator( array() );
+               } catch ( Exception $e ) {
+                       $cache = wfGetMainCache();
+               }
+
+               if ( is_null( self::$singleton ) ) {
+                       self::$singleton = new self( $secret, $wgHKDFAlgorithm, $cache, $context );
+               }
+
+               return self::$singleton;
+       }
+
+       /**
+        * Produce $bytes of secure random data. As a side-effect,
+        * $this->lastK is set to the last hashLen block of key material.
+        * @param int $bytes number of bytes of data
+        * @param string $context to mix into CTXinfo
+        * @return string binary string of length $bytes
+        */
+       protected function realGenerate( $bytes, $context = '' ) {
+
+               if ( $this->prk === '' ) {
+                       $salt = $this->getSaltUsingCache();
+                       $this->prk = self::HKDFExtract(
+                               $this->algorithm,
+                               $salt,
+                               $this->skm
+                       );
+               }
+
+               $CTXinfo = implode( ':', array_merge( $this->context, array( $context ) ) );
+
+               return self::HKDFExpand(
+                       $this->algorithm,
+                       $this->prk,
+                       $CTXinfo,
+                       $bytes,
+                       $this->lastK
+               );
+       }
+
+
+       /**
+        * RFC5869 defines HKDF in 2 steps, extraction and expansion.
+        * From http://eprint.iacr.org/2010/264.pdf:
+        *
+        * The scheme HKDF is specifed as:
+        *      HKDF(XTS, SKM, CTXinfo, L) = K(1) || K(2) || ... || K(t)
+        * where the values K(i) are defined as follows:
+        *      PRK = HMAC(XTS, SKM)
+        *      K(1) = HMAC(PRK, CTXinfo || 0);
+        *      K(i+1) = HMAC(PRK, K(i) || CTXinfo || i), 1 <= i < t;
+        * where t = [L/k] and the value K(t) is truncated to its first d = L mod k bits;
+        * the counter i is non-wrapping and of a given fixed size, e.g., a single byte.
+        * Note that the length of the HMAC output is the same as its key length and therefore
+        * the scheme is well defined.
+        *
+        * XTS is the "extractor salt"
+        * SKM is the "secret keying material"
+        *
+        * N.B. http://eprint.iacr.org/2010/264.pdf seems to differ from RFC 5869 in that the test
+        * vectors from RFC 5869 only work if K(0) = '' and K(1) = HMAC(PRK, K(0) || CTXinfo || 1)
+        *
+        * @param string $hash the hashing function to use (e.g., sha256)
+        * @param string $ikm the input keying material
+        * @param string $salt the salt to add to the ikm, to get the prk
+        * @param string $info optional context (change the output without affecting
+        *      the randomness properties of the output)
+        * @param integer $L number of bytes to return
+        * @return string cryptographically secure pseudorandom binary string
+        */
+       public static function HKDF( $hash, $ikm, $salt, $info, $L ) {
+               $prk = self::HKDFExtract( $hash, $salt, $ikm );
+               $okm = self::HKDFExpand( $hash, $prk, $info, $L );
+               return $okm;
+       }
+
+       /**
+        * Extract the PRK, PRK = HMAC(XTS, SKM)
+        * Note that the hmac is keyed with XTS (the salt),
+        * and the SKM (source key material) is the "data".
+        *
+        * @param string $hash the hashing function to use (e.g., sha256)
+        * @param string $ikm the input keying material
+        * @param string $salt the salt to add to the ikm, to get the prk
+        * @return string binary string (pseudorandm key) used as input to HKDFExpand
+        */
+       private static function HKDFExtract( $hash, $salt, $ikm ) {
+               return hash_hmac( $hash, $ikm, $salt, true );
+       }
+
+       /**
+        * Expand the key with the given context
+        *
+        * @param $hash Hashing Algorithm
+        * @param $prk a pseudorandom key of at least HashLen octets
+         *     (usually, the output from the extract step)
+        * @param $info optional context and application specific information
+         *     (can be a zero-length string)
+        * @param $bytes length of output keying material in bytes
+         *     (<= 255*HashLen)
+        * @param &$lastK set by this function to the last block of the expansion.
+        *      In MediaWiki, this is used to seed future Extractions.
+        * @return string cryptographically secure random string $bytes long
+        */
+       private static function HKDFExpand( $hash, $prk, $info, $bytes, &$lastK = '' ) {
+               $hashLen = MWCryptHKDF::$hashLength[$hash];
+               $rounds = ceil( $bytes / $hashLen );
+               $output = '';
+
+               if ( $bytes > 255 * $hashLen ) {
+                       throw new MWException( "Too many bytes requested from HDKFExpand" );
+               }
+
+               // K(1) = HMAC(PRK, CTXinfo || 1);
+               // K(i) = HMAC(PRK, K(i-1) || CTXinfo || i); 1 < i <= t;
+               for ( $counter = 1; $counter <= $rounds; ++$counter ) {
+                       $lastK = hash_hmac(
+                               $hash,
+                               $lastK . $info . chr($counter),
+                               $prk,
+                               true
+                       );
+                       $output .= $lastK;
+               }
+
+               return substr( $output, 0, $bytes );
+       }
+
+       /**
+        * Generate cryptographically random data and return it in raw binary form.
+        *
+        * @param int $bytes the number of bytes of random data to generate
+        * @param string $context string to mix into HMAC context
+        * @return string binary string of length $bytes
+        */
+       public static function generate( $bytes, $context ) {
+               return self::singleton()->realGenerate( $bytes, $context );
+       }
+
+       /**
+        * Generate cryptographically random data and return it in hexadecimal string format.
+        * See MWCryptRand::realGenerateHex for details of the char-to-byte conversion logic.
+        *
+        * @param int $chars the number of hex chars of random data to generate
+        * @param string $context string to mix into HMAC context
+        * @return string random hex characters, $chars long
+        */
+       public static function generateHex( $chars, $context = '' ) {
+               $bytes = ceil( $chars / 2 );
+               $hex = bin2hex( self::singleton()->realGenerate( $bytes, $context ) );
+               return substr( $hex, 0, $chars );
+       }
+
+}
index 0172974..eb74d12 100644 (file)
@@ -134,12 +134,10 @@ class MWCryptRand {
                // It's mostly worthless but throw the wiki's id into the data for a little more variance
                $state .= wfWikiID();
 
-               // If we have a secret key or proxy key set then throw it into the state as well
-               global $wgSecretKey, $wgProxyKey;
+               // If we have a secret key set then throw it into the state as well
+               global $wgSecretKey;
                if ( $wgSecretKey ) {
                        $state .= $wgSecretKey;
-               } elseif ( $wgProxyKey ) {
-                       $state .= $wgProxyKey;
                }
 
                return $state;
index 38d3af5..e505b28 100644 (file)
@@ -1880,7 +1880,7 @@ class Language {
        /**
         * Used by date() and time() to adjust the time output.
         *
-        * @param int $ts The time in date('YmdHis') format
+        * @param string $ts The time in date('YmdHis') format
         * @param mixed $tz Adjust the time by this amount (default false, mean we
         *   get user timecorrection setting)
         * @return int
@@ -2020,7 +2020,7 @@ class Language {
        }
 
        /**
-        * @param mixed $ts The time format which needs to be turned into a
+        * @param string $ts The time format which needs to be turned into a
         *   date('YmdHis') format with wfTimestamp(TS_MW,$ts)
         * @param bool $adj Whether to adjust the time output according to the
         *   user configured offset ($timecorrection)
@@ -2039,7 +2039,7 @@ class Language {
        }
 
        /**
-        * @param mixed $ts The time format which needs to be turned into a
+        * @param string $ts The time format which needs to be turned into a
         *   date('YmdHis') format with wfTimestamp(TS_MW,$ts)
         * @param bool $adj Whether to adjust the time output according to the
         *   user configured offset ($timecorrection)
@@ -2058,7 +2058,7 @@ class Language {
        }
 
        /**
-        * @param mixed $ts The time format which needs to be turned into a
+        * @param string $ts The time format which needs to be turned into a
         *   date('YmdHis') format with wfTimestamp(TS_MW,$ts)
         * @param bool $adj Whether to adjust the time output according to the
         *   user configured offset ($timecorrection)
@@ -2149,7 +2149,7 @@ class Language {
         * Internal helper function for userDate(), userTime() and userTimeAndDate()
         *
         * @param string $type Can be 'date', 'time' or 'both'
-        * @param mixed $ts The time format which needs to be turned into a
+        * @param string $ts The time format which needs to be turned into a
         *   date('YmdHis') format with wfTimestamp(TS_MW,$ts)
         * @param User $user User object used to get preferences for timezone and format
         * @param array $options Array, can contain the following keys:
@@ -3981,9 +3981,11 @@ class Language {
        }
 
        /**
+        * @deprecated since 1.24, will be removed in 1.25
         * @return Language
         */
        function getLangObj() {
+               wfDeprecated( __METHOD__, '1.24' );
                return $this;
        }
 
index 65d74e9..b3a4c1a 100644 (file)
@@ -1062,8 +1062,8 @@ class LanguageConverter {
         * @param Content $content New page content
         * @param string $summary Edit summary of the edit
         * @param bool $isMinor Was the edit marked as minor?
-        * @param bool $isWatch Did the user watch this page or not?
-        * @param string|int $section
+        * @param null $isWatch Unused.
+        * @param null $section Unused.
         * @param int $flags Bitfield
         * @param Revision|null $revision New Revision object or null
         * @return bool True
old mode 100755 (executable)
new mode 100644 (file)
index 68d3d11..f980f19 100644 (file)
        "qbmyoptions": "My bladsye",
        "faq": "Gewilde vrae",
        "faqpage": "Project:GewildeVrae",
-       "vector-action-addsection": "Nuwe onderwerp",
-       "vector-action-delete": "Skrap",
-       "vector-action-move": "Skuif",
-       "vector-action-protect": "Beskerm",
-       "vector-action-undelete": "Ontskrap",
-       "vector-action-unprotect": "Wysig beskerming",
-       "vector-view-create": "Skep",
-       "vector-view-edit": "Wysig",
-       "vector-view-history": "Wys geskiedenis",
-       "vector-view-view": "Lees",
-       "vector-view-viewsource": "Wys bronteks",
        "actions": "Aksies",
        "namespaces": "Naamruimtes",
        "variants": "Variante",
        "jumptonavigation": "navigasie",
        "jumptosearch": "soek",
        "view-pool-error": "Jammer, die bedieners is tans oorbelas.\nTe veel gebruikers probeer om na hierdie bladsy te kyk.\nWag asseblief 'n rukkie voordat u weer probeer om die bladsy op te roep.\n\n$1",
+       "generic-pool-error": "Jammer, die bedieners is tans oorbelas.\nTe veel gebruikers probeer om na hierdie bladsy te kyk.\nWag asseblief 'n rukkie voordat u weer probeer.",
        "pool-timeout": "Die maksimum wagtyd vir 'n databasisversperring is oorskry.",
        "pool-queuefull": "Die poel se wagtou is vol",
        "pool-errorunknown": "Onbekende fout",
+       "pool-servererror": "Die \"pool counter\"-diens is nie beskikbaar nie ($1).",
        "aboutsite": "Inligting oor {{SITENAME}}",
        "aboutpage": "Project:Omtrent",
        "copyright": "Inhoud is onderhewig aan $1, tensy anders vermeld",
        "gotaccountlink": "Meld aan",
        "userlogin-resetlink": "U besonderhede vergeet?",
        "userlogin-resetpassword-link": "Wagwoord vergeet?",
+       "userlogin-helplink2": "Hulp met aanmelding",
        "userlogin-loggedin": "U is reeds aangemeld as {{GENDER:$1|$1}}.\nGebruik die onderstaande vorm om as 'n ander gebruiker aan te meld.",
        "userlogin-createanother": "Skep nog 'n rekening",
        "createacct-emailrequired": "E-posadres",
        "undo-success": "Die wysiging kan ongedaan gemaak word.\nKontroleer die vergelyking hieronder om seker te maak dis wat u wil doen, en stoor dan om die terugrol te voltooi.",
        "undo-failure": "Die wysiging kan nie ongedaan gemaak word nie omdat dit met intermediêre wysigings bots.",
        "undo-norev": "Die wysiging kon nie ongedaan gemaak word nie omdat dit nie bestaan nie of reeds verwyder is.",
+       "undo-nochange": "Die wysiging is klaarblyklik reeds teruggerol.",
        "undo-summary": "Rol weergawe $1 deur [[Special:Contributions/$2|$2]] ([[User talk:$2|bespreek]]) terug.",
        "undo-summary-username-hidden": "Rol weergawe $1 deur 'n versteekte gebruiker terug",
        "cantcreateaccounttitle": "Kan nie rekening skep nie",
        "revdelete-hide-user": "Steek redigeerder se gebruikersnaam/IP weg",
        "revdelete-hide-restricted": "Onderdruk data van administrateurs asook andere",
        "revdelete-radio-same": "(moenie verander nie)",
-       "revdelete-radio-set": "Ja",
-       "revdelete-radio-unset": "Nee",
+       "revdelete-radio-set": "Versteek",
+       "revdelete-radio-unset": "Sigbaar",
        "revdelete-suppress": "Onderdruk data van administrateurs en ander.",
        "revdelete-unsuppress": "Verwyder beperkinge op herstelde weergawes",
        "revdelete-log": "Rede:",
        "difference-missing-revision": "{{PLURAL:$2|'n Weergawe|$2 weergawes}} van die verskil ($1) {{PLURAL:$2|is|is}} nie gevind nie.\n\nDit word meestal veroorsaak deur die volg van 'n verouderde verwysing na 'n bladsy wat verwyder is.\nDetails kan in die [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} skraplogboek] gevind word.",
        "searchresults": "Soekresultate",
        "searchresults-title": "Soekresultate vir \"$1\"",
-       "toomanymatches": "Te veel resultate. Probeer asseblief 'n ander soektog.",
        "titlematches": "Artikeltitel resultate",
        "textmatches": "Artikelteks resultate",
        "notextmatches": "Geen artikelteks resultate nie",
        "searchmenu-exists": "'''Daar is reeds 'n bladsy genaamd \"[[:$1]]\" op die wiki'''",
        "searchmenu-new": "<strong>Skep die bladsy \"[[:$1]]\" op hierdie wiki</strong> {{PLURAL:$2|0=|Sien ook die bladsy wat in u soektog gevind is.|Sien ook die soekresultate wat gevind is.}}",
        "searchprofile-articles": "Inhoudelike bladsye",
-       "searchprofile-project": "Hulp- en projekbladsye",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Alles",
        "searchprofile-advanced": "Uitgebreid",
        "searchprofile-articles-tooltip": "Soek in $1",
-       "searchprofile-project-tooltip": "Soek in $1",
        "searchprofile-images-tooltip": "Soek na lêers",
        "searchprofile-everything-tooltip": "Soek deur alle inhoud (ook besprekingsbladsye)",
        "searchprofile-advanced-tooltip": "Soek in spesifieke naamruimtes",
        "search-interwiki-default": "Resultate van $1:",
        "search-interwiki-more": "(meer)",
        "search-relatedarticle": "Verwante",
-       "searcheverything-enable": "Soek in alle naamruimtes",
        "searchrelated": "verwante",
        "searchall": "alle",
        "showingresults": "Hier volg {{PLURAL:$1|'''1''' resultaat|'''$1''' resultate}} vanaf #'''$2'''.",
        "allowemail": "Laat e-pos van ander toe",
        "prefs-searchoptions": "Soek",
        "prefs-namespaces": "Naamruimtes",
-       "defaultns": "Anders, soek in hierdie naamruimtes:",
        "default": "verstek",
        "prefs-files": "Lêers",
        "prefs-custom-css": "Persoonlike CSS",
        "prefs-signature": "Handtekening",
        "prefs-dateformat": "Datumformaat",
        "prefs-timeoffset": "Tydsverskil",
-       "prefs-advancedediting": "Algemeen",
+       "prefs-advancedediting": "Algemene instellings",
        "prefs-editor": "Redigeerder",
        "prefs-preview": "Voorskou",
        "prefs-advancedrc": "Gevorderde instellings",
        "right-move": "Skuif bladsye",
        "right-move-subpages": "skuif bladsye met hul subblaaie",
        "right-move-rootuserpages": "Skuif gebruikersblaaie op hoogste vlak",
+       "right-move-categorypages": "Skuif kategoriebladsye",
        "right-movefile": "Skuif lêers",
        "right-suppressredirect": "Geen aansture agterlaat by die skuif van bladsye nie",
        "right-upload": "Laai lêers op",
        "action-createpage": "skep bladsye",
        "action-createtalk": "skep besprekingsblaaie",
        "action-createaccount": "skep die gebruiker",
+       "action-history": "wys die bladsy se geskiedenis",
        "action-minoredit": "merk die wysiging as 'n klein verandering",
        "action-move": "skuif die bladsy",
        "action-move-subpages": "skuif die bladsy met sy subbladsye",
        "action-move-rootuserpages": "gebruikersbladsye van die hoogste vlak te skuif nie",
+       "action-move-categorypages": "skuif kategoriebladsye",
        "action-movefile": "skuif die lêer",
        "action-upload": "laai die lêer op",
        "action-reupload": "oorskryf die bestaande lêer",
        "listusers": "Gebruikerslys",
        "listusers-editsonly": "Slegs gebruikers met wysigings",
        "listusers-creationsort": "Sorteer volgens registrasiedatum",
+       "listusers-desc": "Sorteer in aflopende volgorde",
        "usereditcount": "$1 {{PLURAL:$1|wysiging|wysigings}}",
        "usercreated": "{{GENDER:$3|Geregistreer}} op $1 om $2",
        "newpages": "Nuwe bladsye",
        "listgrouprights-removegroup-self": "Die volgende {{PLURAL:$2|groep|groepe}} verwyder van eie gebruiker: $1",
        "listgrouprights-addgroup-self-all": "Alle groepe byvoeg tot eie gebruiker",
        "listgrouprights-removegroup-self-all": "Alle groepe verwyder van eie gebruiker",
+       "listgrouprights-namespaceprotection-header": "Naamruimtebeperkings",
        "listgrouprights-namespaceprotection-namespace": "Naamruimte",
+       "trackingcategories-msg": "Volg kategorie",
        "trackingcategories-name": "Boodskapnaam",
        "trackingcategories-nodesc": "Geen beskrywing beskikbaar nie.",
        "trackingcategories-disabled": "Kategorie is gedeaktiveer",
        "pageinfo-category-pages": "Aantal bladsye",
        "pageinfo-category-subcats": "Aantal subkategorieë",
        "pageinfo-category-files": "Aantal lêers",
-       "skinname-cologneblue": "Keulen blou",
        "markaspatrolleddiff": "Merk as gekontroleerd",
        "markaspatrolledtext": "Merk hierdie bladsy as gekontroleerd",
        "markedaspatrolled": "As gekontroleerd gemerk",
        "watchlistedit-raw-done": "U dophoulys is opgedateer.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 titel|$1 titels}} was bygevoeg:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 titel|$1 titels}} verwyder:",
+       "watchlistedit-clear-titles": "Titels:",
+       "watchlistedit-clear-done": "U dophoulys is uitgevee.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 titel|$1 titels}} is verwyder:",
+       "watchlisttools-clear": "Vee dophoulys uit",
        "watchlisttools-view": "Besigtig veranderinge",
        "watchlisttools-edit": "Bekyk en wysig dophoulys",
        "watchlisttools-raw": "Wysig bronkode",
        "htmlform-no": "Nee",
        "htmlform-yes": "Ja",
        "htmlform-chosen-placeholder": "Kies 'n opsie",
+       "htmlform-cloner-create": "Meer meer by",
        "htmlform-cloner-delete": "Verwyder",
        "htmlform-cloner-required": "Ten minste één waarde verwag.",
        "sqlite-has-fts": "Weergawe $1 met ondersteuning vir vol-teks soektogte (\"full-text search\")",
index 3752ef0..f811ddf 100644 (file)
        "qbmyoptions": "የኔ ገጾች",
        "faq": "ብጊየጥ (ብዙ ጊዜ የሚጠየቁ ጥያቀዎች)",
        "faqpage": "Project:ብጊየጥ",
-       "vector-action-addsection": "ርዕስ ጨምር",
-       "vector-action-delete": "አጥፋ",
-       "vector-action-move": "ለማዛወር",
-       "vector-action-protect": "ለመቆለፍ",
-       "vector-action-undelete": "አታጥፋ",
-       "vector-action-unprotect": "አለመቆለፍ",
-       "vector-view-create": "አዲስ ፍጠር",
-       "vector-view-edit": "አርም",
-       "vector-view-history": "ታሪኩን አሳይ",
-       "vector-view-view": "ለማንበብ",
-       "vector-view-viewsource": "ጥሬ ኮድ ለመመልከት",
        "actions": "ድርጊቶች",
        "namespaces": "ክፍለ-ዊኪዎች",
        "errorpagetitle": "ስህተት",
        "userlogin-yourname-ph": "የብዕር ስም ያስገቡ",
        "createacct-another-username-ph": "የብዕር ስም ያስገቡ",
        "yourpassword": "Password / መግቢያ ቃል",
+       "userlogin-yourpassword": "የይለፍ ቃል",
        "userlogin-yourpassword-ph": "የመግቢያ ቃል ያስገቡ",
+       "createacct-yourpassword-ph": "የይለፍ ቃል ያስገቡ",
        "yourpasswordagain": "መግቢያ ቃልዎን ዳግመኛ ይስጡ",
        "createacct-yourpasswordagain": "የመግቢያ ቃሉን ይድገሙ",
        "createacct-yourpasswordagain-ph": "የመግቢያ ቃሉን ይድገሙ",
        "gotaccount": "(አባልነት አሁን ካለዎ፥ '''$1''' ይግቡ)",
        "gotaccountlink": "በዚህ",
        "userlogin-resetlink": "የመግቢያ ዝርዝርዎን ረተዋልን?",
+       "userlogin-resetpassword-link": "የይለፍ ቃልዎን አጡ?",
        "createacct-emailrequired": "ኢ-ሜይል አድራሻ",
        "createacct-email-ph": "ኢ-ሜይል አድራሻዎን ያስገቡ",
        "createaccountmail": "በኢ-ሜል",
        "loginlanguagelabel": "ቋምቋ፦ $1",
        "pt-login": "ለመግባት",
        "pt-login-button": "ለመግባት",
+       "pt-userlogout": "መውጫ",
        "user-mail-no-addy": "እሚደርስበት ኢ-ሜል አድራሻ ሳይታወቅ መላክ አይቻልም።",
        "changepassword": "መግቢያ ቃልዎን ለመቀየር",
        "resetpass_announce": "በኢ-ሜል በተላከ ጊዜያዊ ኮድ ገብተዋል። መግባትዎን ለመጨርስ፣ አዲስ መግቢያ ቃል እዚህ መምረጥ አለብዎ።",
        "edit-gone-missing": "ገጹን ማሳደስ አልተቻለም።  እንደ ጠፋ ይመስላል።",
        "edit-conflict": "ተቃራኒ ለውጥ።",
        "edit-no-change": "በጽሕፈቱ አንዳችም አልተለወጠምና ለውጥዎ ቸል ተብሏል።",
+       "postedit-confirmation-saved": "እርማትዎ ተቆጥቧል",
        "edit-already-exists": "አዲስ ገጽ ለመፍጠር አልተቻለም፤\nገና ይኖራልና።",
        "defaultmessagetext": "የቆየው ጽሕፈት",
        "content-model-javascript": "ጃቫ ስክሪፕት",
        "editundo": "ለውጡ ይገልበጥ",
        "searchresults": "የፍለጋ ውጤቶች",
        "searchresults-title": "ለ\"$1\" የፍለጋ ውጤቶች",
-       "toomanymatches": "ከመጠን በላይ ያሉ ስምምነቶች ተመለሱ፤ እባክዎ ሌላ ጥያቄ ይሞክሩ።",
        "titlematches": "የሚስማሙ አርዕስቶች",
        "textmatches": "ጽሕፈት የሚስማማባቸው ገጾች",
        "notextmatches": "ጽሕፈት የሚስማማባቸው ገጾች የሉም",
        "searchmenu-exists": "'''\"[[:$1]]\" የሚባል መጣጥፍ በዚሁ ዊኪ ላይ አለ።'''",
        "searchmenu-new": "'''\"[[:$1]]\" የሚባል መጣጥፍ ይፈጠር?'''",
        "searchprofile-articles": "ይዞታ ያላቸው መጣጥፎች",
-       "searchprofile-project": "የዕርዳታ እና የመርሃግብሩ ገጾች",
        "searchprofile-images": "ፋይሎች",
        "searchprofile-everything": "ሁሉም",
        "searchprofile-advanced": "የተደረጀ ፍለጋ",
        "searchprofile-articles-tooltip": "በ$1 ለመፈለግ",
-       "searchprofile-project-tooltip": "በ$1 ለመፈለግ",
        "searchprofile-images-tooltip": "ለፋይሎች ለመፈለግ",
        "searchprofile-everything-tooltip": "ይዞታውን ሁሉ (ከነውይይት ገጾች) ለመፈለግ",
        "searchprofile-advanced-tooltip": "በልዩ ክፍለ-ዊኪዎች ለመፈለግ",
        "search-interwiki-default": "$1 ውጤቶች፦",
        "search-interwiki-more": "(ተጨማሪ)",
        "search-relatedarticle": "የተዛመደ",
-       "searcheverything-enable": "በክፍለ-ዊኪዎች ሁሉ ለመፈለግ",
        "searchrelated": "የተዛመደ",
        "searchall": "ሁሉ",
        "showingresults": "ከ ቁ.#<b>$2</b> ጀምሮ እስከ <b>$1</b> ውጤቶች ድረስ ከዚህ በታች ይታያሉ።",
        "allowemail": "ኢሜል ከሌሎች ተጠቃሚዎች ለመፍቀድ",
        "prefs-searchoptions": "የፍለጋ ምርጫዎች",
        "prefs-namespaces": "ክፍለ-ዊኪዎች",
-       "defaultns": "በመጀመርያው ፍለጋዎ በነዚህ ክፍለ-ዊኪዎች ብቻ ይደረግ:",
        "default": "ቀዳሚ",
        "prefs-files": "የስዕሎች መጠን",
        "prefs-custom-css": "ልዩ CSS",
        "prefs-emailconfirm-label": "የኢ-ሜል ማረጋገጫ",
        "youremail": "ኢ-ሜል *",
        "username": "የብዕር ስም:",
-       "uid": "የገባበት ቁ.: #",
        "prefs-memberingroups": "ተጠቃሚው {{PLURAL:$1|ያለበት ስብስባ|ያለባቸው ስብስባዎች}}፦",
        "prefs-registration": "የተመዘገበበት ሰዓት፦",
        "yourrealname": "ዕውነተኛ ስም፦",
        "logempty": "(በመዝገቡ ምንም የለም...)",
        "log-title-wildcard": "ከዚህ ፊደል ጀምሮ አርዕስቶችን ለመፈልግ",
        "allpages": "ገጾች ሁሉ በሙሉ",
-       "alphaindexline": "$1 እስከ $2 ድረስ",
        "nextpage": "የሚቀጥለው ገጽ (ከ$1 ጀምሮ)",
        "prevpage": "ፊተኛው ገጽ (ከ$1 ጀምሮ)",
        "allpagesfrom": "ገጾች ከዚሁ ፊደል ጀምሮ ይታዩ፦",
index d685f8f..cf39137 100644 (file)
        "qbmyoptions": "Mīne trametas",
        "faq": "Oftost ascoda ascunga",
        "faqpage": "Project:FAQ",
-       "vector-action-addsection": "Besettan mearcunge",
-       "vector-action-delete": "Forlēosan",
-       "vector-action-move": "Wegan",
-       "vector-action-protect": "Beorgan",
-       "vector-action-undelete": "Scieppan tramet eft",
-       "vector-action-unprotect": "Andwendan beorgunge",
-       "vector-view-create": "Scieppan",
-       "vector-view-edit": "Adihtan",
-       "vector-view-history": "Stǣr",
-       "vector-view-view": "Rǣdan",
-       "vector-view-viewsource": "Sēon fruman",
        "actions": "Fremmunga",
        "namespaces": "Namstedas",
        "variants": "Missenlīcnessa",
        "viewprevnext": "Sēon ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-new": "<strong>Scieppan þone tramet \"[[:$1]]\" on þissum wiki!</strong> {{PLURAL:$2|0=|Seoh ēac þone tramet þe wæs gefunden mid þīnre sōcne.|Seoh ēac þā þing þā wǣron gefunden.}}",
        "searchprofile-articles": "Innunge trametas",
-       "searchprofile-project": "Helpes and Weorca trametas",
        "searchprofile-images": "Missenendebyrdness",
        "searchprofile-everything": "Gehwæt",
        "searchprofile-articles-tooltip": "Sēcan in $1",
-       "searchprofile-project-tooltip": "Sēcan in $1",
        "searchprofile-images-tooltip": "Sēcan ymelan",
        "search-result-size": "$1 ({{PLURAL:$2|1 word|$2 worda}})",
        "search-redirect": "(edlǣded fram \"$1\")",
        "savedprefs": "Þīna fōreberunga wurdon gehordod.",
        "timezonelegend": "Tīdgeard",
        "servertime": "Þegntōles tīd is nū:",
-       "defaultns": "Elles sēcan on þissum namstedum:",
        "default": "gewunelic",
        "youremail": "Spearcǣrenda nama:",
        "username": "{{GENDER:$1|Brūcendnama}}:",
        "recentchanges-label-newpage": "Þēos adihtung scōp nīwne tramet",
        "recentchanges-label-minor": "Þēos is lytel adihtung",
        "recentchanges-label-bot": "Searuþrǣl fremede þās adihtunge",
-       "recentchanges-legend-newpage": "(seoh ēac [[Special:NewPages|getæl nīwra trameta]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (seoh ēac [[Special:NewPages|getæl nīwra trameta]])",
        "rcnotefrom": "Niðer sind þā andwendunga fram <strong>$2</strong> (mǣst īweþ <strong>$1</strong>).",
        "rclistfrom": "Īwan nīwa andwendunga fram $3 $2 and siþþan",
        "rcshowhideminor": "$1 lytela adihtunga",
index 4649132..0598325 100644 (file)
@@ -44,7 +44,8 @@
                        "وهراني",
                        "아라",
                        "Test Create account",
-                       "Kuwaity26"
+                       "Kuwaity26",
+                       "Calak"
                ]
        },
        "tog-underline": "سطر تحت الوصلات:",
        "qbmyoptions": "صفحاتي",
        "faq": "الأسئلة المتكررة",
        "faqpage": "Project:أسئلة متكررة",
-       "vector-action-addsection": "أضف موضوعا",
-       "vector-action-delete": "احذف",
-       "vector-action-move": "انقل",
-       "vector-action-protect": "احم",
-       "vector-action-undelete": "ألغ الحذف",
-       "vector-action-unprotect": "غير الحماية",
-       "vector-view-create": "أنشئ",
-       "vector-view-edit": "عدل",
-       "vector-view-history": "اعرض التاريخ",
-       "vector-view-view": "اقرأ",
-       "vector-view-viewsource": "اعرض المصدر",
        "actions": "أفعال",
        "namespaces": "فضاءات التسمية",
        "variants": "المتغيرات",
        "node-count-exceeded-category": "تجاوزات تعداد العقد",
        "node-count-exceeded-warning": "تجاوزت هذه الصفحة تعداد العقد",
        "expansion-depth-exceeded-category": "تجاوزات عمق التوسيع",
+       "expansion-depth-exceeded-category-desc": "هذا تصنيف للصفحات التي تتجاوز عمق التوسيع.",
        "expansion-depth-exceeded-warning": "الصفحة تجاوزت عمق التوسيع",
        "parser-unstrip-loop-warning": "حلقة معراة تم الكشف عنها",
        "parser-unstrip-recursion-limit": "تعدى حد العودية Unstrip  ($1)",
        "revdelete-show-file-confirm": "هل أنت متأكد أنك تريد رؤية مراجعة محذوفة للملف \"<nowiki>$1</nowiki>\" بتاريخ $2 الساعة $3؟",
        "revdelete-show-file-submit": "نعم",
        "logdelete-selected": "{{PLURAL:$1|حدث السجل المختار|أحداث السجل المختارة}}:",
+       "revdelete-text-others": "سيتمكن الإداريون الآخرون على {{SITENAME}} من الوصول إلى المحتوى المخفي وإلغاء حذفه مجددا من خلال ذات الواجهة ما لم تطبق قيود إضافية.",
        "revdelete-confirm": "الإداريون الآخرون في {{SITENAME}} سيظل بإمكانهم رؤية المحتوى المخفي ويمكنهم استرجاعه مجددا من خلال هذه الواجهة نفسها، مالم يتم وضع قيود إضافية.\nمن فضلك أكد أنك تنوي فعل هذا، وأنك تفهم العواقب، وأنك تفعل هذا بالتوافق مع [[{{MediaWiki:Policy-url}}|السياسة]].",
        "revdelete-suppress-text": "ينبغي للإخفاء أن يستخدم '''فقط''' في الحالات التالية:\n* معلومات يحتمل أن تكون تشهيرية\n* معلومات شخصية غير ملائمة\n*: ''عناوين المنازل وأرقام الهواتف وأرقام الهويات الوطنية إلى آخره.''",
        "revdelete-legend": "وضع ضوابط رؤية",
        "difference-missing-revision": "{{PLURAL:$2|مراجعة واحدة|$2 مراجعات}} لهذا الفرق ($1) {{PLURAL:$2|لم|لم}} يتم إيجادها.\n\nهذا يحدث عادة عن طريق اتباع وصلة فرق قديمة لصفحة تم حذفها.\nالتفاصيل يمكن إيجادها في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
        "searchresults": "نتائج البحث",
        "searchresults-title": "نتائج البحث عن \"$1\"",
-       "toomanymatches": "وجدت مطابقات كثيرة، من فضلك جرب استعلاما مختلفا",
        "titlematches": "عنوان الصفحة يطابق",
        "textmatches": "نص الصفحة يطابق",
        "notextmatches": "لم يتم إيجاد أي نص مطابق",
        "searchmenu-exists": "'''توجد صفحة اسمها \"[[:$1]]\" على هذه الويكي.''' {{PLURAL:$2|0=|انظر ايضا نتائج البحث الأخرى.}}",
        "searchmenu-new": "<strong>أنشئ الصفحة \"[[:$1]]\" على هذه الويكي!</strong>  {{PLURAL:$2|0=|انظر أيضا الصفحة التي تم العثور عليها من بحثك.|انظر ايضا نتائج البحث.}}",
        "searchprofile-articles": "صفحات المحتوى",
-       "searchprofile-project": "صفحات المساعدة والمشروع",
        "searchprofile-images": "الوسائط المتعددة",
        "searchprofile-everything": "الكل",
        "searchprofile-advanced": "متقدم",
        "searchprofile-articles-tooltip": "ابحث في $1",
-       "searchprofile-project-tooltip": "ابحث في $1",
        "searchprofile-images-tooltip": "ابحث عن الصور",
        "searchprofile-everything-tooltip": "ابحث في كل المحتوى (شاملا صفحات النقاش)",
        "searchprofile-advanced-tooltip": "ابحث في النطاقات المخصصة",
        "search-interwiki-default": "نتائح من $1:",
        "search-interwiki-more": "(المزيد)",
        "search-relatedarticle": "مرتبطة",
-       "searcheverything-enable": "ابحث في جميع النطاقات",
        "searchrelated": "مرتبطة",
        "searchall": "الكل",
        "showingresults": "معروض بالأسفل {{PLURAL:$1|'''1''' نتيجة|'''$1''' نتيجة}} بدءا من رقم '''$2'''.",
        "powersearch-togglelabel": "اختر:",
        "powersearch-toggleall": "الكل",
        "powersearch-togglenone": "لا شيء",
+       "powersearch-remember": "تذكر الاختيار لبحث المستقبل",
        "search-external": "بحث خارجي",
        "searchdisabled": "البحث في {{SITENAME}} معطل.\nيمكنك البحث من خلال جوجل في الوقت الحالي.\nلاحظ أن فهارسه لمحتوى {{SITENAME}} ربما تكون غير محدثة.",
        "search-error": "حدث خطأ ما أثناء البحث: $1",
        "allowemail": "مكن تلقي البريد الإلكتروني من المستخدمين الآخرين",
        "prefs-searchoptions": "البحث",
        "prefs-namespaces": "أسماء النطاقات",
-       "defaultns": "أو ابحث في هذه النطاقات:",
        "default": "افتراضي",
        "prefs-files": "ملفات",
        "prefs-custom-css": "CSS مخصص",
        "recentchanges-label-unpatrolled": "لم يراجع هذا التعديل إلى الآن",
        "recentchanges-label-plusminus": "حجم الصفحة تغير بهذا العدد من وحدات البايت",
        "recentchanges-legend-heading": "شرح",
-       "recentchanges-legend-newpage": "(راجع أيضا [[Special:NewPages|قائمة الصفحات الجديدة]])",
-       "rcnotefrom": "بالأسفل التغييرات منذ '''$2''' (إلى '''$1''' معروضة).",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (راجع أيضا [[Special:NewPages|قائمة الصفحات الجديدة]])",
+       "rcnotefrom": "بالأسفل التغييرات منذ <strong>$2</strong> (إلى <strong>$1</strong> معروضة).",
        "rclistfrom": "أظهر التغييرات بدء من $3 $2",
        "rcshowhideminor": "$1 التعديلات الطفيفة",
        "rcshowhideminor-show": "أظهر",
        "pageswithprop-prophidden-binary": "قيمة الخاصية الثنائية المخفية ($1)",
        "doubleredirects": "تحويلات مزدوجة",
        "doubleredirectstext": "هذه الصفحة تعرض الصفحات التي تحول إلى صفحات تحويل أخرى.\nكل سطر يحتوي على وصلات للتحويلة الأولى والثانية وهدف التحويلة الثانية، والذي عادة ما يشير إلى صفحة الهدف \"الحقيقية\"، التي من المفترض أن تحول إليها التحويلة الأولى.\nالمدخلات <del>المشطوبة</del> صححت.",
-       "double-redirect-fixed-move": "[[$1]] تم نقلها، هي الآن تحويلة إلى [[$2]]",
-       "double-redirect-fixed-maintenance": "تصليح تحويلة مزدوجة من [[$1]] إلى [[$2]].",
+       "double-redirect-fixed-move": "نُقلت [[$1]].\nحُدّثت تلقائيا وهي الآن تحويلة إلى [[$2]].",
+       "double-redirect-fixed-maintenance": "تصحيح تلقائي لتحويلة مزدوجة من [[$1]] إلى [[$2]] في مهمة صيانة.",
        "double-redirect-fixer": "مصلح التحويل",
        "brokenredirects": "تحويلات مكسورة",
        "brokenredirectstext": "التحويلات التالية تصل لصفحات غير موجودة:",
        "wantedtemplates": "قوالب مطلوبة",
        "mostlinked": "أكثر الصفحات وصلا",
        "mostlinkedcategories": "أكثر التصنيفات ارتباطا",
-       "mostlinkedtemplates": "أكثر القوالب وصلا",
+       "mostlinkedtemplates": "أكثر الصفحات تضمينا",
        "mostcategories": "أكثر الصفحات تصنيفا",
        "mostimages": "أكثر الملفات ارتباطا",
        "mostinterwikis": "الصفحات التي تحتوي على أغلب وصلات الإنترويكي",
        "listgrouprights-removegroup-self": "يمكنه إزالة {{PLURAL:$2|المجموعة|المجموعات}} من حسابه الخاص: $1",
        "listgrouprights-addgroup-self-all": "يمكنه إضافة كل المجموعات إلى حسابه الخاص",
        "listgrouprights-removegroup-self-all": "يمكنه إزالة كل المجموعات من حسابه الخاص",
+       "listgrouprights-namespaceprotection-header": "قيود النطاق",
        "listgrouprights-namespaceprotection-namespace": "النطاق",
+       "trackingcategories": "تصانيف التتبع",
+       "trackingcategories-summary": "تسرد هذه الصفحة تصانيف التتبع التي ينشئها برنامج ميدياويكي. يمكن تغيير أسمائها بتغيير رسائل النظام في نطاق {{ns:8}}.",
+       "trackingcategories-msg": "تصانيف التتبع",
        "trackingcategories-name": "اسم الرسالة",
        "trackingcategories-desc": "معايير إدراج تصنيف",
+       "noindex-category-desc": "هذه الصفحة لا تفهرسها الروبوتات لأن فيها الكلمة السحرية <code><nowiki>__NOINDEX__</nowiki></code> ولأنها في نطاق يسمح بهذا العلم.",
+       "index-category-desc": "الصفحة فيها <code><nowiki>__INDEX__</nowiki></code> (وهي في نطاق يسمح بهذا العلم) ولذا فالروبوتات تفهرسها بينما الأصل ألا تفعل.",
+       "post-expand-template-inclusion-category-desc": "بعد توسيع جميع القوالب حجم الصفحة أكبر من <code><nowiki>__INDEX__</nowiki></code> ولذا فبعض القوالب لا تُوسّع.",
+       "post-expand-template-argument-category-desc": "بعد توسيع معطى قالب (الموجود بين أقواس معقوفة ثلاثة مثل <code>{{{شيء}}}</code>) الصفحة أكبر من <code>$wgMaxArticleSize</code>.",
+       "expensive-parserfunction-category-desc": "دوال المعالجة المكلفة (مثل <code>#ifexist</code>) كثيرة جدا. راجع [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "يضاف التصنيف إذا كانت الصفحة تحتوي وصلة معطوبة (وصلة لتضمين ملف والملف غير موجود)",
+       "hidden-category-category-desc": "التصنيف الذي فيه <code><nowiki>__HIDDENCAT__</nowiki></code> والذي يمنع مبدئيا عرضه في صندوق وصلات التصانيف في الصفحات.",
+       "trackingcategories-nodesc": "لا يتوفر وصف.",
        "trackingcategories-disabled": "التصنيف غير مفعل",
        "mailnologin": "لا يوجد عنوان للإرسال",
        "mailnologintext": "يجب أن تقوم [[Special:UserLogin|بتسجيل الدخول]] وإدخال بريد إلكتروني صالح في صفحة [[Special:Preferences|التفضيلات]] لتتمكن من إرسال الرسائل لمستخدمين آخرين.",
        "emailuser-title-target": "راسل بالبريد الإلكتروني هذا  {{GENDER:$1| المستخدم}}",
        "emailuser-title-notarget": "مراسلة المستخدم",
        "emailpage": "إرسال رسالة للمستخدم",
-       "emailpagetext": "يمكنك استخدام الاستمارة بالأسفل لإرسال رسالة بريد إلكتروني إلى {{GENDER:$1|هذا المستخدم|هذه المستخدمة}}.\nسيظهر عنوان البريد الإلكتروني الذي أدخلته في [[Special:Preferences|تفضيلاتك]] كعنوان المرسل في البريد الإلكتروني، كي يستطيع المتلقي الرد عليك مباشرة.",
+       "emailpagetext": "يمكنك استخدام الاستمارة بالأسفل لإرسال رسالة بريد إلكتروني إلى {{GENDER:$1|هذا المستخدم|هذه المستخدمة}}.\n'''يمكن أن يرى المرسل إليه عنوان بريدك الإلكتروني''' الذي أدخلته في [[Special:Preferences|تفضيلاتك]] كعنوان المرسل في البريد الإلكتروني، كي يستطيع المتلقي الرد عليك مباشرة.",
        "defemailsubject": "رسالة {{SITENAME}} من المستخدم \"$1\"",
        "usermaildisabled": "بريد المستخدم الإلكتروني معطل",
        "usermaildisabledtext": "لا يمكنك إرسال بريد إلكتروني إلى مستخدمين آخرين على هذه الويكي",
        "watchnologin": "غير مسجل الدخول",
        "addwatch": "إضافة إلى قائمة المراقبة",
        "addedwatchtext": "أضيفت الصفحة  \"[[:$1]]\" إلى [[Special:Watchlist|قائمة مراقبتك]].\nالتغييرات القادمة على هذه الصفحة وصفحة نقاشها سيتم وضعها هناك.",
+       "addedwatchtext-short": "أضيفت صفحة \"$1\" إلى قائمة مراقبتك.",
        "removewatch": "إزالة من قائمة المراقبة",
        "removedwatchtext": "أزيلت الصفحة \"[[:$1]]\" من [[Special:Watchlist|قائمة مراقبتك]].",
+       "removedwatchtext-short": "أزيلت صفحة \"$1\" من قائمة مراقبتك.",
        "watch": "راقب",
        "watchthispage": "راقب هذه الصفحة",
        "unwatch": "أوقف المراقبة",
        "unwatchthispage": "أوقف المراقبة",
        "notanarticle": "ليست صفحة محتوى",
        "notvisiblerev": "المراجعة تم حذفها",
-       "watchlist-details": "{{PLURAL:$1||صÙ\81حة Ù\88احدة|صÙ\81حتاÙ\86|$1 ØµÙ\81حات|$1 ØµÙ\81حة}} Ù\81Ù\8a Ù\82ائÙ\85Ø© Ù\85راÙ\82بتÙ\83Ø\8c Ø¨Ø¯Ù\88Ù\86 Ø¹Ø¯ ØµÙ\81حات Ø§Ù\84Ù\86Ù\82اش.",
+       "watchlist-details": "{{PLURAL:$1||صÙ\81حة Ù\88احدة|صÙ\81حتاÙ\86|$1 ØµÙ\81حات|$1 ØµÙ\81حة}} Ù\81Ù\8a Ù\82ائÙ\85Ø© Ù\85راÙ\82بتÙ\83Ø\8c Ø¯Ù\88Ù\86 Ø§Ø¹ØªØ¨Ø§Ø± ØµÙ\81حات Ø§Ù\84Ù\86Ù\82اش ØµÙ\81حات Ù\85Ù\86Ù\81صÙ\84Ø©.",
        "wlheader-enotif": "الإخطار بالبريد الإلكتروني مُفعّل.",
        "wlheader-showupdated": "الصفحات التي تم تحريرها بعد مطالعتك إياها آخر مرة عناوينها بالخط '''الغليظ'''",
        "wlnote2": "فيما يلي تعرض التعديلات التي أجريت في آخر {{PLURAL:$1|ساعة|ساعتين|<strong>$1</strong> ساعات|<strong>$1</strong> ساعة}}، وذلك اعتبارا من $2، $3.",
        "enotif_lastvisited": "انظر $1 لكل التغييرات منذ زيارتك الأخيرة.",
        "enotif_lastdiff": "انظر $1 لرؤية هذا التغيير.",
        "enotif_anon_editor": "مستخدم مجهول $1",
-       "enotif_body": "عزيزي $WATCHINGUSERNAME\n\n$PAGEINTRO $NEWPAGE\n\nملخص التعديل: $PAGESUMMARY $PAGEMINOREDIT\n\nاتصل بالمحرر:\nالبريد: $PAGEEDITOR_EMAIL\nويكي: $PAGEEDITOR_WIKI\n\nلن يكون هناك إخطارات أخرى في حالة حدوث مزيد من التغييرات إلا إذا قمت بزيارة تلك الصفحة أثناء تواجدك. يمكنك أيضاً إزالة العلامات عن جميع الصفحات في قائمة مراقبتك.\n\nنظام {{SITENAME}} للإشعار\n\n--\nلتغيير إعدادات الإشعار بالبريد الإلكتروني الخاص بك، قم بزيارة\n{{canonicalurl:{{#special:Preferences}}}}\n\nلتغيير إعدادات قائمة مراقبتك، قم بزيارة\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nلحذف الصفحة من قائمة مراقبتك، قم بزيارة\n$UNWATCHURL\n\nللمقترحات وللحصول على مساعدة إضافية:\n{{canonicalurl: {{MediaWiki:Helppage}}}}",
+       "enotif_body": "عزيزي $WATCHINGUSERNAME\n\n$PAGEINTRO $NEWPAGE\n\nملخص التعديل: $PAGESUMMARY $PAGEMINOREDIT\n\nاتصل بالمحرر:\nالبريد: $PAGEEDITOR_EMAIL\nويكي: $PAGEEDITOR_WIKI\n\nلن يكون هناك إخطارات أخرى في حالة حدوث مزيد من التغييرات إلا إذا قمت بزيارة تلك الصفحة أثناء تواجدك. يمكنك أيضاً إزالة العلامات عن جميع الصفحات في قائمة مراقبتك.\n\nنظام {{SITENAME}} للإشعار\n\n--\nلتغيير إعدادات الإشعار بالبريد الإلكتروني الخاص بك، قم بزيارة\n{{canonicalurl:{{#special:Preferences}}}}\n\nلتغيير إعدادات قائمة مراقبتك، قم بزيارة\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nلحذف الصفحة من قائمة مراقبتك، قم بزيارة\n$UNWATCHURL\n\nللمقترحات وللحصول على مساعدة إضافية:\n$HELPPAGE",
        "created": "أنشئت",
        "changed": "غيرت",
        "deletepage": "حذف الصفحة",
        "protect-locked-blocked": "لا يمكنك تغيير مستويات الحماية وأنت ممنوع.\nالإعدادات الحالية للصفحة '''$1''' هي:",
        "protect-locked-dblock": "لا يمكن تغيير مستويات الحماية بسبب غلق قاعدة البيانات حاليا.\nالإعدادات الحالية للصفحة '''$1''' هي:",
        "protect-locked-access": "لا يملك حسابك هذا صلاحية تغيير مستوى حماية الصفحة.\nالإعدادات الحالية للصفحة '''$1''' هي:",
-       "protect-cascadeon": "هذه الصفحة محمية لكونها مضمنة في {{PLURAL:$1|الصفحة|الصفحات}} التالية، والتي بها خيار حماية الصفحات المدمجة فعال.\nيمكنك تغيير مستوى حماية هذه الصفحة بدون التأثير على حماية الصفحات المدمجة الأخرى.",
+       "protect-cascadeon": "هذه الصفحة محمية لكونها مضمنة في {{PLURAL:$1||الصفحة التالية|الصفحتين التاليتين|الصفحات التالية}}، والتي بها خيار حماية الصفحات المدمجة فعال.\nلن يؤثر تغيير مستوى حماية هذه الصفحة على حماية الصفحات المدمجة.",
        "protect-default": "اسمح لكل المستخدمين",
        "protect-fallback": "السماح فقط للمستخدمين ذوي الصلاحية \"$1\"",
        "protect-level-autoconfirmed": "السماح فقط للمستخدمين المؤكدين تلقائيا",
        "contributions-title": "مساهمات {{GENDER:$1|المستخدم|المستخدمة}} $1",
        "mycontris": "مساهماتي",
        "contribsub2": "ل{{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "حساب المستخدم \"$1\" غير مسجل.",
        "nocontribs": "لم يتم العثور على تغييرات تطابق هذه المحددات.",
        "uctop": "حالي",
        "month": "من شهر (وأقدم):",
        "movepagetalktext": "صفحة النقاش المرفقة سيتم نقلها كذلك، '''إلا في حالة''':\n* توجد صفحة نقاش غير فارغة تحت العنوان الجديد، أو\n* قمت بإزالة اختيار الصندوق بالأسفل.\n\nوفي هذه الحالات، يجب عليك نقل أو دمج محتويات الصفحة يدويا، إذا رغب في ذلك.",
        "movearticle": "انقل الصفحة:",
        "moveuserpage-warning": "'''تحذير: أنت على وشك نقل صفحة مستخدم. من فضلك لاحظ أن الصفحة وحدها سوف تنقل وأن المستخدم لن يعاد تسميته.'''",
+       "movecategorypage-warning": "أنت على وشك نقل صفحة التصنيف إلى عنوان جديد؛ لن تنقل الصفحات المندرجة تحت التصنيف إلى العنوان الجديد.",
        "movenologintext": "يجب أن تكون مستخدماً مسجلاً وأن  [[Special:UserLogin|تسجل دخولك]] لكي تنقل صفحة.",
        "movenotallowed": "أنت لا تمتلك الصلاحية لنقل الصفحات.",
        "movenotallowedfile": "أنت لا تمتلك الصلاحية لنقل الملفات.",
        "cant-move-user-page": "أنت لا تمتلك الصلاحية لنقل صفحات المستخدم الرئيسية.",
        "cant-move-to-user-page": "أنت لا تمتلك الصلاحية لنقل صفحة إلى صفحة مستخدم (ماعدا إلى صفحة مستخدم فرعية).",
+       "cant-move-category-page": "أنت لا تمتلك صلاحية نقل صفحات التصانيف.",
+       "cant-move-to-category-page": "أنت لا تمتلك صلاحية نقل صفحة إلى صفحة تصنيف.",
        "newtitle": "إلى العنوان الجديد:",
        "move-watch": "راقب هذه الصفحة",
        "movepagebtn": "انقل الصفحة",
        "tooltip-preferences-save": "احفظ التغييرات",
        "tooltip-summary": "أدخل ملخصا قصيرا",
        "common.css": "/* ستؤثر الأنماط المتراصة (CSS) المعروضة هنا على كل الواجهات */",
-       "cologneblue.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة كولون بلو */",
-       "monobook.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة مونوبوك */",
-       "modern.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة مودرن */",
-       "vector.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة فكتور */",
        "print.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على ناتج الطباعة */",
        "noscript.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على المستخدمين الذين الجافاسكريبت لديهم معطلة */",
        "group-autoconfirmed.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على المستخدمين المؤكدين تلقائيا فقط */",
        "group-sysop.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على الإداريين فقط */",
        "group-bureaucrat.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على البيروقراطيين فقط */",
        "common.js": "/* الجافاسكريبت الموضوع هنا سيتم تحميله لكل المستخدمين مع كل تحميل للصفحة. */",
-       "cologneblue.js": "/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة كولون بلو */",
-       "monobook.js": "/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة مونوبوك */",
-       "modern.js": "/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة مودرن */",
-       "vector.js": "/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة فكتور */",
        "group-autoconfirmed.js": "/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين المؤكدين تلقائيا فقط */",
        "group-bot.js": "/* أي جافاسكريبت هنا سيتم تحميلها للبوتات فقط */",
        "group-sysop.js": "/* أي جافاسكريبت هنا سيتم تحميلها للإداريين فقط */",
        "pageinfo-category-pages": "عدد الصفحات",
        "pageinfo-category-subcats": "عدد التصنيفات الفرعية",
        "pageinfo-category-files": "عدد الملفات",
-       "skinname-cologneblue": "كولون بلو",
-       "skinname-monobook": "مونوبوك",
-       "skinname-modern": "مودرن",
-       "skinname-vector": "فكتور",
        "markaspatrolleddiff": "علم بعلامة المراجعة",
        "markaspatrolledtext": "علم هذه الصفحة بعلامة المراجعة",
        "markedaspatrolled": "علمت بعلامة المراجعة",
        "watchlistedit-raw-done": "قائمة مراقبتك تم تحديثها.",
        "watchlistedit-raw-added": "تمت إضافة {{PLURAL:$1||عنوان واحد|عنوانين|$1 عناوين|$1 عنوانا|$1 عنوان}}:",
        "watchlistedit-raw-removed": "تمت إزالة {{PLURAL:$1||عنوان واحد|عنوانين|$1 عناوين|$1 عنوانا|$1 عنوان}}:",
+       "watchlistedit-clear-title": "قائمة مراقبة ممسوحة",
+       "watchlistedit-clear-legend": "امسح قائمة المراقبة",
+       "watchlistedit-clear-explain": "ستحذف جميع الصفحات من قائمة مراقبتك",
        "watchlistedit-clear-titles": "العناوين:",
+       "watchlistedit-clear-submit": "امسح قائمة المراقبة (هذا دائم!)",
+       "watchlistedit-clear-done": "مُسِحت قائمة مراقبتك.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1||أزيل العنوان التالي|أزيل العنوانان التاليان|أزيلت العناوين ال$1 التالية}}:",
+       "watchlistedit-too-many": "الصفحات أكثر من أن تعرض هنا.",
+       "watchlisttools-clear": "امسح قائمة المراقبة",
        "watchlisttools-view": "اعرض التغييرات المرتبطة",
        "watchlisttools-edit": "اعرض قائمة المراقبة وعدلها",
        "watchlisttools-raw": "عدل قائمة المراقبة الخام",
index 3cc092e..38c4ad4 100644 (file)
        "qbmyoptions": "ܦܐܬܬ̈ܐ ܕܝܠܝ",
        "faq": "ܫܘܐܠ̈ܐ ܬܢܝ̈ܐ",
        "faqpage": "Project:ܫܘܐܠ̈ܐ ܬܢܝ̈ܐ",
-       "vector-action-addsection": "ܐܘܣܦ ܡܠܘܐܐ",
-       "vector-action-delete": "ܫܘܦ",
-       "vector-action-move": "ܫܢܝ",
-       "vector-action-protect": "ܛܪ",
-       "vector-action-undelete": "ܠܐ ܫܘܦ",
-       "vector-action-unprotect": "ܫܚܠܦ ܢܛܝܪܘܬܐ",
-       "vector-view-create": "ܒܪܝ",
-       "vector-view-edit": "ܫܚܠܦ",
-       "vector-view-history": "ܚܙܝ ܬܫܥܝܬܐ",
-       "vector-view-view": "ܩܪܝ",
-       "vector-view-viewsource": "ܚܙܝ ܡܒܘܥܐ",
        "actions": "ܥܒܕ̈ܐ",
        "namespaces": "ܚܩܠܬ̈ܐ",
        "variants": "ܡܫܬܚܠܦܢܘ̈ܬܐ",
        "permissionserrors": "ܦܘܕܐ ܕܦܣܣܐ",
        "permissionserrorstext-withaction": "ܠܝܬ ܠܟ ܦܣܣܐ ܠ$2, ܒ{{PLURAL:$1|ܥܠܬܐ|ܥܠܬ̈ܐ}} ܕ:",
        "log-fulllog": "ܚܙܝ ܣܓܠܐ ܓܡܝܪܐ",
-       "postedit-confirmation": "ܫܘܚܠܦܟ ܐܬܠܒܟ.",
+       "postedit-confirmation-saved": "ܫܘܚܠܦܟ ܐܬܠܒܟ.",
        "edit-already-exists": "ܒܪܝܐ ܕܦܐܬܐ ܚܕܬܐ ܠܐ ܡܬܡܨܝܢܐ.\nܗܕܐ ܦܐܬܐ ܐܝܬ ܡܢ ܟܕܘ.",
        "editwarning-warning": "ܐܢ ܫܒܩܬ ܦܐܬܐ ܗܕܐ ܡܬܡܨܝܢܬܐ ܐܝܬܝܗ ܕܚܣܪܬ ܟܠ ܫܘܚܠܦ̈ܐ ܕܥܒܝܕܬ ܗܪܟܐ.\nܡܨܬ ܕܬܒܛܠ ܙܘܗܪܐ ܗܢܐ ܐܢ ܥܠܝܠܐ ܐܝܬܝܟ ܒܡܢܬܐ ܕ\"ܫܚܠܦܬܐ\" ܒܨܒܝܢܝܘܬ̈ܐ.",
        "undo-summary": "ܠܐ ܬܥܒܕ $1 ܒܝܕ [[Special:Contributions/$2|$2]] ([[User talk:$2|ܡܡܠܠܐ]])",
        "searchmenu-exists": "'''ܐܝܬ ܦܐܬܐ ܒܫܡ \"[[:$1]]\" ܥܠ ܗܢܐ ܘܝܩܝ'''",
        "searchmenu-new": "'''ܒܪܝ ܦܐܬܐ \"[[:$1]]\" ܥܠ ܗܢܐ ܘܝܩܝ!'''",
        "searchprofile-articles": "ܦܐܬܬ̈ܐ ܕܚܒܝܫܬ̈ܐ",
-       "searchprofile-project": "ܦܐܬܬ̈ܐ ܕܬܪ̈ܡܝܬܐ ܘܕܥܘܕܪܢܐ",
        "searchprofile-images": "ܡܝܕ̈ܝܐ ܣܓܝܐ̈ܐ (Multimedia)",
        "searchprofile-everything": "ܟܠ ܡܕܡ",
        "searchprofile-advanced": "ܡܬܩܕܡܢܐ",
        "searchprofile-articles-tooltip": "ܒܨܝ ܒܓܘ $1",
-       "searchprofile-project-tooltip": "ܒܨܝ ܒ $1",
        "searchprofile-images-tooltip": "ܒܨܝ ܥܠ ܠܦܦ̈ܐ",
        "search-result-size": "$1 ({{PLURAL:$2|1 ܡܠܬܐ|$2 ܡܠ̈ܐ}})",
        "search-redirect": "(ܨܝܒ $1)",
        "search-interwiki-default": "ܦܠܛ̈ܐ ܕ $1:",
        "search-interwiki-more": "(ܝܬܝܪ)",
        "search-relatedarticle": "ܐܚܝܢܝ̈ܐ",
-       "searcheverything-enable": "ܒܨܝ ܒܟܠ ܚܩܠܬ̈ܐ",
        "searchrelated": "ܐܚܝܢܝ̈ܐ",
        "searchall": "ܟܠ",
        "showingresults": "ܚܘܘܝܐ ܠܬܚܬ {{PLURAL:$1|'''1''' ܦܠܛܐ|'''$1''' ܦܠܛ̈ܐ}} ܫܪܐ ܡܢ ܡܢܝܢܐ '''$2'''.",
        "timezoneregion-pacific": "ܐܘܩܝܢܘܣ ܫܩܛܝܐ",
        "prefs-searchoptions": "ܒܨܝܐ",
        "prefs-namespaces": "ܚܩܠܬ̈ܐ",
-       "defaultns": "ܐܘ ܒܨܝ ܒܚܩܠܬ̈ܐ ܗܢܝܢ",
        "prefs-files": "ܠܦܦ̈ܐ",
        "prefs-emailconfirm-label": "ܫܘܪܪܐ ܕܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ:",
        "youremail": "ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ:",
        "username": "{{GENDER:$1|ܫܡܐ ܕܡܦܠܚܢܐ|ܫܡܐ ܕܡܦܠܚܢܬܐ}}:",
-       "uid": "ܗܝܝܘܬܐ ܕ{{GENDER:$1|ܡܦܠܚܢܐ|ܡܦܠܚܢܬܐ}}:",
        "prefs-memberingroups": "{{GENDER:$2|ܗܕܡܐ}} ܕ{{PLURAL:$1|ܟܢܘܫܬܐ|ܟܢܘܫܬ̈ܐ}}:",
        "prefs-registration": "ܙܒܢܐ ܕܣܘܓܠܐ:",
        "yourrealname": "ܫܡܐ ܫܪܝܪܐ:",
        "recentchanges-label-unpatrolled": "ܫܘܚܠܦܐ ܗܢܐ ܠܐ ܗܘ ܟܪܝܟܐ ܠܗܫܐ",
        "recentchanges-label-plusminus": "ܥܓܪܐ ܕܦܐܬܐ ܐܫܬܚܠܦ ܒܗܢܐ ܡܢܝܢܐ ܡܢ ܒܝܛ̈",
        "recentchanges-legend-heading": "'''ܦܘܫܩܐ:'''",
-       "recentchanges-legend-newpage": "(ܐܦ ܚܙܝ [[Special:NewPages|ܡܟܬܒܘܬܐ ܕܦܐܬܬ̈ܐ ܚܕ̈ܬܬܐ]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ܐܦ ܚܙܝ [[Special:NewPages|ܡܟܬܒܘܬܐ ܕܦܐܬܬ̈ܐ ܚܕ̈ܬܬܐ]])",
        "rcnotefrom": "ܠܬܚܬ ܫܘܚܠܦ̈ܐ ܕܡܢ '''$2''' (ܥܕ '''$1''' ܡܬܚܙܝܢ̈ܐ).",
        "rclistfrom": "ܚܘܝ ܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ ܡܢ $3 $2",
        "rcshowhideminor": "$1 ܫܘܚܠܦ̈ܐ ܙܥܘܪ̈ܐ",
        "log-title-wildcard": "ܒܨܝ ܥܠ ܟܘܢܝ̈ܐ ܕܫܪܝܢ ܥܡ ܟܬܒܬܐ ܗܕܐ",
        "showhideselectedlogentries": "ܚܘܝ/ܛܫܝ ܣܓܠ̈ܐ ܕܥܠܠܐ ܓܒܝ̈ܐ",
        "allpages": "ܟܠ ܦܐܬܬ̈ܐ",
-       "alphaindexline": "$1 ܠ $2",
        "nextpage": "ܦܐܬܐ ܕܒܬܪ ($1)",
        "prevpage": "ܦܐܬܐ ܕܩܕܡ ($1)",
        "allpagesfrom": "ܚܘܝ ܦܐܬܬ̈ܐ ܕܫܪܐ ܥܡ:",
        "unblock": "ܫܩܘܠ ܚܪܡܐ ܡܢ ܡܦܠܚܢܐ",
        "blockip": "ܚܪܘܡ ܡܦܠܚܢܐ",
        "blockip-legend": "ܚܪܘܡ ܡܦܠܚܢܐ",
-       "ipadressorusername": "ܐܝ ܦܝ (IP) ܐܘ ܫܡܐ ܕܡܦܠܚܢܐ:",
+       "ipaddressorusername": "ܐܝ ܦܝ (IP) ܐܘ ܫܡܐ ܕܡܦܠܚܢܐ:",
        "ipbexpiry": "ܡܬܚܐ ܕܚܪܡܐ:",
        "ipbreason": "ܥܠܬܐ:",
        "ipbsubmit": "ܚܪܘܡ ܡܦܠܚܢܐ ܗܢܐ",
        "newimages": "ܒܝܬ ܓܠܚܐ ܕܠܦܦ̈ܐ ܚܕܬ̈ܐ",
        "newimages-legend": "ܡܨܦܝܢܝܬܐ",
        "newimages-label": "ܫܡܐ ܕܠܦܦܐ (ܐܘ ܡܢܬܐ ܡܢܗ)",
-       "showhidebots": "($1 ܒܘܬ̈ܐ)",
        "noimages": "ܠܝܬ ܡܕܡ ܠܚܙܝܐ.",
        "ilsubmit": "ܒܨܝ",
        "bydate": "ܒܣܝܩܘܡܐ",
index ae9538a..db456aa 100644 (file)
        "qbmyoptions": "صفحاتى",
        "faq": "اسئله بتتسئل كتير",
        "faqpage": "Project:اسئله بتتسئل كتير",
-       "vector-action-addsection": "ضيف موضوع",
-       "vector-action-delete": "مسح",
-       "vector-action-move": "نقل",
-       "vector-action-protect": "حمايه",
-       "vector-action-undelete": "الغى المسح",
-       "vector-action-unprotect": "غير الحمايه",
-       "vector-view-create": "اعمل",
-       "vector-view-edit": "تعديل",
-       "vector-view-history": "استعراض التاريخ",
-       "vector-view-view": "قرايه",
-       "vector-view-viewsource": "استعراض المصدر",
        "actions": "أعمال",
        "namespaces": "النطاقات",
        "variants": "المتغيرات",
        "diff-multi-manyusers": "({{PLURAL:$1|نسخه واحده متوسطه|$1 نسخ متوسطه}} by {{PLURAL:$2|يوزر واحد |$2 يوزرات}}  مش معروضه)",
        "searchresults": "نتايج التدوير",
        "searchresults-title": "نتايج التدوير على \"$1\"",
-       "toomanymatches": "لقينا حاجات كتيرة متطابقة، لو سمحت تجرب استعلام مختلف",
        "titlematches": "عنوان الصفحة زى",
        "textmatches": "نص الصفحة بيطابق",
        "notextmatches": "ما لقيناش أى نص مطابق",
        "searchmenu-exists": "'''فيه صفحه اسمها \"[[:$1]]\" على الويكى ده.''' {{PLURAL:$2|0=|بص كمان على نتايج البحث التانيه.}}",
        "searchmenu-new": "'''ابتدى الصفحه \"[[:$1]]\" ع الويكى دا!''' {{PLURAL:$2|0=|بص كمان على الصفحه اللى لقيناها من بحثك.|بص كمان على نتايج البحث اللى لقيناها.}}",
        "searchprofile-articles": "صفحات محتوى",
-       "searchprofile-project": "صفحات  المساعده و المشروع",
        "searchprofile-images": "مالتيميديا",
        "searchprofile-everything": "كل شىء",
        "searchprofile-advanced": "متقدم",
        "searchprofile-articles-tooltip": "دور فى $1",
-       "searchprofile-project-tooltip": "دور فى $1",
        "searchprofile-images-tooltip": "دور على الصور",
        "searchprofile-everything-tooltip": "دور فى  كل المحتوى (شامل صفحات النقاش)",
        "searchprofile-advanced-tooltip": "دور فى النطاقات المخصصة",
        "search-interwiki-default": "$1 نتيجة:",
        "search-interwiki-more": "(اأكتر)",
        "search-relatedarticle": "مرتبطه",
-       "searcheverything-enable": "دور فى النطاقات كلها.",
        "searchrelated": "مرتبطه",
        "searchall": "الكل",
        "showingresults": "القائمة دى بتعرض {{PLURAL:$1|'''1''' نتيجة|'''$1''' نتيجة}} من أول  رقم '''$2'''.",
        "allowemail": "السماح لليوزرز التانيين يبعتولى ايميل",
        "prefs-searchoptions": "اختيارات التدوير",
        "prefs-namespaces": "أسماء النطاقات",
-       "defaultns": "أو دور فى النطاقات دى:",
        "default": "اوتوماتيكي",
        "prefs-files": "ملفات",
        "prefs-custom-css": "CSS مخصص",
        "prefs-emailconfirm-label": "التأكد من الايميل:",
        "youremail": "الايميل:",
        "username": "{{GENDER:$1|اسم اليوزر}}:",
-       "uid": "رقم {{GENDER:$1|اليوزر}}:",
        "prefs-memberingroups": "{{GENDER:$2|عضو}} فى {{PLURAL:$1|مجموعه|مجموعات}}:",
        "prefs-registration": "وقت التسجيل:",
        "yourrealname": "الاسم الحقيقى:",
        "recentchanges-label-minor": "ده تعديل صغير",
        "recentchanges-label-bot": "التعديل ده عمله بوت",
        "recentchanges-label-unpatrolled": "التعديل ده مإتراجعش لسه",
-       "recentchanges-legend-newpage": "(بص كمان على [[Special:NewPages|قايمه الصفحات الجديده]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (بص كمان على [[Special:NewPages|قايمه الصفحات الجديده]])",
        "rcnotefrom": "دى التعديلات من '''$2''' (ل '''$1''' معروضه).",
        "rclistfrom": "اظهر التعديلات بدايه من $3 $2",
        "rcshowhideminor": "$1 تعديلات صغيره",
        "logempty": "مافيش  سجلات مطابقة فى السجل.",
        "log-title-wildcard": "التدوير على عناوين تبتدى بالنص دا",
        "allpages": "كل الصفحات",
-       "alphaindexline": "$1 ل $2",
        "nextpage": "الصفحه اللى بعد كده ($1)",
        "prevpage": "الصفحه اللى قبل كده ($1)",
        "allpagesfrom": "عرض الصفحات بدايه من:",
        "tooltip-summary": "اكتب ملخص قصير",
        "interlanguage-link-title": "ل $1 – $2",
        "common.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على كل الواجهات */",
-       "cologneblue.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمى واجهة كولون بلو */",
-       "monobook.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمى واجهة مونوبوك */",
-       "modern.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمى واجهة مودرن */",
-       "vector.css": "/* CSS اللى هنا حتأثر على اليوزرز اللى بيستخدموا واجهة فكتور */",
        "print.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على ناتج الطباعة */",
        "common.js": "/*  أى جافاسكريبت  هناح يتحمل لكل اليوزرز مع كل تحميل للصفحة. */",
-       "cologneblue.js": "/* أى جافاسكريبت هنا ح تتحمل لليوزرز اللى بيستعملو واجهة كولون بلو */",
-       "monobook.js": "/* أى جافاسكريبت هنا ح تتحمل لليوزرز اللى بيستعملو واجهة مونوبوك */",
-       "modern.js": "/* أى جافاسكريبت هنا ح تتحمل لليوزرز اللى بيستعملو واجهة مودرن */",
-       "vector.js": "/* اى جافاسكريبت هنا حتتحمل لكل يوزر بيستخدم واجهة فكتور */",
        "anonymous": "{{PLURAL:$1|يوزر مجهول|يوزرز مجهولين}} ل {{SITENAME}}",
        "siteuser": "يوزر {{SITENAME}} $1",
        "anonuser": "{{SITENAME}} يوزر مجهول $1",
        "spam_reverting": "ترجيع آخر نسخة مافيهاش لينكات لـ $1",
        "spam_blanking": "كل النسخ فيها لينكات ل $1، فضيها",
        "simpleantispam-label": "اختبار انتي-سبام.\n'''ماتعبيش''' دا!",
-       "skinname-cologneblue": "كولون بلو",
-       "skinname-monobook": "مونوبوك",
-       "skinname-modern": "مودرن",
        "markaspatrolleddiff": "علم عليها انها متراجعة",
        "markaspatrolledtext": "علم على المقاله دى إنها متراجعة",
        "markedaspatrolled": "اتعلم عليها متراجعة",
index c4f45d0..543f283 100644 (file)
        "qbmyoptions": "মোৰ পৃষ্ঠাসমূহ",
        "faq": "সততে উদিত প্ৰশ্নসমূহ (FAQ)",
        "faqpage": "Project:সততে উদিত প্ৰশ্নসমূহ",
-       "vector-action-addsection": "বিষয় যোগ",
-       "vector-action-delete": "বিলোপ কৰক",
-       "vector-action-move": "স্থানান্তৰ কৰক",
-       "vector-action-protect": "সুৰক্ষিত কৰক",
-       "vector-action-undelete": "পুনৰুদ্ধাৰ কৰক",
-       "vector-action-unprotect": "সুৰক্ষা সলনি কৰক",
-       "vector-view-create": "সৃষ্টি কৰক",
-       "vector-view-edit": "সম্পাদনা",
-       "vector-view-history": "ইতিহাস চাওক",
-       "vector-view-view": "পঢ়ক",
-       "vector-view-viewsource": "উৎস চাওক",
        "actions": "কাৰ্যসমূহ",
        "namespaces": "নামস্থান",
        "variants": "বিকল্পসমূহ",
        "permalink": "স্থায়ী সূত্ৰ (লিংক)",
        "print": "প্ৰিণ্ট কৰিবলৈ",
        "view": "দেখুৱাওক",
+       "view-foreign": "$1-ত চাওক",
        "edit": "সম্পাদনা",
+       "edit-local": "স্থানীয় বিৱৰণ সম্পাদনা কৰক",
        "create": "সৃষ্টি কৰক",
+       "create-local": "স্থানীয় বিৱৰণ যোগ কৰক",
        "editthispage": "এই পৃষ্ঠা সম্পাদনা কৰক",
        "create-this-page": "এই পৃষ্ঠা সৃষ্টি কৰক",
        "delete": "বিলোপ কৰক",
        "jumptonavigation": "দিকদৰ্শন",
        "jumptosearch": "সন্ধানাৰ্থে",
        "view-pool-error": "দুঃখিত, এই মুহূৰ্তত চাৰ্ভাৰত অতিৰিক্ত চাপ পৰিছে ।\nঅজস্ৰ সদস্যই এই পৃষ্ঠা চাব বিচাৰিছে ।\nঅনুগ্ৰহ কৰি অলপ পাছত এই পৃষ্ঠা চাবলৈ প্ৰয়াস কৰক ।\n\n$1",
+       "generic-pool-error": "দুঃখিত, এই মুহূৰ্তত চাৰ্ভাৰত অতিৰিক্ত চাপ পৰিছে।\nঅজস্ৰ সদস্যই এই উৎস চাবলৈ বিচাৰিছে।\nঅনুগ্ৰহ কৰি অলপ পাছত এই উৎস চাবলৈ প্ৰয়াস কৰক।",
        "pool-timeout": "বন্ধ কৰাৰ বাবে অপেক্ষা কৰাৰ সময় উকলি গৈছে",
        "pool-queuefull": "পুল কিউ (pool queue) পূৰ্ণ",
        "pool-errorunknown": "অপৰিচিত ত্ৰুটি",
        "resetpass-abort-generic": "এটা এক্সটেন্‌ছনৰদ্বাৰা গুপ্তশব্দ সলনি কাৰ্য বাতিল কৰা হৈছে।",
        "resetpass-expired": "আপোনাৰ গুপ্তশব্দৰ ম্যাদ উকলি গৈছে। অনুগ্ৰহ কৰি প্ৰৱেশৰ বাবে এটা নতুন গুপ্তশব্দ নিৰ্ধাৰণ কৰক।",
        "resetpass-expired-soft": "আপোনাৰ গুপ্তশব্দৰ ম্যাদ উকলি গৈছে আৰু নতুন এটা নিৰ্ধাৰণ কৰাৰ প্ৰয়োজন। অনুগ্ৰহ কৰি এতিয়া এটা নতুন গুপ্তশব্দ বাছনি কৰক বা পিছত নিৰ্ধাৰণ কৰিবলৈ \"{{int:resetpass-submit-cancel}}\" বুটামত ক্লিক কৰক।",
+       "resetpass-validity-soft": "আপোনাৰ গুপ্তশব্দ বৈধ নহয়: $1\n\nঅনুগ্ৰহ কৰি এটা নতুন গুপ্তশব্দ বাছনি কৰক, বা ইয়াক পাছত সলাবলৈ \"{{int:resetpass-submit-cancel}}\" ক্লিক কৰক।",
        "passwordreset": "গুপ্তশব্দ ন-কৈ বহুৱাওক",
        "passwordreset-text-one": "আপোনাৰ গুপ্তশব্দ ন-কৈ বহুৱাবলৈ এই প্ৰপত্ৰ পূৰণ কৰক।",
        "passwordreset-text-many": "{{PLURAL:$1|ইমেইলত এটা অস্থায়ী গুপ্তশব্দ পাবলৈ এই তথ্যসমূহৰ যিকোনো এটা দিয়ক।}}",
        "edit-gone-missing": "পৃষ্ঠাটো নবীকৰণ কৰিব পৰা নগ’ল।\nসম্ভৱতঃ পৃষ্ঠাখন বিলোপ কৰা হৈছে।",
        "edit-conflict": "সম্পাদনা দ্বন্দ্ব।",
        "edit-no-change": "আপোনাৰ সম্পাদনা আওকাণ কৰা হৈছে, কাৰণ লেখাত কোনো তফাৎ নাই।",
+       "postedit-confirmation-created": "পৃষ্ঠাটো সৃষ্টি কৰা হৈছে।",
+       "postedit-confirmation-restored": "পৃষ্ঠাটো পুনৰুদ্ধাৰ কৰা হৈছে।",
        "postedit-confirmation-saved": "আপোনাৰ সম্পাদনা সাঁচি থোৱা হ'ল।",
        "edit-already-exists": "নতুন পৃষ্ঠা সৃষ্টি কৰা নহ'ল।\nপৃষ্ঠাটো ইতিমধ্যে আছেই।",
        "defaultmessagetext": "সাধাৰণ বাৰ্তা পাঠ্য",
        "content-failed-to-parse": "$1 মডেলৰ বাবে $2ৰ তথ্য নিকা কৰিব পৰা নগ’ল: $3",
        "invalid-content-data": "অবৈধ সমল তথ্য",
        "content-not-allowed-here": "[[$2]] পৃষ্ঠাত \"$1\" সমল অনুমোদিত নহয়",
-       "editwarning-warning": "à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\9fà§\8b à¦\8fৰিলà§\87 à¦\86পà§\81নি à¦\95ৰা à¦ªà§°à¦¿à¦¬à§°à§\8dতনসমà§\82হ à¦¹à§\87ৰাব à¦ªà¦¾à§°à§\87। à¦¯à¦¦à¦¿ à¦\86পà§\81নি à¦ªà§\8dৰৱà§\87শ à¦\95ৰা à¦\85ৱসà§\8dথাত à¦\86à¦\9bà§\87, à¦\86পà§\81নি à¦\8fà¦\87 à¦¸à¦¤à§°à§\8dà¦\95বাৰà§\8dতাà¦\95 à¦\86পà§\8bনাৰ à¦ªà¦\9bনà§\8dদসমà§\82হৰ \"সমà§\8dপাদনা\" à¦\85à¦\82শত à¦\85সামৰà§\8dথবান কৰিব পাৰিব।",
+       "editwarning-warning": "à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\9fà§\8b à¦\8fৰিলà§\87 à¦\86পà§\81নি à¦\95ৰা à¦ªà§°à¦¿à§±à¦¤à¦¨à¦¸à¦®à§\82হ à¦¹à§\87ৰাà¦\87 à¦¯à¦¾à¦¬ à¦ªà¦¾à§°à§\87।\nযদি à¦\86পà§\81নি à¦²à¦\97à§\8dâ\80\8c à¦\87ন à¦\95ৰি à¦\86à¦\9bà§\87, à¦\86পà§\81নি à¦\8fà¦\87 à¦¸à¦¤à§°à§\8dà¦\95বাণà§\80à¦\95 à¦\86পà§\8bনাৰ à¦ªà¦\9bনà§\8dদসমà§\82হৰ \"{{int:prefs-editing}}\" à¦\85à¦\82শত à¦¨à¦¿à¦·à§\8dà¦\95à§\8dৰিয় কৰিব পাৰিব।",
        "editpage-notsupportedcontentformat-title": "সমলৰ ফৰ্মেট সমৰ্থিত নহয়।",
        "editpage-notsupportedcontentformat-text": "সমল মডেল $2ৱে সমল ফৰ্মেট $1 সমৰ্থন নকৰে।",
        "content-model-wikitext": "ৱিকিপাঠ্য",
        "undo-success": "এই সম্পাদনা পূৰ্ববৎ কৰিব পাৰি ।\nঅনুগ্ৰহ কৰি তলৰ তুলনাটি পৰীক্ষা কৰি ঠাৱৰ কৰক যে আপুনি এনে কৰিব বিচাৰিছে, আৰু তলত সালসলনিসমূহ সাঁচি এই কাৰ্য্য সম্পন্ন কৰক ।",
        "undo-failure": "এই সম্পাদনা মধ্যৱৰ্তী সম্পাদনাসমূহৰ দ্বন্দৰ কাৰণে পূৰ্ববৎ কৰা নহ'ব ।",
        "undo-norev": "এই সম্পাদনাটি ৰদ কৰিব নোৱাৰি, কাৰণ ই আৰু নাই বা ইয়াক বাতিল কৰা হ'ল ।",
+       "undo-nochange": "সম্পাদনাটো ইতিমধ্যেই বাতিল কৰা হৈছে।",
        "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|আলোচনা]]) সম্পাদিত $1 সংশোধনটি বাতিল কৰক",
        "undo-summary-username-hidden": "এজন গোপন ব্যৱহাৰকাৰীয়ে কৰা $1 সংশোধন বাতিল কৰক",
        "cantcreateaccounttitle": "একাউণ্ট সৃষ্টি কৰিব নোৱাৰি",
        "currentrev": "শেহতীয়া সংস্কৰণ",
        "currentrev-asof": "$1 অনুযায়ী বৰ্তমান সংস্কৰণ",
        "revisionasof": "$1ৰ সংস্কৰণ",
-       "revision-info": "$1-লà§\88 $2à¦\87 à¦\95ৰা à¦¸à¦\82শà§\8bধন",
+       "revision-info": "$1-ত {{GENDER:$6|$2}} à¦¸à¦¦à¦¸à§\8dযâ\80\8cà¦\87 à¦\95ৰা à¦¸à¦\82শà§\8bধন$7",
        "previousrevision": "← আগৰ সংশোধন",
        "nextrevision": "নতুন সংশোধন→",
        "currentrevisionlink": "শেহতীয়া সংশোধন",
        "difference-missing-revision": "{{PLURAL:$2|এটা সংস্কৰণ|$2 সংস্কৰণসমূহৰ}} সংশোধনৰ পাৰ্থক্য  ($1) {{PLURAL:$2| পোৱা নগ’ল}}।\n\n\nসাধাৰণতে বিলোপ কৰা এখন পৃষ্ঠাৰ পুৰণা ইতিহাস লিংক অনুসৰণ কৰিলে এনে হয়।\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} বিলোপন অভিলেখ] চালে অধিক তথ্য পাব।",
        "searchresults": "অনুসন্ধানৰ ফলাফল",
        "searchresults-title": "\"$1\" অনুসন্ধানৰ ফলাফল",
-       "toomanymatches": "বহুত বেছি মিল পোৱা গৈছে, সন্ধান-শব্দ সলনি কৰিবলৈ অনুৰোধ কৰা হ'ল",
        "titlematches": "পৃষ্ঠাৰ শিৰোনামা মিলিছে",
        "textmatches": "পৃষ্ঠাৰ পাঠ মিলিছে",
        "notextmatches": "কোনো পৃষ্ঠাৰ পাঠ মিলা নাই",
        "searchmenu-exists": "'''এই ৱিকিত \"[[:$1]]\" নামৰ এটা পৃষ্ঠা আছে।'''\n{{PLURAL:$2|0=|আন সন্ধান ফলাফলবোৰ চাওক।}}",
        "searchmenu-new": "<strong>এই ৱিকিত \"[[:$1]]\" পৃষ্ঠাটো সৃষ্টি কৰক!</strong> \n{{PLURAL:$2|0=|আপোনাৰ সন্ধানত পোৱা পৃষ্ঠাবোৰো চাওক।|সন্ধান ফলাফলসমূহো চাওক।}}",
        "searchprofile-articles": "বিষয়বস্তুৰ পৃষ্ঠা",
-       "searchprofile-project": "সহায় আৰু প্ৰকল্প পৃষ্ঠাসমূহ",
        "searchprofile-images": "মাল্টিমিডিয়া",
        "searchprofile-everything": "সকলো",
        "searchprofile-advanced": "উচ্চতৰ",
        "searchprofile-articles-tooltip": "$1-ত অনুসন্ধান কৰক",
-       "searchprofile-project-tooltip": "$1-ত অনুসন্ধান",
        "searchprofile-images-tooltip": "ফাইলৰ বাবে অনুসন্ধান",
        "searchprofile-everything-tooltip": "সকলো বিষয়বস্তু অনুসন্ধান কৰক (কথা-বতৰা পৃষ্ঠা সহ)",
        "searchprofile-advanced-tooltip": "স্বনিৰ্ধাৰিত নামস্থানত অনুসন্ধান কৰক",
        "search-interwiki-default": "$1ৰ ফলাফলসমূহ:",
        "search-interwiki-more": "(আৰু)",
        "search-relatedarticle": "সম্পৰ্কিত",
-       "searcheverything-enable": "সকলো নামস্থানত অনুসন্ধান কৰক",
        "searchrelated": "সম্পৰ্কিত",
        "searchall": "সকলো",
        "showingresults": "তলত #'''$2'''ৰ পৰা {{PLURAL:$1|'''1''' ফলাফল|'''$1''' ফলাফল}} দেখুওৱা হৈছে।",
        "powersearch-togglelabel": "পৰীক্ষা কৰক:",
        "powersearch-toggleall": "সকলো",
        "powersearch-togglenone": "একো নাই",
+       "powersearch-remember": "ভৱিষ্যতৰ সন্ধানৰ বাবে বাছনি মনত ৰাখক।",
        "search-external": "বাহ্যিক সন্ধান",
        "searchdisabled": "{{SITENAME}} ত অনুসন্ধান কৰা সাময়িক ভাবে নিষ্ক্ৰিয় কৰা হৈছে।\nতেতিয়ালৈকে গুগলত অনুসন্ধান কৰক।\nমনত ৰাখিব যে তেঁওলোকৰ {{SITENAME}}ৰ ইণ্ডেক্স পুৰণি হব পাৰে।",
        "search-error": "অনুসন্ধানৰ সময়ত এটা ত্ৰুটি হৈছে: $1",
        "allowemail": "অন্য সদস্যৰ পৰা ই-মেইল সমৰ্থ কৰক",
        "prefs-searchoptions": "সন্ধান কৰক",
        "prefs-namespaces": "নামস্থান",
-       "defaultns": "অন্যথা এই নামস্থান সমূহত অনুসন্ধান কৰিব:",
        "default": "অবিচল",
        "prefs-files": "ফাইলসমূহ",
        "prefs-custom-css": "স্বনিৰ্ধাৰিত CSS",
        "right-move": "পৃষ্ঠাসমূহ স্থানান্তৰ কৰক",
        "right-move-subpages": "পৃষ্ঠাৰ সৈতে উপ-পৃষ্ঠাসমূহও স্থানান্তৰ কৰক",
        "right-move-rootuserpages": "ৰুট সদস্যৰ পৃষ্ঠাসমূহ স্থানান্তৰ কৰক",
+       "right-move-categorypages": "শ্ৰেণী পৃষ্ঠাসমূহ স্থানান্তৰ কৰক",
        "right-movefile": "ফাইল স্থানান্তৰ কৰক",
        "right-suppressredirect": "পৃষ্ঠা স্থানান্তৰ কৰোঁতে উৎস পৃষ্ঠাৰ পৰা পুনঃনিৰ্দেশনা সৃষ্টি কৰিব নালাগে",
        "right-upload": "ফাইল আপল'ড কৰক",
        "action-createpage": "পৃষ্ঠা সৃষ্টি কৰক",
        "action-createtalk": "কথাবতৰা পৃষ্ঠা সৃষ্টি কৰক",
        "action-createaccount": "এই সদস্য একাউণ্ট সৃষ্টি কৰক",
+       "action-history": "এই পৃষ্ঠাৰ ইতিহাস চাওক",
        "action-minoredit": "সম্পাদনা অগুৰুত্বপূৰ্ণ বুলি চিহ্নিত কৰক",
        "action-move": "এই পৃষ্ঠা স্থানান্তৰ কৰক",
        "action-move-subpages": "এই পৃষ্ঠা আৰু ইয়াৰ উপপৃষ্ঠাসমূহ আঁতৰাওক",
        "action-move-rootuserpages": "ৰুট সদস্যৰ পৃষ্ঠাসমূহ স্থানান্তৰ কৰক",
+       "action-move-categorypages": "শ্ৰেণী পৃষ্ঠাসমূহ স্থানান্তৰ কৰক",
        "action-movefile": "এই ফাইল স্থানান্তৰ কৰক",
        "action-upload": "এই ফাইল আপল'ড কৰক",
        "action-reupload": "বৰ্তমান থকা ফাইলৰ ওপৰত লিখক",
        "recentchanges-label-unpatrolled": "এই সম্পাদনাটো এতিয়াও পৰীক্ষা কৰা হোৱা নাই",
        "recentchanges-label-plusminus": "পৃষ্ঠাৰ আকাৰ এই পৰিমাণৰ বাইট পৰিৱৰ্তন হৈছে",
        "recentchanges-legend-heading": "'''ব্যাখ্যা:'''",
-       "recentchanges-legend-newpage": "(লগতে [[Special:NewPages|নতুন পৃষ্ঠাসমূহৰ তালিকা]] চাওক)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (লগতে [[Special:NewPages|নতুন পৃষ্ঠাসমূহৰ তালিকা]] চাওক)",
        "recentchanges-legend-plusminus": "(''±১২৩'')",
        "rcnotefrom": "তলত '''$2''' ৰ পৰা হোৱা ('''$1''' লৈকে) পৰিৱৰ্তন দেখুৱা হৈছে ।",
        "rclistfrom": "$3 $2ৰ পৰা নতুন সালসলনি দেখুৱাওক",
        "protectedpages-cascade": "কেৱল প্ৰপাতাকাৰ সুৰক্ষা",
        "protectedpages-noredirect": "পুনঃনিৰ্দেশ লুকুৱাওক",
        "protectedpagesempty": "এই পাৰামিটাৰবোৰেৰে কোনো পৃষ্ঠা এতিয়া সুৰক্ষিত কৰা হোৱা নাই ।",
+       "protectedpages-timestamp": "সময়-মোহৰ",
        "protectedpages-page": "পৃষ্ঠা",
        "protectedpages-expiry": "ম্যাদ উকলিব",
+       "protectedpages-params": "সুৰক্ষা পাৰামিটাৰসমূহ",
+       "protectedpages-reason": "কাৰণ",
+       "protectedpages-unknown-timestamp": "অজ্ঞাত",
+       "protectedpages-unknown-performer": "অজ্ঞাত ব্যৱহাৰকাৰী",
        "protectedtitles": "সুৰক্ষিত শিৰোনামাসমূহ",
        "protectedtitlesempty": "এই পাৰামিটাৰবোৰেৰে কোনো শিৰোনামা এতিয়া সুৰক্ষিত কৰা হোৱা নাই ।",
        "listusers": "সদস্য তালিকা",
        "listgrouprights-removegroup-self": "{{PLURAL:$2|গোট|গোটসমূহ}} নিজৰ একাউণ্টৰপৰা আঁতৰাওক: $1",
        "listgrouprights-addgroup-self-all": "সকলো গোট নিজৰ একাউণ্টত যোগ কৰক",
        "listgrouprights-removegroup-self-all": "নিজৰ একাউণ্টৰপৰা সকলো গোট আঁতৰাওক",
+       "listgrouprights-namespaceprotection-header": "নামস্থান নিষেধাজ্ঞাসমূহ",
+       "listgrouprights-namespaceprotection-namespace": "নামস্থান",
+       "trackingcategories-nodesc": "কোনো বিৱৰণ উপলব্ধ নহয়।",
+       "trackingcategories-disabled": "শ্ৰেণী নিষ্ক্ৰিয় হৈ আছে",
        "mailnologin": "পাওঁতাৰ ঠিকনা নাই",
        "mailnologintext": "আন সদস্যক ই-মেইল পঠিয়াবলৈ আপুনি [[Special:UserLogin|লগ্‌ ইন]] কৰিব লাগিব আৰু আপোনাৰ [[Special:Preferences|পছন্দসমূহত]] এটা বৈধ ই-মেইল ঠিকনা থাকিব লাগিব ।",
        "emailuser": "এই সদস্যজনলৈ ই-মেইল পঠিয়াওক",
        "watchnologin": "প্ৰৱেশ কৰা নাই",
        "addwatch": "লক্ষ্য-তালিকাত অন্তৰ্ভুক্ত কৰক",
        "addedwatchtext": "আপোনাৰ [[Special:Watchlist|লক্ষ্য তালিকাত ]] \"[[:$1]]\" পৃষ্ঠাটো অন্তৰ্ভুক্ত কৰা হ'ল।\nভৱিষ্যতে এই পৃষ্ঠা বা ইয়াৰ আলোচনা পৃষ্ঠাত হোৱা সাল-সলনি আপুনি আপোনাৰ লক্ষ্য তালিকাত দেখিব।",
+       "addedwatchtext-short": " \"$1\" পৃষ্ঠাটো আপোনাৰ লক্ষ্য-তালিকাত যোগ কৰা হৈছে।",
        "removewatch": "লক্ষ্য-তালিকাৰ পৰা আঁতৰাওক",
        "removedwatchtext": "\"[[:$1]]\" পৃষ্ঠাটো [[Special:Watchlist|আপোনাৰ লক্ষ্য-তালিকা]]ৰ পৰা আঁতৰোৱা হৈছে ।",
+       "removedwatchtext-short": "\"$1\" পৃষ্ঠাটো আপোনাৰ লক্ষ্য-তালিকাৰ পৰা আঁতৰোৱা হৈছে।",
        "watch": "চকু ৰাখক",
        "watchthispage": "এই পৃষ্ঠাটো লক্ষ্য কৰক",
        "unwatch": "চকু দিব নালাগে",
        "unwatchthispage": "চকু দিয়া বন্ধ কৰক",
        "notanarticle": "সমল পৃষ্ঠা নহয়",
        "notvisiblerev": "অন্য কোনো সদস্যই কৰা সংশোধনী বিলোপ কৰা হৈছে",
-       "watchlist-details": "à¦\86লà§\8bà¦\9aনা à¦ªà§\83ষà§\8dঠাসমà§\82হ à¦²à§\87à¦\96ত à¦¨à¦§à§°à¦¿ {{PLURAL:$1|$1 à¦\9fা à¦ªà§\83ষà§\8dঠা}} à¦\86পà§\8bনাৰ à¦²à¦\95à§\8dষà§\8dয-তালিà¦\95াত à¦\86à¦\9bà§\87 ।",
+       "watchlist-details": "à¦\86লà§\8bà¦\9aনা à¦ªà§\83ষà§\8dঠাসমà§\82হ à¦¬à§\87লà§\87à¦\97à¦\95à§\88 à¦²à§\87à¦\96ত à¦¨à¦§à§°à¦¿ {{PLURAL:$1|$1 à¦\9fা à¦ªà§\83ষà§\8dঠা}} à¦\86পà§\8bনাৰ à¦²à¦\95à§\8dষà§\8dয-তালিà¦\95াত à¦\86à¦\9bà§\87।",
        "wlheader-enotif": "ইমেইল জাননী সক্ৰিয় কৰা হৈছে।",
        "wlheader-showupdated": "আপোনাৰ শেষ পৰিদৰ্শনৰ পিছত সলনি হোৱা পৃষ্ঠাসমূহ '''গাঢ়''' আখৰত দেখুওৱা হৈছে।",
+       "wlnote2": "$2, $3 অনুসাৰে শেষ {{PLURAL:$1|ঘণ্টাৰ|<strong>$1</strong> ঘণ্টাৰ}} সালসলনি তলত দিয়া হৈছে।",
        "wlshowlast": "যোৱা $1 ঘণ্টা $2 দিন $3 চাওক",
        "watchlist-options": "লক্ষ্য-তালিকা পছন্দসমূহ",
        "watching": "চকু দিয়া হৈছে.....",
        "file-no-thumb-animation-gif": "'''টোকা: কাৰিকৰী অসুবিধাবশতঃ উচ্চ ৰিজ'লিউচনৰ GIF চিত্ৰ যেনে এইখন এনিমেটেড নহ'ব।'''",
        "newimages": "নতুন ফাইলৰ বিথীকা",
        "imagelisttext": "তলত '''$1''' {{PLURAL:$1|file|files}} সজোঁৱা $2 -ৰ এটা তালিকা দিয়া আছে।",
-       "newimages-summary": "à¦\8fà¦\87 à¦¬à¦¿à¦¶à§\87ষ à¦ªà§\83ষà§\8dঠাà¦\96নত à¦¸à§°à§\8dবশà§\87ষত à¦\86পল'ড à¦\95ৰা à¦«à¦¾à¦\87লসমà§\82হ à¦¦à§\87à¦\96িব ।",
+       "newimages-summary": "à¦\8fà¦\87 à¦¬à¦¿à¦¶à§\87ষ à¦ªà§\83ষà§\8dঠাà¦\9fà§\8bত à¦¶à§\87হতà§\80য়াà¦\95à§\88 à¦\86পল'ড à¦\95ৰা à¦«à¦¾à¦\87লসমà§\82হ à¦¦à§\87à¦\96িব।",
        "newimages-legend": "ছেকনী",
        "newimages-label": "নথিৰ নাম (বা তাৰ এটা অংশ)",
        "noimages": "চাবলৈ একো নাই ।",
        "watchlistedit-raw-done": "আপোনাৰ লক্ষ্য-তালিকা নবীকৰণ কৰা হ'ল",
        "watchlistedit-raw-added": "{{PLURAL:$1|এটা শিৰোনামা|$1-টা শিৰোনামা}} যোগ কৰা হ'ল:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|এটা শিৰোনামা|$1-টা শিৰোনামা}} আঁতৰোৱা হ'ল:",
+       "watchlistedit-clear-title": "লক্ষ্য-তালিকা পৰিষ্কাৰ কৰা হ'ল",
+       "watchlistedit-clear-legend": "লক্ষ্য-তালিকা পৰিষ্কাৰ কৰক",
+       "watchlistedit-clear-explain": "সকলো শিৰোনামা আপোনাৰ লক্ষ্য-তালিকাৰ পৰা আঁতৰোৱা হ'ব",
+       "watchlistedit-clear-titles": "শিৰোনামাসমূহ:",
+       "watchlistedit-clear-submit": "লক্ষ্য-তালিকা পৰিষ্কাৰ কৰক (এইটো স্থায়ী!)",
+       "watchlistedit-clear-done": "আপোনাৰ লক্ষ্য-তালিকা পৰিষ্কাৰ কৰা হ'ল।",
        "watchlisttools-view": "সংগতি থকা সাল-সলনিবোৰ চাওক",
        "watchlisttools-edit": "লক্ষ্য-তালিকা চাওক আৰু সম্পাদনা কৰক",
        "watchlisttools-raw": "অশোধিত লক্ষ্য-তালিকা সম্পাদনা কৰক",
        "htmlform-no": "নহয়",
        "htmlform-yes": "হয়",
        "htmlform-chosen-placeholder": "এটা বিকল্প বাছনি কৰক",
+       "htmlform-cloner-create": "আৰু যোগ কৰক",
+       "htmlform-cloner-delete": "আঁতৰাওক",
        "sqlite-has-fts": "$1 সম্পূৰ্ণ-পাঠ অনুসন্ধান সমৰ্থন সহ",
        "sqlite-no-fts": "$1 সম্পূৰ্ণ-পাঠ অনুসন্ধান সমৰ্থন অবিহনে",
        "logentry-delete-delete": "$3 পৃষ্ঠাটো $1ৰদ্বাৰা {{GENDER:$2|বিলোপ কৰা হ'ল}}",
index 69e78f5..5d4e42c 100644 (file)
        "qbmyoptions": "Les mios páxines",
        "faq": "EMF (entrugues más frecuentes)",
        "faqpage": "Project:FAQ",
-       "vector-action-addsection": "Amestar seición",
-       "vector-action-delete": "Desaniciar",
-       "vector-action-move": "Treslladar",
-       "vector-action-protect": "Protexer",
-       "vector-action-undelete": "Restaurar",
-       "vector-action-unprotect": "Camudar la proteición",
-       "vector-view-create": "Crear",
-       "vector-view-edit": "Editar",
-       "vector-view-history": "Ver historial",
-       "vector-view-view": "Lleer",
-       "vector-view-viewsource": "Ver fonte",
        "actions": "Aiciones",
        "namespaces": "Espacios de nome",
        "variants": "Variantes",
        "difference-missing-revision": "{{PLURAL:$2|Nun s'alcontró|Nun s'alcontraron}} {{PLURAL:$2|una revisión|$2 revisiones}} d'esta diferencia ($1).\n\nDe vezu la causa d'esto ye siguir un enllaz de diferencia antiguu a una páxina que se desanició.\nSe puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rexistru de desanicios].",
        "searchresults": "Resultaos de la busca",
        "searchresults-title": "Resultaos de buscar \"$1\"",
-       "toomanymatches": "Atopáronse demasiaes coincidencies, por favor fai una consulta diferente",
        "titlematches": "Coincidencies de los títulos de la páxina",
        "textmatches": "Coincidencies del testu de la páxina",
        "notextmatches": "Nun hai coincidencies nel testu de la páxina",
        "searchmenu-exists": "'''Hai una páxina nomada \"[[$1]]\" nesta wiki'''",
        "searchmenu-new": "<strong>¡Crear la páxina «[[:$1]]» nesta wiki!</strong> {{PLURAL:$2|0=|Vea tamién la páxina que s'alcontró cola gueta.|Vea tamién los resultaos qu'alcontró la gueta.}}",
        "searchprofile-articles": "Páxines de conteníu",
-       "searchprofile-project": "Páxines de proyeutu y ayuda",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Too",
        "searchprofile-advanced": "Avanzao",
        "searchprofile-articles-tooltip": "Buscar en $1",
-       "searchprofile-project-tooltip": "Buscar en $1",
        "searchprofile-images-tooltip": "Buscar ficheros",
        "searchprofile-everything-tooltip": "Buscar tol conteníu (incluyendo páxines d'alderique)",
        "searchprofile-advanced-tooltip": "Buscar nos espacios de nomes personalizaos",
        "search-interwiki-default": "Resultaos de $1:",
        "search-interwiki-more": "(más)",
        "search-relatedarticle": "Rellacionáu",
-       "searcheverything-enable": "Buscar en tolos espacios de nome",
        "searchrelated": "rellacionáu",
        "searchall": "toos",
        "showingresults": "Abaxo {{PLURAL:$1|amuésase '''un''' resultáu|amuésense '''$1''' resultaos}}, entamando col #'''$2'''.",
        "allowemail": "Dexar a los otros usuarios mandate correos",
        "prefs-searchoptions": "Buscar",
        "prefs-namespaces": "Espacios de nome",
-       "defaultns": "Sinón, buscar nestos espacios de nome:",
        "default": "predetermináu",
        "prefs-files": "Ficheros",
        "prefs-custom-css": "CSS personalizada",
        "recentchanges-label-unpatrolled": "Esta edición ta ensin patrullar entá",
        "recentchanges-label-plusminus": "El tamañu d'esta páxina cambió nesti númberu de bytes",
        "recentchanges-legend-heading": "'''Lleenda:'''",
-       "recentchanges-legend-newpage": "(ver tamién la  [[Special:NewPages|llista de páxines nueves]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ver tamién la  [[Special:NewPages|llista de páxines nueves]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Abaxo tan los cambeos dende <strong>$2</strong> (s'amuesen fasta <strong>$1</strong>).",
        "rclistfrom": "Amosar los nuevos cambios dende $3 $2",
        "tooltip-summary": "Escribi un resume curtiu",
        "interlanguage-link-title": "$1 – $2",
        "common.css": "/* Los CSS allugaos equí s'aplicarán a tolos aspeutos */",
-       "cologneblue.css": "/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Cologne Blue */",
-       "monobook.css": "/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Monobook */",
-       "modern.css": "/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Modern */",
-       "vector.css": "/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Vector */",
        "print.css": "/* Los CSS allugaos equí afeutarán a la salida pola imprentadora */",
        "noscript.css": "/* Los CSS allugaos equí afeutarán a los usuarios col JavaScript desactiváu */",
        "group-autoconfirmed.css": "/* Los CSS allugaos equí afeutarán a los usuarios autoconfirmaos namái */",
        "group-sysop.css": "/* Los CSS allugaos equí afeutarán a los sysops namái */",
        "group-bureaucrat.css": "/* Los CSS allugaos equí afeutarán a los burócrates namái */",
        "common.js": "/* Cualesquier JavaScript que tea equí se cargará pa tolos usuarios en cada carga de páxina. */",
-       "cologneblue.js": "/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Cologne Blue */",
-       "monobook.js": "/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu MonoBook */",
-       "modern.js": "/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Modern */",
-       "vector.js": "/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Vector */",
        "group-autoconfirmed.js": "/* Cualesquier JavaScript que tea equí se cargará pa los usuarios autoconfirmaos namái */",
        "group-bot.js": "/* Cualesquier JavaScript que tea equí se cargará pa los bots namái */",
        "group-sysop.js": "/* Cualesquier JavaScript que tea equí se cargará pa los sysops namái */",
        "pageinfo-category-pages": "Númberu de páxines",
        "pageinfo-category-subcats": "Númberu de subcategoríes",
        "pageinfo-category-files": "Númberu de ficheros",
-       "skinname-cologneblue": "Azul Colonia",
-       "skinname-modern": "Modernu",
        "markaspatrolleddiff": "Marcar como supervisada",
        "markaspatrolledtext": "Marcar esta páxina como supervisada",
        "markedaspatrolled": "Marcar como supervisada",
index 6290b74..331f5e2 100644 (file)
@@ -22,7 +22,8 @@
                        "Vugar 1981",
                        "Wertuose",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Arystanbek"
                ]
        },
        "tog-underline": "Keçidlərin altını xətlə:",
        "vector-view-view": "Oxu",
        "vector-view-viewsource": "Mənbəyə bax",
        "actions": "Hərəkətlər",
+       "vector-more-actions": "Daha",
        "namespaces": "Adlar fəzası",
        "variants": "Variantlar",
        "navigation-heading": "Naviqasiya menyusu",
        "diff-multi-manyusers": "({{PLURAL:$2|Bir istifadəçi|$2 istifadəçi}} tərəfindən edilən {{PLURAL:$1|bir ara redaktə|$1 ara redaktə}} göstərilmir)",
        "searchresults": "Axtarış nəticələri",
        "searchresults-title": "''$1'' üçün axtarış nəticələri",
-       "toomanymatches": "Üst-üstə düşən çoxlu hal tapılıb, lütfən yeni sorğu göndərin",
        "titlematches": "Səhifə adı eynidir",
        "textmatches": "Mətn eynidir",
        "notextmatches": "Məqalələrdə uyğun məzmun tapılmadı",
        "search-interwiki-default": "$1 nəticə:",
        "search-interwiki-more": "(yenə)",
        "search-relatedarticle": "əlaqədar",
-       "searcheverything-enable": "Ad aralığında axtar:",
        "searchrelated": "əlaqəli",
        "searchall": "bütün",
        "showingresults": "Aşağıda #'''$2''' ilə başlayan {{PLURAL:$1|'''$1'''-ə qədər}} nəticə göstərilib.",
        "allowemail": "Digər istifadəçilər mənə e-məktub göndərə bilər",
        "prefs-searchoptions": "Axtarış kriteriyaları",
        "prefs-namespaces": "Adlar fəzası",
-       "defaultns": "Yaxud bu adlar fəzasında axtar:",
        "default": "boş",
        "prefs-files": "Fayllar",
        "prefs-custom-css": "Xüsusi CSS",
index b51d2b2..41f7ac1 100644 (file)
        "qbmyoptions": "صحیفه‌‌لریم",
        "faq": "چوْخ سوْروشولان سوْال‌لار",
        "faqpage": "Project:چوْخ سوْروشولان سوْال‌لار",
-       "vector-action-addsection": "قوْنو آرتیر",
-       "vector-action-delete": "سیل",
-       "vector-action-move": "داشی",
-       "vector-action-protect": "قوْرو",
-       "vector-action-undelete": "سیلمگی قایتار",
-       "vector-action-unprotect": "قوْروماغی دَییشدیر",
-       "vector-view-create": "یارات",
-       "vector-view-edit": "دَییشدیر",
-       "vector-view-history": "گئچمیشه باخ",
-       "vector-view-view": "اوْخو",
-       "vector-view-viewsource": "قایناغا باخ",
        "actions": "چالیشمالار",
        "namespaces": "آد فضالاری",
        "variants": "واریانتلار",
        "difference-missing-revision": "بو فرقین ($1) {{PLURAL:$2|بیر|$2}} نوسخه‌سی تاپیلانمادی.\n\nعموماً بو خطا، سیلینن بیر صحیفه‌یه واختی گئچمیش بیر فرق باغلانتی‌سیلا گلمک ایله آرا گلر.\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}سیلمک سیاهی‌سی]ندا باشقا بیلگیلر اولا بیلر.",
        "searchresults": "آختاریش سونوجلاری",
        "searchresults-title": "«$1» اوچون آختاریش نتیجه‌لری",
-       "toomanymatches": "چوخلو سونوچلار تاپیلدی، لوطفاً باشقا بیر سورغویلا چالیشین.",
        "titlematches": "صحیفه‌‌ آدی عینیدیر",
        "textmatches": "یازی عینی‌دیر",
        "notextmatches": "هئچ بیر بنزر صحیفه یازی‌سی تاپیلمادی",
        "searchmenu-exists": "'''بو ویکی‌ده «[[:$1]]» آدلی صحیفه واردیر.'''",
        "searchmenu-new": "'''بو ویکی‌ده «[[:$1]]» صحیفه‌‌سینی يارات!'''",
        "searchprofile-articles": "مقاله‌لر",
-       "searchprofile-project": "یاردیم و پروژه صحیفه‌لری",
        "searchprofile-images": "مولتی‌مئدیا",
        "searchprofile-everything": "هرشئی",
        "searchprofile-advanced": "گلیشمیش",
        "searchprofile-articles-tooltip": "$1-ده آختار",
-       "searchprofile-project-tooltip": "$1-ده آختار",
        "searchprofile-images-tooltip": "فایل‌لار اوچون آختار",
        "searchprofile-everything-tooltip": "بوتون متنلری آختار (دانیشیق صحیفه‌لری اولماقلا)",
        "searchprofile-advanced-tooltip": "تاپشیریلان آدفضالاریندا آختار",
        "search-interwiki-default": "$1 سونوج:",
        "search-interwiki-more": "(داها)",
        "search-relatedarticle": "ایلگیلی",
-       "searcheverything-enable": "بوتون آدفضالاریندا آختار",
        "searchrelated": "ایلگیلی",
        "searchall": "بوتون",
        "showingresults": "آشاغیدا نومره '''$2'''-دن باشلایان {{PLURAL:$1|'''بیر'''|'''$1'''}} سونوجا قدر گؤستریلیر.",
        "allowemail": "باشقا ایستیفاده‌چیلردن ایمیل آلماغی آچ",
        "prefs-searchoptions": "آختار",
        "prefs-namespaces": "آدلار فضاسی:",
-       "defaultns": "یوخسا بو آدفضالاریندا آختار:",
        "default": "فرض ائدیلن",
        "prefs-files": "فایل‌لار",
        "prefs-custom-css": "شخصی سی‌اس‌اس",
        "recentchanges-label-bot": "بو دییشیک بیر بوت طرفیندن ائدیلیب‌دیر",
        "recentchanges-label-unpatrolled": "بو دییشیکلیک هله گؤزدن گئچیریلمه‌ییب‌دیر",
        "recentchanges-legend-heading": "'''ایختیصارلار:'''",
-       "recentchanges-legend-newpage": "(هم‌ده [[Special:NewPages|یئنی صحیفه‌لرین لیستینه]] باخین)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (هم‌ده [[Special:NewPages|یئنی صحیفه‌لرین لیستینه]] باخین)",
        "rcnotefrom": "آشاغیدا '''$2'''-دن ('''$1'''-ه قدر) ديَیشیکلیکلر گلیبلر.",
        "rclistfrom": "$3 $2 واختیندان باشلایاراق یئنی دییشیکلری گؤستر",
        "rcshowhideminor": "کیچیک دَییشیکلری $1",
index bbe10e3..68d1029 100644 (file)
        "qbmyoptions": "Meine Seiten",
        "faq": "Oft gstejte Frong",
        "faqpage": "Project:FAQ",
-       "vector-action-addsection": "An Obschnitt dazua doa",
-       "vector-action-delete": "Leschn",
-       "vector-action-move": "Vaschiabm",
-       "vector-action-protect": "Schitzn",
-       "vector-action-undelete": "Wiederherstön",
-       "vector-action-unprotect": "freigeem",
-       "vector-view-create": "Aufbaun",
-       "vector-view-edit": "Werkln",
-       "vector-view-history": "Gschicht oschaugn",
-       "vector-view-view": "Lesn",
-       "vector-view-viewsource": "Quejtext ozoagn",
        "actions": "Aktiona",
        "namespaces": "Namasramm",
        "variants": "Variantn",
        "querypage-no-updates": "'''Dé Aktualisiarungsfunkzión voh derer Seiten is derzeid deaktivird. Dé Daaten wern bis auf Weiders néd daneiert.'''",
        "viewsource": "Quejtext ozoagn",
        "viewsource-title": "Quöntext voh da Seiten $1 auhschauh",
-       "actionthrottled": "Akziónszoi limitird",
-       "actionthrottledtext": "Im Råmen voh ner Anti-Spam-Moossnåm kå dé Akzión do in am kurzen Zeidobstånd netter begrenzd ausgfyrd wern. Dé Grenzen host ywerschritten.\nBittscheh vasuachs in a por Minunten nuamoi.",
+       "actionthrottled": "Aktionsfrequenz drossld",
+       "actionthrottledtext": "A Anti-Spam-Skript begrenzd de Ozoi vo de Vaendarunga pro Minutn. Vasuachs in a boar Minutn wieda.",
        "protectedpagetext": "Dé Seiten is gschytzd worn, um Beorweitungen z' vahindern.",
        "viewsourcetext": "Du kåst ower 'n Quötext åschaung und kópirn:",
        "viewyourtext": "Du kåst 'n Quejtext vah '''deiner Beorwatung''' derer Seiten betrochten und kópiern:",
        "nologinlink": "A neichs Nutzakonto olegn",
        "createaccount": "Nutzakonto olegn",
        "gotaccount": "Hosd scho a Nutzakonto? '''$1'''.",
-       "gotaccountlink": "Omejdn",
+       "gotaccountlink": "Eilogga",
        "userlogin-resetlink": "Hosd de Datn zan Eilogga vagessn?",
        "createaccountmail": "per E-Mail",
        "createaccountreason": "Grund",
        "loginreqtitle": "'s braucht a Åmöidung",
        "loginreqlink": "åmöden",
        "loginreqpagetext": "Du muasst dé $1, daas d' Seiten leesen kauhst.",
-       "accmailtitle": "Passwort is vaschickt worn",
+       "accmailtitle": "Kennwoat vaschickt",
        "accmailtext": "E zuafällig genariards Posswort fyr [[User talk:$1|$1]] is an $2 gschickt worn.\n\nDes Posswort fyr des naiche Benutzerkonto kå auf da Speziaalseiten  „[[Special:ChangePassword|Posswort ändern]]“ gändert wern.",
        "newarticle": "(Neich)",
        "newarticletext": "Du bist am Link gfoigt, wos no koa Seitn gibt.\nUm de Seitn ozlegn, trog dein Text im untan Kostn ei (schaug af da [$1 Huifeseitn] fia mea Infos).\nWens a Irrtum is, dassd do bist, nach druck in Zruck-Knopf vom Brausa.",
        "delete-legend": "Léschen",
        "historywarning": "'''Ochtung:''' Dé Seiten, dé du léschen mecherst, hod a Versiónsgschicht mid epper $1 {{PLURAL:$1|Versión|Versiónen}}:",
        "confirmdeletetext": "Du bist dabei, a Seiten mid olle zuaghering ödern Versiónen z' léschen. Bittscheh bstätig dodazua, daas da d' Kónsequenzen bewusst san und daas du in Ywereihstimmung mid d' [[{{MediaWiki:Policy-url}}|Richtlinien]] haundelst.",
-       "actioncomplete": "Aktion beendt",
-       "actionfailed": "Akzion fejgschlogn",
+       "actioncomplete": "Aktion fiate",
+       "actionfailed": "Aktion faigschlogn",
        "deletedtext": "„$1“ is glöscht worn. Im $2 findn Sie a Listn vo de letzten Löschungen.",
        "dellogpage": "Lesch-Logbuach",
        "deletionlog": "Lösch-Logbuach",
index f98f58a..6da96fb 100644 (file)
@@ -7,7 +7,8 @@
                        "Mostafadaneshvar",
                        "Reedy",
                        "ZxxZxxZ",
-                       "아라"
+                       "아라",
+                       "RigiMahnoor"
                ]
        },
        "tog-underline": ":لینکانآ خط کش",
        "tog-hidepatrolled": "ته نوکین تغییرات اصلاحاتی که گردگ بیتگن پناه کن",
        "tog-newpageshidepatrolled": "پناه کتن صفحاتی که گردگ بوتگن چه لیست نوکین صفحه",
        "tog-extendwatchlist": "لیست چارگ مزن کن دان کل تغییرات پیش داریت نه که فقط نوکینءَ",
-       "tog-usenewrc": "کارÙ\85رز Ú©ØªÙ\86 ØªØºÛ\8cÛ\8cرات Ù\86Ù\88Ú©Û\8cÙ\86 Ø¨Ù\87تر Ø¨Ù\88تگÛ\8cÙ\86(جاÙ\88ا Ø§Ø³Ú©Ø±Û\8cپت)",
+       "tog-usenewrc": "گرÙ\88پء ØªØºÛ\8cÛ\8cراÙ\86 ØªØ§Ú©Ø¡ Ù\88استÙ\87 Ù\85اÙ\86 Ù\86Ù\88Ú©Û\8cÙ\86 ØªØºÛ\8cÛ\8cراÙ\86 Ø¡Ù\8f Ú\86ارÙ\88Ú© Ù\84Û\8cست",
        "tog-numberheadings": "اتوماتیک شماره کتن عناوین",
-       "tog-showtoolbar": "میله ابزار اصلاح پیش درا(جاوا)",
-       "tog-editondblclick": "صفحات گون دو کلیک اصلاح کن(جاوا)",
-       "tog-editsectiononrightclick": "Ù\81عاÙ\84 Ú©ØªÙ\86 Ø§ØµÙ\84اح Ú©Ø³Ù\85ت Ú¯Ù\88Ù\86 Ú©Ù\84Û\8cÚ© Ø±Ø§Ø³Øª Ø§Ù\88ر Ú©Ø³Ù\85ت Ø¹Ù\86اÙ\88Û\8cÙ\86(جاÙ\88ا)",
-       "tog-watchcreations": "Ù\87Ù\88ر Ú©Ù\86 Ù\85Ù\86Û\8c ØµÙ\81حاتÛ\8c Ú©Ù\87 Ù\85Ù\86 ØªÙ\87 Ù\84Û\8cست Ú\86ارگ Ø´Ø±Ú©ØªØª",
-       "tog-watchdefault": "Ù\87Ù\88رکÙ\86 ØµÙ\81حاتÛ\8c Ú©Ù\87 Ù\85Ù\86 Ø§ØµÙ\84اح Ú©ØªÙ\86 ØªÙ\87 Ù\85Ù\86Û\8c Ù\84Û\8cست Ú\86ارگ",
-       "tog-watchmoves": "Ù\87Ù\88ر Ú©Ù\86 ØµÙ\81حاتÛ\8c Ú©Ù\87 Ù\85Ù\86 Ø¬Ø§Ù\87 Ù¾Ù\87 Ø¬Ø§Ù\87 Ú©Øª ØªÙ\87 Ù\85Ù\86Û\8c Ù\84Û\8cست Ú\86ارگ",
-       "tog-watchdeletion": "Ù\87Ù\88ر Ú©Ù\86 ØµÙ\81حاتÛ\8c Ú©Ù\87 Ù\85Ù\86 ØªÙ\87 Ù\84Û\8cست Ú\86ارگ Ú©Ù\87 Ù\85Ù\86 Ø­Ø°Ù\81 Ú©Øªن",
+       "tog-showtoolbar": "اصلاح کنوکین میلگ ابزارء پیش بدار",
+       "tog-editondblclick": "ویبتاکانء مان دو کلیک ٹگل بدئ",
+       "tog-editsectiononrightclick": "Ù\81عاÙ\84 Ú©ØªÙ\86 Ø²Ø±ØªÚ¯Û\8cÙ\86 Ø¨Ù\87رء Ø§ØµÙ\84اح Ú©ØªÙ\86 Ú¯Ù\88Ù\86 Ú©Ù\84Û\8cÚ© Ø²Ø±ØªÚ¯Û\8cÙ\86 Ø¹Ù\86Ù\88اÙ\86اÙ\86Ø¡ Ø³Ø±Ø§",
+       "tog-watchcreations": "Ù\85Ù\86Û\8c Ø§Ú\88 Ú©ØªÚ¯Û\8cÙ\86 Ù¾Û\8cج Ù\88 Ø§Ù¾Ù\84Ù\88د Ú©ØªÚ¯Û\8cÙ\86 Ù\81اÛ\8cÙ\84اÙ\86Ø¡ Ú\86ارگ Ù\84Û\8cستء ØªÙ\88کا Ù\87Ù\88ار Ú©Ù\86",
+       "tog-watchdefault": "Ù\85Ù\86Û\8c Ø§ØµÙ\84اح Ú©ØªÚ¯Û\8cÙ\86 Ù\81اÛ\8cÙ\84 Ù\88 Ù¾Û\8cجاÙ\86Ø¡ Ú\86ارگ Ù\84Û\8cستء ØªÙ\88کا Ù\87Ù\88ار Ú©Ù\86",
+       "tog-watchmoves": "Ù\85Ù\86Û\8c Ø³Ù\8fرÛ\8cÙ\86تگÛ\8cÙ\86 Ù\81اÛ\8cÙ\84 Ù\88 Ù¾Û\8cجاÙ\86Ø¡ Ú\86ارگ Ù\84Û\8cستء ØªÙ\88کا Ù\87Ù\88ار Ú©Ù\86",
+       "tog-watchdeletion": "Ù\85Ù\86Û\8c Ø­Ø°Ù\81 Ú©ØªÚ¯Û\8cÙ\86 Ù\81اÛ\8cÙ\84 Ù\88 Ù¾Û\8cجاÙ\86Ø¡ Ú\86ارگ Ù\84Û\8cستء ØªÙ\88کا Ù\87Ù\88ار Ø¨Ú©ن",
        "tog-minordefault": "په طور پیش فرض کل اصلاحات آ په داب جزی مشخص کن",
        "tog-previewontop": "بازبین پیش دار پیش چه جعبه اصلاح",
        "tog-previewonfirst": "ته اولین اصلاح بازبینی پیش دار",
-       "tog-enotifwatchlistpages": "Ù\85Ù\86Û\8c Ø§Û\8cÙ\85Û\8cÙ\84 Ø¬Ù\86 Ù\88Ù\87دÛ\8c Ú©Ù\87 Û\8cÚ© ØµÙ\81Ø­Ù\87 Ø§Û\8c ØªÙ\87 Ù\85Ù\86Û\8c Ù\84Û\8cست Ú\86ارگ Ø¹Ù\88ص Ø¨Û\8cت",
+       "tog-enotifwatchlistpages": "Ù\88Ù\87دÛ\8c Ú©Ù\87 Û\8cÚ© Ù¾Û\8cج Û\8cاÙ\86 Ú©Ù\87 Ù\81اÛ\8cÙ\84Ø¡ Ù¹Ú¯Ù\84 Ù\88ارت Ù¾Ø± Ù\85Ù\86Ø¡ Ø§Û\8cÙ\85Û\8cÙ\84 Ø¯Û\8cÙ\85 Ø¨Ø¯Ø¦",
        "tog-enotifusertalkpages": "منآ ایمیل جن وهدی که صفحه ی گپ کاربر من عوض بیت",
-       "tog-enotifminoredits": "Ù\85Ù\86 Ø§Û\8cÙ\85Û\8cÙ\84 Ø¬Ù\86 Ù\87Ù\85Û\8c Ø¯Ø§Ø¨ Ù¾Ù\87 Ù\87Ù\88ردÛ\8cÙ\86 Ø§ØµÙ\84احات ØµÙ\81حات",
+       "tog-enotifminoredits": "Ù\87Ù\86Ú\86Ù\88Ø´ Ù¾Ø± Ù\87Ù\88ردÛ\8cÙ\86 Ù¹Ú¯Ù\84 Ù\85اÙ\86 Ù¾Û\8cج Ù\88 Ù\81اÛ\8cÙ\84اÙ\86 Ù¾Ø± Ù\85Ù\86Ø¡ Ø§Û\8cÙ\85Û\8cÙ\84 Ø¯Û\8cÙ\85 Ø¨Ø¯Ø¦",
        "tog-enotifrevealaddr": "منی ایمیل پیش دار ته ایمیل أن هوژاری",
        "tog-shownumberswatching": "پیش دار تعداد کاربرانی که چارگتن",
+       "tog-oldsig": "انیگین ایمزا کنوک",
        "tog-fancysig": "امضاءَ په داب ویکی متنی بزان(بی اتوماتیکی لینک)",
-       "tog-uselivepreview": "چه زنده این بازبین استفاده کن(جاوا)(تجربی)",
+       "tog-uselivepreview": "لایو پیشچارگء کارمرز بکن(تجربی)",
        "tog-forceeditsummary": "من آ هال دی وهدی وارد کتن یک هالیکین خلاصه ی اصلاح",
        "tog-watchlisthideown": "منی اصلاحات آ چه لیست چارگ پناه کن",
        "tog-watchlisthidebots": "اصلاحات بوت چه لیست چارگ پناه کن",
        "tog-diffonly": "چیر تفاوت محتوای صفحه ی پیش مدار",
        "tog-showhiddencats": "پناه ین دسته یان پیش دار",
        "tog-norollbackdiff": "تفاوتء حذف کن بعد چه اجرای یک ترینگ",
+       "tog-useeditwarning": "وهدی دربیگ مان اصلاح کتگین پیج اگان تغییران سیو نبوت اتنت منء هشتار بدئ",
+       "tog-prefershttps": "پر مان بوتنء واسته هروهدء یک ایمنین کنکشنء کارمرز بکن",
        "underline-always": "یکسره",
        "underline-never": "هچ وهد",
-       "underline-default": "پیشفرضین بروزر",
+       "underline-default": "وفاولتء پێم پر برۆزر یان پۆسته",
+       "editfont-style": "اصلاح کنۆکێن فۆنتء استایل",
+       "editfont-default": "دفاۆلتێن برۆزر",
+       "editfont-monospace": "فۆنت گۆن مالومێن پاسلگ",
+       "editfont-sansserif": "بئ گۆشگێن فۆنت",
+       "editfont-serif": "گۆشه دارێن فۆنت",
        "sunday": "یک شنبه",
        "monday": "دوشنبه",
        "tuesday": "سی شنبه",
        "oct": "اکت",
        "nov": "نو",
        "dec": "دس",
+       "january-date": "جانری، بهارگاه $1",
+       "february-date": "فبراری، اۆستپان $1",
+       "march-date": "مارچ، مۆلمان $1",
+       "april-date": "اپریل، کرا $1",
+       "may-date": "مئ، سۆچکان $1",
+       "june-date": "جون، جلکان $1",
+       "july-date": "جولئ، سهێل $1",
+       "august-date": "اگست، ساچان $1",
+       "september-date": "سپتمبر، تۆمشان $1",
+       "october-date": "اکتۆبر، سارتان $1",
+       "november-date": "نومبر، گۆپشان $1",
+       "december-date": "دسمبر، تاکشان $1",
        "pagecategories": "{{PLURAL:$1|دسته|دسته جات}}",
        "category_header": "صفحات ته دسته \"$1\"",
        "subcategories": "زیردسته جات",
        "category-file-count": "{{PLURAL:$2|ای دسته فقط شامل جهلیگین فایل انت.|جهلیگین {{PLURAL:$1|افایل انت|$1 فایلان انت}}ته ای دسته, چه $2کلl.}}",
        "category-file-count-limited": "جهلیگین {{PLURAL:$1|فایل|$1 فایلان}} ته هنوکین دسته اینت",
        "listingcontinuesabbrev": "ادامه.",
+       "index-category": "سرتاک بوتگێن پێجان",
+       "noindex-category": "سرتاک نبوتگین پیجان",
+       "broken-file-category": "پیج گون پرشتگین لینک فایل",
        "about": "باره",
        "article": "محتوا صفحه",
        "newwindow": "(ته نوکین پنچره ی پچ کن)",
        "cancel": "کنسل",
        "moredotdotdot": "گیشتر...",
-       "mypage": "می صفحه",
-       "mytalk": "منی گپ",
+       "morenotlisted": "ائ لیست پکا نه انت",
+       "mypage": "تاک",
+       "mytalk": "گپ",
        "anontalk": "گپ کن گون ای آی پی",
        "navigation": "گردگ",
        "and": "&#32;و",
        "qbmyoptions": "منی صفحات",
        "faq": "ب.ج.س",
        "faqpage": "Project:ب.ج.س",
-       "vector-action-addsection": "هور کتن عنوان",
-       "vector-action-delete": "زورگ",
-       "vector-action-move": "جاه په جاه",
-       "vector-action-protect": "حفاظت",
-       "vector-action-undelete": "ترینگ",
-       "vector-action-unprotect": "حفاظت درگیزگ",
-       "vector-view-create": "شرکتن",
-       "vector-view-edit": "اصلاح",
-       "vector-view-history": "چارتن تاریح",
-       "vector-view-view": "وانتن",
-       "vector-view-viewsource": "پیشدارگ بن جاه",
        "actions": "کاران",
        "namespaces": "فضانامان",
        "variants": "گوشگان",
+       "navigation-heading": "منوء ناویگ",
        "errorpagetitle": "حطا",
        "returnto": "تررگ به $1.",
        "tagline": "چه {{SITENAME}}",
        "printableversion": "نسخه چهاپی",
        "permalink": "دایمی لینک",
        "print": "چهاپ",
+       "view": "چارگ",
+       "view-foreign": "بچار مان $1",
        "edit": "اصلاح",
+       "edit-local": "لوکال دسکریپشنء اصلاح کن",
        "create": "شرکتن",
+       "create-local": "لوکال دسکریپشنء هوار کن",
        "editthispage": "ای صفحه اصلاح کن",
        "create-this-page": "ای صفحه شرکتن کن",
        "delete": "حذف",
        "deletethispage": "ای صفحه حذف کن",
+       "undeletethispage": "ائ تاکء دلیت مکن",
        "undelete_short": "حذف مکن {{PLURAL:$1|one edit|$1 edits}}",
+       "viewdeleted_short": "چارگ {{باز،زیاتیگ:$1|یکین حذف بوتگین اصلاح|$1 اصلاح کتگانء حذف بکن}}",
        "protect": "حفاظت",
        "protect_change": "عوض کن",
        "protectthispage": "ای صفحه حفاظت کن",
-       "unprotect": "Ù\85حاÙ\81ظت Ù\85Ú©Ù\86",
-       "unprotectthispage": "ای صفحه محافظت مکن",
+       "unprotect": "پرÙ\88تکشÙ\86Ø¡ Ù¹Ú¯Ù\84 Ø¨Ø¯Ø¦",
+       "unprotectthispage": "ائ تاکء پروتکشنء ٹگل بدئ",
        "newpage": "نوکین صفحه",
        "talkpage": "ای صفحه بحث کن",
        "talkpagelinktext": "گپ کن",
        "articlepage": "محتوا صفحه به گند",
        "talk": "بحث",
        "views": "چارگان",
-       "toolbox": "جعبÙ\87 Ø§Ø¨Ø²Ø§Ø±",
+       "toolbox": "ابزار",
        "userpage": "به گند صفحه کاربر",
        "projectpage": "به گند صفحه",
        "imagepage": "به چار فایل صفحه ءَ",
        "jumptonavigation": "گردگ",
        "jumptosearch": "گردگ",
        "view-pool-error": "متاسفانه، سرور هنون بازگین باری سر انت.\nبازگین کاربری این تاک ءَ چارگنت.\nلطفا کمی صبر کنیت پیش چه شی که دگه ای تاک بچاریت.\n\n$1",
+       "generic-pool-error": "پر بژنء سرورء زیاتیگین بارئ سر انت. بازین کاربر انیگء ائ تاکء چارگء لوٹنت. دزبندی انت کمئ موه بداریت پیسر چه ایشی که ائ تاکء توکا رهشون به بیت.",
+       "pool-timeout": "شمئی انتظارء وهد پر قفل کنگء آسر بوت",
+       "pool-queuefull": "مهزنء صف پر انت",
+       "pool-errorunknown": "ناپجارین ارور",
+       "pool-servererror": "سرویسء پول سینٹر ودی نبیت ($1).",
        "aboutsite": "باره {{SITENAME}}",
        "aboutpage": "Project:باره",
-       "copyright": "محتوا موجودانت تحت $1.",
+       "copyright": "محتوا مان اجازت نامهٔ $1 انت مگان ایشی که آئی هلاپء آرگ ببیت انت.",
        "copyrightpage": "{{ns:project}}:حق کپی",
        "currentevents": "هنوکین رویداد",
        "currentevents-url": "Project:هنوکین رویداد",
        "ok": "هوبنت",
        "retrievedfrom": "درگیجگ بیت چه  \"$1\"",
        "youhavenewmessages": "شما هست  $1 ($2).",
+       "youhavenewmessagesfromusers": "شما چه {{PLURAL:$3|یک دگرین کاربر|$3  کاربر}} $1 داریت ($2).",
+       "youhavenewmessagesmanyusers": "شما چه لهتئ کاربر $1 داریت ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1|نوکین کله|999=نوکین کله هان}}",
+       "newmessagesdifflinkplural": "$1 {{PLURAL:$1|ٹگل داتن|پهکین ٹگل}}",
        "youhavenewmessagesmulti": "شما را نوکین کوله یان هست ته   $1",
        "editsection": "اصلاح",
        "editold": "اصلاح",
        "toc": "محتوا",
        "showtoc": "پیش دار",
        "hidetoc": "پناه کن",
+       "collapsible-collapse": "چیر داتن",
+       "collapsible-expand": "تچک کتن",
        "thisisdeleted": "به گند یا پچ ترین $1?",
        "viewdeleted": "به گند $1?",
        "restorelink": "{{PLURAL:$1|یک حذف اصلاح|$1 حذف اصلاح}}",
        "feed-atom": "اتم",
        "feed-rss": "ار اس اس",
        "red-link-title": "$1 (هنگت  نیستن)",
+       "sort-descending": "نزولی نز آرتن",
+       "sort-ascending": "صعودی نز آرتن",
        "nstab-main": "صفحه",
        "nstab-user": "صفحه کاربر",
        "nstab-media": "صفحه مدیا",
        "nospecialpagetext": "<strong>شما یک نامعتبرین صفحه حاصین درخواست کت.</strong>\n\nیک لیستی چه معتبرین صفحات حاص در کپیت ته [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "حطا",
        "databaseerror": "حطا دیتابیس",
+       "databaseerror-text": "یک ارورء مان دیتابیسء شوهازیگء ودی بیت. هنچوش بیتء کنت ائ یک نکسء مان سفتورء هن پیداگ بکنت انت.",
+       "databaseerror-textcl": "یک ارورء مان دیتابیسء شوهازیگء پیداگ بوت.",
+       "databaseerror-query": "شوهاز: $1",
+       "databaseerror-function": "Function: $1",
+       "databaseerror-error": "ارور: $1",
        "laggedslavemode": "هوژاری: صفحه شاید نوکین په روچ بییگان داشته می بیت",
        "readonly": "دیتابیس کبلنت",
        "enterlockreason": "یک دلیلی په کبل وارد کنیت، شامل یک برآوردی چه وهد کبل ویل بیت",
        "unexpected": "ارزش نه لوٹتیگن : \"$1\"=\"$2\".",
        "formerror": "حطا: نه تونیت فرم دیم دنت",
        "badarticleerror": "ای کار ته ای صفحه اجرای نه بیت",
-       "cannotdelete": "نه نونیت فایل یا صفحه مشخص بیتگین آ حذف کن.\nشاید گون یکی دگه  حذف بوتت",
+       "cannotdelete": "تاک یان پیکچرء هزپ کنگ «$1» بیت نه کنت.\nبلکین پیسرء دگر شهسء آئرا هزپ کتگ.",
+       "cannotdelete-title": "نبیت تاکء «$1» هزپ به بیت.",
+       "delete-hook-aborted": "هزپ گون قلابء واسته ایر دارگ بوت.\nائ بابتء توضیحء درشان نه بوت.",
+       "no-null-revision": "امکان نوکین هالیگ نسخهء اڈ کتن پر تاکء «$1» نه انت",
        "badtitle": "عنوان بد",
        "badtitletext": "لوٹتگین عنوان صفحه نامعتبر ،هالیک یا یک عنوان هرابین لینک بین زبانی یا بین وی کی انت.\nآی شاید شامل یک یا گیشترین کاراکترانت که ته عناوین استفاده نه بنت.",
-       "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|one result is|$1 results are}} مان چیرداتگین حافظهء ودی بیت انت.",
+       "perfcachedts": "جهلیگین دیتا مان چیرداتگین حافظهء ذخیره بوتگ انت و آهرین باریگ مان  $1 چه نوک بیت انت. زیاتیگء {{PLURAL:$4|یک نتیجه|$4 نتیجه}} مان چیرداتگین حافظهء ودی بیت انت.",
        "querypage-no-updates": "په روچ بیگان په ای صفحه الان غیر فعالنت. دیتا ادان الان نوکین نهنت.",
        "viewsource": "به گند منبع آ",
+       "viewsource-title": "منبعء پیش دارگ پر $1",
        "actionthrottled": "کار گیر نت",
        "actionthrottledtext": "په خاطر یک معیار ضد اسپم شما چه انجام ای کار ته یک کمی زمان محدود بیتگیت، و شما چه ای محدودیت رد بیتگیت.\nلطفا چند دقیقه بعد کوشست کن",
-       "protectedpagetext": "ای صفحه کبل بوتت په حاطر اصلاح بیگ",
+       "protectedpagetext": "ائ تاک پر دیم دارگ چه ادگرانی اصلاح کتن یان کارمرز کتن پراتکتء بوتگ انت.",
        "viewsourcetext": "شما تونیت به گند و کپی کنیت منبع ای صفحه آ",
-       "protectedinterface": "ای صفحه فراهم آریت مداخله ی متنی په برنامه و کبل بیتت په جلوگیری چه سو استفاده.",
-       "editinginterface": "'''هوژاری:''' شما یک صفحه ای اصلاح کنیت که به عنوان مداخله گر متنی برنامه استفاده بیت.\nتغییرات ای صفحه کاربرد مداخله گر په دگه کابران تاثیر هلیت.\n  [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net],  په ترجمه یان لطفا توجه کنیت په استفاده پروژه ملکی کتن مدیا وی کی",
+       "viewyourtext": "توانیت منبعی کد چه '''شمئ اصلاح کتگان''' مان ائ تاکء بگند ات و کپی بکن ات:",
+       "protectedinterface": "ائ پیجء توکا تکستء پر واسط کاربری ائ سفتورء مان ائ ویکی انت و پر دست دارگ چه ٹگل داتنء پراتکت بیتگ انت.\n\nپر هوار کتن یانکه رجانکء ٹگل پر پهکین ویکی هان، دزبندی انت چه [//translatewiki.net/ translatewiki.net]، محلی‌سازیء پراجکت پر مدیاویکی، کارمرز به کنیت.",
+       "editinginterface": "'''هوژاری:''' ائ پیجء که انیگء ٹگل دئیت یک تکستء هوار انت که مان ائ سفتورء واسط کاربری کارمرز بیتگ انت.\nائ پیجء ٹگل بیتن واسط کاربریء ظاهرءادگر کاربرانء ٹگل دنت انت.\nپر هوار کتن یانکه رجانکء ٹگل پر پهکین ویکی هان، دزبندی انت چه [//translatewiki.net/ translatewiki.net]، محلی‌سازیء پراجکت پر مدیاویکی، کارمرز به کنیت.",
        "cascadeprotected": "ای صفحه محافظت بیت چه اصلاح چرا که آیی شامل جهلیگین {{PLURAL:$1|صفحه, که|صفحات, که}} محافظتی گون the \"cascading\" option turned on:\n$2",
        "namespaceprotected": "شما اجازت په اصلاح صفحات ته  '''$1'' نام فضا نیست",
+       "customcssprotected": "شما ائ پیجء سی اس اسء اصلاح کتنء اجازتء نداریت، پرچا که آئی توکا وتیگین تنظیمان چه ادگر کاربرء انت.",
+       "customjsprotected": "شما رء ائ جاوا اسکریپتین پیجء اصلاح کتنء اجازتء نه انت، پرچا که آئی توکا وتیگین تنظیمان چه ادگر کاربرء انت.",
+       "mycustomcssprotected": "شما رء اجازت پر ائ سی اس اسین پیجء اصلاح کتن نه انت.",
+       "mycustomjsprotected": "شما رء ائ جاوا اسکریپتین پیجء اصلاح کتنء اجازتء نه انت.",
+       "myprivateinfoprotected": "شما رء اجازت پر وتیگین اینفارمیشنء اصلاح کتنء نه انت.",
+       "mypreferencesprotected": "شما رء اجازت پر وتی تنظیماتء اصلاح کتنء نه انت.",
        "ns-specialprotected": "حاصین صفحات اصلاح نه بنت",
        "titleprotected": "ای عنوان محافظت بوتت چه سربیگ به وسیله  [[User:$1|$1]].\nای دلیل دییگ بیتت ''$2''.",
+       "filereadonlyerror": "ائ فایل ٹگل «$1» بیت نکنت پرچا که ائ فایلء مهزن «$2» مان تهناوانتنیء حالت ایر انت.\n\nهما ماسٹر که آئرا کبل کتگ چوشین توضیحئ درشان کتگ:  «$3».",
+       "invalidtitle-knownnamespace": "نامهتبرین عنوان گون نامء جاگاه «$2» ءُ تکست «$3»",
+       "invalidtitle-unknownnamespace": "نامهتبرین نام گون ناشناسین نامء جاگاه نمبر $1 ءُ تکست «$2»",
+       "exception-nologin": "مان نبیتگ ات",
+       "exception-nologin-text": "دزبندی انت سیستمء تها [[Special:Userlogin|مان بئیت]] تانکه بتوان ات ائ تاکء بگند ات.",
+       "exception-nologin-text-manual": "دزبندی انت  $1  تانکه شمارء پر ائ تاک یانکه اکشنء دزرس ببیت انت.",
        "virus-badscanner": "تنظیم بد: ناشناسین اسکنر ویروس: ''$1''",
        "virus-scanfailed": "اسکن پروش وارت(کد $1)",
        "virus-unknownscanner": "ناشناسین آنتی ویروس:",
-       "logouttext": "''' شما الان در بوتت.'''\n\nشما تونیت چه {{SITENAME}} ناشناس استفاده کنیت یا شما تونیت دگه وراد بیت گون دگه یا هما کاربر.\nتوجه بیت که لهتی صفحات شاید په داب هما وهدی که شما وراد بوتتیت پیش درگ بند تا وهدی که ذخیره بروزر وتی پاک کنیت.",
+       "logouttext": "''' شما انیگء در شُت ات'''\nبزان که تانکه شمئی بروزرء چیرداتگین هافظه پهک مبیت، لهتئ چه تاکان ممکن انت رندا هم هنچوش پیش دارگ ببنت که انگار شما لاگین کتگ ات.",
+       "welcomeuser": "وشاتک ات $1!",
+       "welcomecreation-msg": "انیگء شمئی اکانت اڈ بیتگ انت.\nمشموش ات که وتی [[Special:Preferences|ترجیحات {{SITENAME}}]] رء ٹگل دئیت.",
        "yourname": "نام کاربری",
+       "userlogin-yourname": "اکانتء نام",
+       "userlogin-yourname-ph": "وتی یوزرنامء بلک ات",
+       "createacct-another-username-ph": "وتی یوزرنامء بلک ات",
        "yourpassword": "کلمه رمز",
+       "userlogin-yourpassword": "پسورد",
+       "userlogin-yourpassword-ph": "وتی پسوردء بلک ات",
+       "createacct-yourpassword-ph": "یک پسوردء بلک ات",
        "yourpasswordagain": "کلمه رمز دگه نویس",
+       "createacct-yourpasswordagain": "چه دوبارگ پسوردء بلک ات",
+       "createacct-yourpasswordagain-ph": "چه دوبارگ پسوردء بلک ات",
        "remembermypassword": "می ورودءَ ته ای کامپیوتر بدار (په $1 {{PLURAL:$1|روچ|روچ}})",
+       "userlogin-remembermypassword": "منء همک وهد برجاه بدار",
+       "userlogin-signwithsecure": "چه ایمنین کنکشنء کارمرز بکن ات",
        "yourdomainname": "شمی دامین",
+       "password-change-forbidden": "شما نتوان ات پسوردان مان ائ ویکیء رء ٹگل دئیت.",
        "externaldberror": "یک حطا دیتابیس تصدیق هویت دراییگی هست یا شما را اجازت نیست وتی حساب درایی په روچ کنیت.",
        "login": "ورود",
        "nav-login-createaccount": "ورود/شرکتن حساب",
        "loginprompt": "شما بایدن په وارد بیگ ته {{SITENAME}} کوکی فعال کنیت",
        "userlogin": "ورود/شرکتن حساب",
+       "userloginnocreate": "لاگین",
        "logout": "در بیگ",
        "userlogout": "در بیگ",
        "notloggedin": "وارد نهت",
+       "userlogin-noaccount": "شما رء اکانت نه انت؟",
+       "userlogin-joinproject": "مان {{SITENAME}} ناملکی بکن ات!",
        "nologin": "حسابء  نیستن؟ '''$1'''.",
        "nologinlink": "شرکتن یک حساب",
        "createaccount": "حساب شرکن",
        "gotaccount": "یک حساب الان هست؟'''$1'''.",
        "gotaccountlink": "ورود",
-       "createaccountmail": "گون ایمیل",
+       "userlogin-resetlink": "وتی لاگینء جزئیاتء رء شموش کتگ ات؟",
+       "userlogin-resetpassword-link": "وتی پسوردء رء شموش کتگ ات؟",
+       "userlogin-helplink2": "کمک گون لاگین",
+       "userlogin-loggedin": "شما انیگء {{GENDER:$1|$1}}ء حالتء مان بیتگ ات.\nچه جهلیگین فرم پر لاگین مان ادگر کاربرء حالتء کارمرز بکن ات.",
+       "userlogin-createanother": "ادگر اکانتء اڈ بکن ات",
+       "createacct-emailrequired": "ایمیل",
+       "createacct-emailoptional": "ایمیل (ایهتیاری)",
+       "createacct-email-ph": "وتی ایمیلء بلک ات",
+       "createacct-another-email-ph": "ایمیلء ادرسء بلک ات",
+       "createaccountmail": "کارمرز چه وتکارین موقتین پسورد ءُ رندا آئی دیم داتن پر مالومین ایمیل",
+       "createacct-realname": "شمئی اصلیگین نام (ایهتیاری)",
+       "createacct-reason-ph": "پرچا شما ادگر نوکین اکانتء اڈ کن ات",
+       "createacct-captcha": "سکیوریتی چک",
+       "createacct-imgcaptcha-ph": "برزین سیاهگء ادان بلک ات",
+       "createacct-submit": "وتی اکانتء اڈ کن ات",
+       "createacct-another-submit": "ادگر اکانتء اڈ بکن ات",
+       "createacct-benefit-heading": "{{SITENAME}} شهسانی واسته هنچوش که شمئیء اڈ بیتگ",
+       "createacct-benefit-body1": "$1 {{PLURAL:$1|اصلاح|اصلاح کتگان}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|تاک|تاکان}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|هوار بیتگ}} نوکین",
        "badretype": "کلماتی رمزی که شما وارد کتگیت یک نهنت.",
-       "userexists": "وارد بیتگیت نام کاربری الان استفاده بیت.\nلطفا دگه دابین نامی بزوریت.",
+       "userexists": "ائ یوزرنامء که لکتگ ات پیسریگء کارمرز بیتگ انت.\nدزبندی انت ادگر نامء بزیریت.",
        "loginerror": "حطا ورود",
+       "createacct-error": "ارور مان اکانتء اڈ کنگء",
+       "createaccounterror": "پر ائ اکانتء اڈ کتن امکان نه انت: $1",
        "nocookiesnew": "حساب کاربر شر بوت بله شما وارد نه بیتگیت ته.\n{{SITENAME}} چه کوکی په ورود کابران استفاده کنت.\nشما کوکی غیر فعال کتت.\nلطفا آییآ فعال کنیت رندا گون وتی نوکین نام کاربری و کلمه رمز وارد بیت.",
        "nocookieslogin": "{{SITENAME}} په ورود کابران چه کوکی استفاده کنت.\nشمی کوکی غیر فعالنت.\nلطفا آییا فعال کنیت و دگه  سعی کنیت.",
+       "nocookiesfornew": "اکانت اڈ نبیت، پرچا که ما نتوانت آئی منبعء رء تأیید کنین.\nپکا بزان ات که کوکی‌هان فعال انت، رندا پیجء چه نوک رلود کن ات و دوبارگ بچکاس ات.",
        "noname": "شما یک معتبرین نام کاربر مشخص نه کتت.",
        "loginsuccesstitle": "ورود موفقیت آمیز",
        "loginsuccess": "''''شما الان وارد {{SITENAME}} په عنوان \"$1\".'''",
        "nosuchuser": "هچ کاربری گون نام \"$1\" نیستن.\nکاربری نام حرفش په هور و مزنی حساس انت.\nوتی املايا چک کنیت یا [[Special:UserLogin/signup|نوکین حسابی شرکنیت]].",
        "nosuchusershort": "هچ کاربری گون نام  \"$1\"نیستن.\nوتی املايا کنترل کنیت",
        "nouserspecified": "شما باید یک نام کاربری مشخص کنیت.",
+       "login-userblocked": "ائ کابر بلاک بیتگ. لاگین مان سیستمء اجازت نه انت.",
        "wrongpassword": "اشتباهین کلمه رمز وارد بوت. دگه سعی کن.",
        "wrongpasswordempty": "کلمه رمز وارد بیتگین هالیکنت. دگه سعی کن",
-       "passwordtooshort": "شمی کلمه رمز نامعتبر یا باز هوردنت.\nآیی بایدن حداقل {{PLURAL:$1|1 کاراکتر|$1 کاراکتر}} کاراکتر بیت و چه نام کاربری متفاوت بیت.",
-       "mailmypassword": "نوکین کلمه رمزء ایمیل کن",
+       "passwordtooshort": "پسورد ضرورانت چکم {{PLURAL:$1|۱ کرکتر|$1 کرکتر}} داشتگ بیت.",
+       "password-name-match": "شمئی پسورد ضرورنت چه شمئی یوزرنامء پرک بیت انت.",
+       "password-login-forbidden": "ائ یوزرنام ءُ پسوردء کارمرز اجازت نه انت.",
+       "mailmypassword": "نوکین پسوردء بلوٹ",
        "passwordremindertitle": "نوکین هنگین کلمه رمز په {{SITENAME}}",
        "passwordremindertext": "یک نفری(شاید شما، چه آی پی $1)\nلوٹتگی که ما شما را یک نوکین کلمه رمز دیم دهین په {{SITENAME}} ($4).\nکلمه رمز په کاربر \"$2\" الان شینت\"$3\".\nشما بایدن وارد بیت و وتی کلمه رمزآ بدل کنیت انو.\nشمی موقتین کلمه رمز دا {{PLURAL:$5|یک روچ|$5 روچ}} هلیت\n\nاگه دگه کسی په شما ای درخواست دیم داته و یا شما وتی کلمه رمزآ خاطر داریت و نه لوٹتیت آیآ عوض کنیت، شما تونیت این کوله یا شموشیت و گون هما قدیمی کلمه رمز ادامه دهیت",
        "noemail": "هچ آدرس ایمیلی په کاربر \"$1\" ثبت نه بیتت.",
+       "noemailcreate": "پیکن یک مهتبرین ایمیلء بلک ات.",
        "passwordsent": "یک نوکین کلمه رمزی په آدرس ایمیل ثبت بوتگین په \"$1\" دیم دهگ بیت.\nلطفا بعد چه دریافت وارد بیت",
        "blocked-mailpassword": "شمی آدرس آی پی چه اصلاح کتن محدود بوتت و اجازت نداریت په خاطر جلوگیری چه سو استفاده چه عملگر کلمه رمز استفاده بکنت.",
-       "eauthentsent": "یک ایمیل تاییدی په نامتگین آدرس ایمیل دیم دهگ بوت.\nپیش چه هردابین ایمیلی په حساب دیم دیگ بین، شما بایدن چه دستور العملی که ته ایمیل آتکه پیروی کنیت په شی که شمی حساب که شمی گنت تایید بیت.",
-       "throttled-mailpassword": "یک کلمه رمز یاد آوری پیش تر دیم دهگ بوتت ته  {{PLURAL:$1|ساعت|$1 ساعت}}  ساعت پیش.\nپه جلوگرگ چه سو استفاده فقط یک کلمه رمز یاد آوری هر$1  ساعت دیم دهگ بیت.",
+       "eauthentsent": "یک ایمیلء پر شمئی ایمیل ادرسء تاییدء پر لکتگین ایمیلء راهیگ بوت.\nپیسر چریشی که ادگر ایمیلء راهیگ بیت، ایمیلء توضیحانء پر ائ واسته که هما ادرس المء شمئیگ انت رهچار بکن ات.",
+       "throttled-mailpassword": "یک ایمیلء پر پسوردء واترء مان $1 {{PLURAL:$1|ساهت|ساهت}} پیسریگء راهیگ بیتگ انت.\nپر هلاپء دیمداریء، هر $1 {{PLURAL:$1|ساهت|ساهت}} تهنا یک ایمیلء گون پسوردء واترء راهیگ بیت انت.",
        "mailerror": "حطا دیم دهگ ایمیل:$1",
        "acct_creation_throttle_hit": "شرمنده، لهتی پیسرگین چارون گون شمی آی زیگ لهتی {{PLURAL:$1|1 حساب|$1 حساب}}   شر کتت , که گیشترین حد مجاز ته ای زمان انت.\nهنچوش چاروکان گون ای آی پی ن توننت گیشتر الان حساب شرکننت.",
-       "emailauthenticated": " $3 شمی آدرس ایمیل ته $2  تصدیق بوت.",
-       "emailnotauthenticated": "په آدرس ایمیل هنگت تصدیق نه بوتت.\nهچ ایمیلی په جهلیگین ویژگی دیم دهگ نه بیت.",
+       "emailauthenticated": "شمئی ایمیلء مان $2 ساهت $3 تائید بوت.",
+       "emailnotauthenticated": "شمئی ایمیل ادرسء انیگء تائید نبیتگ انت.\nپر جهلیگین بابت ان هچ ایمیلء راهیگ نبیت.",
        "noemailprefs": "یک آدرس ایمیل په کار کتن ای ویژگیان مشخص کنیت.",
        "emailconfirmlink": "وتی آدرس ایمیل تایید کن",
        "invalidemailaddress": "آدرس ایمیل قبول نه بیت چوش که جاه کیت یک فرمت نامعتبری هست.\nلطفا یک آدرس ایمیل هو-فرمتی وارد کنیت یا ای فیلد هالیک بلیت.",
+       "cannotchangeemail": "مان ائ ویکیء اکانتء ایمیلان ڈگل بیت نکنت انت.",
+       "emaildisabled": "ائ سایتء نتوانیت ایمیل راهیگ بکنت انت.",
        "accountcreated": "حساب شر بوت",
-       "accountcreatedtext": "حساب Ú©Ø§Ø±Ø¨Ø± Ù¾Ù\87 $1 Ø´Ø± Ø¨Ù\88ت.",
+       "accountcreatedtext": "اکاÙ\86تء Ù¾Ø± [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|تراÙ\86]]) Ø§Ú\88 Ø¨Û\8cتگ Ø§Ù\86ت.",
        "createaccount-title": "شرکتن حساب په {{SITENAME}}",
        "createaccount-text": "یکی یک حساب په شمی آدرس ایمیل ته  {{SITENAME}} گون نام ($4)  \"$2\"، گون کلمه رمز \"$3\" شرکتت.\nشما بایدن وارد بیت و وتی کلمه رمز الان عوض کنیت.\n\nشما شاید ای پیام شموشیت اگه ای ای حساب گون حطا شر بوتت.",
-       "login-throttled": "شما په کلمه رمز ای حساب باز جهد کتت نوکی. لطفا صبر کنیت و. رندا جهد کنیت.",
+       "login-throttled": "شما انیگ پر لاگین کتنء چنت بار جهد کتگ ات. دزبندی انت پیسر چه پدایین جهدء $1 موه بداریت.",
+       "login-abort-generic": "شمئی لاگینء پکا نبیت - Aborted",
        "loginlanguagelabel": "زبان: $1",
+       "suspicious-userlogout": "شمئی لوٹ پر در شتن چه سیستمء رد بوت پرچا که چوش که پیداگ انت ائ لوٹ چه هرابین بروزر یانکه پراکسیء راهیگ بیتگ انت.",
+       "createacct-another-realname-tip": "اصلیگین نام ایهتیاری انت.\nاگان آئرا بلک ات رهشونء درگتء پر شمئی سیاهگان چه اصلیگین نام کارمرز بیت انت.",
+       "pt-login": "لاگین",
+       "pt-login-button": "لاگین",
+       "pt-createaccount": "اکانتء اڈ بکن",
+       "pt-userlogout": "در شُتن",
+       "php-mail-error-unknown": "نامالومین ارور مان تابع  mail()‎ پی‌اچ‌پی",
+       "user-mail-no-addy": "جهد پر ایمیلء راهیگ گیر چه ایمیل ادرس",
+       "user-mail-no-body": "جهد پر هالیگ یانکه هوردین ایمیلء راهیگء",
        "changepassword": "کلمه رمز عوض کن",
-       "resetpass_announce": "شما گون یک هنوکین کد ایمیل بوتگین وارد بوتءیت.\nپه تمام کتن ورود، شما باید یک نوکین کلمه رمز اداں شرکنیت",
+       "resetpass_announce": "شما پر وتی لاگینء آسر کتنء، نوکین پسوردء تیار بکن ات.",
        "resetpass_text": "<!-- متن دان هورکن -->",
        "resetpass_header": "حساب کلمه رمزءَ عوض کن",
        "oldpassword": "کلمه رمز کهنگین:",
        "newpassword": "نوکین کلمه رمز:",
        "retypenew": "کلمه رمز دگه بنویس",
        "resetpass_submit": "تنظیم کلمه رمز و ورود",
-       "changepassword-success": "شمی کلمه رمز گون موفقیت عوض بون! هنو شما وارد بیگیت...",
+       "changepassword-success": "شمئی پسورد پر درستیء ٹگل بیت!",
+       "changepassword-throttled": "شما انیگ پر لاگین کتنء چنت بار جهد کتگ ات. دزبندی انت پیسر چه پدایین جهدء $1 موه بداریت.",
        "resetpass_forbidden": "کلمات رمز نه توننت عوض بنت.",
        "resetpass-no-info": "په مستقیمین دسترسی په ای صفحه شما بایدن وارد سایت بیت",
        "resetpass-submit-loggedin": "عوض کتن کلمه رمز",
+       "resetpass-submit-cancel": "کنسیل",
        "resetpass-wrong-oldpass": "کلمه رمز موقت یا هنوکین رمز شر نهنت.\nبلیکن شما الان وتی کلمه رمز عوض کتت یا یک نوکین موقتین رمزی لوٹت.",
+       "resetpass-recycled": "دزبندی انت وتی پسوردء پر ادگرین چیزء گیر چه انیگین پسوردء ٹگل دئیت.",
+       "resetpass-temp-emailed": "شما گون یک موکتین ایمیل کدء مان بیتگ ات.\nپر لاگینء آسرء، شما ضرورنت نوکین پسوردء ادان لاک ات:",
        "resetpass-temp-password": "موقتین کلمه رمز:",
+       "resetpass-abort-generic": "پسوردء ٹگل گون یک اکتنشنء واسته کنسیل بیتگ انت.",
+       "resetpass-expired": "شمئی پسوردء مالومین وهد هلتگ انت. دزبندی انت پر لاگین کتن نوکین پسوردء تیار کن ات.",
+       "resetpass-expired-soft": "شمئی پسوردء مالومین وهد هلتگ انت ءُ نوکین پسوردء اڈ کتن ضرور انت. دزبندی انت انیگء نوکین پسوردء بزیر ات، یانکه پر رندیگین تیار کتنء، ائ بٹنء  \"{{int:resetpass-submit-cancel}}\" سرء کلیک کن ات.",
+       "resetpass-validity-soft": "شمئی پسورد درست نه انت: $1\nدزبندی انت انیگء نوکین پسوردء بزیر ات یانکه ائ بٹنء «{{int:resetpass-submit-cancel}}» سرء کلیک کن ات که رندا آئرا تیار کن ات.",
+       "passwordreset": "نوکین پسوردء بلوٹ",
+       "passwordreset-text-one": "پر وتی پسوردء واترء ائ فرمء پکا کن ات.",
+       "passwordreset-text-many": "{{PLURAL:$1|اگان لوٹت ایمیلء گون موکتین پسوردء پر شما راهیگ ببیت، یکئ چه ائ جاگاهانء پر بکن ات.}}",
+       "passwordreset-legend": "نوکین پسوردء بلوٹ",
+       "passwordreset-disabled": "پسوردء واتر کتن مان ائ ویکیء نافعال بیتگ انت.",
+       "passwordreset-emaildisabled": "ایمیلء حالتان مان ائ ویکیء نافعال بیتگ انت.",
+       "passwordreset-username": "یوزرنام:",
+       "passwordreset-domain": "دامین:",
+       "passwordreset-capture": "آسریگین ایمیل پیش دارگ بیت؟",
+       "passwordreset-capture-help": "اگان ائ گزینگ رء نشانیگ بهل ات، یک ایمیلء (گون موکتین پسوردء) شما رء پیش دارگ بیت ءُ هنچوش پر کاربرء راهیگ بیت انت.",
+       "passwordreset-email": "ایمیل ادرس:",
+       "passwordreset-emailtitle": "اکانتء جزئیات مان {{SITENAME}}",
+       "passwordreset-emailtext-ip": "یک شهسء (بلکین شما، گون آی‌پیء نشانیگ $1) شمئی پسوردء واترء {{SITENAME}} ($4) لوٹتگ انت. {{PLURAL:$3|اکانت|اکانتان}} گون ائ ایمیل ادرسء همگرنچ انت:\n\n$2\n\n{{PLURAL:$3|ائ موکتین پسورد|ائ موکتین پسوردان}} رند چه {{PLURAL:$5|یک روچ|$5 روچ}} باطل بیت انت.\nشما پیکن انیگء لاگین کن ات ءُ نوکین پسوردء بزیر ات. اگان شمئی پگر انت که ادگر شهسء ائ لوٹء راهیگ کتگ یانکه وتی پیسریگین پسوردء هیال کت ات ءُ رندء نلوٹیت آئرا ٹگل دئیت، بیت که ائ پیگامء ناگند بزان ات ءُ وتی پیسریگین پسوردء کارمرز کن ات.",
+       "passwordreset-emailtext-user": "کاربر $1 چه {{SITENAME}} شمئی پسوردء واترء لوٹ مان {{SITENAME}} ($4) کتگ انت. {{PLURAL:$3|اکانت|اکانتان}} چیریگین کاربر گون ائ ایمیل ادرس همگرنچ انت:\n\n$2\n\n{{PLURAL:$3|ائ موکتین پسورد|ائ موکتین پسوردان}} رند چه {{PLURAL:$5|یک روچ|$5 روچ}} باطل بیت انت.\nشما ضرور انت انیگء لاگین کن ات ءُ نوکین پسوردء بزیر ات. اگان ادگر شهسء ائ لوٹء راهیگ کتگ انت، یانکه وتی اصلیگین پسوردء هیال کت ات ءُ رندء نلوٹ ات آئرا ٹگل دئیت، بیت که ائ پیگامء نگند بزان ات ءُ وتی پیسریگین پسوردء کارمرز کن ات.",
+       "passwordreset-emailelement": "یوزرنام: $1\nموکتین پسورد: $2",
+       "passwordreset-emailsent": "یک ایمیلء گون پسوردء واترء راهیگ بوت.",
+       "passwordreset-emailsent-capture": "یک ایمیلء پر پسورد واترء واسته که جهلیگء پیش دارگ بیت، راهیگ بیتگ انت.",
+       "passwordreset-emailerror-capture": "واترین ایمیل، که جهلیگء پیش دارگ بیت، اڈ بوت، بلئی آئی راهیگ پر {{GENDER:$2|کاربر}} پکا نبوت: $1",
+       "changeemail": "ایمیل ادرسء ٹگل بدئ",
+       "changeemail-header": "وتی اکانتء ایمیل ادرسء ٹگل بدئ",
+       "changeemail-text": "ائ فرمء پکا کن ات تانکه شمئی ایمیلء ٹگل به بیت. پریشی که ائ تغییرء تایید کن ات ضرور انت وتی پسوردء بلک ات.",
+       "changeemail-no-info": "پر یکپارگین دزرسی مان ائ تاکء پیکن لاگین کن ات.",
+       "changeemail-oldemail": "انیگین ایمیل ادرس:",
+       "changeemail-newemail": "نوکین ایمیل ادرس:",
+       "changeemail-none": "هج کجام",
+       "changeemail-password": " {{SITENAME}} شمئی پسورد:",
+       "changeemail-submit": "ایمیلء ٹگل بدئ",
+       "changeemail-cancel": "کنسیل",
+       "changeemail-throttled": "شما انیگ پر لاگین کتنء چنت بار جهد کتگ ات. دزبندی انت پیسر چه پدایین جهدء $1 موه بداریت.",
+       "resettokens": "پجاروکان(tokens)ی واتر",
+       "resettokens-text": "شما توان ات پجاروکان(tokens) که دزرسیء اجازت پر شمئی وتیگین دیتا همگرنچ گون شمئی اکانتء دینت، واتر بکن ات.\nهما درگتء ائ کار بیت کنت که نامالومین شهسء شمئی اکانتء لاگین کتگ انت.",
+       "resettokens-no-tokens": "هچ پجاروکء پر واترء ودی نبوت.",
+       "resettokens-legend": "پجاروکان(tokens)ی واتر",
+       "resettokens-tokens": "پجاروکان(tokens):",
+       "resettokens-token-label": "$1 (انیگین اندازگ: $2)",
+       "resettokens-watchlist-token": "ویب فیدء پجاروک [[Special:Watchlist|پیجانی تغییرات که آهانء رهگر کن ات]] (اتم/آراس‌اس)",
+       "resettokens-done": "پجاروکانی واتر.",
+       "resettokens-resetbutton": "درچتگین پجاروکانء واتر بکن",
        "bold_sample": "پررنگین متن",
        "bold_tip": "پررنگین متن",
        "italic_sample": "ایتالیکی متن",
        "showpreview": "بازبین پیش دار",
        "showdiff": "تغییرات پیش دار",
        "anoneditwarning": "'''هوژاری:''' شما وارد نه بیتگیت.\nشمی آی پی ته تاریح اصلاح ای صفحه ثبت بیت.",
+       "anonpreviewwarning": "''شما مان سیستمء لاگین نکتگ. ذخیره کتنء حالت شمئی آی‌پیء نشانیگ مان ائ پیجء هاپزگ سبت بیت انت.''",
        "missingsummary": "'''یادآوری:''' شما یک خلاصه چه اصلاح وارد نه کرت.\nاگر دگه کلیک کنیت ذخیره آ، شمی اصلاح به بی آی ذخیره بنت.",
        "missingcommenttext": "لطفا یک نظری وارد کنیت جهل آ",
-       "missingcommentheader": "'''یاداوری:'' شما یک موضوع/سرخط په ای نظر وارد نکتت.\nاگر شما دگه ذخیره کلیک کنیت، شمی اصلاح بی آی ذخیره بنت.",
+       "missingcommentheader": "'''هالداری:'' شما یک موضوع/سرهت پر ائ کامنت نهشتگ ات.\nاگان دوبارگ بٹن «{{int:savearticle}}» سرء کلیک کن ات شمئی ویرایش گیر چه آئیء ذخیرگ بیت انت.",
        "summary-preview": "خلاصه بازبینی:",
        "subject-preview": "بازبین موضوع/سرخط:",
        "blockedtitle": "کاربر محدود بوتت",
        "blockednoreason": "هچ دلیلی دهگ نه بیته",
        "whitelistedittext": "شما باید $1به اصلاح کتن صفحات.",
        "confirmedittext": "شما بایدن وتی آدرس ایمیل آ پیش چه اصلاح کتن صفحات تایید کنیت.\nلطفا وتی آدرس ایمیل آی چه طریق [[Special:Preferences|ترجحات کاربر]] تنظیم و معتبر کنیت.",
-       "nosuchsectiontitle": "هچ چوشن بخش",
-       "nosuchsectiontext": "Ø´Ù\85ا Ø³Ø¹Û\8c Ú©Øª Û\8cÚ© Ø¨Ø®Ø´Û\8c Ø§ØµÙ\84اح Ú©Ù\86Û\8cت Ú©Ù\87 Ù\86Û\8cستÙ\86.",
+       "nosuchsectiontitle": "هنچوشین بهرء ودی نبوت",
+       "nosuchsectiontext": "Ø´Ù\85ا Ø¬Ù\87د Ú©ØªÚ¯ Ù¾Ø± Û\8cÚ© Ø¨Ù\87رء Ø§Ø¯Û\8cت Ú©ØªÙ\86Ø¡ Ú©Ù\87 Ù\85Ù\88جÙ\88د Ù\86Ù\87 Ø§Ù\86ت .\nÙ\85Ù\85Ú©Ù\86 Ø§Ù\86ت Ù\87Ù\85ئ Ø¯Ø±Ú¯ØªØ¡ Ú©Ù\87 Ø´Ù\85ا Ù¾Û\8cجء Ú\86ارگ Ú©ØªÚ¯ Ø§Øª Ø§Ø¦ Ø³Ù\8fرÛ\8cÙ\86Ú¯ Û\8cاÙ\86Ú©Ù\87 Ù\87زپ Ø¨Û\8cتگ Ø§Ù\86ت.",
        "loginreqtitle": "ورود نیازنت",
        "loginreqlink": "ورود",
        "loginreqpagetext": "شما باید $1 په گندگ دگه صفحات.",
        "accmailtitle": "کلمه رمز دیم دات",
-       "accmailtext": "کلمه رمز په [[User talk:$1|$1]]  دیم دهگ بوت په $2.\nکلمه رمز په نوکین حساب ته صفحه ''[[Special:ChangePassword|عوض کتن رمز]]'' وهدی که وارد بیتت تونیت بدل بیتن",
+       "accmailtext": "یک پسوردء [[User talk:$1|$1]] پر $2 راهیگ بوت. بیت آئرا چه پیجء ''[[Special:ChangePassword|پسوردء ٹگل]]'' که لاگینء درگتء پیش دارگ بیت ٹگل دئیت.",
        "newarticle": "(نوکین)",
        "newarticletext": "شما رند چه یک لینکی په یک صفحه ی که هنو نیستند اتکگیت.\nپه شر کتن صفحه، شروع کن نوشتن ته جعبه جهلی(بچار  [$1 صفحه کمک]  په گیشترین اطلاعات).\nاگر شما اشتباهی ادانیت ته وتی بروزر دکمه ''Back'' بجن.",
        "anontalkpagetext": "----'' ای صفحه بحث انت په یک ناشناس کاربری که هنگت یک حسابی شر نه کتت یا آی ا ستفاده نه کتت. اچه ما بایدن آدرس آی پی عددی په پچاه آرگ آیی استفاده کنین.\nچوشن آدرس آی پی گون چندین کاربر استفاده بیت.\nاگه شما یک کاربر ناشناس ایت وی حس کنیت بی ربطین نظر مربوط شمی هست، لطفا [[Special:UserLogin|وارد بیت ]] یا [[Special:UserLogin/signup|حسابی شرکن]] دان چه هور بییگ گون ناسناسین کاربران پرهیز بیت.''",
        "noarticletext": "هنو هچ متنی ته ای صفحه نیست.\nشما تونیت [[Special:Search/{{PAGENAME}}|گردیت په عنوان صفحه]]  ته دگه صفحات یا<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} گردگ په مربوطین آمار],\nیا [{{fullurl:{{FULLPAGENAME}}|action=edit}} اصلاح ای صفحه]</span>.",
+       "noarticletext-nopermission": "ائ تاکء رء انیگ هچ سیاهگء نه انت .\nشما توانت مان ادگر تاکان [[Special:Search/{{PAGENAME}}|ائ عنوانء رء پٹوپول بکن ات]]،\nیانکه <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} مان یکپیمیگین سیاهگان شوهاز بکن ات]</span> بلئ شما رء پر ائ پیجء اڈ کتنء اجازت نه انت.",
+       "missing-revision": "ویرایش #$1 چه پیجء «{{FULLPAGENAME}}» موجود نه انت.\n\nبلکین چه نوک نکتنء بابتء هزپ بیتگ انت.\nتوان ات گیشترین جزئیات رء مان [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} هزپانی سیاهگ] ودی بکن ات.",
        "userpage-userdoesnotexist": "حساب کاربر \"<nowiki>$1</nowiki>\" ثبت نهنت. لطفا کنترل کنیت اگه شما لوٹیت ای صفحه یا شر/اصلاح کنیت.",
-       "clearyourcache": "'''توجه:''' بعد چه ذخیره کتن، شما شاید مجبور بیت چه وتی ذخیره ی بروزر رد بیت تا تغییرات بگندیت. '''Mozilla / Firefox / Safari:'' ''Shift'' جهل داریت همی وهدی که کلیک کنیت ''Reload'' یا بداریت ''Ctrl-Shift-R'' (''Cmd-Shift-R'' on Apple Mac);'''IE:''' ''Ctrl''  بداری وهدی که کلیک ''Refresh' یا 'Ctrl-F5''; '''Konqueror:''':  راحت کلیک کن دکمه ''Reload'' یا بدار ''F5''; '''Opera''' کاربر بایدن ته ''Tools→Preferences'' ذخیره پاک کنت.",
-       "usercssyoucanpreview": "'''نکته:''' چه دکمه 'Show preview' په آزمایش کتن  CSS پیش چه ذخیره کتن استفاده کن",
-       "userjsyoucanpreview": "'''نکته:''' چه دکمه 'Show preview' په آزمایش کتن  JS پیش چه ذخیره کتن استفاده کن",
+       "userpage-userdoesnotexist-view": "ائ یوزر اکانت «$1» سبت نبیتگ انت.",
+       "blocked-notice-logextract": "ائ کاربر انیگء بلاک بیتگ انت.\nآهرین سیاهگئ که گون بلاکء همگرنچ انت جهلیگء آتکگ انت:",
+       "clearyourcache": "<strong>بزان:</strong> رند چه ذخیرگ کتنء ممکن انت پر ٹگلانی گندگء وتی بروزرئ هاپزگء پهک کتن لوٹ به بیت.\n*<strong>پایرپاکس / ساپاری:</strong> کلیت <em>Shift</em> رء جهل بدار ات ءُ رندء ائ بٹنء <em>Reload</em> کلیک بکن ات، یانکه ائ کلیتان <em>Ctrl-F5</em> یانکه <em>Ctrl-R</em> رء گون همدگرء جهل بدار ات (مان اپل ءُ مکینتاشء سیستمان ائ کلیتان <em>⌘-R</em>)\n*<strong>گوگل کروم:</strong> ائ کلیتان <em>Ctrl+Shift+R</em> رء گون هم جهل بدار ات (مان اپل ءُ مکینتاشء سیستمان ائ کلیتان <em>⌘-Shift-R</em>)\n*<strong>اینترنت اکسپلورر:</strong> کلیت <em>Ctrl</em> رء جهل بدار ات ءُ رندء ائ بٹنء <em>Refresh</em> کلیک بکن ات، یان ائ کلیتان <em>Ctrl-F5</em> رء گون همدگرء جهل بدار ات.\n*<strong>اپرا:</strong> وتی بروزرء چیرداتگین هاپزگ رء چه ائ منو  <em>Tools &rarr; Preferences</em> پهک بکن ات.",
+       "usercssyoucanpreview": "'''بزان:''' پیسر چه سی اس اسء ذخیرگ کتنء، گون ائ بٹن '''{{int:showpreview}}''' بچکاس ات.",
+       "userjsyoucanpreview": "'''بزان:''' پیسر چه جاوا اسکریپتء ذخیرگ کتنء، گون ائ بٹن '''{{int:showpreview}}''' بچکاس ات.",
        "usercsspreview": "''''بزان که شما فقط وتی CSS کاربری بازبینی کنین. هنگنت آیی ذخیره نه بوتت!''''",
        "userjspreview": "''''په یاد دار که شما فقط وتی کاربری  JavaScript بازبینی/آزمایش کنگیت، هنگت ذخیره نه بوتت!''''",
+       "sitecsspreview": "<strong> شمارء هیالداری ببیت که انیگء تهنا پیشچارگ چه ائ سی اس اسء رء گند ات.\nآئی انگت ذخیرگ نبیتگ انت </strong>",
+       "sitejspreview": "<strong> شمارء هیالداری ببیت که انیگء تهنا پیشچارگ چه ائ جاوا اسکریپٹء رء گند ات.\nآئی انگت ذخیرگ نبیتگ انت </strong>",
        "userinvalidcssjstitle": "'''هوژاری:''هچ جلدی نیست\"$1\".\nبزان که صفحات .css و .js چه عناوین گون هوردین حرف استفاده کننت، مثلا {{ns:user}}:Foo/vector.css بدل به په {{ns:user}}:Foo/Vector.css.",
        "updated": "(په روچ بیتگین)",
        "note": "'''یادداشت:'''",
-       "previewnote": "'''شی فقط یک بازبینی انت;\nتغییرات هنگت ذخیره نهنت. '''",
+       "previewnote": "<strong> بزان که ائ تهنا یک پیشچارگء انت</strong>\nشمئی ٹگلان انگتء ذخیرگ نبیتگ انت!",
+       "continue-editing": "شتن پر ادیت کنوکین جاگاه",
        "previewconflict": "ای بازبین متنء پیش داریت ته منطفه بالدی اصلاحی هنچوش که پیش دارگ بیت اگه شما انتخاب کنیت ذخیره",
        "session_fail_preview": "'''شرمنده! ما نه تونست شمی اصلاحء په خاطر گار کتن دیتا دیوان پردازش کنین.\nطلف دگه سعی کنیت. اگر هنگت کار نکنت یک بری [[Special:UserLogout|دربیت]] و پیدا وارد بیت.'''",
        "session_fail_preview_html": "'''شرمنده! ما نه تونست شمی اصلاحء په خاطر گار کتن دیتا دیوان پردازش کنین.'''\n\n''په چی که {{SITENAME}} HTML هام فعالنت، بازبین په خاطر حملات JavaScript پناهنت.''\n\n''' اگر شی یک قانونی تلاش اصلاحنت، دگه کوشش کنیت. اگر هنگت کار نکنت یک بری [[Special:UserLogout|دربیت]] و دگه وارد بیت.'''",
        "token_suffix_mismatch": "''' شمی اصلاح رد بوت په چی که شمی کلاینت نویسگ کاراکترانی په هم جتت.\nاصلاح رد بوت داں چه هراب بیگ متن صفحه جلوگیری بیت.\nشی لهتی وهد پیش کت که شما چه یک هرابین سرویس پروکسی وبی استفاده کنیت.'''",
+       "edit_form_incomplete": "<strong>لهتی چه ادیت فرمء بهران پر سرورء نرستگ انت؛ پکا بزان ات که شمئی ادیتان پکا انت و رندء چدوبارگ جهد کن ات</strong>",
        "editing": "اصلاح $1",
+       "creating": "اڈ کتن $1",
        "editingsection": "اصلاح $1(بخش)",
        "editingcomment": "اصلاح $1 (نوکین بخش)",
        "editconflict": "جنگ ورگ اصلاح: $1",
        "yourdiff": "تفاوتان",
        "copyrightwarning": "لطفا توجه بیت که کل نوشته یات ته {{SITENAME}}  تحت $2 نشر بنت.(بچار په جزیات$1).\nاگه شما لوٹیت شمی نوشتانک اصلاح و دگه چهاپ مبنت، اچه آیانا ادان مهلیت.\nشما ما را قول دهیت که وتی چیزا بنویسیت یا چه یک دامین عمومی کپی کتگیت.\n''' نوشتانکی که کپی رایت دارند بی اجازه ادا هور مکنیت'''",
        "copyrightwarning2": "لطفا توجه کنیت که کل مشارکاتن ته {{SITENAME}} شاید اصلاح, عوض و یا توسط دگه شرکت کننده آن حذف بنت.\nاگر شما نه لوٹیت شمی نوشتاک گون بی رحمی اصلاح مه بنت، اچه شما آیء ادان دیم مه دهیت.<br />\nشما هنچوش ما را قول دهیت که شما شی وت نوشتت یا ایء چه یک دامین عمومی یا هنچوشین آزاتین منبع کپی کتیت.(بچار $1 په جزییات).\n''' نوشتاکی که حق کپی دارنت بی اجازت دیم مه دهیت!'''",
-       "longpageerror": "'''حطا: Ù\85تÙ\86Û\8c Ú©Ù\87 Ø´Ù\85ا Ø¯Û\8cÙ\85 Ø¯Ø§ØªØª $1 Ú©Û\8cÙ\84Ù\88 Ø¨Ø§Û\8cتتØ\8c Ú©Ù\87 Ú\86Ù\87 Ú¯Û\8cشترÛ\8cÙ\86 Ø­Ø¯ $2 Ú©Û\8cÙ\84Ù\88باÛ\8cت Ù\85زÙ\86\nØ¢Û\8c Ù\86Ù\87 ØªÙ\88Ù\86Û\8cت Ø°Ø®Û\8cرÙ\87 Ø¨Ù\88ت.'''",
-       "readonlywarning": "'''هوژاری: دیتابیس به تعمیرات کبلنت، اچه شما نه تونیت وتی اصلاحات هنو ذخیره کنیت.\nشما شاید بلوٹیت متنء تع یم فایل متنی کپی و پیست کنیت و آیء ذخیره کنیت.'''\nمدیری که آیء کبل کتت ای توضیحی داتت: $1",
-       "protectedpagewarning": "'''هوژاری: ای صفحه په کبلنت چی که فقط کابران گون اجازت مدیر سیستم توننت آیء اصلاح کننت.'''",
-       "semiprotectedpagewarning": "''''توجه:'''' ای صفحه کبلنت چوش که فقط ثبت نامی کابران توننت آیء اصلاح کننت.",
+       "longpageerror": "'''ارÙ\88ر: Ø§Ø¦ Ø³Û\8cاÙ\87گء Ú©Ù\87 Ø±Ø§Ù\87Û\8cÚ¯ Ú©ØªÚ¯ Ø§Øª {{PULAR:$1|Û\8cÚ© Ú©Û\8cÙ\84Ù\88باÛ\8cت|$1 Ú©Û\8cÙ\84Ù\88باÛ\8cت}} Ø§Ù\86دازگ Ø¯Ø§Ø±Û\8cت. Ø§Ø¦ Ø§Ù\86دازگ Ú\86Ù\87 Ù\85اکسÛ\8cÙ\85Ù\85Ø¡ {{PLURAL:$2|Û\8cÚ© Ú©Û\8cÙ\84Ù\88باÛ\8cت|$2 Ú©Û\8cÙ\84Ù\88باÛ\8cت}} Ú¯Û\8cشتر Ø§Ù\86ت.'''\nÙ\86بÛ\8cت Ú©Ù\87 Ø¢Ø¦Ø±Ø§ Ø°Ø®Û\8cرگ Ø¨Ú©Ù\86 Ø§Øª.",
+       "readonlywarning": "'''هژاری: دیتابیس پر جوڑ کتنء واسته کبل بیتگ انت، پمیشکا انیگء نبیت که وتی ادیتانء ذخیرگ بکن ات.'''\nاگان لوٹ ات وتی سیاهگء مان یک تکست فایلء کپی و پر آیوکء ذخیرگ بکن ات.\n\nهما ماسٹر که آئرا کبل کتگ ائ توضیحء درشان کتگ انت: $1",
+       "protectedpagewarning": "'''هوژاری: ائ تاک پراتکت بیتگ انت، گڑا تهنا کاربرانء گون ماسٹری حالتء توان انت که آئرا ادیت بکن انت'''\nآهرین سیاهگ که گون ائ بابتء همگرنچ انت جهلیگء آتکگ انت:",
+       "semiprotectedpagewarning": "'''بزان:''' ائ پیج کبل بیتگ تانکه تهنا رجستر کتگین کاربران بتوان انت آئرا ادیت بکن انت.\nآهرین سیاهگ که گون ائ بابتء همگرنچ انت جهلیگء آتکگ:",
        "cascadeprotectedwarning": "''هوژاری''ای صفحه کبلنت چوش که فقط کابران گون دسترسی مدیر سیستم توننت آییء اصلاح کننت،په چی که آیی ته چهلین حمایت آبشاری {{PLURAL:$1|صفحات|صفحه}}:",
-       "titleprotectedwarning": "'''هوژاری: ای صفحه کبلنت چوش که فقط لهتی کاربر گون [[Special:ListGroupRights|خاصین حق]] تواننت آیء شر کننت.'''",
+       "titleprotectedwarning": "'''هوژاری: ائ پیجء پر ائ پیمء کبل بیتگ که پر آئیء اڈ کتنء  [[Special:ListGroupRights|خاصین اجازت]] ضرور انت.'''\nآهریگین سیاهگ که گون ائ بابتء همگرنچ انت جهلیگء آتکگ انت:",
        "templatesused": "{{PLURAL:$1|تمپلت|تمپلت}} که ته ای صفحه کارمز بیتت:",
        "templatesusedpreview": "{{PLURAL:$1|تمپلت|تمپلت}} ته ای بازبینی کارمرز بوتت",
-       "templatesusedsection": "تمپلتانی که ته ای بخش به کار رونت",
+       "templatesusedsection": "{{PLURAL:$1|تمپلٹ|تمپلٹ}} کارمرز بوتگین مان ائ بهر:",
        "template-protected": "(محافظتین)",
        "template-semiprotected": "(نیم محافظتی)",
        "hiddencategories": "ای صفحه عضوی چه {{PLURAL:$1|1 hidden category|$1 پناهین دسته جات}}:",
        "edittools": "<!-- <strong>په کپی و پست کتن چه CTRL+V , CTRL+C استفاده کنیت.</strong> -->",
        "nocreatetext": "{{SITENAME}} شما را چه شرکتن نوکین صفحه منه کته.\nشما تونیت برگردیت و یک پیشگین صفحه ای اصلاح کنیت، یا [[Special:UserLogin|وارد بیت یان یک حسابی شرکنیت]].",
        "nocreate-loggedin": "شما را اجازت په شرکتن نوکین صفحات نیست.",
-       "permissionserrors": "حطای اجازت",
+       "sectioneditnotsupported-title": "ائ بهرانئ ادیت کتن ساپورٹ نه بیت",
+       "sectioneditnotsupported-text": "ائ بهرانئ ادیت کتن مان ائ پیجء ساپورٹ نه بیت",
+       "permissionserrors": "ارور جاگاه دزرسی",
        "permissionserrorstext": "شما را اجازت په انجام آی نیست، په جهلیگین دلیل {{PLURAL:$1|دلیل|دلایل}}:",
        "permissionserrorstext-withaction": "شما را اجازت په $2, په خاطر جهلیگین {{PLURAL:$1|دلیل|دلایل}}:",
        "recreate-moveddeleted-warn": "هوژاری: شما یک صفحه ای دگه شرکنگیت که پیشتر حذف بوتت.'''\n\nشما بایدن توجه کنیت که ادامه اصلاح ای صفحه درستنت.\nآمار حذف و جاه په جاهی ای صفحه په شمی حاطرء ادان هستن:",
        "edit-gone-missing": "نه تونیت صفحهء په روچی کنت.\nچوش که جاه کیت آیی حذف بوتگت.",
        "edit-conflict": "جنگ اصلاحی",
        "edit-no-change": "شمی اصلاح نادید گرگ بوت، په چی که هچ تغییری په متن دهگ نه بوت.",
+       "postedit-confirmation-created": "تاک اڈ بوت.",
+       "postedit-confirmation-restored": "تاک واتر بوت.",
+       "postedit-confirmation-saved": "شمئی ادیت ذخیرگ بوت.",
        "edit-already-exists": "نه تونیت یک نوکین صفحه ای شر کنت.\nهنو شی هستن.",
+       "defaultmessagetext": "اصلیگین پیگامء سیاهگ",
+       "content-failed-to-parse": "تجزیگء $2 توکداریگ پر $1 مدل: $3 پکا نبوت",
+       "invalid-content-data": "توکداریگء دیتا مهتبر نه انت",
+       "content-not-allowed-here": "توکداریگ «$1» مان ائ پیج[[$2]] اجازت نه انت",
+       "editwarning-warning": "گون در شتن چه ائ پیج ممکن انت شمئی پهکین شانس که تان انیگء کٹ کتگ ات بیران بیت.\nاگان شما لاگین کتگ ات، بیت که ائ هژاریء مان ای بهر «{{int:prefs-editing}}» وتی پریفرنسء نافعال بکن ات..",
+       "editpage-notsupportedcontentformat-title": "توکداریگء فرمت ساپورٹ نه بیت",
+       "editpage-notsupportedcontentformat-text": "ائ توکداریگء فرمت $1 مان ائ توکداریگء تهر $2 ساپورٹ نبیتگ انت.",
+       "content-model-wikitext": "ویکیسیاهگ",
+       "content-model-text": "سادگین سیاهگ",
+       "content-model-javascript": "جاوا اسکریپٹ",
+       "content-model-css": "سی اس اس",
        "expensive-parserfunction-warning": "هوژاری: ای صفحه شامل بازگین توار عملگر تجریه کنوک سنگیننت.\nآیی بایدن کمتر چه  $2{{PLURAL:$2|توار|توار}}, داشته بیت ادان هنو  $1 هست.",
        "expensive-parserfunction-category": " صفحات گونبازگین توار عملگر تجریه کنوک",
        "post-expand-template-inclusion-warning": "هوژاری: اندازه شامل تمپلت باز مزننت.\nلهتی تمپلتان هور نه بینت.",
        "post-expand-template-argument-category": "صفحات شامل حذفی آرگومان آن تمپلت انت",
        "parser-template-loop-warning": "تمپلت حقه ای درگبزگ بوت: [[$1]]",
        "parser-template-recursion-depth-warning": "محدودیت عمق تررگ رد بوت ($1)",
+       "language-converter-depth-warning": "چه محدودیت عمق زبانانی کارمرز گؤست ات ($1)",
+       "node-count-exceeded-category": "پیج انی که گیش چه مکسیمم تعداد گره بیتگ انت",
+       "node-count-exceeded-category-desc": "کتگوری پر پیج انی که مان آهان ساب کنوگ برزتر شتگ انت.",
+       "node-count-exceeded-warning": "پیج چه مکسیمم تعداد گره گیش شُت",
+       "expansion-depth-exceeded-category": "پیج انی که چه مکسیمم تچک کتنء امک (عمق) گیش شتگ انت",
+       "expansion-depth-exceeded-category-desc": "کتگری پر پیج انی که مان آهان تچک کتنء امک(عمق) گیش شتگ انت.",
+       "expansion-depth-exceeded-warning": "پیج چه مکسیمم تچک کتنء امک(عمق) گیش شُت",
+       "parser-unstrip-loop-warning": "حلقهء unstrip ودی بوت",
+       "parser-unstrip-recursion-limit": "چه مکسیمم ارجاع مان دستور unstrip گیش شُت ات($1)",
+       "converter-manual-rule-error": "ارور مان قوانین مبدل دستی زبان",
        "undo-success": "اصلاح برگشت نه بیت. لطفا مقایسه جهلگینء کنترل کنیت په تایید شی که شی هما انت که شما لوٹیت، و بعدا تغغیرات جهلی په تمام کتن بر نگردگ اصلاح ذخیره کنیت.",
        "undo-failure": "اصلاح بر نرگردیت په خاطر تضاد میان اصلاحاتی",
        "undo-norev": "اصلاح نه تونیت برگردیت په چی که آی وجود نهنت یا حذف بوتت.",
+       "undo-nochange": "چوش که پیداگ انت ویرایش مان انیگء باطل بوتگ انت.",
        "undo-summary": "بازبینی برگردین $1 گون [[Special:مشارکتان/$2|$2]] ([[User talk:$2|گپ]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]])",
+       "undo-summary-username-hidden": "بی اثر کتن نسخهٔ $1 گون یک نامالومین کاربرء واسته",
        "cantcreateaccounttitle": "نه نونیت حساب شرکنت",
        "cantcreateaccount-text": "شرکتن حساب چی ای آدرس آی پی ('''$1''') محدود بوتت توسط [[User:$3|$3]].\n\nدلیلی داتگین توسط $3  شی انت ''$2''",
+       "cantcreateaccount-range-text": "اکانتء اڈ کتن چه آی پی ادرسء مان ائ هوار '''$1'''، که شمئی آی پی ('''$4''') مان آئی توکاانت، گون [[User:$3|$3]] متوقف بیتگ انت.\nدرشان کتگین دلیل گون $3، $2 انت.",
        "viewpagelogs": "آمار ای صفحه بچار",
        "nohistory": "په ای صفحه تاریح اصلاح نیست.",
        "currentrev": "هنوکین بازبینی",
        "currentrev-asof": "هنوکین بازبینی چه $1",
        "revisionasof": "بازبینی په عنوان $1",
-       "revision-info": "بازبÛ\8cÙ\86Û\8c Ù¾Ù\87 Ø¯Ø§Ø¨ $1 ØªÙ\88سط $2",
+       "revision-info": "تارÛ\8cخء Ù\86سخÙ\87 $1 Ú¯Ù\88Ù\86 {{GENDER:$6|$2}}$7",
        "previousrevision": "←پیش ترین نسخه",
        "nextrevision": "نوکین بازبینی→",
        "currentrevisionlink": "هنوکین بازبینی",
        "page_last": "اهرین",
        "histlegend": "بخش تفاوت: په مقایسه کتن نسخه یان گزینه انتخاب کنیت اینتر یا دکمه بجن.<br />\nLegend: (cur) = تفاوتان گون هنوکین نسخه,\n(last) = تفاوت گون بعدی نسخه, M = هوردین  اصلاح.",
        "history-fieldset-title": "گردگ تاریح",
-       "histfirst": "اولین",
-       "histlast": "اهرین",
+       "history-show-deleted": "تهنا هزپ بیتگ انت",
+       "histfirst": "پیسریگ ترین",
+       "histlast": "نوکترین",
        "historysize": "({{PLURAL:$1|1 بایت|$1 بایت}})",
        "historyempty": "(هالیک)",
        "history-feed-title": "تاریح بازبینی",
        "history-feed-description": "تاریح بازبینی په ای صفحه ته ویکی",
        "history-feed-item-nocomment": "$1 ته $2",
        "history-feed-empty": "لوٹتگین صفحه موجود نهنت.\nشاید آی چه ویکی حذف بوتت یا نامی بدل بوتت.\nآزمایش کن[[Special:Search|گردگ ته ویکی]] په مربطین نوکین صفحات.",
-       "rev-deleted-comment": "(Ù\86ظر Ø²Ù\88رگ Ø¨Û\8cتت)",
+       "rev-deleted-comment": "(Ù\88Û\8cراÛ\8cشء Ø®Ù\84اصگ Ù\87زپ Ø¨Ù\88ت)",
        "rev-deleted-user": "(نام کاربری زورگ بیتت)",
        "rev-deleted-event": "(کار آمار زورگ بیتت)",
-       "rev-deleted-text-permission": "ای بازبینی صفحه چه آرشیو عمومی '''زورگ''' بیتت.\nشاید جزییاتی ته [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} حذف آمار]. بیت",
-       "rev-deleted-text-unhide": "ای اصلاح چه ای صفحه '''زورگ بوتت'''.\nممکن انت اطلاعات مرتبط گون آیی ءَ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سیاهگ حذف] بگندیت.\nشما په عنوان یک مدیر هنوچوش توایت اگر بلوٹیت [$1 ای نسخه را بچاریت].",
+       "rev-deleted-user-contribs": "[یوزرنام یانکه یانکه آی پی ادرس هزپ بیتگ انت  - ویرایش چیرداتگین مان هواربیتگان]",
+       "rev-deleted-text-permission": "ائ ویرایش چه ائ پیج '''هزپ بیتگ انت'''.\nبلکین اطلاعات گون آئی همگرنچء مان [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} هزپانی سیاهگ] موجوت بیت انت.",
+       "rev-deleted-text-unhide": "ائ ویرایش چه ائ پیج '''هزپ بیتگ انت'''.\nبلکین اطلاعات گون آئی همگرنچء مان [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} هزپانی سیاهگ] موجوت بیت انت.\nشما هنچوش اگان بلوٹ ات توان ات [$1 ائ نسخگء بچار ات].",
        "rev-deleted-text-view": "ای بازبینی صفحه چه آرشیو عمومی '''زورگ''' بیتت.\nپه عنوان مدیر ته {{SITENAME}}  شما تونیت آیء بگنیت;\nشاید جزییاتی ته ببیت [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} آمار حذف].",
        "rev-deleted-no-diff": "شما نه تونیت تفاوت ای نسخه بچارت په چی که یکی چه نسخ چه عمومی آرشیو '''زورگ''' بوتت.\nممکن انت [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سیاهگ حذف]  جزئیاتی ببیت.",
        "rev-deleted-unhide-diff": "یکی چه ای دو نسخهٔ  '''حذف بوتت'''.\nممکن انت اطلاعات این شی باره [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سیاهگ حذف] موجود ببیت.\nشما په عنوان یک مدیر هنگت توانیت اگر بلوٹیت [$1 ای تفاوت را بچاریت].",
        "editundo": "خنثی کتن",
        "searchresults": "نتایج گردگ",
        "searchresults-title": "نتایج گردگ په \"$1\"",
-       "toomanymatches": "بازگین هم دپ درگیزگ بوت، لطفا یک متفاوتین درخواست آزمایش کنیت",
        "titlematches": "عنوان صفحه هم دپ نت",
        "textmatches": "متن صفحه هم دپ بنت",
        "notextmatches": "هچ متن صفحه هم دپ نهنت",
        "searchmenu-exists": "'''صفحه گون نام \"[[$1]]\" ته ای ویکی نیستن'''",
        "searchmenu-new": "'''شر کن صفحه ای \"[[:$1]]\" ته ای ویکی!'''",
        "searchprofile-articles": "صفحات محتوا",
-       "searchprofile-project": "کمک و صفحات پروژه ای",
        "searchprofile-images": "ملتیمدیا",
        "searchprofile-everything": "هر چیز",
        "searchprofile-advanced": "پیشرفتگین",
        "searchprofile-articles-tooltip": "گردگ ته $1",
-       "searchprofile-project-tooltip": "گردگ ته $1",
        "searchprofile-images-tooltip": "گردگ په فایلان ته",
        "searchprofile-everything-tooltip": "گردگ په کل محتوا (هور گون صفحات گپ)",
        "searchprofile-advanced-tooltip": "گردگ ته نام فضایان دل واه",
        "search-interwiki-default": "$1 نتایج:",
        "search-interwiki-more": "(گیشتر)",
        "search-relatedarticle": "مربوطین",
-       "searcheverything-enable": "گردگ ته کل فضانامان",
        "searchrelated": "مربوط",
        "searchall": "کل",
        "showingresults": "جهل پیش دارگنت تا  {{PLURAL:$1|'''1'''نتیجه|'''$1''' نتایج}} شروع بنت گون #'''$2'''.",
        "allowemail": "فعال کن ایمیل چه دگه کابران",
        "prefs-searchoptions": "گردگ انتخابان",
        "prefs-namespaces": "نام فصا",
-       "defaultns": "گردگ ته ای نام فضا آن په طور پیش فرض:",
        "default": "پیش فرض",
        "prefs-files": "فایلان",
        "prefs-custom-css": "رسمی سی‌اس‌اس",
        "prefs-emailconfirm-label": "تایید کتن پست الکترونیک:",
        "youremail": "ایمیل:",
        "username": "نام کاربری:",
-       "uid": "کاربر شناسگ:",
        "prefs-memberingroups": "عضو گروه {{PLURAL:$1|group|groups}}:",
        "prefs-registration": "ثبت نام وهد:",
        "yourrealname": "راستین  نام:",
        "logempty": "هچ آیتم هم دپ ته آمار",
        "log-title-wildcard": "بگرد عناوین که گون ای متن شروع بنت",
        "allpages": "کل صفحات",
-       "alphaindexline": "$1 په $2",
        "nextpage": "صفحه ی بعدی ($1)",
        "prevpage": " ($1)پیشگین صفحه",
        "allpagesfrom": "پیش در صفحات شروع بنت ته:",
        "tooltip-rollback": "\"ترین\" اصلا(ان) ته ای صفحه چه اهزس مشارکت کنوک ته گون یک کلیک.",
        "tooltip-undo": "\"ترینگ\" ای  اصلاح و پچ کن فرم اصلاحء ته حالت بازبینی. اجازت دن اضافه کتن یک دلیلی ته خلاصه",
        "common.css": "/* CSS که اداننت په کل پوستان په کار رونت. */",
-       "monobook.css": "/* CSS که اداننت کابران پوست مونوبوک تاثیر کننت */",
        "common.js": "/* هر جاوا اسکریپتی ادان په کل کابران ته هر صفحه ای بار بیت. */",
-       "monobook.js": "/* جاوا اسکریپت ادان فقط په کابرانی که چه پوست منوبوک استفاده کننت بار بیت. */",
        "anonymous": "ناشناسین {{PLURAL:$1|کاربر|کاربران}} چه {{SITENAME}}",
        "siteuser": "{{SITENAME}} کاربر $1",
        "lastmodifiedatby": "ای صفحه اهری رندی که تغییر دهگ بیته $2, $1گون $3.",
        "spam_reverting": "عوض کتن په آهری نسحه که شامل لینکان می بیت په $1",
        "spam_blanking": "کل بازبینی آن شامل لینکان په $1, بوتت  هالیکی",
        "simpleantispam-label": "کنترل ضد اسپم.\nای شیء پر ''مکن''",
-       "skinname-cologneblue": "نیلی کولاجن",
-       "skinname-monobook": "منوبوک",
-       "skinname-modern": "مدرن",
        "markaspatrolleddiff": "نشان کن په داب نظارت بوتگین",
        "markaspatrolledtext": "ای صفحه نشان کن په داب نظارت بوتگین",
        "markedaspatrolled": "نشاننت په داب نظارتی",
index 7b3e12e..998bdd9 100644 (file)
        "qbmyoptions": "Sakong mga pahina",
        "faq": "PPK (Pirmihang Pighahapot na mga kahaputan)",
        "faqpage": "Project:PPK (Pirmihang Pighahapot na mga Kahaputan)",
-       "vector-action-addsection": "Idagdag an topic",
-       "vector-action-delete": "puráon",
-       "vector-action-move": "Ibalyó",
-       "vector-action-protect": "Protektaran",
-       "vector-action-undelete": "Bawion sa pagkapara",
-       "vector-action-unprotect": "Ribayan an proteksyon",
-       "vector-view-create": "Magmukna",
-       "vector-view-edit": "Liwatón",
-       "vector-view-history": "Tanawon sa historiya",
-       "vector-view-view": "Basáha",
-       "vector-view-viewsource": "Hilingón an ginikánan",
        "actions": "Mga aksyon",
        "namespaces": "Mga espasyong ngaran",
        "variants": "Mga pinalaen",
        "difference-missing-revision": "{{PLURAL:$2|sarong rebisyon|$2 mga rebisyon}} kaining diperensiya ($1) {{PLURAL:$2|na iyo an|kaidto na iyo an}} dae nanagboan.\n\nIni pirmihan na pinagkakausa sa paagi nin pagsusunod nin luwas sa petsang diff na kasugponan pasiring sa sarong pahina na pinagpura na.\nAn mga detalye mapuwedeng matatagboan sa [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} talaan kan pinagpuraan].",
        "searchresults": "Resulta kan paghahánap",
        "searchresults-title": "Resulta kan paghahanap para sa \"$1\"",
-       "toomanymatches": "Kadakol-dakol na angay an ipigbalik, probaran an ibang kahaputan",
        "titlematches": "Angay an título kan artíkulo",
        "textmatches": "Angay an teksto nin páhina",
        "notextmatches": "Mayong ángay na teksto nin páhina",
        "search-interwiki-default": "$1 na mga resulta:",
        "search-interwiki-more": "(dakol pa)",
        "search-relatedarticle": "Kauyon",
-       "searcheverything-enable": "Maghanap sa gabos na mga espasyong-ngaran",
        "searchrelated": "kauyon",
        "searchall": "gabós",
        "showingresults": "Pigpapahiling sa babâ sagkod sa {{PLURAL:$1|'''1''' resulta|'''$1''' mga resulta}} poon sa #'''$2'''.",
        "allowemail": "Togotan an mga ''e''-surat halî sa ibang mga parágamit",
        "prefs-searchoptions": "Hanapa",
        "prefs-namespaces": "Pangarang mga espasyo",
-       "defaultns": "Kun laen maghanap sa laog kaining pangarang mga espasyo:",
        "default": "pwestong normal",
        "prefs-files": "Mga dokumento",
        "prefs-custom-css": "Kustombreng CSS",
        "recentchanges-label-unpatrolled": "Ining pagliwat dae pa tabi pinagpatrolyahan",
        "recentchanges-label-plusminus": "An kadakulaan nin pahina pinagliwat sa paagi kaining numero nin mga bayta",
        "recentchanges-legend-heading": "'''Kabalaynan:'''",
-       "recentchanges-legend-newpage": "(hilngon man [[Special:NewPages|listahan kan mga baguhong pahina]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (hilngon man [[Special:NewPages|listahan kan mga baguhong pahina]])",
        "recentchanges-legend-plusminus": "(''±saro-duwa-tolo'')",
        "rcnotefrom": "Sa ibaba iyo an mga kaliwatan poon kan '''$2''' (sagkod sa '''$1''' na ipinapahiling).",
        "rclistfrom": "Ipahiling an baguhon na mga kaliwatan magpoon kan $3 $2",
        "tooltip-summary": "Magkaag nin sarong halipot na sumaryo",
        "interlanguage-link-title": "$1 - $2",
        "common.css": "/** an CSS na pigbugtak digdi maiaaplikar sa gabos na mga skin */",
-       "monobook.css": "/* an CSS na pigbugtak digdi makakaapektar sa mga parágamit kan Monobook skin */",
        "common.js": "/* Arin man na JavaScript digdi maikakarga para sa gabos na mga parágamit sa kada karga kan páhina. */",
-       "monobook.js": "/* Deprecado; gamiton an [[MediaWiki:common.js]] */",
        "anonymous": "Bako-bistadong {{PLURAL:$1|paragamit|mga paragamit}} kan {{SITENAME}}",
        "siteuser": "Paragamit kan {{SITENAME}} na si $1",
        "anonuser": "{{SITENAME}} bako-bistadong paragamit $1",
index 811d516..51f7900 100644 (file)
@@ -13,7 +13,8 @@
                        "Wizardist",
                        "Zedlik",
                        "Тест",
-                       "아라"
+                       "아라",
+                       "Liashko"
                ]
        },
        "tog-underline": "Падкрэсьліваць спасылкі:",
        "category_header": "Старонкі ў катэгорыі «$1»",
        "subcategories": "Падкатэгорыі",
        "category-media-header": "Файлы ў катэгорыі «$1»",
-       "category-empty": "''Гэтая катэгорыя ня ўтрымлівае ні старонак, ні файлаў.''",
+       "category-empty": "<em>Гэтая катэгорыя ня ўтрымлівае ні старонак, ні файлаў.</em>",
        "hidden-categories": "{{PLURAL:$1|1=Схаваная катэгорыя|Схаваныя катэгорыі}}",
        "hidden-category-category": "Схаваныя катэгорыі",
        "category-subcat-count": "{{PLURAL:$2|1=Гэтая катэгорыя зьмяшчае наступную падкатэгорыю.|Гэтая катэгорыя зьмяшчае {{PLURAL:$1|наступную $1 падкатэгорыю|наступныя $1 падкатэгорыі|наступныя $1 падкатэгорыяў}} з $2 агулам.}}",
        "qbmyoptions": "Мае старонкі",
        "faq": "Частыя пытаньні",
        "faqpage": "Project:Частыя пытаньні",
-       "vector-action-addsection": "Дадаць тэму",
-       "vector-action-delete": "Выдаліць",
-       "vector-action-move": "Перанесьці",
-       "vector-action-protect": "Абараніць",
-       "vector-action-undelete": "Аднавіць",
-       "vector-action-unprotect": "Зьмяніць абарону",
-       "vector-view-create": "Стварыць",
-       "vector-view-edit": "Рэдагаваць",
-       "vector-view-history": "Паказаць гісторыю",
-       "vector-view-view": "Чытаць",
-       "vector-view-viewsource": "Паказаць крыніцу",
        "actions": "Дзеяньні",
        "namespaces": "Прасторы назваў",
        "variants": "Варыянты",
        "currentrev": "Цяперашняя вэрсія",
        "currentrev-asof": "Цяперашняя вэрсія на $1",
        "revisionasof": "Вэрсія ад $1",
-       "revision-info": "Вэрсія ад $1, аўтар $2",
+       "revision-info": "Вэрсія ад $1, {{GENDER:$6|аўтар $2|аўтарка $2}}$7",
        "previousrevision": "← Папярэдняя вэрсія",
        "nextrevision": "Наступная вэрсія →",
        "currentrevisionlink": "Цяперашняя вэрсія",
        "mergehistory-empty": "Няма гісторыі рэдагаваньняў, якую магчыма аб'яднаць.",
        "mergehistory-success": "$3 {{PLURAL:$3|вэрсія|вэрсіі|вэрсіяў}} з [[:$1]] пасьпяхова аб’яднаныя ў [[:$2]].",
        "mergehistory-fail": "Не атрымалася аб'яднаць гісторыі старонак. Калі ласка, праверце парамэтры старонкі і часу.",
+       "mergehistory-fail-toobig": "Немагчыма аб’яднаць гісторыю, бо будзе перавышаны ліміт у $1 {{PLURAL:$1|1=вэрсію|вэрсіі|вэрсіяў}}, якія будуць перанесеныя.",
        "mergehistory-no-source": "Не існуе крынічнай старонкі $1.",
        "mergehistory-no-destination": "Не існуе мэтавай старонкі $1.",
        "mergehistory-invalid-source": "Крынічная старонка мусіць мець карэктную назву.",
        "difference-missing-revision": "{{PLURAL:$2|$2 вэрсія|$2 вэрсіі|$2 вэрсіяў}} з гэтымі адрозьненьнямі ($1) {{PLURAL:$2|не была|не былі}} знойдзеныя.\n\nЗвычайна гэта здараецца з-за пераходу па састарэлай спасылцы на старонку, якая была выдаленая.\nПадрабязнасьці можна знайсьці ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].",
        "searchresults": "Вынікі пошуку",
        "searchresults-title": "Вынікі пошуку для «$1»",
-       "toomanymatches": "Знойдзена зашмат супадзеньняў з запытам, калі ласка, паспрабуйце зьмяніць запыт",
        "titlematches": "Супадзеньні ў назвах старонак",
        "textmatches": "Супадзеньні ў тэкстах старонак",
        "notextmatches": "Супадзеньні ў тэкстах старонак ня знойдзеныя",
        "search-interwiki-default": "Вынікі з $1:",
        "search-interwiki-more": "(яшчэ)",
        "search-relatedarticle": "Зьвязаны",
-       "searcheverything-enable": "Шукаць ва ўсіх прасторах назваў",
        "searchrelated": "зьвязаны",
        "searchall": "усе",
        "showingresults": "Ніжэй {{PLURAL:$1|паданы|паданыя|паданыя}} да '''$1''' {{PLURAL:$1|выніку|вынікаў|вынікаў}}, пачынаючы з #<b>$2</b>.",
        "powersearch-togglelabel": "Пазначыць:",
        "powersearch-toggleall": "Усе",
        "powersearch-togglenone": "Нічога",
+       "powersearch-remember": "Запомніць выбар для будучых пошукаў",
        "search-external": "Вонкавы пошук",
        "searchdisabled": "Функцыя пошуку ў {{GRAMMAR:месны|{{SITENAME}}}} адключаная.\nВы можаце пашукаць з дапамогай Google, але заўважце, што там інфармацыя пра старонкі {{GRAMMAR:родны|{{SITENAME}}}} можа быць састарэлай.",
        "search-error": "Узьнікла памылка пры пошуку: $1",
        "allowemail": "Дазволіць атрыманьне лістоў ад іншых удзельнікаў і ўдзельніц",
        "prefs-searchoptions": "Пошук",
        "prefs-namespaces": "Прасторы назваў",
-       "defaultns": "Інакш шукаць у наступных прасторах назваў:",
        "default": "па змоўчваньні",
        "prefs-files": "Файлы",
        "prefs-custom-css": "Індывідуальны CSS",
        "recentchanges-label-unpatrolled": "Гэтае рэдагаваньне яшчэ не было адпатруляванае",
        "recentchanges-label-plusminus": "Памер старонкі зьмяніўся на такую колькасьць байтаў",
        "recentchanges-legend-heading": "'''Легенда:'''",
-       "recentchanges-legend-newpage": "(глядзіце таксама [[Special:NewPages|сьпіс новых старонак]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (глядзіце таксама [[Special:NewPages|сьпіс новых старонак]])",
        "rcnotefrom": "Ніжэй знаходзяцца зьмены з <strong>$2</strong> (да <strong>$1</strong> на старонку).",
        "rclistfrom": "Паказаць зьмены з $2 $3",
        "rcshowhideminor": "$1 дробныя праўкі",
        "windows-nonascii-filename": "Гэтая вікі не падтрымлівае назвы файлаў з спэцыяльнымі сымбалямі.",
        "fileexists": "Файл з такой назвай ужо існуе. Калі ласка, праверце <strong>[[:$1]]</strong>, калі Вы ня ўпэўненыя, што жадаеце яго замяніць. [[$1|thumb]]",
        "filepageexists": "Старонка апісаньня для гэтага файла ўжо існуе як <strong>[[:$1]]</strong>, але файла з такой назвай няма.\nАпісаньне якое Вы дадалі ня зьявіцца на старонцы апісаньня.\nКаб яно там зьявілася, Вам трэба рэдагаваць яе самастойна.\n[[$1|thumb]]",
-       "fileexists-extension": "Файл Ð· Ð¿Ð°Ð´Ð¾Ð±Ð½Ð°Ð¹ Ð½Ð°Ð·Ð²Ð°Ð¹ Ñ\83жо Ñ\96Ñ\81нÑ\83е: [[$2|thumb]]\n* Ð\9dазва Ð·Ð°Ð³Ñ\80Ñ\83жанага Ñ\84айла: <strong>[[:$1]]</strong>\n* Ð\9dазва Ñ\96Ñ\81нÑ\83Ñ\8eÑ\87ага Ñ\84айла: <strong>[[:$2]]</strong>\nÐ\9aалÑ\96 Ð»Ð°Ñ\81ка, Ð²Ñ\8bбÑ\8fÑ\80Ñ\8bÑ\86е Ñ\96нÑ\88Ñ\83Ñ\8e Ð½Ð°Ð·Ð²Ñ\83.",
+       "fileexists-extension": "Файл Ð· Ð¿Ð°Ð´Ð¾Ð±Ð½Ð°Ð¹ Ð½Ð°Ð·Ð²Ð°Ð¹ Ñ\83жо Ñ\96Ñ\81нÑ\83е: [[$2|thumb]]\n* Ð\9dазва Ð·Ð°Ð³Ñ\80Ñ\83жанага Ñ\84айла: <strong>[[:$1]]</strong>\n* Ð\9dазва Ñ\96Ñ\81нÑ\83Ñ\8eÑ\87ага Ñ\84айла: <strong>[[:$2]]</strong>\nÐ\9cагÑ\87Ñ\8bма, Ð²Ñ\8b Ð¶Ð°Ð´Ð°ÐµÑ\86е Ð²Ñ\8bкаÑ\80Ñ\8bÑ\81Ñ\82аÑ\86Ñ\8c Ð°Ð´Ñ\80ознÑ\83Ñ\8e Ð½Ð°Ð·Ð²Ñ\83?",
        "fileexists-thumbnail-yes": "Верагодна файл зьяўляецца паменшанай копіяй ''(мініятурай)''. [[$1|thumb]]\nКалі ласка, праверце файл <strong>[[:$1]]</strong>.\nКалі правераны файл зьяўляецца той жа выявай, то загрузка мініятуры ня мае сэнсу.",
        "file-thumbnail-no": "Назва файла пачынаецца з <strong>$1</strong>.\nВерагодна гэта паменшаная копія выявы ''(мініятура)''.\nКалі Вы маеце гэтую выяву ў поўным памеры, загрузіце яе, альбо зьмяніце назву файла.",
        "fileexists-forbidden": "Файл з такой назвай ужо існуе і ня можа быць перапісаны.\nКалі ласка, вярніцеся назад і загрузіце гэты файл з новай назвай. [[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Выдаленьне і аднаўленьне файлаў часова забароненае па прычыне падтрымкі.",
        "filedelete-maintenance-title": "Немагчыма выдаліць файл",
        "mimesearch": "Пошук па MIME",
-       "mimesearch-summary": "Гэта старонка дазваляе адбор файлаў па іх MIME-тыпе.\nФармат уводу: тып_зьместу/падтып, напрыклад, <code>image/jpeg</code>.",
+       "mimesearch-summary": "Гэта старонка дазваляе адбор файлаў па іх MIME-тыпе.\nФармат уводу: тып_зьместу/падтып або тып_зьместу/*, напрыклад, <code>image/jpeg</code>.",
        "mimetype": "Тып MIME:",
        "download": "загрузіць",
        "unwatchedpages": "Старонкі, за якімі ніхто не назірае",
        "wantedtemplates": "Запатрабаваныя шаблёны",
        "mostlinked": "Старонкі, на якія найчасьцей спасылаюцца",
        "mostlinkedcategories": "Катэгорыі з найбольшай колькасьцю старонак",
-       "mostlinkedtemplates": "ШаблÑ\91нÑ\8b, Ñ\8fкÑ\96Ñ\8f Ð½Ð°Ð¹Ñ\87аÑ\81Ñ\8cÑ\86ей Ð²Ñ\8bкаÑ\80Ñ\8bÑ\81Ñ\82оÑ\9eваÑ\8eÑ\86Ñ\86а",
+       "mostlinkedtemplates": "СÑ\82аÑ\80онкÑ\96, Ñ\8fкÑ\96Ñ\8f Ð½Ð°Ð¹Ñ\87аÑ\81Ñ\8cÑ\86ей Ñ\83клÑ\8eÑ\87аÑ\8eÑ\86Ñ\86а Ñ\9e Ñ\96нÑ\88Ñ\8bÑ\8f Ñ\81Ñ\82аÑ\80онкÑ\96",
        "mostcategories": "Старонкі з найбольшай колькасьцю катэгорыяў",
        "mostimages": "Файлы, на якія найчасьцей спасылаюцца",
        "mostinterwikis": "Старонкі з найбольшай колькасьцю інтэрвікі",
        "pageinfo-category-pages": "Колькасьць старонак",
        "pageinfo-category-subcats": "Колькасьць падкатэгорыяў",
        "pageinfo-category-files": "Колькасьць файлаў",
-       "skinname-monobook": "Монакніга",
-       "skinname-vector": "Вэктар",
        "markaspatrolleddiff": "Пазначыць як «патруляваную»",
        "markaspatrolledtext": "Пазначыць гэтую старонку як «патруляваную»",
        "markedaspatrolled": "Пазначаная як «патруляваная»",
        "watchlistedit-clear-legend": "Ачысьціць сьпіс назіраньня",
        "watchlistedit-clear-explain": "Усе старонкі будуць выдаленыя з вашага сьпісу назіраньня",
        "watchlistedit-clear-titles": "Старонкі:",
+       "watchlistedit-clear-submit": "Ачысьціць сьпіс назіраньня (гэта незваротна!)",
+       "watchlistedit-clear-done": "Ваш сьпіс назіраньня быў ачышчаны.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|$1 запіс быў выдалены|$1 запісы былі выдаленыя|$1 запісаў былі выдаленыя}}:",
+       "watchlistedit-too-many": "Зашмат старонак, каб паказаць іх тут.",
+       "watchlisttools-clear": "Ачысьціць сьпіс назіраньня",
        "watchlisttools-view": "Паказаць зьмены ў старонках зь сьпісу",
        "watchlisttools-edit": "Праглядзець альбо рэдагаваць сьпіс назіраньня",
        "watchlisttools-raw": "Рэдагаваць як тэкст",
        "version-hook-name": "Назва працэдуры-перахопніка",
        "version-hook-subscribedby": "Падпісаны на",
        "version-version": "(Вэрсія $1)",
+       "version-no-ext-name": "[бяз назвы]",
        "version-svn-revision": "(r$2)",
        "version-license": "Ліцэнзія MediaWiki",
+       "version-ext-license": "Ліцэнзія",
+       "version-ext-colheader-name": "Пашырэньне",
+       "version-ext-colheader-version": "Вэрсія",
+       "version-ext-colheader-license": "Ліцэнзія",
+       "version-ext-colheader-description": "Апісаньне",
+       "version-ext-colheader-credits": "Аўтары",
+       "version-license-title": "Ліцэнзія для $1",
+       "version-license-not-found": "Для гэтага пашырэньня няма падрабязных зьвестак пра ліцэнзію.",
+       "version-credits-title": "Сьпіс аўтараў $1",
+       "version-credits-not-found": "Для гэтага пашырэньня ня знойдзена падрабязных зьвестак пра аўтараў.",
        "version-poweredby-credits": "{{SITENAME}} працуе на праграмным забесьпячэньні '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
        "version-poweredby-others": "іншыя",
        "version-poweredby-translators": "перакладчыкі з translatewiki.net",
        "redirect-lookup": "Шукаць паводле:",
        "redirect-value": "Значэньне:",
        "redirect-user": "Ідэнтыфікатара ўдзельніка",
+       "redirect-page": "Ідэнтыфікатар старонкі",
        "redirect-revision": "Вэрсіі старонкі",
        "redirect-file": "Імя файла",
        "redirect-not-exists": "Значэньне ня знойдзена",
        "htmlform-no": "Не",
        "htmlform-yes": "Так",
        "htmlform-chosen-placeholder": "Выберыце варыянт",
+       "htmlform-cloner-create": "Дадаць больш",
+       "htmlform-cloner-delete": "Выдаліць",
+       "htmlform-cloner-required": "Патрабуецца як мінімум яшчэ адно значэньне.",
        "sqlite-has-fts": "$1 з падтрымкай поўнатэкстнага пошуку",
        "sqlite-no-fts": "$1 без падтрымкі поўнатэкстнага пошуку",
        "logentry-delete-delete": "$1 {{GENDER:$2|выдаліў|выдаліла}} старонку $3",
        "api-error-overwrite": "Замена існуючага файла забароненая.",
        "api-error-stashfailed": "Унутраная памылка: сэрвэр ня змог захаваць часовы файл.",
        "api-error-publishfailed": "Унутраная памылка: сэрвэр ня змог захаваць часловы файл.",
+       "api-error-stasherror": "Падчас загрузкі файла ў сховішча адбылася памылка.",
        "api-error-timeout": "Сэрвэр не адказаў у чаканы тэрмін.",
        "api-error-unclassified": "Узьнікла невядомая памылка",
        "api-error-unknown-code": "Невядомая памылка: «$1».",
        "expand_templates_input": "Крынічны тэкст:",
        "expand_templates_output": "Вынік",
        "expand_templates_xml_output": "вынік у фармаце XML",
+       "expand_templates_html_output": "HTML-вывад",
        "expand_templates_ok": "Добра",
        "expand_templates_remove_comments": "Выдаліць камэнтары",
        "expand_templates_remove_nowiki": "Падаўляць тэгі <nowiki> у выніку",
        "expand_templates_generate_xml": "Паказаць дрэва аналізу XML",
+       "expand_templates_generate_rawhtml": "Паказаць HTML",
        "expand_templates_preview": "Папярэдні прагляд"
 }
index 3cfc599..1579ea7 100644 (file)
                        "Чаховіч Уладзіслаў",
                        "לערי ריינהארט",
                        "아라",
-                       "Unomano"
+                       "Unomano",
+                       "Mikalai Udodau",
+                       "Artificial123"
                ]
        },
        "tog-underline": "Падкрэсліваць спасылкі:",
-       "tog-hideminor": "Ð\9dе Ð¿Ð°ÐºÐ°Ð·Ð²Ð°Ñ\86Ñ\8c Ð´Ñ\80обнÑ\8bÑ\85 Ð¿Ñ\80авак",
+       "tog-hideminor": "Ð\9dе Ð¿Ð°ÐºÐ°Ð·Ð²Ð°Ñ\86Ñ\8c Ð´Ñ\80обнÑ\8bÑ\8f Ð¿Ñ\80аÑ\9eкÑ\96",
        "tog-hidepatrolled": "Без паказу ўхваленых правак у нядаўніх змяненнях",
        "tog-newpageshidepatrolled": "Без паказу ўхваленых правак у пераліку новых старонак",
        "tog-extendwatchlist": "Паказваць усе змяненні, а не толькі апошнія",
        "category_header": "Складнікі ў катэгорыі “$1”",
        "subcategories": "Падкатэгорыі",
        "category-media-header": "Мультымедыя ў катэгорыі \"$1\"",
-       "category-empty": "''Зараз у катэгорыі няма аніводнай старонкі або мультымедыйнага файла.''",
+       "category-empty": "<em>Зараз у катэгорыі няма аніводнай старонкі або мультымедыйнага файла.</em>",
        "hidden-categories": "{{PLURAL:$1|Схаваная катэгорыя|Схаваныя катэгорыі}}",
        "hidden-category-category": "Схаваныя катэгорыі",
        "category-subcat-count": "{{PLURAL:$1|Паказана $1 падкатэгорыя|Паказаны $1 падкатэгорыі|Паказаны $1 падкатэгорый}} з $2.",
        "qbmyoptions": "Свае старонкі",
        "faq": "ЧАПЫ",
        "faqpage": "Project:ЧАПЫ",
-       "vector-action-addsection": "Дадаць тэму",
-       "vector-action-delete": "Сцерці",
-       "vector-action-move": "Перанесці",
-       "vector-action-protect": "Ахова",
-       "vector-action-undelete": "Аднавіць",
-       "vector-action-unprotect": "Змяніць ахову",
-       "vector-view-create": "Стварыць",
-       "vector-view-edit": "Правіць",
-       "vector-view-history": "Паказаць гісторыю",
-       "vector-view-view": "Чытаць",
-       "vector-view-viewsource": "Паказаць зыходны тэкст",
        "actions": "Дзеянні",
        "namespaces": "Прасторы імёнаў",
        "variants": "Варыянты",
        "navigation-heading": "Навігацыя",
        "errorpagetitle": "Памылка",
        "returnto": "Вярнуцца да $1.",
-       "tagline": "З пляцоўкі {{SITENAME}}.",
+       "tagline": "З пляцоўкі {{SITENAME}}",
        "help": "Даведка",
        "search": "Знайсці",
        "searchbutton": "Знайсці",
        "go": "Пераход",
        "searcharticle": "Артыкул",
        "history": "Гісторыя старонкі",
-       "history_short": "гісторыя",
+       "history_short": "Ð\93історыя",
        "updatedmarker": "абноўлена ад часу апошняга наведвання",
        "printableversion": "Для друку",
        "permalink": "Нязменная спасылка",
        "print": "Друкаваць",
        "view": "Паказ",
+       "view-foreign": "Глядзець на $1",
        "edit": "Правіць",
+       "edit-local": "Правіць тутэйшае апісанне",
        "create": "Стварыць",
+       "create-local": "Дадаць тутэйшае апісанне",
        "editthispage": "Правіць гэту старонку",
        "create-this-page": "Стварыць старонку",
-       "delete": "сцерці",
+       "delete": "Сцерці",
        "deletethispage": "Сцерці гэту старонку",
        "undeletethispage": "Аднавіць гэту старонку",
        "undelete_short": "Аднавіць {{PLURAL:$1|адну праўку|$1 правак}}",
        "unprotectthispage": "Змяніць ахову гэтай старонкі",
        "newpage": "Новая старонка",
        "talkpage": "Размовы пра гэтую старонку",
-       "talkpagelinktext": "размова",
+       "talkpagelinktext": "Размовы",
        "specialpage": "Адмысловая старонка",
        "personaltools": "Асабістыя прылады",
        "postcomment": "Новы раздзел",
        "redirectedfrom": "(Пасля перасылкі з $1)",
        "redirectpagesub": "Старонка-перасылка",
        "lastmodifiedat": "Апошняе змяненне старонкі адбылося $2, $1.",
-       "viewcount": "Гэту старонку адкрывалі {{PLURAL:$1|адзін раз|$1 разоў}}.",
+       "viewcount": "Гэту старонку адкрывалі {{PLURAL:$1|адзін раз|$1 разы|$1 разоў}}.",
        "protectedpage": "Старонка пад аховай",
        "jumpto": "Перайсці да:",
        "jumptonavigation": "рух",
        "jumptosearch": "знайсці",
        "view-pool-error": "На жаль, у гэты момант серверы перагружаны.\nЗанадта многія чытачы спрабуюць адкрыць гэтую старонку.\nКалі ласка, трохі пачакайце, перш чым адкрываць гэтую старонку ізноў.\n\n$1",
+       "generic-pool-error": "На жаль, у гэты момант серверы перагружаны.\nЗанадта многія карыстальнікі спрабуюць адкрыць гэты рэсурс.\nКалі ласка, трохі пачакайце, перш чым спрабаваць атрымаць доступ да гэтага рэсурсу ізноў.",
        "pool-timeout": "Выйшаў час чакання блакіроўкі",
        "pool-queuefull": "Чарга запытаў перапоўнена",
        "pool-errorunknown": "Невядомая памылка",
        "youhavenewmessages": "Вы маеце $1 ($2).",
        "youhavenewmessagesfromusers": "Вы атрымалі $1 ад {{PLURAL:$3|$3 ўдзельніка|$3 удзельнікаў}} ($2).",
        "youhavenewmessagesmanyusers": "Вы атрымалі $1 ад мноства карыстальнікаў ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1|новае паведамленне|999=новыя паведамленні}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|апошняя \nзмена|999=апошнія \nзмены}}",
        "youhavenewmessagesmulti": "У вас ёсць новыя паведамленні на $1",
        "editsection": "правіць",
        "editold": "правіць",
-       "viewsourceold": "гл. Ð²Ñ\8bÑ\82ок",
+       "viewsourceold": "гл. Ð·Ñ\8bÑ\85однÑ\96к",
        "editlink": "правіць",
        "viewsourcelink": "паказ крыніцы",
        "editsectionhint": "Правіць раздзел: $1",
        "toc": "Змест",
        "showtoc": "паказаць",
        "hidetoc": "не паказваць",
-       "collapsible-collapse": "схаваць",
+       "collapsible-collapse": "Схаваць",
        "collapsible-expand": "Паказаць",
        "thisisdeleted": "Паказаць ці аднавіць $1?",
        "viewdeleted": "Ці паказаць $1?",
-       "restorelink": "$1 {{PLURAL:$1|сцёртая праўка|сцёртых правак}}",
+       "restorelink": "$1 {{PLURAL:$1|Ñ\81Ñ\86Ñ\91Ñ\80Ñ\82аÑ\8f Ð¿Ñ\80аÑ\9eка|Ñ\81Ñ\86Ñ\91Ñ\80Ñ\82Ñ\8bÑ\8f Ð¿Ñ\80аÑ\9eкÑ\96\81Ñ\86Ñ\91Ñ\80Ñ\82Ñ\8bÑ\85 Ð¿Ñ\80авак}}",
        "feedlinks": "Струмень:",
        "feed-invalid": "Недапушчальны тып струмяня навін.",
        "feed-unavailable": "Няма струмянёў навін",
        "nospecialpagetext": "<strong>Вы звярнуліся па няправільную адмысловую старонку.</strong>\n\nПералік правільных адмысловых старонак ёсць на [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Памылка",
        "databaseerror": "Памылка базы дадзеных",
-       "laggedslavemode": "Увага: Старонка можа не ўтрымліваць апошніх змен.",
+       "databaseerror-query": "Запыт: $1",
+       "databaseerror-function": "Функцыя: $1",
+       "databaseerror-error": "Памылка: $1",
+       "laggedslavemode": "<strong>Увага:</strong> Старонка можа не ўтрымліваць апошніх змен.",
        "readonly": "База звестак заблакаваная",
        "enterlockreason": "Упішыце прычыну зачынення, а таксама меркаваны час адчынення",
        "readonlytext": "База даных не прыймае новых старонак і іншых змяненняў, таму што яна зараз зачынена, відаць, дзеля абслугоўвання, пасля чаго будзе вернута да нармальнай працы.\n\nАдміністратар, які зачыняў базу, растлумачыў гэта так: $1",
        "badarticleerror": "Аперацыя не дазволена на гэтай старонцы.",
        "cannotdelete": "Немагчыма сцерці старонку ці файл \"$1\". Магчыма, хтосьці іншы ўжо зрабіў гэта.",
        "cannotdelete-title": "Нельга выдаліць старонку \"$1\"",
+       "delete-hook-aborted": "Сціранне спынена хукам (hook).\nТлумачэнняў не было.",
+       "no-null-revision": "Немагчыма стварыць нуль-версію (null revision) для старонкі \"$1\"",
        "badtitle": "Няправільная назва",
        "badtitletext": "Назва старонкі, па якую звярталіся, аказалася недапушчальнай, пустой, або няправільна прылучанай між-моўнай ці між-вікі назвай. Магчыма, у ёй ёсць знакі, якія нельга ўжываць у назвах.",
        "perfcached": "Гэта ўзятыя з кэшу звесткі, і яны могуць не быць актуальнымі. У кэшы захоўваецца не больш за {{PLURAL:$1|адзін вынік|$1 вынікі|$1 вынікаў}}.",
        "viewsource-title": "Прагляд зыходнага тэксту старонкі $1",
        "actionthrottled": "Дзеянне прыгашана",
        "actionthrottledtext": "Дзеля абароны ад спаму, вам не дазваляецца выконваць гэтае дзеянне занадта часта за пэўны адрэзак часу, і вы гэты ліміт перасягнулі. Паспрабуйце ізноў праз некалькі мінут.",
-       "protectedpagetext": "Старонка ахоўваецца, каб нельга было яе правіць.",
+       "protectedpagetext": "Старонка ахоўваецца, каб нельга было яе правіць ці яшчэ што рабіць.",
        "viewsourcetext": "Можна бачыць і капіраваць зыходны тэкст гэтай старонкі:",
        "viewyourtext": "Вы можаце праглядзець і скапіяваць зыходны тэкст '''вашых правак''' на гэтай старонцы:",
        "protectedinterface": "Старонка ўтрымлівае інтэрфейснае паведамленне праграмнага забеспячэння гэтага вікі-праекта і ахоўваецца, каб прадухіліць вандалізм.\nКаб дабавіць ці змяніць пераклады ва ўсіх вікі-праектах, калі ласка, выкарыстоўвайце сайт лакалізацыі MediaWiki [//translatewiki.net/ translatewiki.net].",
-       "editinginterface": "'''Увага:''' Вы правіце старонку, якая ўтрымлівае тэкст карыстальніцкага інтэрфейсу.\nЯе змяненне паўплывае на вонкавы выгляд праграмы для ўсіх удзельнікаў.\nПраект лакалізацыі MediaWiki: [//translatewiki.net/wiki/Main_Page?setlang=be translatewiki.net].",
+       "editinginterface": "<strong>Увага:</strong> Вы правіце старонку, якая ўтрымлівае тэкст карыстальніцкага інтэрфейсу.\nЯе змяненне паўплывае на вонкавы выгляд праграмы для ўсіх удзельнікаў гэтай вікі.\nПраект лакалізацыі MediaWiki: [//translatewiki.net/wiki/ translatewiki.net].",
        "cascadeprotected": "Старонка знаходзіцца пад аховай ад правак, таму што яна ўлучана ў наступн{{PLURAL:$1|ую старонку|ыя старонкі}}, якія ахоўваюцца з магчымасцю \"каскаднага распаўсюджвання\" аховы:\n$2",
-       "namespaceprotected": "Вам не дазволена правіць старонкі ў прасторы назваў '''$1'''.",
+       "namespaceprotected": "Вам не дазволена правіць старонкі ў прасторы назваў <strong>$1</strong>.",
        "customcssprotected": "У вас няма дазволу рэдагаваць гэтую CSS-старонку, бо яна ўтрымлівае асабістыя настройкі іншага ўдзельніка.",
        "customjsprotected": "У вас няма дазволу рэдагаваць гэтую JavaScript-старонку, таму што яна ўтрымлівае асабістыя настройкі іншага ўдзельніка.",
+       "mycustomcssprotected": "Вам не дазволена рэдагаванне гэтай старонкі CSS.",
+       "mycustomjsprotected": "Вам не дазволена рэдагаванне гэтай старонкі JavaScript.",
+       "myprivateinfoprotected": "Вам не дазволена рэдагаваць свае асабістыя звесткі.",
+       "mypreferencesprotected": "Вам не дазволена рэдагаваць свае настройкі.",
        "ns-specialprotected": "Не дазволена правіць старонкі ў прасторы назваў {{ns:special}}.",
-       "titleprotected": "Назва засцерагаецца ад стварэння; ахова пастаўлена ўдзельнікам: [[User:$1|$1]].\nТлумачэнне пастаноўкі пад ахову: ''$2''.",
+       "titleprotected": "Назва засцерагаецца ад стварэння; ахова пастаўлена ўдзельнікам: [[User:$1|$1]].\nТлумачэнне пастаноўкі пад ахову: \"<em>$2</em>\".",
+       "invalidtitle-knownnamespace": "Недапушчальны загаловак з прасторай імёнаў \"$2\" і тэкстам \"$3\"",
+       "invalidtitle-unknownnamespace": "Недапушчальны загаловак з невядомым лікам прасторы імён $1 і тэкстам \"$2\"",
        "exception-nologin": "Вы не ўвайшлі ў сістэму",
        "virus-badscanner": "Некарэктная канфігурацыя: невядомы антывірусны сканер: ''$1''",
        "virus-scanfailed": "не ўдалося праверыць (код $1)",
        "virus-unknownscanner": "невядомы антывірус:",
-       "logouttext": "'''Вы выйшлі з сістэмы.'''\n\nМожна працягваць працу на {{SITENAME}} ананімна, або можна <span class='plainlinks'>[$1 ўвайсці ў сістэму ізноў]</span>, пад тым самым або пад іншым удзельніцкім імем. Заўважце, што некаторыя старонкі могуць паказвацца так, быццам вы яшчэ не выйшлі; у такім разе трэба ачысціць кэш вашага браўзера.",
+       "logouttext": "<strong>Вы выйшлі з сістэмы.</strong>\n\nЗаўважце, што некаторыя старонкі могуць паказвацца так, быццам вы яшчэ не выйшлі; у такім разе трэба ачысціць кэш вашага браўзера.",
        "welcomeuser": "Вітаем, $1!",
        "welcomecreation-msg": "Ваш рахунак быў створаны.\nНе забудзьцеся ажыццявіць [[Special:Preferences|настройку]] для {{SITENAME}}.",
-       "yourname": "Імя ўдзельніка",
+       "yourname": "Імя ўдзельніка:",
        "userlogin-yourname": "Імя ўліковага запісу",
        "userlogin-yourname-ph": "Увядзіце імя вашага ўліковага запісу",
        "createacct-another-username-ph": "Увядзіце імя карыстальніка",
-       "yourpassword": "Пароль",
+       "yourpassword": "Пароль:",
        "userlogin-yourpassword": "Пароль",
        "userlogin-yourpassword-ph": "Увядзіце ваш пароль",
        "createacct-yourpassword-ph": "Увядзіце пароль",
-       "yourpasswordagain": "Паўтарыце пароль",
+       "yourpasswordagain": "Паўтарыце пароль:",
        "createacct-yourpasswordagain": "Пацвердзіце пароль",
        "createacct-yourpasswordagain-ph": "Увядзіце пароль яшчэ раз",
-       "remembermypassword": "Памятаць мяне на гэтым камп'ютары (не даўжэй за $1 {{PLURAL:$1|дзень|дзён}})",
+       "remembermypassword": "Ð\9fамÑ\8fÑ\82аÑ\86Ñ\8c Ð¼Ñ\8fне Ð½Ð° Ð³Ñ\8dÑ\82Ñ\8bм ÐºÐ°Ð¼Ð¿'Ñ\8eÑ\82аÑ\80Ñ\8b (не Ð´Ð°Ñ\9eжÑ\8dй Ð·Ð° $1 {{PLURAL:$1|дзенÑ\8c|днÑ\96|дзÑ\91н}})",
        "userlogin-remembermypassword": "Заставацца ў сістэме",
        "userlogin-signwithsecure": "Выкарыстоўваць абароненае злучэнне",
-       "yourdomainname": "Ваш дамен",
+       "yourdomainname": "Ваш дамен:",
+       "password-change-forbidden": "Вы не можаце змяняць паролі на гэтай Вікі.",
        "externaldberror": "Або памылка вонкавай аўтэнтыкацыі ў базе дадзеных, або вам не дазволена абнаўляць свой вонкавы рахунак.",
        "login": "Увайсці ў сістэму",
        "nav-login-createaccount": "Увайсці ў сістэму / стварыць рахунак",
        "gotaccountlink": "Увайсці ў сістэму",
        "userlogin-resetlink": "Забыліся даныя для ўваходу?",
        "userlogin-resetpassword-link": "Забылі пароль?",
+       "userlogin-createanother": "Стварыць яшчэ адзін уліковы запіс",
        "createacct-emailrequired": "Адрас электроннай пошты",
        "createacct-emailoptional": "Адрас электроннай пошты (неабавязкова)",
        "createacct-email-ph": "Увядзіце ваш адрас электроннай пошты",
        "createacct-another-email-ph": "Увядзіце адрас электроннай пошты",
-       "createaccountmail": "праз эл.пошту",
+       "createaccountmail": "Ужыць часовы выпадковы пароль і даслаць яго праз эл.пошту",
+       "createacct-realname": "Сапраўднае імя (неабавязкова)",
        "createaccountreason": "Прычына:",
        "createacct-reason": "Прычына",
+       "createacct-captcha": "Праверка бяспекі",
        "createacct-imgcaptcha-ph": "Увядзіце тэкст, які вы бачыце вышэй",
        "createacct-submit": "Стварыць уліковы запіс",
+       "createacct-another-submit": "Стварыць яшчэ адзін уліковы запіс",
+       "createacct-benefit-heading": "{{SITENAME}} зроблены такімі ж людзьмі, як вы.",
+       "createacct-benefit-body1": "{{PLURAL:$1|праўка|праўкі|правак}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|старонка|старонкі|старонак}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|апошні \nўкладальнік|апошнія \nўкладальнікі|апошніх \nукладальнікаў}}",
        "badretype": "Уведзеныя паролі не аднолькавыя.",
        "userexists": "Такое імя ўдзельніка ўжо занятае.\nКалі ласка, выбярыце іншае імя.",
        "loginerror": "Памылка ўваходу",
        "createaccounterror": "Не ўдалося стварыць рахунак: $1",
        "nocookiesnew": "Рахунак быў створаны, але ў сістэму вы не ўвайшлі. {{SITENAME}} карыстаецца квіткамі (кукі), каб апрацоўваць уваходы ўдзельнікаў, а гэтая функцыянальнасць адключана ў вашым браўзеры. Уключыце квіткі ў браўзеры, тады ўваходзьце са сваімі новымі імем удзельніка і паролем.",
        "nocookieslogin": "{{SITENAME}} карыстаецца квіткамі (кукі), каб пазнаваць удзельнікаў. У вашым браўзеры квіткі не дазволены. Дазвольце іх працу і паспрабуйце ізноў.",
-       "nocookiesfornew": "Уліковы запіс карыстальніка не быў створаны, бо мы не змаглі пацвердзіць яго крыніцы. \n Пераканайцеся ў тым, кукі ўключаныя, абнавіце старонку і паспрабуйце яшчэ раз.",
+       "nocookiesfornew": "Уліковы запіс карыстальніка не быў створаны, бо мы не змаглі пацвердзіць яго крыніцы. \nУпэўніцеся, што кукі ўключаныя, абнавіце старонку і паспрабуйце яшчэ раз.",
        "noname": "Вы не вызначылі правільнага імя ўдзельніка.",
        "loginsuccesstitle": "Паспяховы ўваход у сістэму",
-       "loginsuccess": "'''Цяпер Вы ўвайшлі на {{SITENAME}} як \"$1\".'''",
+       "loginsuccess": "<strong>Цяпер Вы ўвайшлі на {{SITENAME}} як \"$1\".</strong>",
        "nosuchuser": "Няма ўдзельніка з імем \"$1\". Праверце правільнасць напісання або [[Special:UserLogin/signup|стварыце новы рахунак]]. Вялікія і малыя літары ў такіх імёнах лічацца рознымі.",
        "nosuchusershort": "Удзельніка з імем \"$1\" не існуе. Праверце яго напісанне.",
        "nouserspecified": "Вы мусіце вызначыць імя ўдзельніка.",
        "noemailcreate": "Вам неабходна паказаць дзеючы адрас электроннай пошты",
        "passwordsent": "На адрас электроннай пошты, зарэгістраваны для \"$1\",\nбыў дасланы новы пароль.\nКалі ласка, увайдзіце ў сістэму зноў пасля яго атрымання.",
        "blocked-mailpassword": "Для адрасу IP, з якога вы працуеце, забароненыя праўкі, а значыць, у мэтах абароны ад злоўжывання нельга карыстацца і функцыяй аднаўлення паролю.",
-       "eauthentsent": "Пацверджанне было адасланае эл.поштай на азначаны адрас эл.пошты.\nКаб туды, у далейшым, трапляла іншая эл.пошта адсюль, патрабуецца выканаць інструкцыі, выкладзеныя ў гэтым эл.паведамленні, каб пацвердзіць сваё права на рахунак эл.пошты.",
-       "throttled-mailpassword": "Нагаданне пра пароль ужо адсылалася на працягу апошн{{PLURAL:$1|яй гадзіны|іх $1 гадзін}}. Дзеля абароны ад злоўжыванняў, дазваляецца атрымліваць толькі адно такое нагаданне за {{PLURAL:$1|гадзіну|$1 гадзін}}.",
+       "eauthentsent": "Пацверджанне было адасланае электроннай поштай на азначаны адрас эл.пошты.\nКаб туды, у далейшым, трапляла іншая пошта адсюль, патрабуецца выканаць інструкцыі, выкладзеныя ў тым эл.паведамленні, каб пацвердзіць сваё права на рахунак эл.пошты.",
+       "throttled-mailpassword": "Нагаданне пра пароль ужо адсылалася на працягу апошн{{PLURAL:$1|яй гадзіны|іх $1 гадзін}}. Дзеля абароны ад злоўжыванняў, дазваляецца атрымліваць толькі адно такое нагаданне за {{PLURAL:$1|гадзіну|$1 гадзіны|$1 гадзін}}.",
        "mailerror": "Памылка адсылання эл.пошты: $1",
        "acct_creation_throttle_hit": "На гэтай вікі за апошні дзень створаны {{PLURAL:$1|1 рахунак|$1 рахункаў}} наведвальнікамі з вашага адрасу IP. Больш за такі час не дазваляецца. Таму на пэўны час з гэтага адрасу IP нельга ствараць новых рахункаў.",
        "emailauthenticated": "Ваш адрас эл.пошты быў пацверджаны на пляцоўцы $2 ($3).",
-       "emailnotauthenticated": "Адрас эл.пошты яшчэ не пацверджаны. Эл.пошта ў гэтых магчымасцях слацца не будзе.",
+       "emailnotauthenticated": "Адрас эл.пошты яшчэ не пацверджаны. \nЭл.пошта ў гэтых магчымасцях адсылацца не будзе.",
        "noemailprefs": "Патрэбны адрас эл.пошты, каб дзейнічалі гэтыя магчымасці.",
        "emailconfirmlink": "Пацвердзіце ваш адрас эл.пошты",
        "invalidemailaddress": "Непрыймальны адрас эл.пошты, таму што яго фармат выглядае няправільным. Упішыце адрас у правільным фармаце або ачысціце гэтае поле.",
        "cannotchangeemail": "Адрасы электроннай пошты гэтага ўліковага запісу не могуць быць зменены ў гэтай вікі.",
+       "emaildisabled": "Гэты сайт не можа адсылаць эл.пошту.",
        "accountcreated": "Створаны рахунак",
-       "accountcreatedtext": "СÑ\82воÑ\80анÑ\8b Ñ\80аÑ\85Ñ\83нак Ñ\83дзелÑ\8cнÑ\96ка $1.",
+       "accountcreatedtext": "СÑ\82воÑ\80анÑ\8b Ñ\9eлÑ\96ковÑ\8b Ð·Ð°Ð¿Ñ\96Ñ\81 Ñ\83дзелÑ\8cнÑ\96ка [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|Ñ\80азмовÑ\8b]]).",
        "createaccount-title": "Стварэнне рахунка на {{SITENAME}}",
        "createaccount-text": "На пляцоўцы {{SITENAME}} ($4) быў створаны рахунак удзельніка з гэтым адрасам эл.пошты. Назва рахунку \"$2\", пароль \"$3\". Варта адразу ўвайсці ў сістэму і змяніць пароль.\n\nКалі стварэнне рахунку было памылковым, то на гэтае паведамленне можна не звяртаць увагі.",
-       "login-throttled": "Ð\97анадÑ\82а Ð¼Ð½Ð¾Ð³Ð° Ð½Ñ\8fдаÑ\9eнÑ\96Ñ\85 Ñ\81пÑ\80обаÑ\9e Ñ\83вайÑ\81Ñ\86Ñ\96 Ð¿Ð°Ð´ Ð³Ñ\8dÑ\82Ñ\8bм Ñ\80аÑ\85Ñ\83нкам. Ð\9fаÑ\87акайÑ\86е перад тым, як спрабаваць ізноў.",
+       "login-throttled": "Ð\97анадÑ\82а Ð¼Ð½Ð¾Ð³Ð° Ð½Ñ\8fдаÑ\9eнÑ\96Ñ\85 Ñ\81пÑ\80обаÑ\9e Ñ\83вайÑ\81Ñ\86Ñ\96 Ð¿Ð°Ð´ Ð³Ñ\8dÑ\82Ñ\8bм Ñ\83лÑ\96ковÑ\8bм Ð·Ð°Ð¿Ñ\96Ñ\81ам. \nÐ\9fаÑ\87акайÑ\86е $1 перад тым, як спрабаваць ізноў.",
        "login-abort-generic": "Няўдалая спроба ўвайсці ў сістэму",
        "loginlanguagelabel": "Мова: $1",
        "suspicious-userlogout": "Ваш запыт на выхад быў адмоўлены, паколькі ён выглядае як накіраваны са зламанага браўзера або кэшаванне проксі-сервераў.",
+       "createacct-another-realname-tip": "Сапраўднае імя паведамляць неабавязкова.\nКалі вы рашылі паведаміць яго, ім будзе падпісваецца зроблены ўдзельнікам унёсак.",
        "pt-login": "Увайсці",
        "pt-login-button": "Увайсці",
        "pt-createaccount": "Стварыць уліковы запіс",
        "pt-userlogout": "Выйсці",
        "php-mail-error-unknown": "Невядомая памылка ў функцыі PHP-пошты",
        "user-mail-no-addy": "Паспрабаваў адправіць электронны ліст без адрасу электроннай пошты",
+       "user-mail-no-body": "Спроба даслаць ліст эл.пошты з пустым або неабгрунтавана кароткім зместам.",
        "changepassword": "Пароль",
        "resetpass_announce": "Каб завяршыць уваход у сістэму, Вы павінны ўстанавіць новы пароль.",
        "resetpass_header": "Змяніць пароль рахунку",
        "retypenew": "Новы пароль паўторна:",
        "resetpass_submit": "Наставіць пароль і ўвайсці",
        "changepassword-success": "Ваш пароль паспяхова зменены!",
+       "changepassword-throttled": "Занадта многа нядаўніх спробаў увайсці пад гэтым уліковым запісам. \nПачакайце $1 перад тым, як спрабаваць ізноў.",
        "resetpass_forbidden": "Не дазволена мяняць паролі",
        "resetpass-no-info": "Трэба ўвайсці ў сістэму, каб звяртацца да гэтай старонкі наўпрост.",
        "resetpass-submit-loggedin": "Змяніць пароль",
        "resetpass-submit-cancel": "Нічога",
        "resetpass-wrong-oldpass": "Недапушчальны тымчасовы ці актуальны пароль.\nМагчыма, вы ўжо змянілі свой пароль ці папрасілі новы тымчасовы.",
+       "resetpass-recycled": "Калі ласка, змяніце свой пароль на нешта іншае, чым ваш цяперашні пароль.",
        "resetpass-temp-password": "Тымчасовы пароль:",
+       "resetpass-validity-soft": "Ваш пароль недапушчальны: $1\n\nКалі ласка, выберыце новы пароль зараз, або націсніце \"{{int:resetpass-submit-cancel}}\", каб скінуць яго пазней.",
        "passwordreset": "Выслаць мне новы пароль",
+       "passwordreset-text-one": "Запоўніце гэту форму, каб атрымаць часовы пароль па эл.пошце.",
        "passwordreset-legend": "Пераўстанавіць пароль",
        "passwordreset-disabled": "Функцыя пераўсталёўкі пароля адключаная на гэтай вікі.",
-       "passwordreset-username": "Імя ўдзельніка",
+       "passwordreset-emaildisabled": "Функцыі эл.пошты адключаны на гэтай Вікі.",
+       "passwordreset-username": "Імя ўдзельніка:",
        "passwordreset-domain": "Дамен:",
        "passwordreset-capture": "Праглядзець напісаны ліст?",
        "passwordreset-capture-help": "Калі вы паставіце адзнаку, то вам будзе паказаны ліст з часовым паролем, які адпраўляецца ўдзельніку.",
        "passwordreset-email": "Адрас электроннай пошты:",
        "passwordreset-emailtitle": "Інфармацыя пра рахунак на сайце {{SITENAME}}",
-       "passwordreset-emailtext-ip": "Нехта (магчыма вы, з IP-адрасу $1) запытаў напамін пра ваш \nуліковы запіс у праекце {{SITENAME}} ($4).\n{{PLURAL:$3|Наступны ўліковы запіс звязаны | Наступныя ўліковыя запісы звязаны}} з гэтым адрасам электроннай пошты:\n\n$2\n\n{{PLURAL:$3|Гэты часовы пароль будзе|Гэтыя часовыя паролі будуць}} дзейнічаць {{PLURAL:$5|адзін дзень|$5 дзён}}.\nВы павінны ўвайсці ў сістэму і абраць новы пароль.\nКалі вы не рабілі гэтага запыту, ці ўспомнілі свой зыходны пароль\nі не жадаеце яго мяняць, вы можаце праігнараваць гэтае паведамленне\nі працягнуць выкарыстоўваць свой стары пароль.",
-       "passwordreset-emailtext-user": "УдзелÑ\8cнÑ\96к $1 Ð· Ð¿Ñ\80аекÑ\82Ñ\83 {{SITENAME}} Ð·Ð°Ð¿Ñ\80аÑ\81Ñ\96Ñ\9e Ð½Ð°Ð¿Ð°Ð¼Ñ\96н Ð¿Ñ\80а Ð²Ð°Ñ\88\nÑ\83лÑ\96ковÑ\8b Ð·Ð°Ð¿Ñ\96Ñ\81 Ñ\83 Ð¿Ñ\80аекÑ\86е {{SITENAME}}\n($4).\n{{PLURAL:$3|Ð\9dаÑ\81Ñ\82Ñ\83пнÑ\8b Ñ\9eлÑ\96ковÑ\8b Ð·Ð°Ð¿Ñ\96Ñ\81 Ð·Ð²Ñ\8fзанÑ\8b | Ð\9dаÑ\81Ñ\82Ñ\83пнÑ\8bÑ\8f Ñ\83лÑ\96ковÑ\8bÑ\8f Ð·Ð°Ð¿Ñ\96Ñ\81Ñ\8b Ð·Ð²Ñ\8fзанÑ\8b}} Ð· Ð³Ñ\8dÑ\82Ñ\8bм Ð°Ð´Ñ\80аÑ\81ам Ñ\8dлекÑ\82Ñ\80оннай Ð¿Ð¾Ñ\88Ñ\82Ñ\8b:\n\n$2\n\n{{PLURAL:$3|Ð\93Ñ\8dÑ\82Ñ\8b Ñ\87аÑ\81овÑ\8b Ð¿Ð°Ñ\80олÑ\8c Ð±Ñ\83дзе|Ð\93Ñ\8dÑ\82Ñ\8bÑ\8f Ñ\87аÑ\81овÑ\8bÑ\8f Ð¿Ð°Ñ\80олÑ\96 Ð±Ñ\83дÑ\83Ñ\86Ñ\8c}} Ð´Ð·ÐµÐ¹Ð½Ñ\96Ñ\87аÑ\86Ñ\8c {{PLURAL:$5|$5 Ð´Ð·ÐµÐ½Ñ\8c |$5 Ð´Ð½Ñ\8f |$5 Ð´Ð·Ñ\91н}}.\nÐ\92Ñ\8b Ð¿Ð°Ð²Ñ\96ннÑ\8b Ñ\9eвайÑ\81Ñ\86Ñ\96 Ñ\9e Ñ\81Ñ\96Ñ\81Ñ\82Ñ\8dмÑ\83 Ñ\96 Ð°Ð±Ñ\80аÑ\86Ñ\8c Ð½Ð¾Ð²Ñ\8b Ð¿Ð°Ñ\80олÑ\8c.\nÐ\9aалÑ\96 Ð²Ñ\8b Ð½Ðµ Ñ\80абÑ\96лÑ\96 Ð³Ñ\8dÑ\82ага Ð·Ð°Ð¿Ñ\8bÑ\82Ñ\83, Ñ\86Ñ\96 Ñ\9eÑ\81помнÑ\96лÑ\96 Ñ\81вой Ð·Ñ\8bÑ\85однÑ\8b Ð¿Ð°Ñ\80олÑ\8c\nÑ\96 Ð½Ðµ Ð¶Ð°Ð´Ð°ÐµÑ\86е Ñ\8fго Ð¼Ñ\8fнÑ\8fÑ\86Ñ\8c, Ð²Ñ\8b Ð¼Ð¾Ð¶Ð°Ñ\86е Ð¿Ñ\80аÑ\96гнаÑ\80аваÑ\86Ñ\8c Ð³Ñ\8dÑ\82ае Ð¿Ð°Ð²ÐµÐ´Ð°Ð¼Ð»ÐµÐ½Ð½Ðµ\nÑ\96 Ð¿Ñ\80аÑ\86Ñ\8fгнÑ\83ць выкарыстоўваць свой стары пароль.",
+       "passwordreset-emailtext-ip": "Нехта (магчыма вы, з IP-адрасу $1) запытаў скід  вашага пароля ў праекце {{SITENAME}} ($4).\n{{PLURAL:$3|Наступны ўліковы запіс звязаны|Наступныя ўліковыя запісы звязаны}} з гэтым адрасам электроннай пошты:\n\n$2\n\n{{PLURAL:$3|Гэты часовы пароль будзе|Гэтыя часовыя паролі будуць}} дзейнічаць {{PLURAL:$5|адзін дзень|$5 дні|$5 дзён}}.\nВы павінны зараз увайсці ў сістэму і абраць новы пароль. Калі вы не рабілі гэтага запыту, ці ўспомнілі свой зыходны пароль і не жадаеце яго мяняць, вы можаце праігнараваць гэтае паведамленне і працягнуць выкарыстоўваць свой стары пароль.",
+       "passwordreset-emailtext-user": "УдзелÑ\8cнÑ\96к $1 Ð· Ð¿Ñ\80аекÑ\82Ñ\83 {{SITENAME}} Ð·Ð°Ð¿Ñ\8bÑ\82аÑ\9e Ñ\81кÑ\96д Ð²Ð°Ñ\88ага Ð¿Ð°Ñ\80олÑ\8f Ñ\9e Ð¿Ñ\80аекÑ\86е {{SITENAME}}\n($4).\n{{PLURAL:$3|Ð\9dаÑ\81Ñ\82Ñ\83пнÑ\8b Ñ\9eлÑ\96ковÑ\8b Ð·Ð°Ð¿Ñ\96Ñ\81 Ð·Ð²Ñ\8fзанÑ\8b\9dаÑ\81Ñ\82Ñ\83пнÑ\8bÑ\8f Ñ\83лÑ\96ковÑ\8bÑ\8f Ð·Ð°Ð¿Ñ\96Ñ\81Ñ\8b Ð·Ð²Ñ\8fзанÑ\8b}} Ð· Ð³Ñ\8dÑ\82Ñ\8bм Ð°Ð´Ñ\80аÑ\81ам Ñ\8dлекÑ\82Ñ\80оннай Ð¿Ð¾Ñ\88Ñ\82Ñ\8b:\n\n$2\n\n{{PLURAL:$3|Ð\93Ñ\8dÑ\82Ñ\8b Ñ\87аÑ\81овÑ\8b Ð¿Ð°Ñ\80олÑ\8c Ð±Ñ\83дзе|Ð\93Ñ\8dÑ\82Ñ\8bÑ\8f Ñ\87аÑ\81овÑ\8bÑ\8f Ð¿Ð°Ñ\80олÑ\96 Ð±Ñ\83дÑ\83Ñ\86Ñ\8c}} Ð´Ð·ÐµÐ¹Ð½Ñ\96Ñ\87аÑ\86Ñ\8c {{PLURAL:$5|$5 Ð´Ð·ÐµÐ½Ñ\8c |$5 Ð´Ð½Ñ\96 |$5 Ð´Ð·Ñ\91н}}.\nÐ\92Ñ\8b Ð¿Ð°Ð²Ñ\96ннÑ\8b Ð·Ð°Ñ\80аз Ñ\83вайÑ\81Ñ\86Ñ\96 Ñ\9e Ñ\81Ñ\96Ñ\81Ñ\82Ñ\8dмÑ\83 Ñ\96 Ð°Ð±Ñ\80аÑ\86Ñ\8c Ð½Ð¾Ð²Ñ\8b Ð¿Ð°Ñ\80олÑ\8c. Ð\9aалÑ\96 Ð²Ñ\8b Ð½Ðµ Ñ\80абÑ\96лÑ\96 Ð³Ñ\8dÑ\82ага Ð·Ð°Ð¿Ñ\8bÑ\82Ñ\83, Ñ\86Ñ\96 Ñ\9eÑ\81помнÑ\96лÑ\96 Ñ\81вой Ð·Ñ\8bÑ\85однÑ\8b Ð¿Ð°Ñ\80олÑ\8c Ñ\96 Ð½Ðµ Ð¶Ð°Ð´Ð°ÐµÑ\86е Ñ\8fго Ð¼Ñ\8fнÑ\8fÑ\86Ñ\8c, Ð²Ñ\8b Ð¼Ð¾Ð¶Ð°Ñ\86е Ð¿Ñ\80аÑ\96гнаÑ\80аваÑ\86Ñ\8c Ð³Ñ\8dÑ\82ае Ð¿Ð°Ð²ÐµÐ´Ð°Ð¼Ð»ÐµÐ½Ð½Ðµ Ñ\96 Ð¿Ñ\80аÑ\86Ñ\8fгваць выкарыстоўваць свой стары пароль.",
        "passwordreset-emailelement": "Імя ўдзельніка: $1\nЧасовы пароль: $2",
-       "passwordreset-emailsent": "Ð\9fа Ñ\8dлекÑ\82Ñ\80оннай Ð¿Ð¾Ñ\88Ñ\86е Ð±Ñ\8bÑ\9e Ð°Ð´Ð¿Ñ\80аÑ\9eленÑ\8b Ð½Ð°Ð¿Ð°Ð¼Ñ\96н.",
-       "passwordreset-emailsent-capture": "Ніжэй прыведзены адпраўлены ліст-напамін.",
-       "passwordreset-emailerror-capture": "Ніжэй прыведзены створаны ліст-напамін, яго адпраўка не атрымалася па прычыне: $1",
+       "passwordreset-emailsent": "Ð\9fа Ñ\8dлекÑ\82Ñ\80оннай Ð¿Ð¾Ñ\88Ñ\86е Ð±Ñ\8bÑ\9e Ð°Ð´Ð¿Ñ\80аÑ\9eленÑ\8b Ð»Ñ\96Ñ\81Ñ\82 Ð¿Ñ\80а Ñ\81кÑ\96д Ð¿Ð°Ñ\80олÑ\8f.",
+       "passwordreset-emailsent-capture": "Ніжэй прыведзены адпраўлены ліст пра скід пароля.",
+       "passwordreset-emailerror-capture": "Ніжэй прыведзены створаны ліст пра скід пароля, яго адпраўка не атрымалася па прычыне: $1",
        "changeemail": "Змяніць адрас электроннай пошты",
        "changeemail-header": "Змена электроннага адрасу акаўнта",
        "changeemail-text": "Запоўніце гэтую форму, каб змяніць свой адрас электроннай пошты. Вам трэба будзе ўвесці пароль, каб пацвердзіць змяненне.",
        "changeemail-oldemail": "Бягучы адрас электроннай пошты:",
        "changeemail-newemail": "Новы адрас электроннай пошты:",
        "changeemail-none": "(няма)",
+       "changeemail-password": "Ваш {{SITENAME}} пароль:",
        "changeemail-submit": "Змяніць адрас электроннай пошты:",
        "changeemail-cancel": "Адмена",
+       "changeemail-throttled": "Надта штмат спробаў увайсці пад гэтым рахункам. Пачакайце $1 перад тым, як спрабаваць ізноў.",
        "bold_sample": "Цёмны тэкст",
        "bold_tip": "Цёмны тэкст",
        "italic_sample": "Курсіўны тэкст",
        "loginreqtitle": "Патрабуецца ўваход у сістэму",
        "loginreqlink": "ўвайсці",
        "loginreqpagetext": "Вы павінны $1, каб праглядаць іншыя старонкі.",
-       "accmailtitle": "Быў адасланы пароль.",
-       "accmailtext": "Ð\9dа Ð°Ð´Ñ\80аÑ\81 $2 Ð±Ñ\8bÑ\9e Ð°Ð´Ð°Ñ\81ланÑ\8b Ð·Ð³ÐµÐ½ÐµÑ\80аванÑ\8b Ð¿Ð°Ñ\80олÑ\8c Ð´Ð»Ñ\8f [[User talk:$1|$1]].\n\nÐ\9fаÑ\80олÑ\8c Ð½Ð° Ð³Ñ\8dÑ\82Ñ\8b Ð½Ð¾Ð²Ñ\8b Ñ\80аÑ\85Ñ\83нак Ð¼Ð¾Ð¶Ð° Ð±Ñ\8bÑ\86Ñ\8c Ð·Ð¼ÐµÐ½ÐµÐ½Ñ\8b Ð½Ð° ''[[Special:ChangePassword|адмÑ\8bÑ\81ловай Ñ\81Ñ\82аÑ\80онÑ\86Ñ\8b]]'' пасля ўваходу ў сістэму.",
+       "accmailtitle": "Быў адасланы пароль",
+       "accmailtext": "Ð\9dа Ð°Ð´Ñ\80аÑ\81 $2 Ð±Ñ\8bÑ\9e Ð´Ð°Ñ\81ланÑ\8b Ð·Ð³ÐµÐ½ÐµÑ\80аванÑ\8b Ð¿Ð°Ñ\80олÑ\8c Ð´Ð»Ñ\8f [[User talk:$1|$1]]. Ð\81н Ð¼Ð¾Ð¶Ð° Ð±Ñ\8bÑ\86Ñ\8c Ð·Ð¼ÐµÐ½ÐµÐ½Ñ\8b Ð½Ð° <em>[[Special:ChangePassword|Ñ\81Ñ\82аÑ\80онÑ\86Ñ\8b Ð·Ð¼ÐµÐ½Ñ\8b Ð¿Ð°Ñ\80олÑ\8f]]</em> пасля ўваходу ў сістэму.",
        "newarticle": "(Новы)",
        "newarticletext": "Вы перайшлі да старонкі, якой яшчэ няма, і таму трапілі сюды. Каб пачаць новую старонку, пішыце яе тэкст у ніжэйпаказаным акне рэдагавання (падрабязнасці бач у [$1 даведцы]). Калі вы тут выпадкова, проста націсніце \"назад\" у браўзеры.",
        "anontalkpagetext": "----''Гэта старонка размовы з ананімным удзельнікам, які або не мае свайго рахунку, або ім не карыстаўся. Таму дзеля яго ці яе ідэнтыфікацыі мы мусім выкарыстаць лічбавы Адрас IP. Такі адрас IP могуць дзяліць між сабою некалькі асоб. Калі вы ананімны ўдзельнік, і лічыце, што атрымліваеце няслушныя заўвагі,[[Special:UserLogin/signup|стварыце рахунак]] або [[Special:UserLogin|акажыцеся]], каб вас больш не блыталі з іншымі ананімнымі ўдзельнікамі.''",
        "userpage-userdoesnotexist": "Рахунак удзельніка \"<nowiki>$1</nowiki>\" не зарэгістраваны. Праверце, ці вы жадаеце стварыць або паправіць гэтую старонку.",
        "userpage-userdoesnotexist-view": "Уліковы запіс удзельніка \" $1 \"не зарэгістраваны.",
        "blocked-notice-logextract": "Гэты карыстальнік у дадзены момант заблакаваны. \n Апошні запіс журнала блакіровак прыводзіцца ніжэй для даведкі:",
-       "clearyourcache": "'''Заўвага:''' Пасля замацоўвання, вам можа спатрэбіцца ачыстка кэшу браўзера, каб убачыць унесеныя змяненні. \n*'''Firefox / Safari:''' націсніце '''Reload''', утрымліваючы ''Shift'', або націсніце ''Ctrl-F5'' ці ''Ctrl-R'' (''Cmd-R'' на Макінтошах)\n* '''Konqueror:''': націсніце ''Reload'' або ''F5''\n* '''Opera''': увайдзіце ў настройкі карыстальніка (меню ''Tools'', падпункт ''Preferences''), там ачысціце кэш; * '''Internet Explorer:''' націсніце ''Refresh'', утрымліваючы ''Ctrl'', або націсніце ''Ctrl-F5''\n* '''Google Chrome:''' Націсніце ''Ctrl-Shift-R'' (''⌘-Shift-R'' на Mac)",
+       "clearyourcache": "<strong>Заўвага:</strong> Пасля замацоўвання, вам можа спатрэбіцца ачыстка кэшу браўзера, каб убачыць унесеныя змяненні. \n*<strong>Firefox / Safari:</strong> націсніце <em>Reload</em>, утрымліваючы <em>Shift</em>, або націсніце <em>Ctrl-F5</em> ці <em>Ctrl-R</em> (<em>⌘-R</em> на Макінтошах)\n* <strong>Google Chrome</strong>: Націсніце <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> на Mac)\n* <strong>Internet Explorer</strong>: націсніце <em>Refresh</em>, утрымліваючы <em>Ctrl</em>, або націсніце <em>Ctrl-F5</em>\n* <strong>Opera</strong>: увайдзіце ў настройкі карыстальніка (меню <em>Tools</em>, падпункт <em>Preferences</em>), там ачысціце кэш;",
        "usercssyoucanpreview": "'''Парада:''' Карыстайцеся кнопкай \"''{{int:showpreview}}''\" для выпрабоўвання новага коду CSS ''перад тым'', як яго запісваць.",
        "userjsyoucanpreview": "'''Парада:''' Карыстайцеся кнопкай \"''{{int:showpreview}}''\" для выпрабоўвання новага коду JS ''перад тым'', як яго запісваць.",
        "usercsspreview": "'''Памятайце, што гэта толькі папярэдні паказ вашага ўласнага CSS. Праўкі яшчэ не замацаваныя!'''",
        "sitecsspreview": "'''Памятайце, што гэта толькі папярэдні паказ вашага CSS.'''\n'''Праўкі яшчэ не замацаваныя!'''",
        "sitejspreview": "'''Памятайце, што гэта толькі папярэдні паказ вашага JavaScript.'''\n'''Праўкі яшчэ не замацаваныя!'''",
        "userinvalidcssjstitle": "'''Увага:''' Няма вокладкі з назвай \"$1\". Памятайце, што свае старонкі .css і .js называюцца толькі малымі літарамі, такім чынам, напр., {{ns:user}}:Foo/vector.css, а не {{ns:user}}:Foo/Vector.css.",
-       "updated": "(абноўлена)",
-       "note": "'''Заўвага:'''",
-       "previewnote": "'''Памятайце, гэта папярэдні паказ; праўкі яшчэ не замацаваныя!'''",
+       "updated": "(Ð\90бноўлена)",
+       "note": "<strong>Заўвага:</strong>",
+       "previewnote": "<strong>Памятайце, гэта толькі папярэдні паказ.</strong> Праўкі яшчэ не замацаваныя!",
        "continue-editing": "Працягнуць рэдагаванне",
        "previewconflict": "Гэта папярэдні паказ магчымага выніку замацоўвання актуальнага стану крынічнага тэксту ў верхнім тэкставым полі.",
        "session_fail_preview": "'''Не ўдалося апрацаваць вашую праўку, таму што сервер згубіў звесткі аб вашым сеансе.\nПаспрабуйце, калі ласка, ізноў. Калі і тады не атрымаецца, паспрабуйце [[Special:UserLogout|выйсці з сістэмы]] і зайсці ізноў.'''",
        "session_fail_preview_html": "'''Не ўдалося апрацаваць вашую праўку з-за таго, што згубіліся даныя аб сеансе.'''\n\n''Перадпаказ не зроблены, бо на пляцоўцы {{SITENAME}} дазволены сыры код HTML, што робіць магчымымі атакі праз Яваскрыпт.''\n\n'''Калі гэта нармальная спроба праўкі, паспрабуйце паўтарыць запісванне. Калі і гэта не дапаможа, паспрабуйце [[Special:UserLogout|выйсці з сістэмы]] і ўвайсці ізноў.'''",
        "token_suffix_mismatch": "'''Ваша праўка была адхілена, каб пазбегнуць сапсавання тэксту старонкі, таму што ваш браўзер папсаваў знакі прыпынку ў квітку праўкі.\nМагчыма, прычына ў выкарыстанні вамі ананімнага проксі-сервера, праграмы якога працуюць некарэктна.'''",
        "edit_form_incomplete": "'''Некаторыя часткі формы рэдагавання не дасягнулі сервера. Упэўніцеся, што Вашыя рэдагаванні не пашкоджаныя і паспрабуйце зноў.'''",
-       "editing": "Правім: $1",
+       "editing": "Правім $1",
        "creating": "Стварэнне старонкі «$1»",
        "editingsection": "Правім $1 (раздзел)",
        "editingcomment": "Правім $1 (новы раздзел)",
        "copyrightwarning": "Заўважце, што ўсе ўклады на {{SITENAME}} лічацца выданымі на ўмовах $2 (бач падрабязнасці на $1). Калі вы не жадаеце, каб вашыя матэрыялы бязлітасна правіліся, і свабодна распаўсюджваліся, то і не аддавайце іх сюды.<br />\nТаксама вы нам абяцаеце, што напісалі гэта самі, або скапіравалі з рэсурсу, які знаходзіцца ў публічнай уласнасці, або з аналагічнага свабоднага рэсурсу.\n'''НЕ КЛАДЗІЦЕ СЮДЫ, БЕЗ АДПАВЕДНАГА ДАЗВОЛУ, МАТЭРЫЯЛУ, ЯКІ АХОЎВАЕЦЦА АЎТАРСКІМ ПРАВАМ!'''",
        "copyrightwarning2": "Заўважце, што кожны ўклад на {{SITENAME}} можа быць папраўлены, зменены або выдалены іншымі ўдзельнікамі. Калі вы не жадаеце, каб вашыя матэрыялы бязлітасна правіліся, то і не давайце іх сюды.<br />\nТаксама вы нам абяцаеце, што напісалі гэта самі, або скапіравалі з рэсурсу, які знаходзіцца ў публічнай уласнасці, або з аналагічнага свабоднага рэсурсу (бач падрабязнасці на $1).\n'''НЕ КЛАДЗІЦЕ СЮДЫ, БЕЗ АДПАВЕДНАГА ДАЗВОЛУ, МАТЭРЫЯЛУ, ЯКІ АХОЎВАЕЦЦА АЎТАРСКІМ ПРАВАМ!'''",
        "longpageerror": "'''Памылка: Аб’ём тэксту, які Вы спрабуеце запісаць складае $1 {{PLURAL:$1|кілабайт|кілабайты|кілабайтаў}}, што болей устаноўленага абмежавання на $2 {{PLURAL:$2|кілабайт|кілабайты|кілабайтаў}}.'''\nСтаронка не можа быць захаваная.",
-       "readonlywarning": "'''УВАГА: зараз вы не можаце запісаць свае праўкі, таму што база даных зачынена на абслугоўванне. Магчыма, варта перанесці ваш тэкст у асобны файл і запісаць на потым.\n\nАдміністратар, які зачыніў базу, растлумачыў гэта так: $1'''",
+       "readonlywarning": "<strong>Увага: зараз вы не можаце запісаць свае праўкі, таму што база звестак зачынена на абслугоўванне.</strong>\nМагчыма, варта перанесці ваш тэкст у асобны файл і запісаць на потым.\n\nАдміністратар, які зачыніў базу, растлумачыў гэта так: $1",
        "protectedpagewarning": "'''УВАГА: старонка пастаўленая пад ахову, таму яе могуць правіць толькі адміністратары.'''\nНіжэй паказаны апошні запіс з адпаведнага журналу:",
        "semiprotectedpagewarning": "'''Увага:''' старонка пастаўленая пад ахову, таму яе могуць правіць толькі рэгістраваныя ўдзельнікі («паў-ахова»). Ніжэй паказаны апошні запіс з адпаведнага журналу:",
        "cascadeprotectedwarning": "'''Увага:''' гэтая старонка ахоўваецца, таму яе могуць правіць толькі ўдзельнікі з правамі адміністратара. Прычына аховы: улучэнне гэтай старонкі ў {{PLURAL:$1|старонку, якая стаіць|старонкі, якія стаяць}} пад каскаднай аховай:",
        "template-semiprotected": "(часткова ахоўвацца)",
        "hiddencategories": "Старонка належыць да {{PLURAL:$1|1 схаванай катэгорыі|$1 схаваных катэгорый}}:",
        "nocreatetext": "На пляцоўцы {{SITENAME}} магчымасці стварэння новых старонак абмежаваныя.\nВы можаце папрацаваць з існуючай старонкай, або [[Special:UserLogin|увайсці ў сістэму, або завесці сабе рахунак]].",
-       "nocreate-loggedin": "Ð\92ам Ð½Ðµ Ð´Ð°Ð·Ð²Ð¾Ð»ÐµÐ½Ð° Ñ\81Ñ\82ваÑ\80аÑ\86Ñ\8c Ð½Ð¾Ð²Ñ\8bÑ\85 Ñ\81Ñ\82аÑ\80онак.",
-       "sectioneditnotsupported-title": "РÑ\8dдагаванне раздзелу не падтрымліваецца",
-       "sectioneditnotsupported-text": "РÑ\8dдагаванне Ñ\81екÑ\86Ñ\8bÑ\96 не падтрымліваецца на гэтай старонцы.",
-       "permissionserrors": "Памылкі дазволаў",
+       "nocreate-loggedin": "Ð\92ам Ð½Ðµ Ð´Ð°Ð·Ð²Ð¾Ð»ÐµÐ½Ð° Ñ\81Ñ\82ваÑ\80аÑ\86Ñ\8c Ð½Ð¾Ð²Ñ\8bÑ\8f Ñ\81Ñ\82аÑ\80онкÑ\96.",
+       "sectioneditnotsupported-title": "Ð\9fÑ\80аÑ\9eка раздзелу не падтрымліваецца",
+       "sectioneditnotsupported-text": "Ð\9fÑ\80аÑ\9eка Ñ\80аздзелÑ\83 не падтрымліваецца на гэтай старонцы.",
+       "permissionserrors": "Памылка доступу",
        "permissionserrorstext": "Вам не дазволена гэтага рабіць, з наступн{{PLURAL:$1|ай прычыны|ых прычын}}:",
        "permissionserrorstext-withaction": "Вам не дазволена $2, з-за наступ{{PLURAL:$1|най прычыны|ных прычын}}:",
-       "recreate-moveddeleted-warn": "'''Увага: Вы аднаўляеце старонку, якая раней была сцёрта.'''\n\nТрэба падумаць, ці варта далей працаваць з гэтай старонкай.\nВось журнал сціранняў і пераносаў для гэтай старонкі:",
+       "recreate-moveddeleted-warn": "<strong>Увага: Вы аднаўляеце старонку, якая раней была сцёрта.</strong>\n\nТрэба падумаць, ці варта далей працаваць з гэтай старонкай.\nВось журнал сціранняў і пераносаў для гэтай старонкі:",
        "moveddeleted-notice": "Гэтая старонка была сцёртая.\nНіжэй паказаны журнал сціранняў і пераносаў для гэтай старонкі.",
        "log-fulllog": "Паглядзець поўны лог",
        "edit-hook-aborted": "Праўка спынена хукам (hook).\nТлумачэнняў не было.",
        "edit-gone-missing": "Не ўдалося абнавіць старонку.\nЗдаецца, што яна была сцёртая.",
        "edit-conflict": "Канфлікт правак.",
        "edit-no-change": "Вашая праўка была праігнараваная, таму што не мяняўся тэкст.",
-       "postedit-confirmation-saved": "Вашая праўка была захаваная.",
+       "postedit-confirmation-created": "Створана старонка.",
+       "postedit-confirmation-restored": "Старонка адноўлена.",
+       "postedit-confirmation-saved": "Ваша праўка запісана.",
        "edit-already-exists": "Не ўдалося стварыць новую старонку.\nТакая ўжо існуе.",
+       "defaultmessagetext": "Прадвызначаны тэкст",
+       "content-failed-to-parse": "Не ўдалося прааналізаваць змест \"$2\" як $1: $3",
+       "invalid-content-data": "Недапушчальнае змесціва",
+       "content-not-allowed-here": "\"$1\" не дазволены на старонцы [[$2]]",
        "editwarning-warning": "Пераход на іншую старонку можа прывесці да страты правак, зробленых Вамі. \nКалі Вы ўвайшлі ў сістэму, Вы можаце адключыць гэта папярэджанне ў раздзеле \"{{int:prefs-editing}}\" Вашых настроек.",
+       "editpage-notsupportedcontentformat-title": "Фармат змесціва не падтрымліваецца",
        "content-model-wikitext": "вікі-тэкст",
        "content-model-text": "звычайны тэкст",
        "content-model-javascript": "JavaScript",
        "undo-failure": "Немагчыма адкаціць праўку, таму што перашкаджаюць праўкі, што былі перад ёй.",
        "undo-norev": "Не ўдалося адкаціць праўку, таму што яна не існуе або была сцёрта.",
        "undo-summary": "Адкат версіі $1 аўтарства [[Special:Contributions/$2|$2]] ([[User talk:$2|размова]])",
+       "undo-summary-username-hidden": "Адкат версіі $1 схаванага ўдзельніка",
        "cantcreateaccounttitle": "Немагчыма стварыць рахунак",
        "cantcreateaccount-text": "Стварэнне рахункаў было забаронена для гэтага адрасу IP ('''$1''').\n\nЗабарона зроблена ўдзельнікам [[User:$3|$3]], з такім тлумачэннем: ''$2''",
        "viewpagelogs": "Паказаць журналы для гэтай старонкі",
        "currentrev": "Актуальная версія",
        "currentrev-asof": "Актуальная версія на $1",
        "revisionasof": "Версія ад $1",
-       "revision-info": "Версія ад $1, аўтар $2",
+       "revision-info": "Версія ад $1, аўтар {{GENDER:$6|$2}}$7",
        "previousrevision": "← Папярэдн. версія",
        "nextrevision": "Навейшая версія →",
        "currentrevisionlink": "Актуальная версія",
        "histlegend": "Выбар розніцы: адзначце радыё-боксы версій, якія трэба параўнаць і націсніце enter або кнопку, што ўнізе.<br /> Тлумачэнне: (з актуальн.) = розніца з актуальнай версіяй, (з папярэд.) = розніца з папярэдняй версіяй, д = дробная праўка.",
        "history-fieldset-title": "Прагляд гісторыі",
        "history-show-deleted": "Толькі выдаленыя",
-       "histfirst": "Самае Ñ\81Ñ\82аÑ\80ое",
-       "histlast": "Самае Ð½Ð¾Ð²Ð°Ðµ",
-       "historysize": "({{PLURAL:$1|1 байт|$1 байтаў}})",
+       "histfirst": "найÑ\81Ñ\82аÑ\80Ñ\8dйÑ\88Ñ\8bÑ\8f",
+       "histlast": "найноÑ\9eÑ\88Ñ\8bÑ\8f",
+       "historysize": "({{PLURAL:$1|1 байт|$1 байты|$1 байтаў}})",
        "historyempty": "(пуста)",
        "history-feed-title": "Гісторыя версій",
        "history-feed-description": "Гісторыя версій гэтай старонкі",
        "rev-deleted-diff-view": "Адна з версій гэтага параўнання версій была' ''выдалена'''.\nВы можаце прагледзець гэта параўнанне, падрабязнасці могуць быць паказаны ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале сцірання].",
        "rev-suppressed-diff-view": "Адна з версій гэтага параўнання версій была '''схаваная'''.\nВы можаце прагледзець гэта параўнанне, падрабязнасці могуць быць паказаны ў [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале ўтойвання].",
        "rev-delundel": "паказаць/схаваць",
-       "rev-showdeleted": "Ð\9fаказаць",
+       "rev-showdeleted": "паказаць",
        "revisiondelete": "Сцерці/аднавіць версіі",
        "revdelete-nooldid-title": "Недапушчальная мэтавая версія",
        "revdelete-nooldid-text": "Не выбрана мэтавая версія (ці версіі) дзеля выканання гэтай функцыі, азначаная версія не існуе, або вы спрабуеце схаваць актуальную версію.",
        "revdelete-no-file": "Пазначаны файл не існуе.",
        "revdelete-show-file-confirm": "Ці сапраўды паказаць сцёртую версію файла \"<nowiki>$1</nowiki>\" ($2 $3)?",
        "revdelete-show-file-submit": "Так",
+       "revdelete-selected-text": "{{PLURAL:$1|Выбраная версія|Выбраныя версіі}} [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Выбраная версія файла|Выбраныя версіі файла}} [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Выбраны запіс|Выбраныя запісы}} журналу:",
+       "revdelete-text-text": "Сцёртыя версіі будуць па-ранейшаму паказвацца ў гісторыі старонкі, але частка іх зместу будзе недаступна для грамадскасці.",
+       "revdelete-text-file": "Сцёртыя версіі файла будуць па-ранейшаму паказвацца ў гісторыі файла, але частка іх зместу будзе недаступна для грамадскасці.",
+       "logdelete-text": "Сцёртыя запісы журнала будуць па-ранейшаму паказвацца ў журналах, але частка іх зместу будзе недаступна для грамадскасці.",
+       "revdelete-text-others": "Іншыя адміністратары пляцоўкі {{SITENAME}} будуць па-ранейшаму мець доступ да схаванага зместу і змогуць аднавіць яго праз гэты самы інтэрфейс, калі не ўстанавіць дадатковыя абмежаванні.",
        "revdelete-confirm": "Пацвердзіце, што вы жадаеце гэта зрабіць, што вы разумееце наступствы, і што вы робіце гэта ў адпаведнасці з [[{{MediaWiki:Policy-url}}|арганізацыйнымі правіламі]].",
-       "revdelete-suppress-text": "Заглушэнне належыць ужываць '''выключна''' ў наступных выпадках:\n* Недапушчальная асабістая інфармацыя\n*: ''хатнія адрасы і тэлефоны, нумары страхавання і г.д.''",
+       "revdelete-suppress-text": "Заглушэнне належыць ужываць <strong>выключна</strong> ў наступных выпадках:\n* патэнцыяльна паклёпніцкія звесткі\n* недапушчальная асабістая інфармацыя\n*: <em>хатнія адрасы і тэлефоны, нумары страхавання і г.д.</em>",
        "revdelete-legend": "Настроіць абмежаванні бачнасці",
-       "revdelete-hide-text": "Ð\9dе Ð¿Ð°ÐºÐ°Ð·Ð²Ð°Ñ\86Ñ\8c Ñ\82экст версіі",
+       "revdelete-hide-text": "Тэкст версіі",
        "revdelete-hide-image": "Схаваць змест файла",
        "revdelete-hide-name": "Не паказваць дзеяння і мэты",
-       "revdelete-hide-comment": "Ð\9dе Ð¿Ð°ÐºÐ°Ð·Ð²Ð°Ñ\86Ñ\8c Ñ\82лÑ\83маÑ\87Ñ\8dннÑ\8f праўкі",
-       "revdelete-hide-user": "Ð\9dе Ð¿Ð°ÐºÐ°Ð·Ð²Ð°Ñ\86Ñ\8c Ñ\9eдзелÑ\8cнага Ñ\96мÑ\8f Ð°Ñ\9eÑ\82аÑ\80а Ð°Ð±Ð¾ Ñ\8fго адрас IP",
+       "revdelete-hide-comment": "ТлÑ\83маÑ\87Ñ\8dнне праўкі",
+       "revdelete-hide-user": "Ð\86мÑ\8f Ñ\9eдзелÑ\8cнÑ\96ка /адрас IP",
        "revdelete-hide-restricted": "Таксама абмяжоўваць такім чынам адміністратараў",
        "revdelete-radio-same": "(не мяняць)",
-       "revdelete-radio-set": "Так",
-       "revdelete-radio-unset": "Ð\9dе",
+       "revdelete-radio-set": "СÑ\85аванÑ\8b",
+       "revdelete-radio-unset": "Ð\91аÑ\87нÑ\8b",
        "revdelete-suppress": "Прыпыняць* звесткі ад адміністратараў таксама",
        "revdelete-unsuppress": "Зняць абмежаванні на адноўленыя версіі",
        "revdelete-log": "Прычына:",
        "revdelete-submit": "Прымяніць да азначан{{PLURAL:$1|ай ерсіі|ых версій}}",
-       "revdelete-success": "'''Паспяхова абноўлена бачнасць версіі.'''",
+       "revdelete-success": "<strong>Паспяхова абноўлена бачнасць версіі.</strong>",
        "revdelete-failure": "'''Не ўдалося абнавіць бачнасць версіі:'''\n$1",
        "logdelete-success": "'''Бачнасць падзеі настаўленая паспяхова.'''",
        "logdelete-failure": "'''Бачнасць журнала не ўсталявана:'''\n$1",
-       "revdel-restore": "Ð\9fамяняць бачнасць",
+       "revdel-restore": "памяняць бачнасць",
        "pagehist": "Гісторыя старонкі",
        "deletedhist": "Сцёртая гісторыя",
        "revdelete-hide-current": "Памылка пры скрыванні складніка з датай $2, $1: таму што гэта актуальная версія, \nа яе немагчыма скрываць.",
        "revdelete-no-change": "'''Увага:''' для складніка з датай $2, $1 патрэбная бачнасць ужо настаўленая.",
        "revdelete-concurrent-change": "Памылка пры змяненні складніка з датай $2, $1: стан складніка, здаецца, быў зменены некім іншым, пакуль вы спрабавалі змяніць складнік.\nПраверце журналы.",
        "revdelete-only-restricted": "Памылка пры скрыванні складніка з датай $2, $1: вы не можаце скрываць складнікі ад адміністратараў, не выбраўшы яшчэ хоць адну з іншых магчымасцяў.",
-       "revdelete-reason-dropdown": "* Найбольш распаўсюджаныя прычыны выдалення \n ** Парушэнне аўтарскіх правоў \n ** Неадпаведная асабістая інфармацыя \n ** Патэнцыйна ілжывая інфармацыя",
+       "revdelete-reason-dropdown": "* Найбольш распаўсюджаныя прычыны выдалення\n** Парушэнне аўтарскіх правоў\n** Неадпаведны каментарый ці асабістая інфармацыя\n** Недапушчальнае імя ўдзельніка\n** Патэнцыйна ілжывая інфармацыя",
        "revdelete-otherreason": "Іншая/дадатковая прычына:",
        "revdelete-reasonotherlist": "Іншая прычына",
        "revdelete-edit-reasonlist": "Правіць прычыны сцірання",
-       "revdelete-offender": "Аўтар праўкі",
+       "revdelete-offender": "Аўтар праўкі:",
        "suppressionlog": "Журнал падаўленняў",
-       "suppressionlogtext": "Ніжэй пералічаныя сціранні і блокі, якія датычаць зместу, скрытага ад адміністратараў.\nБач актуальныя забароны і блокі ў [[Special:BlockList|IP block list]].",
+       "suppressionlogtext": "Ніжэй пералічаныя сціранні і блокі, якія датычаць зместу, скрытага ад адміністратараў.\nБач актуальныя забароны і блокі ў [[Special:BlockList|спісе блакавання]].",
        "mergehistory": "Аб'яднаць гісторыі старонак",
        "mergehistory-header": "Тут можна аб'ядноўваць версіі з гісторыі адной старонкі ў іншую, навейшую старонку.\nТрэба спачатку ўпэўніцца, што такое дзеянне не парушыць гістарычнай паслядоўнасці версій.",
        "mergehistory-box": "Аб'яднаць версіі дзвюх старонак:",
        "revertmerge": "Адкаціць аб'яднанне",
        "mergelogpagetext": "Ніжэй паказаны пералік самых нядаўніх аб'яднанняў гісторый старонак.",
        "history-title": "Гісторыя версій \"$1\"",
+       "difference-title": "Розніца паміж версіямі \"$1\"",
+       "difference-title-multipage": "Розніца між старонкамі \"$1\" і \"$2\"",
        "difference-multipage": "(Розніца паміж старонкамі)",
        "lineno": "Радок $1:",
        "compareselectedversions": "Параўнаць азначаныя версіі",
        "showhideselectedversions": "Паказаць/схаваць выбраныя версіі",
        "editundo": "адкат",
+       "diff-empty": "(Няма розніцы)",
+       "diff-multi-sameuser": "(Не паказана{{PLURAL:$1|адна прамежкавая версія|$1 прамежкавыя версіі|$1 прамежкавых версій}} таго ж удзельніка)",
+       "diff-multi-otherusers": "(Не паказана {{PLURAL:$1|адна прамежкавая версія|$1 прамежкавыя версіі|$1 прамежкавых версій}} {{PLURAL:$2|яшчэ аднаго ўдзельніка|$2 удзельнікаў}})",
        "diff-multi-manyusers": "({{PLURAL:$1|не паказана $1 прамежкавая версія|не паказаны $1 прамежкавыя версіі|не паказаны $1 прамежкавых версій}}, зробленыя больш чым {{PLURAL:$2|$1 удзельнікам|$2 удзельнікамі}})",
        "searchresults": "Вынікі пошуку",
        "searchresults-title": "Вынікі пошуку «$1»",
-       "toomanymatches": "Знойдзена занадта шмат адпаведнасцяў, паспрабуйце змяніць шуканае.",
        "titlematches": "Знойдзена ў назвах",
        "textmatches": "Знойдзена ў тэкстах",
        "notextmatches": "Нічога не знойдзена ў тэкстах старонак",
        "shown-title": "Паказваць $1 {{PLURAL:$1|вынік|вынікі(аў)}} на старонку",
        "viewprevnext": "Гл. ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''На вікі ёсць старонка \"[[:$1]]\"'''",
-       "searchmenu-new": "'''Стварыць на гэтай вікі старонку \"[[:$1]]\"'''",
+       "searchmenu-new": "<strong>Стварыць на гэтай вікі старонку \"[[:$1]]\"</strong> {{PLURAL:$2|0=|Гл. таксама вынікі пошуку.|Гл. таксама вынік пошуку.}}",
        "searchprofile-articles": "Артыкулы",
-       "searchprofile-project": "Старонкі даведкі і праекта",
        "searchprofile-images": "Мультымедыя",
        "searchprofile-everything": "Усё",
        "searchprofile-advanced": "Складана",
        "searchprofile-articles-tooltip": "Шукаць у $1",
-       "searchprofile-project-tooltip": "Шукаць у $1",
        "searchprofile-images-tooltip": "Шукаць файлы",
        "searchprofile-everything-tooltip": "Шукаць паўсюль (таксама ў размовах)",
        "searchprofile-advanced-tooltip": "Шукаць у дадатковых прасторах назваў",
-       "search-result-size": "$1 ({{PLURAL:$2|1 слова|$2 словаў}})",
+       "search-result-size": "$1 ({{PLURAL:$2|1 слова|$2 словы|$2 словаў}})",
        "search-result-category-size": "{{PLURAL:$1|$1 элемент|$1 элемента|$1 элементаў}} ({{PLURAL:$2|$2 падкатэгорыя|$2 падкатэгорыі|$2 падкатэгорый}}, {{PLURAL:$3|$3 файл|$3 файла|$3 файлаў}})",
        "search-result-score": "Адпаведнасць: $1%",
        "search-redirect": "(перасылка $1)",
        "search-section": "(падраздзел $1)",
+       "search-file-match": "(адпавядае змесціву файла)",
        "search-suggest": "Ці хацелі вы сказаць: $1",
        "search-interwiki-caption": "Сумежныя праекты",
-       "search-interwiki-default": "вынікі з $1:",
+       "search-interwiki-default": "Ð\92ынікі з $1:",
        "search-interwiki-more": "(яшчэ)",
        "search-relatedarticle": "Дачыняюцца*",
-       "searcheverything-enable": "Пошук ва ўсіх прасторах назваў",
        "searchrelated": "маюць дачыненне",
        "searchall": "усе",
        "showingresults": "Ніжэй паказаны да {{PLURAL:$1|'''$1''' выніку|'''$1''' вынікаў}}, пачынаючы з нумару '''$2'''.",
+       "showingresultsinrange": "Ніжэй паказаны да {{PLURAL:$1|<strong>1</strong> выніку|<strong>$1</strong> вынікаў}} у дыяпазоне ад #<strong>$2</strong> да #<strong>$3</strong>.",
        "showingresultsnum": "Ніжэй паказаны{{PLURAL:$3| '''1''' вынік|я '''$3''' вынікаў}}, пачынаючы з нумару #'''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|Вынік '''$1''' из '''$3'''|Вынікі '''$1 — $2''' из '''$3'''}} для '''$4'''",
        "search-nonefound": "Нічога не было знойдзена.",
        "powersearch-togglelabel": "Праверце:",
        "powersearch-toggleall": "Усе",
        "powersearch-togglenone": "Няма",
+       "powersearch-remember": "Запомніць выбар для наступных пошукаў",
        "search-external": "Вонкавы пошук",
        "searchdisabled": "Функцыя пошуку {{SITENAME}} не працуе. Тымчасова можна шукаць з дапамогай Google. Заўважце, што тамтэйшыя індэксы зместу {{SITENAME}} могуць не быць актуальнымі.",
+       "search-error": "Памылка пошуку: $1",
        "preferences": "Настройкі",
        "mypreferences": "Настройкі",
        "prefs-edits": "Колькасць правак:",
+       "prefsnologintext2": "Трэба $1, каб мяняць свае настройкі.",
        "prefs-skin": "Вокладка",
-       "skin-preview": "перадпаказ",
+       "skin-preview": "Ð\9fерадпаказ",
        "datedefault": "Не вызначана",
        "prefs-labs": "Эксперыментальныя магчымасці",
+       "prefs-user-pages": "Старонкі ўдзельнікаў",
        "prefs-personal": "Удзельнік",
        "prefs-rc": "{{:{{ns:mediawiki}}:Recentchanges/be}}",
        "prefs-watchlist": "Спіс назірання",
        "prefs-watchlist-days": "За колькі дзён паказваць змяненні ў назіраным:",
-       "prefs-watchlist-days-max": "(найбольш $1 {{PLURAL:$1|дзень|дзён}})",
+       "prefs-watchlist-days-max": "(найболÑ\8cÑ\88 $1 {{PLURAL:$1|дзенÑ\8c|днÑ\96|дзÑ\91н}})",
        "prefs-watchlist-edits": "Колькасць правак для паказу ў разгорнутым выглядзе:",
        "prefs-watchlist-edits-max": "Максімум: 1000",
        "prefs-watchlist-token": "Сакрэтны ключ для RSS:",
        "prefs-email": "Эл.пошта",
        "prefs-rendering": "Від",
        "saveprefs": "Запісаць",
-       "restoreprefs": "Аднавіць усе прадвызначэнні",
+       "restoreprefs": "Аднавіць усе прадвызначэнні (ва ўсіх раздзелах)",
        "prefs-editing": "Праца",
        "rows": "Радкі:",
        "columns": "Калонкі:",
        "allowemail": "Атрымліваць эл.пошту ад іншых удзельнікаў",
        "prefs-searchoptions": "Магчымасці пошуку",
        "prefs-namespaces": "Прасторы назваў",
-       "defaultns": "Іначай шукаць у гэтых прасторах назваў:",
        "default": "прадвызначэнні",
        "prefs-files": "Файлы",
        "prefs-custom-css": "Уласны CSS",
        "prefs-reset-intro": "Тут можна вярнуць свае настройкі да прадвызначэнняў, прынятых на гэтай пляцоўцы.\nАдкаціць гэтае дзеянне нельга.",
        "prefs-emailconfirm-label": "Пацверджанне адрасу эл.пошты:",
        "youremail": "Эл.пошта *",
-       "username": "Імя ўдзельніка:",
+       "username": "Імя {{GENDER:$1|ўдзельніка|ўдзельніцы}}:",
        "prefs-memberingroups": "Уваходзіць у {{PLURAL:$1|групу|групы}}:",
        "prefs-registration": "Час рэгістрацыі:",
        "yourrealname": "Сапраўднае імя:",
        "prefs-dateformat": "Фармат даты",
        "prefs-timeoffset": "Часавы пояс",
        "prefs-advancedediting": "Агульныя настройкі",
+       "prefs-editor": "Рэдактар",
+       "prefs-preview": "Перадпаказ",
        "prefs-advancedrc": "Пашыраныя настройкі",
        "prefs-advancedrendering": "Пашыраныя настройкі",
        "prefs-advancedsearchoptions": "Пашыраныя настройкі",
        "prefs-advancedwatchlist": "Пашыраныя настройкі",
        "prefs-displayrc": "Паказ",
        "prefs-displaywatchlist": "Паказ",
+       "prefs-tokenwatchlist": "Токен",
        "prefs-diffs": "Розніцы",
+       "prefs-help-prefershttps": "Гэта настройка пачне дзейнічаць па наступным уваходзе ў сістэму.",
+       "prefs-tabs-navigation-hint": "Падказка: Вы можаце карыстацца клавішамі са стрэлкамі ўлева і ўправа для навігацыі паміж карткамі ў спісе картак.",
        "email-address-validity-valid": "Адрас электроннай пошты з'яўляецца сапраўдным",
        "email-address-validity-invalid": "Увядзіце слушны адрас электроннай пошты",
        "userrights": "Распараджэнне правамі ўдзельніка",
        "userrights-no-interwiki": "Вам не дазволена мяняць дазволаў карыстальнікам на іншых Вікі-ах.",
        "userrights-nodatabase": "Не знойдзена тут, або не існуе база даных $1.",
        "userrights-nologin": "Належыць [[Special:UserLogin|увайсці ў сістэму]] на рахунак адміністратара, каб прызначаць дазволы ўдзельнікам.",
-       "userrights-notallowed": "Ð\97 Ð²Ð°Ñ\88ага Ñ\9eлÑ\96ковага Ð·Ð°Ð¿Ñ\96Ñ\81Ñ\83 Ð½Ðµ Ð´Ð°Ð·Ð²Ð¾Ð»ÐµÐ½Ð° Ð´Ð°Ð´Ð°Ð²Ð°Ñ\86Ñ\8c і выдаляць правы ўдзельнікаў.",
+       "userrights-notallowed": "Ð\92ам Ð½Ðµ Ð´Ð°Ð·Ð²Ð¾Ð»ÐµÐ½Ð° Ð´Ð°Ð´Ð°Ð²Ð°Ñ\86Ñ\8c Ñ\86і выдаляць правы ўдзельнікаў.",
        "userrights-changeable-col": "Групы, якія вам дазволена мяняць",
        "userrights-unchangeable-col": "Групы, якія вам не дазволена мяняць",
+       "userrights-conflict": "Канфлікт змянення ўдзельніцкіх дазволаў! Калі ласка, праверце і пацвердзіце змены.",
+       "userrights-removed-self": "Вы паспяхова выдалілі свае ўласныя правы. Такім чынам, Вы больш не зможаце атрымаць доступ да гэтай старонкі.",
        "group": "Група:",
        "group-user": "Удзельнікі",
        "group-autoconfirmed": "Аўта-пацверджаныя ўдзельнікі",
        "right-move": "Пераносіць старонкі",
        "right-move-subpages": "Пераносіць старонкі разам з пад-старонкамі",
        "right-move-rootuserpages": "Пераносіць каранёвыя старонкі ўдзельнікаў",
+       "right-move-categorypages": "Пераносіць старонкі катэгорый",
        "right-movefile": "Пераносіць файлы",
        "right-suppressredirect": "Не пакідаць перасылку са старой назвы пасля пераносу старонкі",
        "right-upload": "Укладваць файлы",
        "right-reupload-shared": "Перамагаць файлы з агульнага сховішча тутэйшымі файламі",
        "right-upload_by_url": "Укладваць файл з сеціўнага адрасу (URL)",
        "right-purge": "Чысціць кэш пляцоўкі для старонкі без пацверджання",
-       "right-autoconfirmed": "Ð\9fÑ\80авÑ\96Ñ\86Ñ\8c Ñ\81Ñ\82аÑ\80онкÑ\96 Ð·-пад Ñ\87аÑ\81Ñ\82ковай Ð°Ñ\85овÑ\8b",
+       "right-autoconfirmed": "Ð\9dе Ð¿Ð°Ð´Ð¿Ð°Ñ\80адкоÑ\9eваÑ\86Ñ\86а Ð°Ð±Ð¼ÐµÐ¶Ð°Ð²Ð°Ð½Ð½Ñ\8fм Ñ\85Ñ\83Ñ\82каÑ\81Ñ\86Ñ\96, Ð½Ð°ÐºÐ»Ð°Ð´Ð·ÐµÐ½Ñ\8bм Ð½Ð° IP",
        "right-bot": "Лічыцца аўтаматычным працэсам",
        "right-nominornewtalk": "Не паведамляць пра новыя паведамленні ў адказ на дробныя праўкі размоўных старонак",
        "right-apihighlimits": "Карыстацца вышэйшымі лімітамі ў API-зваротах",
        "right-writeapi": "Карыстацца праграмным інтэрфейсам запісу (write API)",
        "right-delete": "Сціраць старонкі",
        "right-bigdelete": "Сціраць старонкі з вялікімі гісторыямі",
+       "right-deletelogentry": "Сціраць і аднаўляць асобныя запісы журналаў",
        "right-deleterevision": "Сціраць і аднаўляць паасобныя версіі старонак",
        "right-deletedhistory": "Чытаць сцёртыя складнікі гісторыі без іх прывязанага тэксту",
        "right-deletedtext": "Адкрыць выдалены тэкст і ўсе змены паміж выдаленымі версіямі",
        "right-hideuser": "Забараняць імя ўдзельніка і рабіць яго нябачным",
        "right-ipblock-exempt": "Перамагаць забароны на IP, аўта- і дыяпазонныя забароны",
        "right-proxyunbannable": "Перамагаць аўтаматычныя забароны на проксі",
-       "right-unblockself": "Разблакаваць іх",
-       "right-protect": "Мяняць узроўні аховы і правіць старонкі, што пад аховай",
-       "right-editprotected": "Правіць старонкі, што пад аховай (але без каскаднай аховы)",
+       "right-unblockself": "Разблакаваць сябе",
+       "right-protect": "Мяняць узроўні аховы і правіць старонкі пад каскаднай аховай",
+       "right-editprotected": "Правіць старонкі пад аховай \"{{int:protect-level-sysop}}\"",
+       "right-editsemiprotected": "Правіць старонкі, што пад аховай \"{{int:protect-level-autoconfirmed}}\"",
        "right-editinterface": "Правіць карыстальніцкі інтэрфейс",
        "right-editusercssjs": "Правіць файлы CSS і JS іншых удзельнікаў",
        "right-editusercss": "Правіць файлы CSS іншых удзельнікаў",
        "right-edituserjs": "Правіць файлы JS іншых удзельнікаў",
+       "right-editmyusercss": "Правіць уласныя файлы CSS",
+       "right-editmyuserjs": "Правіць уласныя файлы JavaScript",
+       "right-viewmywatchlist": "Глядзець свой спіс назірання",
+       "right-editmywatchlist": "Правіць свой спіс назірання. Заўвага: некаторыя дзеянні будуць дадаваць старонкі нават без гэтага дазволу.",
+       "right-viewmyprivateinfo": "Глядзець свае асабістыя звесткі (напр., адрас эл.пошты, сапраўднае імя)",
+       "right-editmyprivateinfo": "Правіць свае асабістыя звесткі (напр., адрас эл.пошты, сапраўднае імя)",
+       "right-editmyoptions": "Змяняць свае настройкі",
        "right-rollback": "Паскорана адкочваць праўкі апошняга ўдзельніка, які правіў пэўную старонку",
        "right-markbotedits": "Меціць адкочаныя праўкі як праўкі робатаў",
        "right-noratelimit": "Не падпарадкоўвацца абмежаванням хуткасці",
        "action-createpage": "ствараць старонкі",
        "action-createtalk": "ствараць размоўныя старонкі",
        "action-createaccount": "ствараць гэты рахунак удзельніка",
+       "action-history": "глядзець гісторыю гэтай старонкі",
        "action-minoredit": "значыць гэтую праўку як дробную",
        "action-move": "пераносіць гэтую старонку",
        "action-move-subpages": "пераносіць гэтую старонку і яе пад-старонкі",
        "action-move-rootuserpages": "пераносіць каранёвыя старонкі ўдзельнікаў",
+       "action-move-categorypages": "пераносіць старонкі катэгорый",
        "action-movefile": "перанесці гэты файл",
        "action-upload": "укладваць гэты файл",
        "action-reupload": "запісваць паўзверх гэтага файла",
        "action-block": "блакаваць праўкі гэтага ўдзельніка",
        "action-protect": "мяняць узровень аховы гэтай старонкі",
        "action-rollback": "хутка адкаціць змены апошняга карыстальніка, які рэдагаваў старонку",
-       "action-import": "імпартаваць гэтую старонку з іншай вікі",
-       "action-importupload": "імпартаваць гэтую старонку з укладзенага файла",
+       "action-import": "імпартаваць старонкі з іншай вікі",
+       "action-importupload": "імпартаваць старонкі з укладзенага файла",
        "action-patrol": "значыць праўкі іншых як ухваленыя",
        "action-autopatrol": "атрымліваць знак ухваленасці на свае праўкі",
        "action-unwatchedpages": "бачыць спіс неназіраных старонак",
        "action-userrights-interwiki": "мяняць дазволы ўдзельнікаў на іншых вікі",
        "action-siteadmin": "зачыняць і адчыняць базу даных",
        "action-sendemail": "адпраўка электронных пісем",
+       "action-editmywatchlist": "правіць свой спіс назірання",
+       "action-viewmywatchlist": "глядзець свой спіс назірання",
+       "action-viewmyprivateinfo": "бачыць свае асабістыя звесткі",
+       "action-editmyprivateinfo": "правіць свае асабістыя звесткі",
        "nchanges": "$1 {{PLURAL:$1|змена|змены|змен}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|з часу апошняга наведвання}}",
+       "enhancedrc-history": "гісторыя",
        "recentchanges": "Апошнія змены",
        "recentchanges-legend": "Магчымасці паказу",
        "recentchanges-summary": "Гэта апошнія змены на пляцоўцы {{SITENAME}}.",
+       "recentchanges-noresult": "Няма зменаў за дадзены перыяд, якія адпавядаюць гэтым крытэрыям.",
        "recentchanges-feed-description": "Сачыць за найбольш актуальнымі змяненнямі ў віксе праз гэты струмень навін.",
-       "recentchanges-label-newpage": "Ð\93Ñ\8dÑ\82ай Ð¿Ñ\80аÑ\9eкай Ð±Ñ\8bла Ñ\81творана новая старонка",
-       "recentchanges-label-minor": "Ð\93Ñ\8dÑ\82а Ð´робная па значэнні праўка",
-       "recentchanges-label-bot": "Ð\9fÑ\80аÑ\9eка Ð±Ñ\8bла Ð·Ñ\80обленаÑ\8f праграмай-робатам",
+       "recentchanges-label-newpage": "Створана новая старонка",
+       "recentchanges-label-minor": "Ð\94робная па значэнні праўка",
+       "recentchanges-label-bot": "Ð\9fÑ\80аÑ\9eка Ð·Ñ\80облена праграмай-робатам",
        "recentchanges-label-unpatrolled": "Праўка яшчэ не атрымала адзнакі ўхваленасці (за ёй не сочыць \"патруль\")",
-       "recentchanges-legend-newpage": "$1 - новая старонка",
+       "recentchanges-label-plusminus": "Аб'ём старонкі змяніўся на гэтую лічбу байтаў",
+       "recentchanges-legend-heading": "'''Легенда:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (гл. асобна [[Special:NewPages|новыя старонкі]])",
        "rcnotefrom": "Ніжэй знаходзяцца змены з <b>$2</b> (паказана не больш чым <b>$1</b>).",
        "rclistfrom": "Паказаць змены з $3 $2",
        "rcshowhideminor": "$1 дробныя праўкі",
+       "rcshowhideminor-show": "Паказаць",
        "rcshowhideminor-hide": "Схаваць",
        "rcshowhidebots": "$1 робатаў",
        "rcshowhidebots-show": "Паказаць",
        "rclinks": "Паказаць апошнія $1 змен за мінулыя $2 дзён<br />$3",
        "diff": "розн.",
        "hist": "гіст.",
-       "hide": "без Ñ\83лÑ\96кÑ\83",
-       "show": "з Ñ\83лÑ\96кам",
+       "hide": "Ð\9dе Ñ\9eлÑ\96Ñ\87ваÑ\86Ñ\8c",
+       "show": "УлÑ\96Ñ\87ваÑ\86Ñ\8c",
        "minoreditletter": "д",
        "newpageletter": "Н",
        "boteditletter": "р",
-       "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|назіральнік|назіральнікаў}}]",
+       "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|назіральнік|назіральнікі|назіральнікаў}}]",
        "rc_categories": "Абмежаваць катэгорыямі (размяжоўваць знакам \"|\")",
        "rc_categories_any": "Усе",
-       "rc-change-size-new": "$1 {{PLURAL:$1|байт|байта|байтаў}} пасля змены",
+       "rc-change-size-new": "$1 {{PLURAL:$1|байт|байты|байтаў}} пасля змены",
        "newsectionsummary": "/* $1 */ новы падраздзел",
        "rc-enhanced-expand": "Паказаць падрабязнасці",
        "rc-enhanced-hide": "Не паказваць падрабязнасцей",
+       "rc-old-title": "першапачаткова створана як \"$1\"",
        "recentchangeslinked": "Звязаныя праўкі",
        "recentchangeslinked-feed": "Звязаныя праўкі",
        "recentchangeslinked-toolbox": "Звязаныя праўкі",
        "recentchangeslinked-title": "Змяненні, якія датычаць \"$1\"",
-       "recentchangeslinked-summary": "Гэта пералік нядаўніх змяненняў старонак, на якія спасылаецца азначаная старонка, або змяненняў складнікаў азначанай катэгорыі.\nСтаронкі, якія ўваходзяць у [[Special:Watchlist|лік назіраных вамі]], выдзелены '''стылем'''.",
+       "recentchangeslinked-summary": "Гэта пералік нядаўніх змяненняў старонак, на якія спасылаецца азначаная старонка, або змяненняў складнікаў азначанай катэгорыі.\nСтаронкі, якія ўваходзяць у [[Special:Watchlist|лік назіраных вамі]], выдзелены <strong>стылем</strong>.",
        "recentchangeslinked-page": "Назва старонкі:",
        "recentchangeslinked-to": "Паказваць, замест гэтага, змяненні на старонках, што спасылаюцца сюды",
        "upload": "Укласці файл",
        "reuploaddesc": "Спыніць укладанне і вярнуцца да пачатковага фармуляра.",
        "upload-tryagain": "Адправіць змененае апісанне файла",
        "uploadnologin": "Не ў сістэме",
-       "uploadnologintext": "Каб укладваць файлы, трэба [[Special:UserLogin|ўвайсці ў сістэму]].",
+       "uploadnologintext": "Каб укладваць файлы, трэба $1.",
        "upload_directory_missing": "Няма каталога для ўкладаў ($1), і серверу не ўдалося яго стварыць.",
        "upload_directory_read_only": "Немагчыма для веб-сервера запісаць у каталог укладаў ($1).",
        "uploaderror": "Памылка пры ўкладанні",
        "upload-recreate-warning": "'''Увага''': файл з такім імем быў выдалены або перамешчаны.''' \n\nЖурнал выдалення і перамяшчэння гэтай старонкі прыводзіцца тут для зручнасці:",
        "uploadtext": "Тут можна ўкласці файлы ў вікі.\nПрагляд або пошук раней укладзенага [[Special:FileList|робіцца тут]]; апроч таго, усе ўкладанні і сціранні адзначаюцца ў журналах [[Special:Log/upload|укладання]] і [[Special:Log/delete|сцірання]], адпаведна.\n\nКаб уставіць файл ў старонку, ужываецца спасылка, зробленая адным з наступных спосабаў:\n* '''<code><nowiki>[[</nowiki>image<nowiki>:File.jpg]]</nowiki></code>''' паказвае файл у поўным памеры\n*  '''<code><nowiki>[[</nowiki>image<nowiki>:File.png|200px|thumb|left|тлумачальны тэкст]]</nowiki></code>''' паказвае файл, маштабаваны да шырыні 200 кропак, у рамцы, змешчанай злева, і з 'тлумачальным тэкстам' у якасці подпісу\n* '''<code><nowiki>[[</nowiki>media<nowiki>:File.ogg]]</nowiki></code>''' не паказвае самога файла, а толькі спасылку на яго",
        "upload-permitted": "Дазволеныя тыпы файлаў: $1.",
-       "upload-preferred": "Ð\91олÑ\8cÑ\88 Ð¿Ñ\80Ñ\8bймалÑ\8cнÑ\8bÑ\8f Ñ\82Ñ\8bпÑ\8b Ñ\84айлаÑ\9e: $1.",
+       "upload-preferred": "Больш прымальныя тыпы файлаў: $1.",
        "upload-prohibited": "Забароненыя тыпы файлаў: $1.",
        "uploadlogpage": "Журнал укладанняў",
        "uploadlogpagetext": "Ніжэй паказаны спіс [[Special:NewFiles|нядаўна ўкладзеных]] файлаў.",
        "badfilename": "Назва файла зменена на \"$1\".",
        "filetype-mime-mismatch": "Пашырэнне файла (\".$1\") не адпавядае заўважанаму тыпу MIME ($2).",
        "filetype-badmime": "Не дазваляецца ўкладанне файлаў з тыпам MIME \"$1\".",
-       "filetype-bad-ie-mime": "Немагчыма ўкласці гэты файл, таму што  браўзер Internet Explorer будзе пазнаваць яго як \"$1\", а гэта з'яўляецца забароненым і патэнцыйна небяспечным тыпам файлаў.",
+       "filetype-bad-ie-mime": "Немагчыма ўкласці гэты файл, таму што  браўзер Internet Explorer будзе пазнаваць яго як \"$1\", а гэта забаронены і патэнцыйна небяспечны тып файлаў.",
        "filetype-unwanted-type": "'''\".$1\"''' належыць да нежаданых тыпаў файлаў. Пажаданы{{PLURAL:$3| тып файла|я тыпы файлаў}}: $2.",
        "filetype-banned-type": "'''\".$1\"''' {{PLURAL:$4|належыць да недазволенага тыпу файлаў|належаць да недазволеных тыпаў файлаў}}.\nПералік дазволеных тыпаў складаецца з {{PLURAL:$3|тыпа|тыпаў}}: $2.",
        "filetype-missing": "Назва файла без суфіксу (напрыклад, \".jpg\").",
        "largefileserver": "Гэты файл большага аб'ёму, чым дазваляе канфігурацыя сервера.",
        "emptyfile": "Здаецца, што файл, укладзены вамі, пусты. Магчыма, здарылася памылка ў назве файла? Праверце, ці вы сапраўды хацелі ўкласці менавіта гэты файл.",
        "windows-nonascii-filename": "Дадзеная вікі не падтрымлівае імёны файлаў са спецыяльнымі знакамі.",
-       "fileexists": "Ужо Ñ\96Ñ\81нÑ\83е Ñ\84айл Ð· Ñ\82акоÑ\8e назвай, праверце <strong>[[:$1]]</strong>, калі не ўпэўнены, што жадаеце мяняць яго змесціва.\n[[$1|thumb]]",
+       "fileexists": "Ужо Ñ\91Ñ\81Ñ\86Ñ\8c Ñ\84айл Ð· Ñ\82акой назвай, праверце <strong>[[:$1]]</strong>, калі не ўпэўнены, што жадаеце мяняць яго змесціва.\n[[$1|thumb]]",
        "filepageexists": "Для файла з такой назвай існуе старонка апісання <strong>[[:$1]]</strong>, але сам файл зараз не існуе.\nТаму вашае апісанне не з'явіцца на адпаведнай старонцы, пакуль вы самастойна яе не паправіце.\n[[$1|thumb]]",
-       "fileexists-extension": "Ужо Ñ\91Ñ\81Ñ\86Ñ\8c Ñ\84айл Ð· Ð¿Ð°Ð´Ð¾Ð±Ð½Ð°Ð¹ Ð½Ð°Ð·Ð²Ð°Ð¹: [[$2|thumb]]\n* Ð\9dазва Ñ\9eкладанага Ñ\84айла: <strong>[[:$1]]</strong>\n* Ð\9dазва Ð½Ð°Ñ\8fÑ\9eнага Ñ\84айла: <strong>[[:$2]]</strong>\nÐ\92Ñ\8bбеÑ\80Ñ\8bÑ\86е Ñ\96нÑ\88Ñ\83Ñ\8e Ð½Ð°Ð·Ð²Ñ\83.",
+       "fileexists-extension": "Ужо Ñ\91Ñ\81Ñ\86Ñ\8c Ñ\84айл Ð· Ð¿Ð°Ð´Ð¾Ð±Ð½Ð°Ð¹ Ð½Ð°Ð·Ð²Ð°Ð¹: [[$2|thumb]]\n* Ð\9dазва Ñ\9eкладанага Ñ\84айла: <strong>[[:$1]]</strong>\n* Ð\9dазва Ð½Ð°Ñ\8fÑ\9eнага Ñ\84айла: <strong>[[:$2]]</strong>\nÐ\9cожа, Ñ\85оÑ\87аÑ\86е Ð²Ñ\8bкаÑ\80Ñ\8bÑ\81Ñ\82аÑ\86Ñ\8c Ð°Ð´Ñ\80ознÑ\83Ñ\8e Ð½Ð°Ð·Ð²Ñ\83?",
        "fileexists-thumbnail-yes": "Файл падобны на выяву скарочанага памеру ''(драбніца)''. [[$1|thumb]]\nПраверце файл <strong>[[:$1]]</strong>.\nКалі правераны файл мае змест і памеры, аднолькавыя з гэтым, то дадатковае ўкладанне драбніцы непатрэбнае.",
        "file-thumbnail-no": "Назва файла пачынаецца з <strong>$1</strong>.\nТак можа называцца выява зменшанага памеру ''(драбніца)''.\nКалі гэтая выява сапраўды запісаная ў найлепшым разрозненні, якое ёсць, то ўкладайце яе, а іначай лепей памяняць назву файла.",
        "fileexists-forbidden": "Файл з такой назвай ужо ёсць, і нельга запісаць паўзверх яго. Калі вы жадаеце абавязкова ўкласці свой файл, то выберыце новую назву. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "У агульным сховішчы ўжо існуе файл з такою назвай.\nКалі вы жадаеце ўсё ж укласці свой файл, паўтарыце працэдуру ўкладання, але з іншай назвай. [[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Гэты файл з'яўляецца дублікатам наступн{{PLURAL:$1|ага файла|ых файлаў}}:",
        "file-deleted-duplicate": "Файл, падобны да гэтага ([[:$1]]), быў сцёрты некалі раней. Трэба праверыць гісторыю таго файла перад тым, як укладваць яго нанова.",
+       "file-deleted-duplicate-notitle": "Файл, ідэнтычны гэтаму, быў сцёрты раней, а назва файла заглушана.\nВы мусіце спытаць каго-небудзь з магчымасцю бачыць заглушаныя звесткі па файлах пераглядзець сітуацыю перад тым, як укладваць яго нанова.",
        "uploadwarning": "Папярэджанне пра ўкладанне",
-       "uploadwarning-text": "Калі ласка, зменіце файл апісанне ніжэй і паўтарыце спробу.",
+       "uploadwarning-text": "Калі ласка, змяніце апісанне файла ніжэй і паўтарыце спробу.",
        "savefile": "Запісаць файл",
        "uploadedimage": "укладзена \"[[$1]]\"",
        "overwroteimage": "укладзена новая версія \"[[$1]]\"",
        "uploaddisabledtext": "Не дазваляюцца ўкладанні файлаў.",
        "php-uploaddisabledtext": "Укладанне файлаў не дазволена ў асяроддзі PHP. Праверце настаўленне file_uploads.",
        "uploadscripted": "У файле ўтрымліваецца код HTML або Яваскрыпту, які можа быць памылкова апрацаваны браўзерам.",
+       "uploadscriptednamespace": "Гэты файл SVG утрымлівае недапушчальную прастору імёнаў \"$1\".",
+       "uploadinvalidxml": "Немагчыма прааналізаваць XML ва ўкладзеным файле.",
        "uploadvirus": "Файл утрымлівае вірус! Падрабязнасці: $1",
        "uploadjava": "Файл ўяўляе сабой ZIP-архіў, які змяшчае .class файл Java.",
        "upload-source": "Зыходны файл",
        "upload-options": "Магчымасці ўкладання",
        "watchthisupload": "Назіраць за файлам",
        "filewasdeleted": "Файл з такою назвай быў раней укладзены сюды, а потым сцёрты. Варта паглядзець у $1 перад тым, як укладаць яго нанова.",
-       "filename-bad-prefix": "Назва файла, які вы ўкладаеце, пачынаецца з '''\"$1\"''', што падобна на аўтаматычныя, неінфарматыўныя назвы файлаў, якія робяць лічбавыя фотаапараты. Калі ласка, змяніце назву на больш зразумелую.",
+       "filename-bad-prefix": "Назва файла, які вы ўкладаеце, пачынаецца з <strong>\"$1\"</strong>, што падобна на аўтаматычныя, неінфарматыўныя назвы файлаў, якія робяць лічбавыя фотаапараты. Калі ласка, змяніце назву на больш зразумелую.",
        "upload-success-subj": "Паспяховае ўкладанне",
        "upload-success-msg": "Ваша загрузка [$2] прайшла паспяхова. Вы можаце паглядзець вынік тут: [[:{{ns:file}}:$1]]",
        "upload-failure-subj": "Праблема загрузкі",
        "backend-fail-notsame": "Ужо існуе неідэнтычны файл $1.",
        "backend-fail-invalidpath": "$1 не з'яўляецца дапушчальным шляхам",
        "backend-fail-delete": "Не ўдалося сцерці файл \"$1\".",
+       "backend-fail-describe": "Немагчыма змяніць метазвесткі для файла \"$1\".",
        "backend-fail-alreadyexists": "Файл $1 ужо існуе.",
        "backend-fail-store": "Не ўдалося захаваць файл $1 на $2 .",
        "backend-fail-copy": "Не ўдалося капіраваць файл \"$1\" у \"$2\".",
        "backend-fail-writetemp": "Не атрымалася запісаць часовы файл",
        "backend-fail-closetemp": "Не атрымалася закрыць часовы файл",
        "backend-fail-read": "Не атрымалася прачытаць файл $1.",
-       "backend-fail-create": "Не атрымалася стварыць файл $1.",
+       "backend-fail-create": "Немагчыма запісаць файл \"$1\".",
+       "backend-fail-maxsize": "Немагчыма запісаць файл \"$1\", таму што ён большы за {{PLURAL:$2|адзін байт|$2 байты|$2 байтаў}}.",
        "backend-fail-readonly": "Сервер сховішча «$1» у рэжыме толькі чытання. Прычына: «$2»",
        "backend-fail-synced": "Стан файла «$1» адрозніваецца ад стану на ўнутраным серверы сховішча",
        "backend-fail-connect": "Немагчыма далучыцца да сервера сховішча «$1».",
        "backend-fail-internal": "Узнікла невядомая памылка на серверы сховішча «$1».",
        "backend-fail-contenttype": "Немагчыма вызначыць тып зместу файла, які мусіць быць захаваны ў «$1».",
        "backend-fail-batchsize": "Сервер сховішча атрымаў блок з $1 {{PLURAL:$1|файлавай аперацыі|файлавых аперацый|файлавых аперацый}}; абмежаванне складае $2",
+       "backend-fail-usable": "Немагчыма прачытаць ці запісаць файл \"$1\" з-за нястачы дазволаў ці адсутнасці каталогаў/кантэйнераў.",
+       "filejournal-fail-dbconnect": "Немагчыма далучыцца да базы звестак журнала для рухавіка захоўвання дадзеных \"$1\".",
+       "filejournal-fail-dbquery": "Немагчыма абнавіць базу звестак журнала для рухавіка захоўвання дадзеных \"$1\".",
        "lockmanager-notlocked": "Не ўдалося разблакаваць \"$1\"; ён не заблакаваны.",
        "lockmanager-fail-closelock": "Не ўдалося закрыць файл блакіроўкі для  «$1».",
        "lockmanager-fail-deletelock": "Не ўдалося выдаліць файл блакіроўкі для  «$1».",
        "uploadstash-nofiles": "У вас няма схаваных файлаў.",
        "uploadstash-badtoken": "Не атрымалася выканаць названыя дзеянні. Магчыма, скончыўся тэрмін дзеяння вашага жэтона бяспекі. Паспрабуйце яшчэ раз.",
        "uploadstash-errclear": "Ачыстка файлаў не ўдалася",
-       "uploadstash-refresh": "Абнавіць спісак файлаў",
+       "uploadstash-refresh": "Абнавіць спіс файлаў",
        "invalid-chunk-offset": "Недапушчальнае зрушэнне фрагмента",
        "img-auth-accessdenied": "Доступ забаронены",
-       "img-auth-nopathinfo": "Адсутнічае PATH_INFO",
+       "img-auth-nopathinfo": "Адсутнічае PATH_INFO.\nВаш сервер не настроены на перадачу гэтых звестак.\nМагчыма, ён на аснове CGI і не падтрымлівае img_auth.\nГл. https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Запытаны шлях не ставіцца да наладжанага каталога ўкладанняў.",
        "img-auth-badtitle": "Немагчыма пабудаваць правільны загаловак з «$1».",
        "img-auth-nologinnWL": "Вы не ўвайшлі ў сістэму, а «$1» не ўваходзіць ў белы спіс.",
        "listfiles_size": "Памер у байтах",
        "listfiles_description": "Апісанне",
        "listfiles_count": "Версіі",
+       "listfiles-show-all": "Уключыць старыя версіі відарысаў",
+       "listfiles-latestversion": "Актуальная версія",
+       "listfiles-latestversion-yes": "Так",
+       "listfiles-latestversion-no": "Не",
        "file-anchor-link": "Файл",
        "filehist": "Гісторыя файла",
        "filehist-help": "Націснуць на даце з часам, каб паказаць файл, якім ён тады быў.",
        "sharedupload": "Гэты файл з $1 і можа выкарыстоўвацца іншымі праектамі.",
        "sharedupload-desc-there": "Гэты файл з $1 і можа выкарыстоўвацца ў іншых праектах.\nДадатковую інфармацыю можна знайсці на [$2 старонцы апісання файла].",
        "sharedupload-desc-here": "Гэты файл з $1 і можа выкарыстоўвацца іншымі праектамі. Апісанне на яго [$2 старонцы размоў] прыведзена ніжэй",
+       "sharedupload-desc-edit": "Гэты файл з $1 і можа выкарыстоўвацца ў іншых праектах.\nМажліва, вы хочаце правіць апісанне на [$2 старонцы апісання файла] там.",
        "filepage-nofile": "Не знойдзены файл з такой назвай.",
        "filepage-nofile-link": "Не знойдзены файл з такой назвай, але можна [$1 яго ўкласці].",
        "uploadnewversion-linktext": "Укласці новую версію гэтага файла",
        "shared-repo-from": "з $1",
        "shared-repo": "супольнае сховішча",
+       "upload-disallowed-here": "Вы не можаце перапісаць гэты файл.",
        "filerevert": "Адкаціць $1",
        "filerevert-legend": "Адкат файла",
        "filerevert-intro": "Вы адкочваеце '''[[Media:$1|$1]]''' да [$4 версіі з $3, $2].",
        "filedelete-reason-dropdown": "*Звычайныя прычыны сцірання\n** Парушэнне аўтарскага права\n** Дублікатны файл",
        "filedelete-edit-reasonlist": "Правіць прычыны сцірання",
        "filedelete-maintenance": "Тымчасова адключаныя сціранне і аднаўленне файлаў (на час тэхнічнага абслугоўвання).",
-       "filedelete-maintenance-title": "Немагчыма выдаліць файл",
+       "filedelete-maintenance-title": "Немагчыма сцерці файл",
        "mimesearch": "Пошук паводле зместу файла",
-       "mimesearch-summary": "Старонка дазваляе прасейваць файлы ў залежнасці ад іх тыпаў MIME. Фармат уводу: contenttype/subtype, напр., <code>image/jpeg</code>.",
+       "mimesearch-summary": "Старонка дазваляе прасейваць файлы ў залежнасці ад іх тыпаў MIME.\nФармат уводу: contenttype/subtype або contenttype/*, напр., <code>image/jpeg</code>.",
        "mimetype": "Тып MIME:",
        "download": "узяць сабе",
        "unwatchedpages": "Старонкі, якія не назіраюцца",
        "listredirects": "Усе перасылкі",
+       "listduplicatedfiles": "Пералік дублікатных файлаў",
+       "listduplicatedfiles-summary": "Гэта пералік файлаў, у якіх найноўшая версія файла ўяўляе сабою копію апошняй версіі якога-небудзь іншага файла. Улічваюцца толькі лакальныя файлы.",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]] мае [[$3|{{PLURAL:$2|дублікат|$2 дублікаты|$2 дублікатаў}}]].",
        "unusedtemplates": "Шаблоны, якія не выкарыстаны",
        "unusedtemplatestext": "Тут пералічаныя ўсе старонкі ў прасторы назваў {{ns:template}}, якія ані разу не ўкладзеныя ў іншыя старонкі. Памятайце, што трэба правяраць спасылкі на шаблоны перад тым, як сціраць іх.",
        "unusedtemplateswlh": "іншыя спасылкі",
        "randompage": "Выпадковая старонка",
        "randompage-nopages": "Няма старонак у наступн{{PLURAL:$2|ай прасторы|ых прасторах}} назваў: $1.",
+       "randomincategory": "Выпадковая старонка ў катэгорыі",
+       "randomincategory-invalidcategory": "\"$1\" - недапушчальная назва катэгорыі.",
+       "randomincategory-nopages": "Няма старонак у катэгорыі [[:Category:$1|$1]].",
+       "randomincategory-selectcategory": "Атрымаць выпадковую старонку з катэгорыі: $1 $2.",
+       "randomincategory-selectcategory-submit": "Перайсці",
        "randomredirect": "Выпадковая перасылка",
        "randomredirect-nopages": "Няма перасылак у прасторы назваў \"$1\".",
        "statistics": "Статыстыка",
        "statistics-users-active": "Актыўныя ўдзельнікі",
        "statistics-users-active-desc": "Удзельнікі, якія хоць нешта зрабілі за апошн{{PLURAL:$1|і дзень|ія $1 дзён}}",
        "statistics-mostpopular": "Самыя папулярныя старонкі",
+       "pageswithprop": "Старонкі з уласцівасцю старонкі",
+       "pageswithprop-legend": "Старонкі з пэўнай уласцівасцю",
+       "pageswithprop-text": "На гэтай старонцы пералічаны старонкі, якія выкарыстоўваюць пэўную уласцівасць.",
+       "pageswithprop-prop": "Назва ўласцівасці:",
+       "pageswithprop-submit": "Перайсці",
+       "pageswithprop-prophidden-long": "доўгае тэкставае значэнне ўласцівасці схавана ($1)",
+       "pageswithprop-prophidden-binary": "двайковае значэнне ўласцівасці схавана ($1)",
        "doubleredirects": "Падвойныя перасылкі",
        "doubleredirectstext": "Тут пералічаныя старонкі-перасылкі, якія паказваюць на іншыя перасылкі.\nКожны радок утрымлівае спасылкі на першую і другую перасылкі, а таксама мэту другой перасылкі, якая звычайна і ёсць \"сапраўдная\" мэтавая старонка, на якую павінна была паказваць першая перасылка.\n<del>Закрэсленыя складнікі</del> ўжо былі папраўленыя.",
-       "double-redirect-fixed-move": "Назва [[$1]] была перанесена, і зараз перасылае да [[$2]]",
-       "double-redirect-fixed-maintenance": "Ð\92Ñ\8bпÑ\80аÑ\9eленне Ð¿Ð°Ð´Ð²Ð¾Ð¹Ð½Ð°Ð³Ð° Ð¿ÐµÑ\80анакÑ\96Ñ\80аваннÑ\8f Ð· [[$1]] Ð½Ð° [[$2]].",
+       "double-redirect-fixed-move": "Назва [[$1]] была перанесена.\nПасля аўтаматычнага абнаўлення зараз яна перасылае да [[$2]]",
+       "double-redirect-fixed-maintenance": "Ð\90Ñ\9eÑ\82амаÑ\82Ñ\8bÑ\87нае Ð²Ñ\8bпÑ\80аÑ\9eленне Ð¿Ð°Ð´Ð²Ð¾Ð¹Ð½Ð°Ð¹ Ð¿ÐµÑ\80аÑ\81Ñ\8bлкÑ\96 Ð· [[$1]] Ð½Ð° [[$2]] Ñ\86Ñ\8fгам Ñ\82Ñ\8dÑ\85нÑ\96Ñ\87нага Ð°Ð±Ñ\81лÑ\83гоÑ\9eваннÑ\8f.",
        "double-redirect-fixer": "Выпраўляльнік перасылак",
        "brokenredirects": "Паламаныя перасылкі",
        "brokenredirectstext": "Гэтыя перасылкі паказваюць на старонкі, якіх няма:",
        "fewestrevisions": "Артыкулы з найменшай колькасцю версій",
        "nbytes": "$1 {{PLURAL:$1|байт|байта|байтаў}}",
        "ncategories": "$1 {{PLURAL:$1|катэгорыя|катэгорыі|катэгорый}}",
+       "ninterwikis": "$1 {{PLURAL:$1|інтэрвікі|інтэрвікі}}",
        "nlinks": "$1 {{PLURAL:$1|спасылка|спасылкі|спасылак}}",
        "nmembers": "$1 {{PLURAL:$1|складнік|складнікі|складнікаў}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|складнік|складнікі|складнік}}",
        "nrevisions": "$1 {{PLURAL:$1|версія|версіі|версій}}",
        "nviews": "$1 {{PLURAL:$1|паказ|паказаў}}",
        "nimagelinks": "Выкарыстоўваецца на $1 {{PLURAL:$1|старонцы|старонках|старонках}}",
        "mostlinkedtemplates": "Шаблоны ў частым выкарыстанні",
        "mostcategories": "Артыкулы ў найбольшай кольк. катэгорый",
        "mostimages": "Выявы ў частым выкарыстанні",
+       "mostinterwikis": "Артыкулы з найбольш. кольк. інтэрвікі",
        "mostrevisions": "Артыкулы з найбольшай колькасцю версій",
        "prefixindex": "Старонкі з назвамі на ўзор",
        "prefixindex-namespace": "Усе старонкі з прэфіксам ( $1 прастора імёнаў)",
+       "prefixindex-strip": "Прыбраць прэфікс у пераліку",
        "shortpages": "Старонкі малога аб'ёму",
        "longpages": "Старонкі вялікага аб'ёму",
        "deadendpages": "Старонкі без спасылак",
        "deadendpagestext": "Спіс старонак без спасылак на тутэйшыя артыкулы.",
        "protectedpages": "Старонкі пад аховай",
        "protectedpages-indef": "Толькі бестэрміновыя аховы",
+       "protectedpages-summary": "На гэтай старонцы пералічаны наяўныя старонкі, якія зараз знаходзяцца пад аховай. Спіс назваў, абароненых ад стварэння, гл. [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Толькі каскадныя засцераганні",
        "protectedpages-noredirect": "Схаваць перанакіраванні",
        "protectedpagesempty": "Ніякія старонкі такім чынам не ахоўваюцца.",
+       "protectedpages-timestamp": "Дата/час",
+       "protectedpages-page": "Старонка",
+       "protectedpages-expiry": "Канчаецца",
+       "protectedpages-performer": "Паставіў ахову",
+       "protectedpages-params": "Тыпы аховы",
+       "protectedpages-reason": "Прычына",
+       "protectedpages-unknown-timestamp": "Невядома",
+       "protectedpages-unknown-performer": "Нявызначаны ўдзельнік",
        "protectedtitles": "Назвы пад аховай",
+       "protectedtitles-summary": "На гэтай старонцы пералічаны назвы, якія зараз абаронены ад стварэння. Спіс існых старонак пад аховай гл. [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Няма назваў, якія зараз бы ахоўваліся з такімі параметрамі.",
        "listusers": "Усе ўдзельнікі",
        "listusers-editsonly": "Толькі ўдзельнікі, якія маюць праўкі",
        "listusers-creationsort": "У парадку датаў стварэння",
+       "listusers-desc": "Парадкаваць да памяншэння",
        "usereditcount": "$1 {{PLURAL:$1|праўка|праўкі}}",
        "usercreated": "\t{{GENDER:$3|Зарэгістраваўся|Зарэгістравалася}} $1 в $2",
        "newpages": "Новыя старонкі",
        "alllogstext": "Супольны паказ усіх магчымых журналаў на пляцоўцы {{SITENAME}}.\nМожна звузіць аб'ём паказу, выбіраючы тып журнала, імя ўдзельніка (з улікам рэгістру літар) або старонкі (таксама з улікам рэгістру).",
        "logempty": "Нічога адпаведнага ў журнале не знойдзена.",
        "log-title-wildcard": "Знайсці назвы, якія пачынаюцца з гэтага тэксту",
+       "showhideselectedlogentries": "Паказаць/схаваць выбраныя запісы журнала",
        "allpages": "Усе старонкі",
        "nextpage": "Наступная старонка ($1)",
        "prevpage": "Папярэдняя старонка ($1)",
        "allpagesbadtitle": "Гэтая назва старонкі недапушчальная або ўтрымлівае між-моўны або між-вікавы прэфікс. Магчыма, у назве ёсць знак ці знакі, якія нельга ўжываць у назвах.",
        "allpages-bad-ns": "На {{SITENAME}} прастора назваў \"$1\" не падтрымліваецца.",
        "allpages-hide-redirects": "Схаваць перанакіраванні",
+       "cachedspecial-viewing-cached-ttl": "Вы праглядаеце кэшаваную версію старонкі, даўнасць якой можа быць $1.",
+       "cachedspecial-viewing-cached-ts": "Вы праглядаеце кэшаваную версію старонкі, якая можа быць не зусім актуальнай.",
+       "cachedspecial-refresh-now": "Глядзець найноўшую.",
        "categories": "Катэгорыі",
        "categoriespagetext": "Наступн{{PLURAL:$1|ая катэгорыя ўтрымлівае|ыя $1 катэгорыі(-й) утрымліваюць}} старонкі або мультымедыю.\nТут не паказаныя [[Special:UnusedCategories|катэгорыі без складнікаў]].\nГл. таксама [[Special:WantedCategories|патрэбныя катэгорыі]].",
        "categoriesfrom": "Паказаць катэгорыі, пачынаючы з:",
        "linksearch-pat": "Што шукаецца:",
        "linksearch-ns": "Прастора назваў:",
        "linksearch-ok": "Знайсці",
-       "linksearch-text": "Ð\9cожна Ð²Ñ\8bкаÑ\80Ñ\8bÑ\81Ñ\82оÑ\9eваÑ\86Ñ\8c Ð¿Ð°Ð´Ñ\81Ñ\82аноÑ\9eнÑ\8bÑ\8f Ñ\81Ñ\96мвалÑ\8b, Ð½Ð°Ð¿Ñ\80Ñ\8bклад, <code>*.wikipedia.org</code>.\nÐ\9dеабÑ\85одзен Ð¿Ñ\80Ñ\8bнамÑ\81Ñ\96 Ð´Ð°Ð¼ÐµÐ½ Ð²ÐµÑ\80Ñ\85нÑ\8fга Ñ\9eзÑ\80оÑ\9eнÑ\8f, Ð½Ð°Ð¿Ñ\80Ñ\8bклад <code>*.org</code><br />\nÐ\9fÑ\80аÑ\82аколÑ\8b, Ñ\8fкÑ\96Ñ\8f Ð¿Ð°Ð´Ñ\82Ñ\80Ñ\8bмлÑ\96ваÑ\8eÑ\86Ñ\86а: <code>$1</code> (не Ð´Ð°Ð´Ð°Ð²Ð°Ñ\86Ñ\8c Ð»Ñ\8eбÑ\8b Ð· Ñ\96Ñ\85 Ñ\83 Ð²Ð°Ñ\88Ñ\8bм Ð¿Ð¾Ñ\88Ñ\83кÑ\83)",
+       "linksearch-text": "Ð\9cожна Ð²Ñ\8bкаÑ\80Ñ\8bÑ\81Ñ\82оÑ\9eваÑ\86Ñ\8c Ð¿Ð°Ð´Ñ\81Ñ\82аноÑ\9eнÑ\8bÑ\8f Ñ\81Ñ\96мвалÑ\8b, Ð½Ð°Ð¿Ñ\80Ñ\8bклад, <code>*.wikipedia.org</code>.\nÐ\9dеабÑ\85одзен Ð¿Ñ\80Ñ\8bнамÑ\81Ñ\96 Ð´Ð°Ð¼ÐµÐ½ Ð²ÐµÑ\80Ñ\85нÑ\8fга Ñ\9eзÑ\80оÑ\9eнÑ\8e, Ð½Ð°Ð¿Ñ\80Ñ\8bклад <code>*.org</code><br />\n{{PLURAL:$2|Ð\9fÑ\80аÑ\82акол|Ð\9fÑ\80аÑ\82аколÑ\8b}}, Ñ\8fкÑ\96Ñ\8f Ð¿Ð°Ð´Ñ\82Ñ\80Ñ\8bмлÑ\96ваÑ\8eÑ\86Ñ\86а: <code>$1</code> (пÑ\80адвÑ\8bзнаÑ\87анÑ\8b http:// ÐºÐ°Ð»Ñ\96 Ð¿Ñ\80аÑ\82акол Ð½Ðµ Ñ\9eказанÑ\8b)",
        "linksearch-line": "$1, на які спасылаецца $2",
        "linksearch-error": "Узоры можна ставіць толькі ў пачатак адрасу.",
        "listusersfrom": "Паказаць удзельнікаў, пачаўшы з:",
        "listusers-submit": "Паказаць",
        "listusers-noresult": "Удзельнікі не знойдзеныя.",
-       "listusers-blocked": "(Ð\97аблакаваны)",
+       "listusers-blocked": "(заблакаваны)",
        "activeusers": "Актыўныя ўдзельнікі",
        "activeusers-intro": "Гэта пералік удзельнікаў, якія нешта рабілі за апошнія $1 {{PLURAL:$1|дзень|дзён}}.",
-       "activeusers-count": "$1 {{PLURAL:$1|пÑ\80аÑ\9eка|пÑ\80аÑ\9eкÑ\96|пÑ\80авак}} Ð·Ð° Ð°Ð¿Ð¾Ñ\88нÑ\96{{PLURAL:$3| Ð´Ð·ÐµÐ½Ñ\8c|я $3 дзён}}",
+       "activeusers-count": "$1 {{PLURAL:$1|дзеÑ\8fнне|дзеÑ\8fннÑ\96|дзеÑ\8fннÑ\8fÑ\9e}} Ð·Ð° Ð°Ð¿Ð¾Ñ\88нÑ\96{{PLURAL:$3| Ð´Ð·ÐµÐ½Ñ\8c\8f $3 Ð´Ð½Ñ\96|я $3 дзён}}",
        "activeusers-from": "Паказ, пачынаючы з:",
        "activeusers-hidebots": "Без робатаў",
        "activeusers-hidesysops": "Без адміністратараў",
        "activeusers-noresult": "Няма такіх удзельнікаў.",
        "listgrouprights": "Дазволы для груп удзельнікаў",
        "listgrouprights-summary": "Гэты пералік вызначаных у гэтай вікі груп удзельнікаў, разам з прыпісанымі ім дазволамі.\nДаведацца больш пра асабістыя дазволы можна на старонцы [[{{MediaWiki:Listgrouprights-helppage}}]].",
-       "listgrouprights-key": "* <span class=\"listgrouprights-granted\">Дадзены правы</span>\n* <span class=\"listgrouprights-revoked\">Адкліканыя правы</span>",
+       "listgrouprights-key": "Легенда:\n* <span class=\"listgrouprights-granted\">Дадзены дазвол</span>\n* <span class=\"listgrouprights-revoked\">Адкліканы дазвол</span>",
        "listgrouprights-group": "Група",
        "listgrouprights-rights": "Дазволы",
        "listgrouprights-helppage": "Help:Дазволы ў групах",
        "listgrouprights-removegroup-self": "можа выдаліць {{PLURAL:$2|групу|групы}} са свайго ўліковага запісу: $1",
        "listgrouprights-addgroup-self-all": "Дадаць усе групы да свайго акаунта",
        "listgrouprights-removegroup-self-all": "Выдаліць усе групы са свайго акаунта",
+       "listgrouprights-namespaceprotection-header": "Абмежаванні прасторы назваў",
+       "listgrouprights-namespaceprotection-namespace": "Прастора назваў",
+       "listgrouprights-namespaceprotection-restrictedto": "Дазвол(ы), неабходныя для праўкі",
+       "trackingcategories": "Катэгорыі адсочвання",
+       "trackingcategories-name": "Назва паведамлення",
+       "trackingcategories-desc": "Крытэрый уключэння ў катэгорыю",
+       "trackingcategories-nodesc": "Апісанне адсутнічае.",
+       "trackingcategories-disabled": "Катэгорыя адключана",
        "mailnologin": "Няма эл.адрасу",
        "mailnologintext": "Трэба [[Special:UserLogin|ўвайсці ў сістэму]] і мець пацверджаны адрас эл.пошты ў сваіх [[Special:Preferences|настáўленнях]], каб слаць эл.пошту іншым удзельнікам.",
        "emailuser": "Эл.пошта ўдзельніка",
+       "emailuser-title-target": "Напісаць ліст {{GENDER:$1|удзельніку|удзельніцы}}",
        "emailuser-title-notarget": "Напісанне электроннага ліста ўдзельніку",
        "emailpage": "Зварот да ўдзельніка праз эл.пошту",
-       "emailpagetext": "Тут можна выслаць эл.пошту гэтаму ўдзельніку.\nАдрас эл.пошты, уведзены вамі ў [[Special:Preferences|сваіх настаўленнях]], з'явіцца ў полі \"From\" вашага ліста, і атрымальнік зможа адказаць на ваш ліст.",
+       "emailpagetext": "Тут можна выслаць эл.пошту гэта{{GENDER:$1|му ўдзельніку|й удзельніцы}}.\nАдрас эл.пошты, уведзены вамі ў [[Special:Preferences|сваіх настройках]], з'явіцца ў полі \"Ад каго (From)\" вашага ліста, і атрымальнік зможа адказаць на ваш ліст.",
        "defemailsubject": "{{SITENAME}} — Ліст ад $1",
        "usermaildisabled": "Электронная пошта ўдзельніка не працуе",
        "usermaildisabledtext": "Вы не можаце адпраўляць паведамленні электроннай пошты іншым карыстальнікам гэтай вікі",
        "emailuserfooter": "Гэты эл.ліст быў высланы ад $1 да $2 праз функцыю \"{{:{{ns:mediawiki}}:emailuser/be}}\" пляцоўкі {{SITENAME}}.",
        "usermessage-summary": "Пакінуць адмысловае паведамленне.",
        "usermessage-editor": "Адмысловая дастаўка",
-       "watchlist": "Ð\9cой Ñ\81пÑ\96Ñ\81 Ð½Ð°Ð·Ñ\96Ñ\80анага",
+       "watchlist": "Ð\9cой Ñ\81пÑ\96Ñ\81 Ð½Ð°Ð·Ñ\96Ñ\80аннÑ\8f",
        "mywatchlist": "Спіс назірання",
        "watchlistfor2": "Для $1 $2",
        "nowatchlist": "Ваш спіс назірання зараз пусты.",
        "watchlistanontext": "Каб паглядзець ці змяніць спіс назірання, трэба $1.",
        "watchnologin": "Без прадстаўлення",
        "addwatch": "Дадаць у спіс назірання",
-       "addedwatchtext": "Старонка \"[[:$1]]\" была дададзена да [[Special:Watchlist|назіраных]] вамі.\nЗмяненні, якія адбудуцца з гэтай старонкай і з Размовай пра яе, будуць паказвацца там, і старонка будзе '''вылучацца шрыфтам''' у [[Special:RecentChanges|спісе нядаўніх змяненняў]], каб лягчэй пазнаваць яе.\n\nКалі вы не пажадаеце больш назіраць за гэтай старонкай, націсніце \"Не назіраць\" у бакоўцы.",
+       "addedwatchtext": "Старонка \"[[:$1]]\" была дададзена да [[Special:Watchlist|назіраных]] вамі.\nЗмяненні, якія адбудуцца з гэтай старонкай і з размовамі пра яе, будуць паказвацца ў спісе назірання.",
+       "addedwatchtext-short": "Старонка \"$1\" была дададзена ў ваш спіс назірання.",
        "removewatch": "Выдаліць са спіса назірання",
        "removedwatchtext": "Старонка \"[[:$1]]\" была вынята з вашага [[Special:Watchlist|спіса назірання]].",
+       "removedwatchtext-short": "Старонка \"$1\" была выдаленая з вашага спісу назірання.",
        "watch": "Назіраць",
        "watchthispage": "Назіраць за гэтай старонкай",
        "unwatch": "Не назіраць",
        "unwatchthispage": "Спыніць назіранне",
        "notanarticle": "Гэта не змястоўная старонка",
        "notvisiblerev": "Версія сцёртая",
-       "watchlist-details": "Назіраю {{PLURAL:$1|$1 старонку|$1 старонак}} без уліку размоўных.",
+       "watchlist-details": "Ð\9dазÑ\96Ñ\80аÑ\8e {{PLURAL:$1|$1 Ñ\81Ñ\82аÑ\80онкÑ\83|$1 Ñ\81Ñ\82аÑ\80онкÑ\96|$1 Ñ\81Ñ\82аÑ\80онак}} Ð±ÐµÐ· Ñ\83лÑ\96кÑ\83 Ñ\80азмоÑ\9eнÑ\8bÑ\85.",
        "wlheader-enotif": "Працуе апавяшчанне праз эл.пошту.",
-       "wlheader-showupdated": "Старонкі, якія былі зменены пасля вашага апошняга іх наведвання, паказаны '''абрысам шрыфту'''.",
+       "wlheader-showupdated": "Старонкі, якія былі зменены пасля вашага апошняга наведвання, паказаны <strong>абрысам шрыфту</strong>.",
+       "wlnote2": "Ніжэй паказаны змены за {{PLURAL:$1|апошнюю гадзіну|апошнія <strong>$1</strong> гадзіны|апошнія <strong>$1</strong> гадзін}}, па стане на $2, $3.",
        "wlshowlast": "Паказваць апошнія $1 гадз. $2 дзён $3",
        "watchlist-options": "Магчымасці назірання",
        "watching": "Дапісваецца ў спіс назірання...",
        "watcherrortext": "Адбылася памылка пры змене настройкі назірання для «$1».",
        "enotif_reset": "Пазначыць усе старонкі як наведаныя",
        "enotif_impersonal_salutation": "Шаноўны ўдзельнік {{SITENAME}}",
+       "enotif_subject_deleted": "Старонка $1 праекта {{SITENAME}} сцёрта {{GENDER:$2|ўдзельнікам|ўдзельніцай}} $2",
+       "enotif_subject_created": "Старонка $1 праекта {{SITENAME}} створана {{GENDER:$2|ўдзельнікам|ўдзельніцай}} $2",
+       "enotif_subject_moved": "Старонка $1 праекта {{SITENAME}} перанесена {{GENDER:$2|ўдзельнікам|ўдзельніцай}} $2",
+       "enotif_subject_restored": "Старонка $1 праекта {{SITENAME}} адноўлена {{GENDER:$2|ўдзельнікам|ўдзельніцай}} $2",
+       "enotif_subject_changed": "Старонка $1 праекта {{SITENAME}} зменена {{GENDER:$2|ўдзельнікам|ўдзельніцай}} $2",
+       "enotif_body_intro_deleted": "Старонка $1 праекта {{SITENAME}} сцёрта {{GENDER:$2|ўдзельнікам|ўдзельніцай}} $2 $PAGEEDITDATE, гл. $3.",
+       "enotif_body_intro_created": "Старонка $1 праекта {{SITENAME}} створана {{GENDER:$2|ўдзельнікам|ўдзельніцай}} $2 $PAGEEDITDATE, гл. актуальную версію $3.",
+       "enotif_body_intro_moved": "Старонка $1 праекта {{SITENAME}} перанесена {{GENDER:$2|ўдзельнікам|ўдзельніцай}} $2 $PAGEEDITDATE, гл. актуальную версію $3.",
+       "enotif_body_intro_restored": "Старонка $1 праекта {{SITENAME}} адноўлена {{GENDER:$2|ўдзельнікам|ўдзельніцай}} $2 $PAGEEDITDATE, гл. актуальную версію $3.",
+       "enotif_body_intro_changed": "Старонка $1 праекта {{SITENAME}} зменена {{GENDER:$2|ўдзельнікам|ўдзельніцай}} $2 $PAGEEDITDATE, гл. актуальную версію $3.",
        "enotif_lastvisited": "Гл. $1 каб бачыць усе змены пасля вашага апошняга наведвання.",
        "enotif_lastdiff": "Гл. $1 каб бачыць гэтую мену.",
        "enotif_anon_editor": "ананімны ўдзельнік $1",
-       "enotif_body": "Паважаны(ая) $WATCHINGUSERNAME,\n\n$PAGEEDITDATE старонка праекту «{{SITENAME}}» $PAGETITLE была $CHANGEDORCREATED удзельнікам $PAGEEDITOR, гл. $PAGETITLE_URL для прагляду бягучай версіі.\n\n$NEWPAGE\n\nКароткае апісанне змены: $PAGESUMMARY $PAGEMINOREDIT\n\nЗвярнуцца да змяніўшага:\nэл. пошта: $PAGEEDITOR_EMAIL\nвікі: $PAGEEDITOR_WIKI\n\nКалі вы не наведаеце гэтую старонку, то ў выпадку яе далейшых змен апавяшчэнняў больш не будзе.\nВы можаце таксама адключыць опцыю паведамлення для ўсіх старонак у вашым спісе назірання.\n\n             Сістэма апавяшчэння {{grammar:genitive|{{SITENAME}}}}\n\n--\nЗмена наладаў апавяшчэнняў\n{{canonicalurl:{{#special:Preferences}}}}\n\nЗмена наладаў вашага спісу назіранняў\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nВыдаліць старонкі з вашага спісу назіранага\n$UNWATCHURL\n\nЗваротная сувязь і дапамога\n$HELPPAGE",
+       "enotif_body": "Паважаны(ая) $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nКароткае апісанне змены: $PAGESUMMARY $PAGEMINOREDIT\n\nЗвярнуцца да змяніўшага:\nэл. пошта: $PAGEEDITOR_EMAIL\nвікі: $PAGEEDITOR_WIKI\n\nКалі вы не наведаеце гэтую старонку, прадставіўшыся сістэме, у выпадку далейшай актыўнасці апавяшчэнняў больш не будзе. Вы можаце таксама адключыць опцыю паведамлення для ўсіх старонак у вашым спісе назірання.\n\nСістэма апавяшчэння {{grammar:genitive|{{SITENAME}}}}\n\n--\nЗмена настроек апавяшчэння\n{{canonicalurl:{{#special:Preferences}}}}\n\nЗмена наладаў вашага спісу назірання\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nВыдаліць старонку з вашага спісу назірання\n$UNWATCHURL\n\nЗваротная сувязь і дапамога\n$HELPPAGE",
        "created": "створана",
        "changed": "зменена",
        "deletepage": "Сцерці старонку",
        "deletecomment": "Прычына:",
        "deleteotherreason": "Іншы/дадатковы повад:",
        "deletereasonotherlist": "Іншы повад",
-       "deletereason-dropdown": "*Ð\97вÑ\8bÑ\87айнÑ\8bÑ\8f Ð¿Ñ\80Ñ\8bÑ\87Ñ\8bнÑ\8b Ñ\81Ñ\86Ñ\96Ñ\80аннÑ\8f\n** Ð\96аданне Ð°Ñ\9eÑ\82аÑ\80а Ñ\82Ñ\8dкÑ\81Ñ\82Ñ\83\n** Ð\9fаÑ\80Ñ\83Ñ\88Ñ\8dнне Ð°Ñ\9eÑ\82аÑ\80Ñ\81кага Ð¿Ñ\80ава\n** Ð\92андалÑ\96зм",
+       "deletereason-dropdown": "*Ð\97вÑ\8bÑ\87айнÑ\8bÑ\8f Ð¿Ñ\80Ñ\8bÑ\87Ñ\8bнÑ\8b Ñ\81Ñ\86Ñ\96Ñ\80аннÑ\8f\n** Ð¡Ð¿Ð°Ð¼\n** Ð\92андалÑ\96зм\n** Ð\9fаÑ\80Ñ\83Ñ\88Ñ\8dнне Ð°Ñ\9eÑ\82аÑ\80Ñ\81кага Ð¿Ñ\80ава\n** Ð\96аданне Ð°Ñ\9eÑ\82аÑ\80а Ñ\82Ñ\8dкÑ\81Ñ\82Ñ\83\n** Ð\9dÑ\8fÑ\81лÑ\83Ñ\88наÑ\8f Ð¿ÐµÑ\80аÑ\81Ñ\8bлка",
        "delete-edit-reasonlist": "Правіць прычыны сцірання",
        "delete-toobig": "Старонка мае вялікую гісторыю правак, больш за $1 {{PLURAL:$1|версію|версій}}. Сціранне такіх старонак было абмежавана, каб пазбегчы ўтварэння выпадковых перашкод працы {{SITENAME}}.",
        "delete-warning-toobig": "Старонка мае вялікую гісторыю правак, больш за $1 {{PLURAL:$1|версію|версій}}. Сціранне такіх старонак можа перашкодзіць працы базы даных {{SITENAME}}; будзьце асцярожнымі.",
+       "deleting-backlinks-warning": "'''Увага:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Іншыя старонкі]] спасылаюцца на ці ўключаюць старонку, якую вы збіраецеся сцерці.",
        "rollback": "Адкаціць праўкі",
        "rollback_short": "Адкат",
        "rollbacklink": "адкат",
+       "rollbacklinkcount": "адкаціць $1 {{PLURAL:$1|праўку|праўкі|правак}}",
+       "rollbacklinkcount-morethan": "адкаціць больш за $1 {{PLURAL:$1|праўку|праўкі|правак}}",
        "rollbackfailed": "Не ўдалося адкаціць",
        "cantrollback": "Немагчыма адкаціць праўку; апошні аўтар гэта адзіны аўтар на гэтай старонцы.",
        "alreadyrolled": "Немагчыма адкаціць апошнюю праўку ў [[:$1]], аўтарства [[User:$2|$2]] ([[User talk:$2|Talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nз таго часу нехта іншы правіў або адкатваў гэтую старонку.\n\nАпошняя праўка старонкі была аўтарства [[User:$3|$3]] ([[User talk:$3|Talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Тлумачэнне праўкі было: \"''$1''\".",
        "revertpage": "Праўкі аўтарства [[Special:Contributions/$2|$2]] ([[User talk:$2|размова]]) адкочаныя; вернута апошняя версія аўтарства [[User:$1|$1]]",
-       "revertpage-nouser": "Праўкі (імя ўдзельніка выдалена) адкочаны да версіі [[User:$1|$1]]",
+       "revertpage-nouser": "Праўкі (імя ўдзельніка схавана) адкочаны да версіі {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Адкочаны праўкі $1; вернута апошняя версія $2.",
        "sessionfailure-title": "Памылка сеансу",
        "sessionfailure": "Магчыма, ёсць праблемы з вашым сеансам працы ў сістэме. Таму вам было адмоўлена ў выкананні дзеяння, каб засцерагчыся ад захопу сеанса. Націсніце \"Назад\", і перачытайце старонку, з якой вы сюды прыйшлі, тады паспрабуйце нанова.",
        "prot_1movedto2": "[[$1]] перанесена ў [[$2]]",
        "protect-badnamespace-title": "Прастора імёнаў без аховы",
        "protect-badnamespace-text": "Старонкі ў гэтай прасторы імёнаў не могуць знаходзіцца пад аховай.",
+       "protect-norestrictiontypes-text": "Старонка не можа ахоўвацца, таму што недаступны тыпы абмежавання.",
        "protect-legend": "Пацверджанне пачатку аховы",
        "protectcomment": "Прычына:",
        "protectexpiry": "Канчаецца:",
        "protect-cascadeon": "Старонка зараз ахоўваецца, таму што ўлучана ў наступн{{PLURAL:$1|ую старонку, на якую|ыя старонкі, на якія}} пастаўлена каскадная ахова. Можна змяніць узровень аховы гэтай старонкі, але вынікаў каскаднай аховы гэта не пераможа.",
        "protect-default": "Дазваляць усім удзельнікам",
        "protect-fallback": "Патрабуецца дазвол \"$1\"",
-       "protect-level-autoconfirmed": "Ð\97абаÑ\80анÑ\8fÑ\86Ñ\8c Ð½Ð¾Ð²Ñ\8bм Ñ\96 Ð½ÐµÑ\80Ñ\8dгÑ\96Ñ\81Ñ\82Ñ\80аванÑ\8bм Ñ\83дзелÑ\8cнÑ\96кам",
+       "protect-level-autoconfirmed": "ТолÑ\8cкÑ\96 Ð°Ñ\9eÑ\82а-паÑ\86веÑ\80джанÑ\8bÑ\8f Ñ\83дзелÑ\8cнÑ\96кÑ\96",
        "protect-level-sysop": "Толькі для адміністратараў",
        "protect-summary-cascade": "каскад",
        "protect-expiring": "скончыцца $1 (UTC)",
        "undelete-nodiff": "Не знойдзены ніякія папярэднія версіі.",
        "undeletebtn": "Аднавіць",
        "undeletelink": "паказаць/аднавіць",
-       "undeleteviewlink": "Ð\9fÑ\80аглÑ\8fдзець",
+       "undeleteviewlink": "паказаць",
        "undeleteinvert": "Перавярнуць выбранае",
        "undeletecomment": "Прычына:",
-       "undeletedrevisions": "Адноўлен{{PLURAL:$1|а 1 версія|ыя $1 версій}}",
-       "undeletedrevisions-files": "Адноўлен{{PLURAL:$1|а 1 версія|ыя $1 версій}} і {{PLURAL:$2|1 файл|$2 файлаў}}",
-       "undeletedfiles": "Адноўлен{{PLURAL:$1|ы 1 файл|ыя $1 файлаў}}",
-       "cannotundelete": "Не ўдалося аднавіць; магчыма, нехта іншы ўжо аднавіў старонку.",
+       "undeletedrevisions": "Адноўлен{{PLURAL:$1|а 1 версія|ы $1 версіі|ы $1 версій}}",
+       "undeletedrevisions-files": "Адноўлен{{PLURAL:$1|а 1 версія|ы $1 версіі|ыя $1 версій}} і {{PLURAL:$2|1 файл|$2 файлы|$2 файлаў}}",
+       "undeletedfiles": "Адноўлен{{PLURAL:$1|ы 1 файл|ы $1 файлы|ыя $1 файлаў}}",
+       "cannotundelete": "Не ўдалося аднавіць:\n$1",
        "undeletedpage": "'''$1 была адноўлена'''\n\nПраверце пералік нядаўніх сціранняў і аднаўленняў у [[Special:Log/delete|журнале сціранняў]].",
        "undelete-header": "Нядаўна сцёртыя старонкі можна паглядзець у [[Special:Log/delete|журнале сціранняў]].",
-       "undelete-search-title": "Ð\9fоÑ\88Ñ\83к Ð²Ñ\8bдаленÑ\8bÑ\85 Ñ\81Ñ\82аÑ\80онак",
+       "undelete-search-title": "ШÑ\83каÑ\86Ñ\8c Ñ\83 Ñ\81Ñ\86Ñ\91Ñ\80Ñ\82Ñ\8bÑ\85 Ñ\81Ñ\82аÑ\80онкаÑ\85",
        "undelete-search-box": "Знайсці ў сцёртых старонках",
        "undelete-search-prefix": "Паказаць старонкі, пачынаючы з:",
        "undelete-search-submit": "Шукаць",
        "namespace_association": "Звязаная прастора",
        "tooltip-namespace_association": "Устанавіце гэтую адзнаку, каб таксама ўключыць прастору імёнаў абмеркавання (або прадметную), звязаную з абранай прасторай імёнаў",
        "blanknamespace": "(Артыкулы)",
-       "contributions": "Уклад удзельніка",
-       "contributions-title": "Уклад удзельніка $1",
+       "contributions": "Уклад {{GENDER:$1|удзельніка|удзельніцы}}",
+       "contributions-title": "Уклад {{GENDER:$1|удзельніка|удзельніцы}} $1",
        "mycontris": "Уклад",
        "contribsub2": "Для $1 ($2)",
+       "contributions-userdoesnotexist": "Уліковы запіс удзельніка \"$1\" не зарэгістраваны.",
        "nocontribs": "Не знойдзена змен, адпаведных зададзеным параметрам.",
        "uctop": "(апошн.)",
        "month": "Ад месяцу (і раней):",
        "sp-contributions-newbies-sub": "З новых рахункаў",
        "sp-contributions-newbies-title": "Уклады ўдзельнікаў з новых рахункаў",
        "sp-contributions-blocklog": "блакіроўкі",
+       "sp-contributions-suppresslog": "заглушаны ўклад удзельніка",
        "sp-contributions-deleted": "сцёрты ўклад удзельніка",
-       "sp-contributions-uploads": "Загрузкі",
+       "sp-contributions-uploads": "укладанні",
        "sp-contributions-logs": "журналы",
-       "sp-contributions-talk": "размова",
+       "sp-contributions-talk": "размовы",
        "sp-contributions-userrights": "распараджэнне правамі ўдзельніка",
        "sp-contributions-blocked-notice": "Гэты ўдзельнік у дадзены момант заблакаваны. Ніжэй прыведзены апошні запіс з журнала блакаванняў:",
        "sp-contributions-blocked-notice-anon": "Гэты IP-адрас у дадзены момант заблакаваны.\nНіжэй прыведзены апошні запіс з журнала блакаванняў:",
        "sp-contributions-search": "Знайсці ўклад",
        "sp-contributions-username": "Адрас IP або імя ўдзельніка:",
        "sp-contributions-toponly": "Паказваць толькі праўкі, якія з'яўляюцца апошнімі версіямі",
+       "sp-contributions-newonly": "Паказваць толькі праўкі, якімі створаны старонкі",
        "sp-contributions-submit": "Пошук",
        "whatlinkshere": "Сюды спасылаюцца",
        "whatlinkshere-title": "Старонкі, якія спасылаюцца на \"$1\"",
        "whatlinkshere-page": "Старонка:",
-       "linkshere": "СÑ\82аÑ\80онкÑ\96, Ñ\8fкÑ\96Ñ\8f Ñ\81паÑ\81Ñ\8bлаÑ\8eÑ\86Ñ\86а Ð½Ð° '''[[:$1]]''':",
+       "linkshere": "Ð\9dаÑ\81Ñ\82Ñ\83пнÑ\8bÑ\8f Ñ\81Ñ\82аÑ\80онкÑ\96 Ñ\81паÑ\81Ñ\8bлаÑ\8eÑ\86Ñ\86а Ð½Ð° <strong>[[:$1]]</strong>:",
        "nolinkshere": "Няма старонак, якія б спасылаліся на '''[[:$1]]'''.",
        "nolinkshere-ns": "Няма старонак, якія б спасылаліся на '''[[:$1]]''' у гэтай прасторы назваў.",
        "isredirect": "старонка-перасылка",
        "ipbexpiry": "Згасае:",
        "ipbreason": "Прычына:",
        "ipbreason-dropdown": "*Звычайныя прычыны блоку\n** Упісванне несапраўднай інфармацыі\n** Сціранне інфармацыі са старонак\n** Спамавыя спасылкі на вонкавыя сайты\n** Упісванне бессэнсоўнай інфармацыі\n** Некультурныя паводзіны/пераследаванне\n** Злоўжыванне некалькімі рахункамі\n** Недапушчальнае імя ўдзельніка",
-       "ipb-hardblock": "Ð\97абаÑ\80анÑ\96Ñ\86Ñ\8c Ð¿Ð°ÐºÐ°Ð·Ð²Ð°Ñ\86Ñ\8c удзельнікам рэдагаванне з гэтага IP-адрасу",
+       "ipb-hardblock": "Ð\97абаÑ\80анÑ\96Ñ\86Ñ\8c Ð¿Ð°Ð·Ð½Ð°Ð½Ñ\8bм удзельнікам рэдагаванне з гэтага IP-адрасу",
        "ipbcreateaccount": "Не дазваляць стварэнне рахунка",
        "ipbemailban": "Не дазваляць удзельніку слаць эл.пошту",
        "ipbenableautoblock": "Аўтаматычна блакаваць адрас IP, якім удзельнік карыстаўся апошнім разам, і ўсе наступныя адрасы IP, з-пад якіх ён паспрабуе рабіць праўкі",
        "ipb-confirm": "Пацвердзіць блакіроўку",
        "badipaddress": "Недапушчальны адрас IP",
        "blockipsuccesssub": "Паспяховае блакаванне",
-       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] быў заблакаваны.<br />\nБлокі пералічаныя ў [[Special:BlockList|спісе IP-блокаў]].",
-       "ipb-blockingself": "Вы спрабуеце заблакіраваць сябе самога! Вы ўпэўнены, што вы жадаеце гэта зрабіць?",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] быў заблакаваны.<br />\nБлокі пералічаны ў [[Special:BlockList|спісе блокаў]].",
+       "ipb-blockingself": "Вы спрабуеце заблакіраваць сябе самога! Вы ўпэўнены, што хочаце гэта зрабіць?",
        "ipb-confirmhideuser": "Вы намерваецеся заблакіраваць удзельніка і схаваць яго імя. Яно не будзе адлюстроўвацца ў спісах і журналах. Вы ўпэўнены, што жадаеце гэта зрабіць?",
+       "ipb-confirmaction": "Калі вы ўпэўнены, што сапраўды хочаце гэта зрабіць, калі ласка, адзначце поле \"{{int:ipb-confirm}}\" ніжэй.",
        "ipb-edit-dropdown": "Прычыны пастаноўкі блока",
        "ipb-unblock-addr": "Зняць блок з $1",
        "ipb-unblock": "Зняць блок з імя ўдзельніка або адрасу IP",
        "unblockiptext": "У форме, што ніжэй, можна вярнуць дазвол на запіс для раней заблакаванага адрасу IP або ўдзельніка.",
        "ipusubmit": "Зняць гэты блок",
        "unblocked": "[[User:$1|$1]] быў адблакаваны",
-       "unblocked-range": "$1 быў разблакіраваны",
+       "unblocked-range": "$1 быў разблакаваны.",
        "unblocked-id": "Блок $1 быў зняты",
        "blocklist": "Заблакаваныя ўдзельнікі",
        "ipblocklist": "Заблакаваныя ўдзельнікі",
        "change-blocklink": "змяніць блок",
        "contribslink": "уклад",
        "emaillink": "адправіць ліст",
-       "autoblocker": "Аўтаматычны блок таму што вашым адрасам IP нядаўна карыстаўся \"[[User:$1|$1]]\". Блакаванне $1's патлумачана так: \"'''$2'''\"",
+       "autoblocker": "Аўтаматычны блок, таму што вашым адрасам IP нядаўна карыстаўся \"[[User:$1|$1]]\".\nБлакаванне $1 патлумачана так: \"$2\"",
        "blocklogpage": "Журнал блокаў",
-       "blocklog-showlog": "{{GENDER:$1|Гэты ўдзельнік ужо блакіраваўся|Гэта ўдзельніца ўжо блакіравалася}} раней.\nНіжэй прыведзены журнал блакіровак:",
+       "blocklog-showlog": "{{GENDER:$1|Гэты ўдзельнік ужо блакаваўся|Гэта ўдзельніца ўжо блакавалася}} раней.\nЖурнал блакіровак прыведзены ніжэй:",
        "blocklog-showsuppresslog": "Гэты ўдзельнік ужо заблакаваны і скрыты. Журнал утойвання прыведзены ніжэй:",
        "blocklogentry": "паставіў блок на \"[[$1]]\", з часам трывання $2 $3",
        "reblock-logentry": "змененыя настройкі блока для [[$1]] з часам згасання $2 $3",
-       "blocklogtext": "Ð\96Ñ\83Ñ\80нал Ð¿Ð°Ñ\81Ñ\82аноÑ\9eкÑ\96 Ñ\96 Ð·Ð´Ñ\8bманнÑ\8f Ð±Ð»Ð¾ÐºÐ°Ñ\9e. Ð\90Ñ\9eÑ\82амаÑ\82Ñ\8bÑ\87на Ð±Ð»Ð°ÐºÐ°Ð²Ð°Ð½Ñ\8bÑ\8f Ð°Ð´Ñ\80аÑ\81Ñ\8b IP Ñ\82Ñ\83Ñ\82 Ð½Ðµ Ð¿Ð°ÐºÐ°Ð·Ð²Ð°Ñ\8eÑ\86Ñ\86а. Ð¡Ð¿Ñ\96Ñ\81 Ð°ÐºÑ\82Ñ\83алÑ\8cнÑ\8bÑ\85 Ð·Ð°Ð±Ð°Ñ\80он Ñ\96 Ð±Ð»Ð¾ÐºÐ°Ñ\9e Ð±Ð°Ñ\87 Ñ\83 [[Special:BlockList|Ñ\81пÑ\96Ñ\81е Ð±Ð»Ð¾ÐºÐ°Ñ\9e IP]].",
+       "blocklogtext": "Ð\96Ñ\83Ñ\80нал Ð¿Ð°Ñ\81Ñ\82аноÑ\9eкÑ\96 Ñ\96 Ð·Ð½Ñ\8fÑ\86Ñ\86Ñ\8f Ð±Ð»Ð¾ÐºÐ°Ñ\9e. Ð\90Ñ\9eÑ\82амаÑ\82Ñ\8bÑ\87на Ð±Ð»Ð°ÐºÐ°Ð²Ð°Ð½Ñ\8bÑ\8f Ð°Ð´Ñ\80аÑ\81Ñ\8b IP Ñ\82Ñ\83Ñ\82 Ð½Ðµ Ð¿Ð°ÐºÐ°Ð·Ð²Ð°Ñ\8eÑ\86Ñ\86а. Ð¡Ð¿Ñ\96Ñ\81 Ð°ÐºÑ\82Ñ\83алÑ\8cнÑ\8bÑ\85 Ð·Ð°Ð±Ð°Ñ\80он Ñ\96 Ð±Ð»Ð¾ÐºÐ°Ñ\9e Ð±Ð°Ñ\87 Ñ\83 [[Special:BlockList|Ñ\81пÑ\96Ñ\81е Ð±Ð»Ð¾ÐºÐ°Ñ\9e]].",
        "unblocklogentry": "зняты блок з $1",
        "block-log-flags-anononly": "толькі ананімныя ўдзельнікі",
        "block-log-flags-nocreate": "стварэнне рахунку не дазволена",
        "range_block_disabled": "Не дазволена адміністратарская магчымасць ставіць блокі на адрасныя дыяпазоны.",
        "ipb_expiry_invalid": "Некарэктны час сканчэння.",
        "ipb_expiry_temp": "Скрытыя блокі на імёны ўдзельнікаў мусяць быць сталымі.",
-       "ipb_hide_invalid": "Ð\9dемагÑ\87Ñ\8bма Ð·Ð°Ð³Ð»Ñ\83Ñ\88Ñ\8bÑ\86Ñ\8c Ð³Ñ\8dÑ\82Ñ\8b Ñ\80аÑ\85Ñ\83нак; Ð¼Ð°Ð³Ñ\87Ñ\8bма, Ð´Ð»Ñ\8f Ñ\8fго Ð¼Ð°ÐµÑ\86Ñ\86а Ð·Ð°Ñ\88маÑ\82 Ð¿Ñ\80авак.",
+       "ipb_hide_invalid": "Ð\9dемагÑ\87Ñ\8bма Ð·Ð°Ð³Ð»Ñ\83Ñ\88Ñ\8bÑ\86Ñ\8c Ð³Ñ\8dÑ\82Ñ\8b Ñ\80аÑ\85Ñ\83нак; Ð´Ð»Ñ\8f Ñ\8fго Ð¼Ð°ÐµÑ\86Ñ\86а Ð±Ð¾Ð»Ñ\8cÑ\88 Ð·Ð° {{PLURAL:$1|аднÑ\83 Ð¿Ñ\80аÑ\9eкÑ\83|$1 Ð¿Ñ\80аÑ\9eкÑ\96|$1 Ð¿Ñ\80авак}}.",
        "ipb_already_blocked": "\"$1\" ужо знаходзіцца пад блокам",
        "ipb-needreblock": "$1 ужо заблакіраваны. Жадаеце змяніць настройкі блакіроўкі?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Іншая блакіроўка|Іншыя блакіроўкі}}",
        "proxyblockreason": "Ваш адрас IP заблакаваны, таму што ён належыць да ліку адкрытых проксі.\nГэта сур'ёзная праблема бяспекі; паведамце пра гэта свайму Інтэрнет-правайдэру або ў службу тэхнічнай падтрымкі.",
        "sorbsreason": "Ваш адрас IP знаходзіцца ў спісе забароненых адкрытых проксі, якім карыстаецца {{SITENAME}}.",
        "sorbs_create_account_reason": "Ваш адрас IP знаходзіцца ў спісе забароненых адкрытых проксі, якім карыстаецца {{SITENAME}}.\nВы не можаце рэгістравацца",
+       "xffblockreason": "IP-адрас, прыведзены ў загалоўку X-Forwarded-For, або ваш, або проксі-сервера, які вы выкарыстоўваеце, быў заблакаваны. Першапачаткова блок патлумачаны так: $1",
        "cant-see-hidden-user": "Удзельнік, якога вы спрабуеце заблакіраваць, ужо заблакіраваны і схаваны. Паколькі ў вас няма дазволу на працу па схаванні ўдзельнікаў, вы не можаце прагледзець ці змяніць гэту блакіроўку.",
        "ipbblocked": "Вы не можаце блакіраваць ці разблакіраваць іншых удзельнікаў, бо вы самі заблакіраваны",
        "ipbnounblockself": "Вы не можаце разблакіраваць самога сябе",
        "lockedbyandtime": "($1 $2 $3)",
        "move-page": "Перанесці $1",
        "move-page-legend": "Перанесці старонку",
-       "movepagetext": "Форма, што ніжэй, перанясе старонку пад новую назву, і таксама перанясе пад новую назву ўсю гісторыю старонкі.\nСтарая назва ператворыцца ў перасылку да новай.\nПерасылкі, што вялі да старой назвы, можна ўдакладніць аўтаматычна.\nКалі такое аўта-удакладненне не будзе рабіцца, трэба праверыць наяўнасць [[Special:DoubleRedirects|падвойных]] ці [[Special:BrokenRedirects|зламаных]] перасылак.\nАдказнасць за правільную працу спасылак ляжыць на тым, хто пераносіць.\n\nЗаўважце, што старонка '''не будзе''' перанесена, калі пад новай назвай ужо існуе старонка, не пустая і не перасылка і без гісторыі правак. Такім чынам, пры пераносе нельга перапісаць наяўную старонку, а магчымую памылку можна адразу выправіць, пераносячы старонку ў адваротным кірунку.\n\n'''УВАГА!'''\nДля папулярнай старонкі гэта можа стацца рэзкім і нечаканым змяненнем;\nупэўніцеся, што разумееце наступствы пераносу перад тым, як яго зрабіць.",
+       "movepagetext": "Форма, што ніжэй, перанясе старонку пад новую назву, і таксама перанясе пад новую назву ўсю гісторыю старонкі.\nСтарая назва ператворыцца ў перасылку да новай.\nПерасылкі, што вялі да старой назвы, можна ўдакладніць аўтаматычна.\nКалі такое аўта-удакладненне не будзе рабіцца, трэба праверыць наяўнасць [[Special:DoubleRedirects|падвойных]] ці [[Special:BrokenRedirects|зламаных]] перасылак.\nАдказнасць за правільную працу спасылак ляжыць на тым, хто пераносіць.\n\nЗаўважце, што старонка <strong>не будзе</strong> перанесена, калі пад новай назвай ужо існуе старонка, і гэта не перасылка без гісторыі правак.\nТакім чынам, пры пераносе нельга перапісаць наяўную старонку, а магчымую памылку можна адразу выправіць, пераносячы старонку ў адваротным кірунку.\n\n</strong>Увага!</strong>\nДля папулярнай старонкі гэта можа стацца рэзкім і нечаканым змяненнем;\nупэўніцеся, што разумееце наступствы пераносу перад тым, як яго зрабіць.",
        "movepagetext-noredirectfixer": "Форма, што ніжэй, перанясе старонку пад новую назву, і таксама перанясе пад новую назву ўсю гісторыю старонкі.\nСтарая назва ператворыцца ў перасылку да новай.\nПерасылкі, што вялі да старой назвы, можна ўдакладніць аўтаматычна.\nКалі такое аўта-удакладненне не будзе рабіцца, трэба праверыць наяўнасць [[Special:DoubleRedirects|падвойных]] ці [[Special:BrokenRedirects|зламаных]] перасылак.\nАдказнасць за правільную працу спасылак ляжыць на тым, хто пераносіць.\n\nЗаўважце, што старонка '''не будзе''' перанесена, калі пад новай назвай ужо існуе старонка, не пустая і не перасылка і без гісторыі правак. Такім чынам, пры пераносе нельга перапісаць наяўную старонку, а магчымую памылку можна адразу выправіць, пераносячы старонку ў адваротным кірунку.\n\n'''УВАГА!'''\nДля папулярнай старонкі гэта можа стацца рэзкім і нечаканым змяненнем;\nупэўніцеся, што разумееце наступствы пераносу перад тым, як яго зрабіць.",
        "movepagetalktext": "Звязаная старонка размовы будзе аўтаматычна перанесена разам з асноўнай, '''апроч тых выпадкаў, калі:'''\n*Існуе непустая старонка размовы звязаная з новай назвай, або\n*З боксу, што ніжэй, знятая адзнака.\n\nУ такіх выпадках, калі гэта неабходна, трэба пераносіць або аб'ядноўваць старонку размовы самастойна.",
-       "movearticle": "Перанесці старонку",
+       "movearticle": "Перанесці старонку:",
        "moveuserpage-warning": "'''Увага.''' Вы збіраецеся пераназваць старонку ўдзельніка. Калі ласка, звернеце ўвагу, што пераназвана будзе толькі старонка, удзельнік '''не''' будзе пераназваны.",
+       "movecategorypage-warning": "<strong>Увага:</strong> Вы збіраецеся перанесці старонку катэгорыі. Заўважце, што толькі гэта старонка будзе перанесена, і ніводная старонка са старой катэгорыі <em>не будзе</em> катэгарызавана ў новай.",
        "movenologintext": "Вы павінны быць зарэгістраваным удзельнікам, і [[Special:UserLogin|ўвайсці ў сістэму]], каб пераносіць старонкі.",
-       "movenotallowed": "Ð\92ам Ð½Ðµ Ð´Ð°Ð·Ð²Ð¾Ð»ÐµÐ½Ð° Ð¿ÐµÑ\80аноÑ\81Ñ\96Ñ\86Ñ\8c Ñ\81Ñ\82аÑ\80онак.",
+       "movenotallowed": "Ð\92ам Ð½Ðµ Ð´Ð°Ð·Ð²Ð¾Ð»ÐµÐ½Ð° Ð¿ÐµÑ\80аноÑ\81Ñ\96Ñ\86Ñ\8c Ñ\81Ñ\82аÑ\80онкÑ\96.",
        "movenotallowedfile": "Вы не маеце дазволу пераносіць файлы.",
        "cant-move-user-page": "Вам не дазволена пераносіць старонак карыстальнікаў (не лічачы пад-старонак).",
        "cant-move-to-user-page": "Вам не дазволена пераносіць старонку ў старонку карыстальніка (не лічачы пад-старонак карыстальніка).",
+       "cant-move-category-page": "Вам не дазволена пераносіць старонкі катэгорый.",
+       "cant-move-to-category-page": "Вам не дазволена пераносіць старонку ў старонку катэгорыі.",
        "newtitle": "Пад новую назву:",
        "move-watch": "Назіраць за старонкай",
        "movepagebtn": "Перанесці старонку",
        "pagemovedsub": "Паспяховы перанос",
-       "movepage-moved": "'''\"$1\" перанесена ў \"$2\"'''",
-       "movepage-moved-redirect": "Была створаная перасылка.",
+       "movepage-moved": "<strong>\"$1\" перанесена ў \"$2\"</strong>",
+       "movepage-moved-redirect": "Была створана перасылка.",
        "movepage-moved-noredirect": "Не была створаная перасылка.",
        "articleexists": "Старонка з такой назвай ужо існуе, або\nвамі выбрана недапушчальнае імя.\nВыберыце іншае імя.",
        "cantmove-titleprotected": "Немагчыма перанесці старонку пад гэтую назву, таму што назва ахоўваецца ад стварэння",
-       "movetalk": "Перанесці таксама старонку размовы.",
+       "movetalk": "Перанесці таксама старонку размоў",
        "move-subpages": "Таксама перанесці пад-старонкі (да ўзроўню $1)",
        "move-talk-subpages": "Таксама перанесці пад-старонкі размовы (да ўзроўню $1)",
        "movepage-page-exists": "Старонка $1 ужо існуе і не можа быць аўтаматычна перапісаная.",
        "movepage-page-unmoved": "Не ўдалося перанесці старонку $1 у $2.",
        "movepage-max-pages": "Быў перанесены дазволены максімум $1 {{PLURAL:$1|старонкі|старонак}} і больш аўтаматычных пераносаў не будзе.",
        "movelogpage": "Журнал пераносаў",
-       "movelogpagetext": "Ð\9dÑ\96жÑ\8dй Ð¿Ð°Ð´Ð°ÐµÑ\86Ñ\86а спіс пераносаў старонак.",
+       "movelogpagetext": "Ð\9dÑ\96жÑ\8dй Ð¿Ð°Ð´Ð°Ð´Ð·ÐµÐ½Ñ\8b спіс пераносаў старонак.",
        "movesubpage": "{{PLURAL:$1|Пад-старонка|Пад-старонкі}}",
        "movesubpagetext": "Старонка мае $1 {{PLURAL:$1|пад-старонку, паказаную ніжэй|пад-старонкі, паказаныя ніжэй}}.",
        "movenosubpage": "Старонка не мае пад-старонак.",
        "movereason": "Прычына:",
        "revertmove": "адкат",
-       "delete_and_move": "Ð\92Ñ\8bдалÑ\96Ñ\86Ñ\8c і перанесці",
+       "delete_and_move": "СÑ\86еÑ\80Ñ\86Ñ\96 і перанесці",
        "delete_and_move_text": "==Патрабуецца сціранне==\n\nУжо існуе артыкул з мэтавай назвай \"[[:$1]]\". Дык ці жадаеце сцерці яго, каб зрабіць месца для пераносу?",
        "delete_and_move_confirm": "Так, сцерці старонку",
        "delete_and_move_reason": "Сцёрта, каб зрабіць месца для пераносу \"[[$1]]\"",
        "selfmove": "Назвы вытока і мэты такія самыя; нельга пераносіць старонку саму на сябе.",
        "immobile-source-namespace": "Нельга пераносіць старонкі ў прасторы назваў \"$1\"",
-       "immobile-target-namespace": "Ð\9dелÑ\8cга Ð¿ÐµÑ\80аноÑ\81Ñ\96Ñ\86Ñ\8c Ñ\81Ñ\82аÑ\80онкÑ\96 Ñ\9e Ð¿Ñ\80аÑ\81Ñ\82оÑ\80Ñ\8b назваў \"$1\"",
+       "immobile-target-namespace": "Ð\9dелÑ\8cга Ð¿ÐµÑ\80аноÑ\81Ñ\96Ñ\86Ñ\8c Ñ\81Ñ\82аÑ\80онкÑ\96 Ñ\9e Ð¿Ñ\80аÑ\81Ñ\82оÑ\80Ñ\83 назваў \"$1\"",
        "immobile-target-namespace-iw": "Нельга пераносіць старонку на месца спасылкі інтэрвікі.",
        "immobile-source-page": "Нельга пераносіць гэтую старонку.",
-       "immobile-target-page": "Ð\9dемагÑ\87Ñ\8bма Ð¿ÐµÑ\80аноÑ\81Ñ\96Ñ\86Ñ\8c Ð½Ð° гэтую назву.",
+       "immobile-target-page": "Ð\9dелÑ\8cга Ð¿ÐµÑ\80аноÑ\81Ñ\96Ñ\86Ñ\8c Ð¿Ð°Ð´ гэтую назву.",
        "imagenocrossnamespace": "Нельга пераносіць у не-файлавую прастору назваў",
        "nonfile-cannot-move-to-file": "Немагчыма пераназываць старонкі ў выявы",
        "imagetypemismatch": "Новы канчатак назвы файла не адпавядае яго тыпу",
        "imageinvalidfilename": "Недапушчальная назва мэтавага файла",
        "fix-double-redirects": "Абнавіць усе перасылкі, якія вядуць да пачатковай назвы",
        "move-leave-redirect": "Пакінуць перасылку са старой назвы",
-       "protectedpagemovewarning": "'''Папярэджанне. Гэта старонка была змешчана пад ахову; пераназваць яе могуць толькі ўдзельнікі з паўнамоцтвамі адміністратараў.'''\nНіжэй для даведкі прыведзена апошні запіс журнала:",
-       "semiprotectedpagemovewarning": "'''Заўвага.''' Гэта старонка была змешчана пад ахову; пераназваць яе могуць толькі зарэгістраваныя ўдзельнікі.\nНіжэй для даведкі прыведзена апошні запіс журнала:",
+       "protectedpagemovewarning": "<strong>Папярэджанне:</strong> Гэта старонка была змешчана пад ахову; пераназваць яе могуць толькі ўдзельнікі з паўнамоцтвамі адміністратараў.\nНіжэй для даведкі прыведзена апошні запіс журнала:",
+       "semiprotectedpagemovewarning": "<strong>Заўвага:</strong> Гэта старонка была змешчана пад ахову; пераносіць яе пад іншую назву могуць толькі зарэгістраваныя ўдзельнікі.\nНіжэй для даведкі прыведзена апошні запіс журнала:",
        "move-over-sharedrepo": "== Файл існуе ==\nФайл з назвай [[:$1]] ёсць у агульным сховішчы. Файл, перанесены пад такую назву, будзе перамагаць файл з агульнага сховішча.",
        "file-exists-sharedrepo": "Такая назва файла ўжо выкарыстана ў агульным сховішчы.\nВыберыце іншую назву.",
        "export": "Экспартаваць старонкі",
        "export-addcattext": "Дадаць старонкі з катэгорыі:",
        "export-addcat": "Дадаць",
        "export-addnstext": "Уключыць старонкі з прасторы назваў:",
-       "export-addns": "Ð\94адаÑ\82кова",
+       "export-addns": "Ð\94адаÑ\86Ñ\8c",
        "export-download": "Прапанаваць запісаць у файл",
        "export-templates": "Разам з шаблонамі",
        "export-pagelinks": "Разам са старонкамі, на якія ёсць спасылкі (макс. кольк. крокаў):",
        "allmessagesname": "Назва",
        "allmessagesdefault": "Прадвызначаны тэкст",
        "allmessagescurrent": "Актуальны тэкст",
-       "allmessagestext": "Пералік сістэмных паведамленняў, наяўных у прасторы назваў MediaWiki.",
+       "allmessagestext": "Пералік сістэмных паведамленняў, наяўных у прасторы назваў MediaWiki.\nКалі ласка, наведайце пляцоўкі [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] і [//translatewiki.net translatewiki.net], калі жадаеце ўдзельнічаць у перакладзе MediaWiki.",
        "allmessagesnotsupportedDB": "Немагчыма паказаць '''{{ns:special}}:{{:{{ns:mediawiki}}:Allmessages}}''', таму што не працуе '''$wgUseDatabaseMessages'''.",
        "allmessages-filter-legend": "Фільтры",
        "allmessages-filter": "Са станам апрацоўкі:",
        "allmessages-prefix": "Толькі назвы з такім пачаткам:",
        "allmessages-language": "Мова:",
        "allmessages-filter-submit": "Пошук",
+       "allmessages-filter-translate": "Перакласці",
        "thumbnail-more": "Павялічыць",
        "filemissing": "Адсутны файл",
        "thumbnail_error": "Памылка пры стварэнні драбніцы: $1",
+       "thumbnail_error_remote": "Паведамленне пра памылку з $1:\n$2",
        "djvu_page_error": "Старонка DjVu па-за інтэрвалам",
        "djvu_no_xml": "Не ўдалося ўзяць XML для файла DjVu",
        "thumbnail-temp-create": "Не ўдаецца стварыць часовы файл эскіза",
        "import-comment": "Каментарый:",
        "importtext": "Калі ласка, экспартуйце файл з крынічнай вікі з дапамогай [[Special:Export|прылады экспарту]].\nЗахавайце яго на свой камп'ютар, а потым загрузіце сюды.",
        "importstart": "Імпартаванне старонак...",
-       "import-revision-count": "$1 {{PLURAL:$1|версія|версій}}",
+       "import-revision-count": "$1 {{PLURAL:$1|версія|версіі|версій}}",
        "importnopages": "Няма старонак для імпартавання.",
        "imported-log-entries": "{{PLURAL:$1|Імпартаваны $1 запіс журнала|Імпартавана $1 запісы журнала|Імпартавана $1 запісаў журнала}}.",
        "importfailed": "Не ўдалося імпартаваць: $1",
        "importuploaderrorsize": "Не ўдалося атрымаць файл дзеля імпартавання. Аб'ём файла занадта вялікі.",
        "importuploaderrorpartial": "Не ўдалося атрымаць файл дзеля імпартавання. Атрыманы файл няпоўны.",
        "importuploaderrortemp": "Не ўдалося атрымаць файл дзеля імпартавання. Няма тымчасовага каталога.",
-       "import-parse-failure": "Памылка разбірання XML пры імпартаванні",
+       "import-parse-failure": "Памылка аналізу XML пры імпартаванні",
        "import-noarticle": "Няма старонак, каб іх імпартаваць!",
-       "import-nonewrevisions": "УÑ\81е Ð²ÐµÑ\80Ñ\81Ñ\96Ñ\96 Ñ\9eжо Ð±Ñ\8bлÑ\96 Ñ\96мпаÑ\80Ñ\82аванÑ\8bÑ\8f Ñ\80аней.",
+       "import-nonewrevisions": "Ð\9dÑ\96Ñ\87ога Ð½Ðµ Ñ\96мпаÑ\80Ñ\82авана (Ñ\83Ñ\81е Ð²ÐµÑ\80Ñ\81Ñ\96Ñ\96 Ð°Ð»Ñ\8cбо Ñ\9eжо Ð¿Ñ\80Ñ\8bÑ\81Ñ\83Ñ\82нÑ\96Ñ\87аÑ\8eÑ\86Ñ\8c, Ð°Ð»Ñ\8cбо Ð¿Ñ\80апÑ\83Ñ\88Ñ\87анÑ\8b Ð·-за Ð¿Ð°Ð¼Ñ\8bлак).",
        "xml-error-string": "$1 у радку $2, знак $3 (байт $4): $5",
        "import-upload": "Укласці даныя XML",
        "import-token-mismatch": "Згублены звесткі пра сеанс. Паспрабуйце ізноў.",
        "import-invalid-interwiki": "Немагчыма імпартаваць з гэтай вікі.",
-       "import-error-edit": "Старонка «$1» не была імпартавана раней, бо вам не дазволена яе рэдагаваць.",
-       "import-error-create": "Старонка «$1» не была імпартавана раней, бо вам не дазволена яе ствараць.",
+       "import-error-edit": "Старонка «$1» не была імпартавана, бо вам не дазволена яе правіць.",
+       "import-error-create": "Старонка «$1» не была імпартавана, бо вам не дазволена яе ствараць.",
        "import-error-interwiki": "Старонка «$1» не была імпартаваная, таму што гэтая назва зарэзерваваная для інтэрвікі.",
        "import-error-special": "Старонка «$1» не была імпартаваная, таму што яна належыць да спецыяльнай прасторы назваў, старонкі ў якой не дазволеныя.",
        "import-error-invalid": "Старонка «$1» не была імпартаваная з-за няслушнасці назвы.",
        "importlogpage": "Журнал імпартаванняў",
        "importlogpagetext": "Адміністрацыйныя імпартаванні старонак з іншых вікі, разам з гісторыямі правак.",
        "import-logentry-upload": "імпартавана [[$1]] праз файлавы ўклад",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|версія|версій}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|версія|версіі|версій}}",
        "import-logentry-interwiki": "транс-вікавана $1",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|версія|версій}} з $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|версія|версіі|версій}} з $2",
        "javascripttest": "JavaScript-тэсты",
        "javascripttest-title": "Праводзіцца тэставанне $1",
        "javascripttest-pagetext-noframework": "Гэта старонка зарэзервавана для запуску тэстаў JavaScript",
        "tooltip-preferences-save": "Захаваць настройкі",
        "tooltip-summary": "Дайце кароткае апісанне",
        "common.css": "/** CSS, упісаны сюды, будзе дзейнічаць на карыстальнікаў усіх світаў */",
-       "monobook.css": "/* CSS, упісаны сюды, будзе дзейнічаць на браўзер кожнага чытача з актыўнай світай Monobook */",
        "common.js": "/* Яваскрыпт, упісаны сюды, будзе выконвацца для кожнага чытача, на кожным счытванні старонкі. */",
-       "monobook.js": "/* Any JavaScript here will be loaded for users using the MonoBook skin */",
        "anonymous": "Ананімны{{PLURAL:$1| ўдзельнік|я ўдзельнікі}} на пляцоўцы {{SITENAME}}",
        "siteuser": "удзельнік $1 з {{SITENAME}}",
        "anonuser": "ананімны ўдзельнік {{SITENAME}} - $1",
        "pageinfo-title": "Інфармацыя для \"$1\"",
        "pageinfo-header-basic": "Агульныя звесткі",
        "pageinfo-header-edits": "Гісторыя правак",
-       "pageinfo-robot-index": "Індэксуюцца",
-       "pageinfo-robot-noindex": "Не індэксуюцца",
+       "pageinfo-header-restrictions": "Ахова старонкі",
+       "pageinfo-header-properties": "Уласцівасці старонкі",
+       "pageinfo-display-title": "Паказаная назва",
+       "pageinfo-default-sort": "Прадвызначаны ключ парадкавання",
+       "pageinfo-length": "Даўжыня старонкі (у байтах)",
+       "pageinfo-article-id": "Ідэнтыфікатар старонкі",
+       "pageinfo-language": "Мова змесціва старонкі",
+       "pageinfo-content-model": "Мадэль змесціва старонкі",
+       "pageinfo-robot-policy": "Індэксаванне робатамі",
+       "pageinfo-robot-index": "Дазволена",
+       "pageinfo-robot-noindex": "Не дазволена",
        "pageinfo-views": "Колькасць праглядаў",
-       "pageinfo-watchers": "Колькасць назіральнікаў",
+       "pageinfo-watchers": "Колькасць назіральнікаў старонкі",
+       "pageinfo-few-watchers": "Менш чым $1 {{PLURAL:$1|назіральнік|назіральнікі|назіральнікаў}}",
+       "pageinfo-redirects-name": "Колькасць перасылак на гэту старонку",
+       "pageinfo-subpages-name": "Колькасць падстаронак гэтай старонкі",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|перасылка|перасылкі|перасылак}}; $3 {{PLURAL:$3|прамая спасылка|прамыя спасылкі|прамых спасылак}})",
+       "pageinfo-firstuser": "Стваральнік старонкі",
+       "pageinfo-firsttime": "Дата стварэння старонкі",
        "pageinfo-lastuser": "Апошні рэдактар",
        "pageinfo-lasttime": "Дата апошняй праўкі",
        "pageinfo-edits": "Агульная колькасць правак",
        "pageinfo-authors": "Агульная колькасць розных аўтараў",
-       "skinname-cologneblue": "Сіні Кёльн",
-       "skinname-monobook": "Манабук",
-       "skinname-modern": "Сучаснасць",
+       "pageinfo-toolboxlink": "Звесткі пра старонку",
+       "pageinfo-redirectsto": "Перасылае да",
+       "pageinfo-redirectsto-info": "звесткі",
+       "pageinfo-contentpage": "Улічваецца як змястоўная старонка",
+       "pageinfo-contentpage-yes": "Так",
+       "pageinfo-protect-cascading": "Каскадная ахова пачынаецца адсюль",
+       "pageinfo-protect-cascading-yes": "Да",
+       "pageinfo-protect-cascading-from": "Каскадная ахова ад",
+       "pageinfo-category-info": "Звесткі аб катэгорыі",
+       "pageinfo-category-pages": "Колькасць старонак",
+       "pageinfo-category-subcats": "Колькасць падкатэгорый",
+       "pageinfo-category-files": "Колькасць файлаў",
        "markaspatrolleddiff": "Пазначыць як ухваленае",
        "markaspatrolledtext": "Пазначыць старонку як ухваленую",
        "markedaspatrolled": "Пазначана як ухваленае",
        "markedaspatrollederror": "Немагчыма пазначыць як вартае",
        "markedaspatrollederrortext": "Трэба паказаць тую версію, якую жадаеце пазначыць ухваленай.",
        "markedaspatrollederror-noautopatrol": "Вам не дазволена значыць уласныя праўкі як ухваленыя.",
+       "markedaspatrollednotify": "Змена ў $1 пазначана як ухваленая.",
        "patrol-log-page": "Журнал ухваленых",
        "patrol-log-header": "Журнал ухваленых версій",
        "log-show-hide-patrol": "$1 журнал ухваленняў",
        "file-info-size-pages": "$1 × $2 пікселяў, памер файла: $3, MIME-тип: $4, $5 {{PLURAL:$5|старонка|старонкі|старонак}}",
        "file-nohires": "Без версіі ў лепшым разрозненні.",
        "svg-long-desc": "файл SVG, намінальна $1 × $2 кропак, аб'ём файла: $3",
-       "show-big-image": "Ð\9dайлепÑ\88ае Ñ\80азÑ\80озненне",
+       "show-big-image": "Ð\90Ñ\80Ñ\8bгÑ\96налÑ\8cнÑ\8b Ñ\84айл",
        "show-big-image-preview": "Памер пры папярэднім праглядзе: $1.",
        "show-big-image-other": "{{PLURAL:$2|Іншы дазвол|Іншыя дазволы}}: $1.",
        "show-big-image-size": "$1 × $2 піхеляў",
        "newimages-summary": "Тут паказаныя нядаўна ўкладзеныя файлы.",
        "newimages-legend": "Фільтр",
        "newimages-label": "Назва файла (або яе частка):",
+       "newimages-showbots": "Паказваць укладанні ботамі",
        "noimages": "Тут нічога няма.",
        "ilsubmit": "Знайсці",
        "bydate": "п. датаў",
        "minutes": "{{PLURAL:$1|$1 хвіліна|$1 хвіліны|$1 хвілін}}",
        "hours": "{{PLURAL:$1|$1 гадзіна|$1 гадзіны|$1 гадзін}}",
        "days": "{{PLURAL:$1|$1 дзень|$1 дня|$1 дзён}}",
+       "weeks": "{{PLURAL:$1|$1 тыдзень|$1 тыдні|$1 тыдняў}}",
+       "months": "{{PLURAL:$1|$1 месяц|$1 месяцы|$1 месяцаў}}",
+       "years": "{{PLURAL:$1|$1 год|$1 гады|$1 гадоў}}",
        "ago": "$1 назад",
+       "just-now": "толькі што",
+       "hours-ago": "$1 {{PLURAL:$1|гадзіну|гадзіны|гадзін}} таму",
+       "minutes-ago": "$1 {{PLURAL:$1|мінуту|мінуты|мінут}} таму",
+       "seconds-ago": "$1 {{PLURAL:$1|секунду|секунды|секундаў}} таму",
+       "monday-at": "У панядзелак а $1",
+       "tuesday-at": "У аўторак а $1",
+       "wednesday-at": "У сераду а $1",
+       "thursday-at": "У чацвер а $1",
+       "friday-at": "У пятніцу а $1",
+       "saturday-at": "У суботу а $1",
+       "sunday-at": "У нядзелю а $1",
+       "yesterday-at": "Учора а $1",
        "bad_image_list": "Афармленне гэтага такое:\n\nУлічваюцца толькі складнікі спісаў (радкі, пачатыя з зорачкі *). Першая спасылка ў радку павінна быць спасылкай на кепскую выяву.\nУсе наступныя спасылкі ў тым самым радку лічацца выняткамі, г.зн. старонкамі, у якіх файл можа быць устаўлены ў тэкст.",
        "metadata": "Мета-дадзеныя",
        "metadata-help": "У файле ёсць дадатковыя звесткі, магчыма, дадзеныя лічбавай фотакамерай ці сканерам, з якіх гэты файл паходзіць. Калі арыгінальны файл быў зменены, то частка гэтых звестак магла страціць актуальнасць у дачыненні да змененага файла.",
        "exif-compression-3": "CCITT Group 3, факсавае кадзіраванне",
        "exif-compression-4": "CCITT Group 4, факсавае кадзіраванне",
        "exif-copyrighted-true": "Ахоўваецца аўтарскім правам",
-       "exif-copyrighted-false": "Ð\93Ñ\80амадÑ\81кÑ\96 Ð·Ð´Ð°Ð±Ñ\8bÑ\82ак",
+       "exif-copyrighted-false": "СÑ\82аÑ\82Ñ\83Ñ\81 Ð°Ñ\9eÑ\82аÑ\80Ñ\81Ñ\82ва Ð½Ðµ Ñ\9eÑ\81Ñ\82аноÑ\9eленÑ\8b",
        "exif-unknowndate": "Невядомая дата",
        "exif-orientation-1": "Звычайна",
        "exif-orientation-2": "Адлюстравана злева ўправа",
        "exif-flash-function-1": "Без бліскавіцы",
        "exif-flash-redeye-1": "памяншэнне чырвані вачэй",
        "exif-focalplaneresolutionunit-2": "цаляў",
-       "exif-sensingmethod-1": "Невызначаны",
+       "exif-sensingmethod-1": "Нявызначаны",
        "exif-sensingmethod-2": "1-корпусны плошчавы каляровы датчык",
        "exif-sensingmethod-3": "2-корпусны плошчавы каляровы датчык",
        "exif-sensingmethod-4": "3-корпусны плошчавы каляровы датчык",
        "exif-subjectdistancerange-1": "Макрас",
        "exif-subjectdistancerange-2": "Від зблізу",
        "exif-subjectdistancerange-3": "Від зводдаль",
-       "exif-gpslatitude-n": "паўночная шырата",
-       "exif-gpslatitude-s": "паўднёвая шырата",
-       "exif-gpslongitude-e": "усходняя даўгата",
-       "exif-gpslongitude-w": "заходняя даўгата",
+       "exif-gpslatitude-n": "Ð\9fаўночная шырата",
+       "exif-gpslatitude-s": "Ð\9fаўднёвая шырата",
+       "exif-gpslongitude-e": "Усходняя даўгата",
+       "exif-gpslongitude-w": "Ð\97аходняя даўгата",
        "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|метр|метра|метраў}} над узроўнем мора",
        "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|метр|метра|метраў}} ніжэй узроўня мора",
        "exif-gpsstatus-a": "Адбываецца вымярэнне",
        "confirmemail_subject": "Пацверджанне адрасу эл.пошты для {{SITENAME}}",
        "confirmemail_body": "Нехта (магчыма, што і вы — з адрасу IP $1) завёў рахунак \"$2\" на пляцоўцы {{SITENAME}}, паказваючы гэты адрас эл.пошты як свой.\n\nДзеля таго, каб пацвердзіць, што рахунак сапраўды ваш, і каб актываваць магчымасці эл.пошты для {{SITENAME}}, адкрыйце ў браўзеры гэтую спасылку:\n\n$3\n\nКалі гэта *былі не вы*, не адкрывайце той спасылкі, а адкрыйце гэтую, каб згасіць пацверджанне адрасу эл.пошты:\n\n$5\n\nГэты пацвярджальны код згасне $4.",
        "confirmemail_body_changed": "Нехта з IP-адрасу \"$1\" (магчыма, што Вы) змяніў адрас эл.пошты для рахунку \"$2\" на пляцоўцы {{SITENAME}}.\n\nКаб пацвердзіць, што рахунак сапраўды належыць вам, і каб ізноў уключыць працу з эл.поштай для рахунку на пляцоўцы {{SITENAME}}, адкрыйце гэтую спасылку ў браўзеры:\n\n$3\n\nКалі рахунак вам *не належыць*, адкрыйце ніжэй паказаную спасылку, каб адмовіцца ад пацверджання адрасу эл.пошты:\n\n$5\n\nГэты квіток на пацверджанне будзе дзейсны не далей за $4.",
-       "confirmemail_body_set": "Нехта (магчыма, вы) з IP-адрасам $1\nпаказаў дадзены адрас электроннай пошты для ўліковага запісу «$2» у праекце {{SITENAME}}.\n\nКаб пацвердзіць, што акаўнт сапраўды належыць вам, і ўключыць магчымасць адпраўкі лістоў з сайта {{SITENAME}}, адкрыйце гэтую спасылку ў браўзеры:\n\n$3\n\nКалі рахунак вам *не належыць*, адкрыйце ніжэй паказаную спасылку, каб адмовіцца ад пацверджання адрасу эл.пошты:\n\n$5\n\nКод пацверджання сапраўдны да $4.",
+       "confirmemail_body_set": "Нехта (магчыма, вы) з IP-адрасам $1\nпаказаў дадзены адрас электроннай пошты для ўліковага запісу «$2» у праекце {{SITENAME}}.\n\nКаб пацвердзіць, што акаўнт сапраўды належыць вам, і ўключыць магчымасць адпраўкі лістоў з сайта {{SITENAME}}, адкрыйце гэтую спасылку ў браўзеры:\n\n$3\n\nКалі рахунак вам *не належыць*, адкрыйце ніжэй паказаную спасылку, каб адмовіцца ад пацверджання адрасу эл.пошты:\n\n$5\n\nКод пацверджання дзейсны да $4.",
        "confirmemail_invalidated": "Пацверджанне эл.пошты скасаванае",
        "invalidateemail": "Адмовіцца ад пацверджання эл.пошты",
        "scarytranscludedisabled": "[Устаўлянне з іншых вікі не дазволена]",
        "scarytranscludefailed": "[Не ўдалося атрымаць шаблон для $1]",
+       "scarytranscludefailed-httpstatus": "[Не ўдалося атрымаць шаблон для $1: HTTP $2]",
        "scarytranscludetoolong": "[Занадта доўгі URL]",
        "deletedwhileediting": "'''Увага''': гэтая старонка была сцёрта пасля таго, як вы пачалі з ёй працаваць!",
        "confirmrecreate": "Удзельнік [[User:$1|$1]] ([[User talk:$1|размова]]) сцёр гэты артыкул пасля таго, як вы пачалі працу з ім, падаўшы прычыну:\n: ''$2''\nПацвердзіце свой намер аднавіць гэты артыкул.",
        "confirm-watch-top": "Дабавіць старонку ў спіс назірання",
        "confirm-unwatch-button": "ОК",
        "confirm-unwatch-top": "Выняць гэту старонку з вашага спіса назірання?",
+       "quotation-marks": "«$1»",
        "imgmultipageprev": "← папярэдняя старонка",
        "imgmultipagenext": "наступная старонка →",
        "imgmultigo": "Пераход!",
        "imgmultigoto": "На старонку $1",
+       "img-lang-default": "(прадвызначаная мова)",
        "ascending_abbrev": "да больш.",
        "descending_abbrev": "да менш.",
        "table_pager_next": "Наступная старонка",
        "autosumm-replace": "Замена старонкі на '$1'",
        "autoredircomment": "Перасылае да [[$1]]",
        "autosumm-new": "Новая старонка: '$1'",
-       "lag-warn-normal": "Змены, зробленыя менш за $1 {{PLURAL:$1|сек.|сек.}} назад, могуць не трапіць у гэты спіс.",
-       "lag-warn-high": "Ð\97 Ð¿Ñ\80Ñ\8bÑ\87Ñ\8bнÑ\8b Ð¼Ð¾Ñ\86нÑ\8bÑ\85 Ð·Ð°Ñ\82Ñ\80Ñ\8bмак Ð½Ð° Ñ\81еÑ\80веÑ\80Ñ\8b Ð±Ð°Ð· Ð´Ð°Ð½Ñ\8bÑ\85, Ð·Ð¼ÐµÐ½Ñ\8b, Ð·Ñ\80обленÑ\8bÑ\8f Ð¿Ð°Ð·Ð½ÐµÐ¹ Ñ\87Ñ\8bм $1 {{PLURAL:$1|Ñ\81ек.|Ñ\81ек.}} назад, могуць не трапіць у гэты спіс.",
+       "lag-warn-normal": "Змены, зробленыя менш за $1 {{PLURAL:$1|сек.|сек.}} таму назад, могуць не трапіць у гэты спіс.",
+       "lag-warn-high": "Ð\97 Ð¿Ñ\80Ñ\8bÑ\87Ñ\8bнÑ\8b Ð¼Ð¾Ñ\86нÑ\8bÑ\85 Ð·Ð°Ñ\82Ñ\80Ñ\8bмак Ð½Ð° Ñ\81еÑ\80веÑ\80Ñ\8b Ð±Ð°Ð· Ð·Ð²ÐµÑ\81Ñ\82ак, Ð·Ð¼ÐµÐ½Ñ\8b, Ð·Ñ\80обленÑ\8bÑ\8f Ð¼ÐµÐ½Ñ\88 Ð·Ð° $1 {{PLURAL:$1|Ñ\81ек.|Ñ\81ек.}} Ñ\82амÑ\83 назад, могуць не трапіць у гэты спіс.",
        "watchlistedit-normal-title": "Спіс назірання",
        "watchlistedit-normal-legend": "Выдаленне складнікаў са спіса назірання",
        "watchlistedit-normal-explain": "Назвы старонак з ліку назіраных паказаныя ніжэй. Каб нешта сцерці, адзначце клетку побач з адпаведным радком, пасля чаго націсніце \"Выняць складнікі\". Таксама можна правіць гэты спіс непасрэдна, [[Special:EditWatchlist/raw|без афармлення]].",
        "watchlistedit-raw-done": "Спіс назірання абноўлены.",
        "watchlistedit-raw-added": "Дапісаны{{PLURAL:$1| 1 складнік|я $1 складнікаў}}:",
        "watchlistedit-raw-removed": "Выняты{{PLURAL:$1| 1 складнік|я $1 складнікаў}}:",
+       "watchlistedit-clear-title": "Чыстка спісу назірання",
+       "watchlistedit-clear-legend": "Ачысціць спіс назірання",
+       "watchlistedit-clear-explain": "Усе складнікі будуць выняты з вашага спісу назірання",
+       "watchlistedit-clear-titles": "Складнікі:",
+       "watchlistedit-clear-submit": "Ачысціць спіс назірання (адкат будзе немагчымы!)",
+       "watchlistedit-clear-done": "Ваш спіс назірання ачышчаны.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 складнік выняты|$1 складнікі выняты|$1 складнікаў вынята}}:",
+       "watchlistedit-too-many": "Занадта шмат старонак, каб паказаць тут.",
+       "watchlisttools-clear": "Ачысціць спіс назірання",
        "watchlisttools-view": "Паказаць змяненні",
        "watchlisttools-edit": "Паказаць спіс назірання",
        "watchlisttools-raw": "Паказаць нефарматаваны спіс назірання",
        "version-hook-name": "Назва хука",
        "version-hook-subscribedby": "Сюды падпісаныя",
        "version-version": "(Версія $1)",
-       "version-license": "Ліцэнзія",
+       "version-no-ext-name": "[без назвы]",
+       "version-license": "Ліцэнзія MediaWiki",
+       "version-ext-license": "Ліцэнзія",
+       "version-ext-colheader-name": "Прыстаўка",
+       "version-ext-colheader-version": "Версія",
+       "version-ext-colheader-license": "Ліцэнзія",
+       "version-ext-colheader-description": "Апісанне",
+       "version-ext-colheader-credits": "Аўтары",
+       "version-license-title": "Ліцэнзія $1",
+       "version-license-not-found": "Не знойдзена падрабязнай інфармацыі аб ліцэнзіі для гэтай прыстаўкі.",
        "version-poweredby-credits": "Пляцоўка працуе на '''[https://www.mediawiki.org/ MediaWiki]''', капірайт © 2001-$1 $2.",
        "version-poweredby-others": "іншыя",
+       "version-poweredby-translators": "перакладчыкі translatewiki.net",
        "version-license-info": "MediaWiki з'яўляецца свабодным праграмным забеспячэннем. Такім чынам, вы можаце паўторна распаўсюджваць прадукт і(або) змяняць яго на ўмовах пагаднення GNU General Public License у тым выглядзе, у якім яно публікуецца фондам Free Software Foundation; сілу мае версія (выпуск) 2 гэтага пагаднення або, на ваш выбар, навейшая версія (выпуск) пагаднення.\n\nMediaWiki распаўсюджваецца, спадзеючыся на прыдатнасць прадукта, але БЕЗ ЯКІХ-НЕБУДЗЬ ГАРАНТЫЙ, у тым ліку, без імплікаваных гарантый СПАЖЫВЕЦКАЙ ВАРТАСЦІ або ПРЫДАТНАСЦІ ДЛЯ ЯКОЙ-НЕБУДЗЬ МЭТЫ. Больш падрабязна гл. пагадненне GNU General Public License.\n\nРазам з гэтым праграмным забеспячэннем вы павінны былі атрымаць [{{SERVER}}{{SCRIPTPATH}}/COPYING копію пагаднення GNU General Public License]. Калі гэта не так, паведамце аб гэтым у фонд Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA або [//www.gnu.org/licenses/old-licenses/gpl-2.0.html атрымайце яе з Інтэрнэту].",
        "version-software": "Устаноўленыя праграмныя прадукты",
        "version-software-product": "Прадукт",
        "version-software-version": "Версія",
        "version-entrypoints-header-entrypoint": "Кропка ўваходу",
        "version-entrypoints-header-url": "URL",
+       "redirect-legend": "Перасылка да файла ці старонкі",
+       "redirect-submit": "Перайсці",
+       "redirect-lookup": "Шукаць:",
+       "redirect-value": "Значэнне:",
+       "redirect-user": "ID удзельніка",
+       "redirect-page": "Ідэнтыфікатар старонкі",
+       "redirect-revision": "Версія старонкі",
+       "redirect-file": "Назва файла",
+       "redirect-not-exists": "Значэнне не знойдзена",
        "fileduplicatesearch": "Пошук дублікатных файлаў",
        "fileduplicatesearch-summary": "Пошук дублікатных файлах на падставе іх хэшаў.",
        "fileduplicatesearch-legend": "Знайсці дублікаты",
        "fileduplicatesearch-result-n": "Файл \"$1\" мае {{PLURAL:$2|1 ідэнтычны дублікат|$2 ідэнтычных дублікатаў}}.",
        "fileduplicatesearch-noresults": "Не знойдзены файл з іменем «$1».",
        "specialpages": "Адмысловыя старонкі",
+       "specialpages-note-top": "Легенда",
        "specialpages-note": "* Звычайныя адмысловыя старонкі.\n* <span class=\"mw-specialpagerestricted\">Адмысловыя старонкі з абмежаваным доступам.</span>\n* <span class=\"mw-specialpagecached\">Закэшаваныя адмысловыя старонкі (могуць быць састарэлымі).</span>",
        "specialpages-group-maintenance": "Звесткі аб працы",
        "specialpages-group-other": "Іншыя адмысловыя старонкі",
        "specialpages-group-highuse": "Старонкі частага карыстання",
        "specialpages-group-pages": "Пералікі старонак",
        "specialpages-group-pagetools": "Прылады для старонак",
-       "specialpages-group-wiki": "Вікі-даныя і прылады",
+       "specialpages-group-wiki": "Вікізвесткі і прылады",
        "specialpages-group-redirects": "Адмысловыя старонкі-перасылкі",
        "specialpages-group-spam": "Прылады супраць спама",
        "blankpage": "Пустая старонка",
        "tags": "Дапушчальныя біркі",
        "tag-filter": "Фільтр [[Special:Tags|бірак]]:",
        "tag-filter-submit": "Фільтр",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Тэг|Тэгі}}]]: $2)",
        "tags-title": "Біркі",
        "tags-intro": "Тут пералічаныя біркі, якімі праграмы могуць пазначыць праўку, а таксама іх значэнні.",
        "tags-tag": "Назва біркі",
        "tags-display-header": "Назва на паказ",
        "tags-description-header": "Поўнае апісанне значэння",
+       "tags-active-header": "Актыўны?",
        "tags-hitcount-header": "Пазначаных правак",
+       "tags-active-yes": "Да",
+       "tags-active-no": "Не",
        "tags-edit": "правіць",
        "tags-hitcount": "$1 {{PLURAL:$1|змена|змены|змен}}",
        "comparepages": "Параўнанне старонак",
        "dberr-problems": "Прабачце, на пляцоўцы здарыліся тэхнічныя цяжкасці.",
        "dberr-again": "Паспрабуйце перачытаць праз некалькі хвілін.",
        "dberr-info": "(Немагчыма звязацца з серверам баз даных: $1)",
+       "dberr-info-hidden": "(Немагчыма звязацца з серверам базы звестак)",
        "dberr-usegoogle": "Тымчасам можна паспрабаваць пошук праз Гугл.",
        "dberr-outofdate": "Заўважце, што тамтэйшыя індэксы тутэйшага зместу могуць быць састарэлымі.",
        "dberr-cachederror": "Гэта копія старонкі, узятая з кэшу, і, магчыма, састарэлая.",
        "htmlform-submit": "Падаць",
        "htmlform-reset": "Адкаціць змяненні",
        "htmlform-selectorother-other": "Рознае",
+       "htmlform-no": "Не",
+       "htmlform-cloner-create": "Дадаць яшчэ",
+       "htmlform-cloner-delete": "Сцерці",
+       "htmlform-cloner-required": "Неабходна хаця б адно значэнне.",
        "sqlite-has-fts": "$1 з падтрымкай поўна-тэкставага пошуку",
        "sqlite-no-fts": "$1 без падтрымкі поўна-тэкставага пошуку",
-       "logentry-delete-delete": "$1 выдаліў старонку $3",
-       "logentry-delete-restore": "$1 аднавіў старонку $3",
-       "logentry-delete-event": "$1 змяніў бачнасць {{PLURAL:$5|$5 запісу журнала|$5 запісаў журнала|$5 запісаў журнала}} на $3: $4",
-       "logentry-delete-revision": "$1 змяніў бачнасць {{PLURAL:$5|$5 версіі|$5 версій|$5 версій}} на старонцы $3: $4",
-       "logentry-delete-event-legacy": "$1 змяніў бачнасць запісаў журнала $3",
-       "logentry-delete-revision-legacy": "$1 змяніў бачнасць версій на старонцы $3",
-       "logentry-suppress-delete": "$1 падавіў старонку $3",
-       "logentry-suppress-event": "$1 утойліва змяніў бачнасць {{PLURAL:$5|$5 запіс часопіса|$5 запісы часопіса |$5 запісаў часопіса}} на $3: $4",
-       "logentry-suppress-revision": "$1 утойліва змяніў бачнасць {{PLURAL:$5|$5 версію|$5 версіі|$5 версій}} на старонцы $3: $4",
-       "logentry-suppress-event-legacy": "$1 утойліва змяніў бачнасць запісаў журнала $3",
-       "logentry-suppress-revision-legacy": "$1 утойліва змяніў бачнасць версій на старонцы $3",
+       "logentry-delete-delete": "$1 {{GENDER:$2|сцёр|сцёрла}} старонку $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|аднавіў|аднавіла}} старонку $3",
+       "logentry-delete-event": "$1 {{GENDER:$2|змяніў|змяніла}} бачнасць {{PLURAL:$5|запісу журнала|$5 запісаў журнала}} $3: $4",
+       "logentry-delete-revision": "$1 {{GENDER:$2|змяніў|змяніла}} бачнасць {{PLURAL:$5|версіі|$5 версій|$5 версій}} старонкі $3: $4",
+       "logentry-delete-event-legacy": "$1 {{GENDER:$2|змяніў|змяніла}} бачнасць запісаў журнала $3",
+       "logentry-delete-revision-legacy": "$1 {{GENDER:$2|змяніў|змяніла}} бачнасць версій на старонцы $3",
+       "logentry-suppress-delete": "$1 {{GENDER:$2|заглушыў|заглушыла}} старонку $3",
+       "logentry-suppress-event": "$1 утойліва {{GENDER:$2|змяніў|змяніла}} бачнасць {{PLURAL:$5|запісу журнала|$5 запісаў журнала}} $3: $4",
+       "logentry-suppress-revision": "$1 утойліва {{GENDER:$2|змяніў|змяніла}} бачнасць {{PLURAL:$5|версіі|$5 версій}} старонкі $3: $4",
+       "logentry-suppress-event-legacy": "$1 утойліва {{GENDER:$2|змяніў|змяніла}} бачнасць запісаў журнала $3",
+       "logentry-suppress-revision-legacy": "$1 утойліва {{GENDER:$2|змяніў|змяніла}} бачнасць версій на старонцы $3",
        "revdelete-content-hid": "змест схаваны",
        "revdelete-summary-hid": "апісанне змены схавана",
        "revdelete-uname-hid": "імя ўдзельніка схавана",
        "revdelete-uname-unhid": "імя ўдзельніка адкрыта",
        "revdelete-restricted": "пастаўленыя абмежаванні на адміністратараў",
        "revdelete-unrestricted": "знятыя абмежаванні з адміністратараў",
-       "logentry-move-move": "$1 перанёс старонку $3 у $4",
-       "logentry-move-move-noredirect": "$1 перанёс старонку $3 у $4 без пакідання перанакіравання",
-       "logentry-move-move_redir": "$1 пераназваў старонку $3 у $4 па-над перанакіраваннем",
-       "logentry-move-move_redir-noredirect": "$1 пераназваў старонку $3 у $4 па-над перанакіраваннем і без пакідання перанакіравання",
-       "logentry-patrol-patrol": "$1 адпатруляваў версію $4 старонкі $3",
-       "logentry-patrol-patrol-auto": "$1 аўтаматычна адпатруляваў версію $4 старонкі $3",
-       "logentry-newusers-newusers": "$1 стварыў уліковы запіс удзельніка",
-       "logentry-newusers-create": "$1 стварыў уліковы запіс удзельніка",
-       "logentry-newusers-create2": "$1 стварыў уліковы запіс удзельніка $3",
-       "logentry-newusers-autocreate": "Аўтаматычна створаны ўліковы запіс $1",
+       "logentry-move-move": "$1 {{GENDER:$2|перанёс|перанесла}} старонку $3 у $4",
+       "logentry-move-move-noredirect": "$1 {{GENDER:$2|перанёс|перанесла}} старонку $3 у $4, не пакінуўшы перасылкі",
+       "logentry-move-move_redir": "$1 {{GENDER:$2|перанёс|перанесла}} старонку $3 у $4 па-над перасылкаю",
+       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|перанёс|перанесла}} старонку $3 у $4 па-над перасылкаю, не пакінуўшы перасылкі",
+       "logentry-patrol-patrol": "$1 {{GENDER:$2|адзначыў|адзначыла}} версію $4 старонкі $3 як ухваленую",
+       "logentry-patrol-patrol-auto": "$1 аўтаматычна {{GENDER:$2|адзначыў|адзначыла}} версію $4 старонкі $3 як ухваленую",
+       "logentry-newusers-newusers": "Створаны ўліковы запіс {{GENDER:$2|удзельніка}} $1",
+       "logentry-newusers-create": "Створаны ўліковы запіс {{GENDER:$4|удзельніка|удзельніцы}} $1",
+       "logentry-newusers-create2": "$1 {{GENDER:$2|стварыў|стварыла}} уліковы запіс {{GENDER:$4|удзельніка|удзельніцы}} $3",
+       "logentry-newusers-byemail": "$1 {{GENDER:$2|стварыў|стварыла}} ўліковы запіс {{GENDER:$4|удзельніка|удзельніцы}} $3; пароль адпраўлены на адрас эл.пошты.",
+       "logentry-newusers-autocreate": "Аўтаматычна створаны ўліковы запіс удзельніка $1",
+       "logentry-rights-rights": "$1 {{GENDER:$2|змяніў|змяніла}} прыналежнасць $3 да групы з $4 на $5",
+       "logentry-rights-rights-legacy": "$1 {{GENDER:$2|змяніў|змяніла}} прыналежнасць $3 да групы",
+       "logentry-rights-autopromote": "$1 аўтаматычна {{GENDER:$2|пераведзены|пераведзена}} з $4 у $5",
        "rightsnone": "(няма)",
        "feedback-bugornote": "Калі вы гатовыя падрабязна апісаць тэхнічную праблему, калі ласка, [$1 паведаміце пра памылку].\nУ адваротным выпадку вы можаце выкарыстоўваць гэтую простую форму. Ваш каментар будзе дададзены на старонку «[$3 $2]» разам з вашым імем удзельніка і выкарыстоўваемым браўзерам.",
        "feedback-subject": "Тэма:",
        "api-error-empty-file": "Дасланы Вамі файл быў пусты.",
        "api-error-emptypage": "Стварэнне новых пустых старонак забаронена.",
        "api-error-fetchfileerror": "Унутраная памылка: падчас атрымання файла штосьці здарылася.",
+       "api-error-fileexists-forbidden": "Файл з назвай \"$1\" ужо ёсць і не можа быць перапісаны.",
+       "api-error-fileexists-shared-forbidden": "Файл з назвай \"$1\" ужо ёсць у супольным сховішчы файлаў, ён не можа быць перапісаны.",
        "api-error-file-too-large": "Дасланы Вамі файл занадта вялікі.",
        "api-error-filename-tooshort": "Імя файла занадта кароткае.",
        "api-error-filetype-banned": "Гэты тып файлаў забаронены.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|належыць да недазволенага тыпу файлаў|належаць да недазволеных тыпаў файлаў}}. Пералік дазволеных тыпаў складаецца з {{PLURAL:$3|тыпа|тыпаў}}: $2.",
+       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|належыць да недазволенага тыпу файлаў|належаць да недазволеных тыпаў файлаў}}. Пералік дазволеных тыпаў складаецца з {{PLURAL:$3|тыпу|тыпаў}}: $2.",
        "api-error-filetype-missing": "У файла няма пашырэння.",
        "api-error-hookaborted": "Прапанаванае вамі змяненне было адменена ў апрацоўшчыку пашырэння.",
        "api-error-http": "Унутраная памылка: немагчыма далучыцца да сервера.",
        "api-error-ok-but-empty": "Унутраная памылка: няма адказу ад сервера.",
        "api-error-overwrite": "Замена існуючага файла не дапускаецца.",
        "api-error-stashfailed": "Унутраная памылка: сервер не змог захаваць часовы файл.",
+       "api-error-publishfailed": "Унутраная памылка: сервер не змог апублікаваць тымчасовы файл.",
        "api-error-timeout": "Сервер не адказаў у чаканы тэрмін.",
        "api-error-unclassified": "Узнікла невядомая памылка",
        "api-error-unknown-code": "Невядомая памылка: «$1».",
        "api-error-unknown-warning": "Невядомае папярэджанне: $1",
        "api-error-unknownerror": "Невядомая памылка: «$1».",
        "api-error-uploaddisabled": "Загрузка ў гэтую вікі адключаная.",
-       "api-error-verification-error": "Гэты файл можа быць пашкоджаны, ці мае няслушнае пашырэнне."
+       "api-error-verification-error": "Гэты файл можа быць пашкоджаны, ці мае няслушны канчатак назвы.",
+       "duration-seconds": "$1 {{PLURAL:$1|секунда|секунды|секундаў}}",
+       "duration-minutes": "$1 {{PLURAL:$1|мінута|мінуты|мінут}}",
+       "duration-hours": "$1 {{PLURAL:$1|гадзіна|гадзіны|гадзін}}",
+       "duration-days": "$1 {{PLURAL:$1|дзень|дні|дзён}}",
+       "duration-weeks": "$1 {{PLURAL:$1|тыдзень|тыдні|тыдняў}}",
+       "duration-years": "$1 {{PLURAL:$1|год|гады|гадоў}}",
+       "duration-decades": "$1 {{PLURAL:$1|дзесяцігоддзе|дзесяцігоддзі|дзесяцігоддзяў}}",
+       "duration-centuries": "$1 {{PLURAL:$1|стагоддзе|стагоддзі|стагоддзяў}}",
+       "duration-millennia": "$1 {{PLURAL:$1|тысячагоддзе|тысячагоддзі|тысячагоддзяў}}",
+       "limitreport-cputime-value": "$1 {{PLURAL:$1|секунда|секунды|секундаў}}",
+       "limitreport-walltime-value": "$1 {{PLURAL:$1|секунда|секунды|секундаў}}",
+       "expand_templates_output": "Вынік",
+       "expand_templates_remove_comments": "Сцерці каментарыі",
+       "expand_templates_preview": "Перадпаказ"
 }
index 1763074..207114f 100644 (file)
        "qbmyoptions": "Моите страници",
        "faq": "ЧЗВ",
        "faqpage": "Project:ЧЗВ",
-       "vector-action-addsection": "Добавяне на тема",
-       "vector-action-delete": "Изтриване",
-       "vector-action-move": "Преместване",
-       "vector-action-protect": "Защита",
-       "vector-action-undelete": "Възстановяване",
-       "vector-action-unprotect": "Промяна на защитата",
-       "vector-view-create": "Създаване",
-       "vector-view-edit": "Редактиране",
-       "vector-view-history": "История",
-       "vector-view-view": "Преглед",
-       "vector-view-viewsource": "Преглед на кода",
        "actions": "Действия",
        "namespaces": "Именни пространства",
        "variants": "Варианти",
        "difference-missing-revision": "{{PLURAL:$2|Не беше открита|Не бяха открити}} {{PLURAL:$2|една версия|$2 версии}} от тази разликова препратка ($1).\n\nТова обикновено се случва, когато е последвана остаряларазликова препратка на страница,коятоебила изтрита.\nПовече подробности могат да бъдат открити в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневника на изтриванията].",
        "searchresults": "Резултати от търсенето",
        "searchresults-title": "Резултати от търсенето за „$1“",
-       "toomanymatches": "Бяха открити твърде много съвпадения, опитайте с различна заявка",
        "titlematches": "Съответствия в заглавията на страници",
        "textmatches": "Съответствия в текста на страници",
        "notextmatches": "Няма съответствия в текста на страници",
        "searchmenu-exists": "'''Съществува страница с името „[[:$1]]“ в това уики.'''",
        "searchmenu-new": "'''Създаване на страницата „[[:$1]]“ в това уики!'''",
        "searchprofile-articles": "Съдържателни страници",
-       "searchprofile-project": "Помощни и проектни страници",
        "searchprofile-images": "Мултимедия",
        "searchprofile-everything": "Всичко",
        "searchprofile-advanced": "Разширено търсене",
        "searchprofile-articles-tooltip": "Търсене в $1",
-       "searchprofile-project-tooltip": "Търсене в $1",
        "searchprofile-images-tooltip": "Търсене на файлове",
        "searchprofile-everything-tooltip": "Търсене в цялото съдържание (вкл. беседи)",
        "searchprofile-advanced-tooltip": "Търсене в избрани именни пространства",
        "search-interwiki-default": "$1 резултата:",
        "search-interwiki-more": "(още)",
        "search-relatedarticle": "Свързани",
-       "searcheverything-enable": "Търсене във всички именни пространства",
        "searchrelated": "свързани",
        "searchall": "всички",
        "showingresults": "Показване на до {{PLURAL:$1|'''1''' резултат|'''$1''' резултата}}, като се започва от номер '''$2'''.",
        "allowemail": "Възможност за получаване на писма от други потребители",
        "prefs-searchoptions": "Търсене",
        "prefs-namespaces": "Именни пространства",
-       "defaultns": "Или търсене в следните именни пространства:",
        "default": "по подразбиране",
        "prefs-files": "Файлове",
        "prefs-custom-css": "Личен CSS",
        "prefs-emailconfirm-label": "Потвърждаване на адрес за е-поща:",
        "youremail": "Е-поща:",
        "username": "{{GENDER:$1|Потребителско име}}:",
-       "uid": "{{GENDER:$1|Потребителски}} номер:",
        "prefs-memberingroups": "{{GENDER:$2|Член}} на {{PLURAL:$1|група|групи}}:",
        "prefs-registration": "Регистрация:",
        "yourrealname": "Истинско име:",
        "recentchanges-label-unpatrolled": "Тази редакция все още не е проверена",
        "recentchanges-label-plusminus": "Размерът на страницата е променен с този брой байтове",
        "recentchanges-legend-heading": "'''Легенда:'''",
-       "recentchanges-legend-newpage": "(вижте също [[Special:NewPages|списъка с нови страници]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (вижте също [[Special:NewPages|списъка с нови страници]])",
        "rcnotefrom": "Дадени са промените от <strong>$2</strong> (до <strong>$1</strong> показани).",
        "rclistfrom": "Показване на промени, като се започва от $3 $2",
        "rcshowhideminor": "$1 на малки промени",
        "logempty": "Дневникът не съдържа записи, отговарящи на избрания критерий.",
        "log-title-wildcard": "Търсене на заглавия, започващи със",
        "allpages": "Всички страници",
-       "alphaindexline": "от $1 до $2",
        "nextpage": "Следваща страница ($1)",
        "prevpage": "Предходна страница ($1)",
        "allpagesfrom": "Показване на страниците, като се започва от:",
        "listgrouprights-removegroup-self": "Може да премахва {{PLURAL:$2|група|групи}} от собствената си сметка: $1",
        "listgrouprights-addgroup-self-all": "Може да добавя всички групи към своята сметка",
        "listgrouprights-removegroup-self-all": "Може да премахва всички групи от собствената сметка",
+       "listgrouprights-namespaceprotection-namespace": "Именно пространство",
        "mailnologin": "Няма електронна поща",
        "mailnologintext": "Необходимо е да [[Special:UserLogin|влезете]] и да посочите валидна електронна поща в [[Special:Preferences|настройките]] си, за да може да пращате писма на други потребители.",
        "emailuser": "Писмо до потребителя",
        "tooltip-preferences-save": "Съхраняване на предпочитанията",
        "tooltip-summary": "Въведете кратко резюме",
        "common.css": "/* Чрез редактиране на този файл ще промените всички облици */",
-       "monobook.css": "/* Чрез редактиране на този файл можете да промените облика Монобук */",
        "common.js": "/* Този файл съдържа код на Джаваскрипт и се зарежда при всички потребители. */",
-       "monobook.js": "/* Остаряла страница; използвайте [[MediaWiki:Common.js]] */",
        "anonymous": "{{PLURAL:$1|Анонимен потребител|Анонимни потребители}}на {{SITENAME}}",
        "siteuser": "потребител на {{SITENAME}} $1",
        "anonuser": "Анонимен потребител на {{SITENAME}} $1",
        "pageinfo-category-pages": "Брой страници",
        "pageinfo-category-subcats": "Брой подкатегории",
        "pageinfo-category-files": "Брой файлове",
-       "skinname-cologneblue": "Кьолнско синьо",
-       "skinname-monobook": "Монобук",
-       "skinname-modern": "Модерен",
        "markaspatrolleddiff": "Отбелязване като проверена редакция",
        "markaspatrolledtext": "Отбелязване на редакцията като проверена",
        "markedaspatrolled": "Проверена редакция",
        "newimages-summary": "Тази специална страница показва последно качените файлове.",
        "newimages-legend": "Име на файл",
        "newimages-label": "Име на файл (или част от него):",
+       "newimages-showbots": "Показване на качвания от ботове",
        "noimages": "Няма нищо.",
        "ilsubmit": "Търсене",
        "bydate": "по дата",
        "watchlistedit-raw-done": "Списъкът ви за наблюдение беше обновен.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 страница беше добавена|$1 страници бяха добавени}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Една страница беше премахната|$1 страници бяха премахнати}}:",
+       "watchlisttools-clear": "Изчистване на списъка за наблюдение",
        "watchlisttools-view": "Преглед на списъка за наблюдение",
        "watchlisttools-edit": "Преглед и редактиране на списъка за наблюдение",
        "watchlisttools-raw": "Редактиране на необработения списък за наблюдение",
        "htmlform-no": "Не",
        "htmlform-yes": "Да",
        "htmlform-chosen-placeholder": "Избиране",
+       "htmlform-cloner-create": "Добавяне на още",
+       "htmlform-cloner-delete": "Премахване",
        "sqlite-has-fts": "$1 с поддръжка на пълнотекстово търсене",
        "sqlite-no-fts": "$1 без поддръжка на пълнотекстово търсене",
        "logentry-delete-delete": "$1 {{GENDER:$2|изтри}} страницата $3",
index 9ac5f31..f7dea84 100644 (file)
@@ -17,7 +17,6 @@
        "tog-showtoolbar": "सम्पादन औजार् बक्सा के दिखाइल् जाए",
        "tog-editondblclick": "दुई क्लिक पर पृष्ठ संपादित करीं (जावास्क्रिप्ट आवश्यक बा)",
        "tog-editsectiononrightclick": "अनुभाग शीर्षक पर दायाँ क्लिक कर अनुभाग सम्पादित करीं (जावास्क्रिप्ट आवश्यक बा)",
-       "tog-rememberpassword": "इ ब्राउजर पर हमार प्रवेश जारी रहे (अधिकतम $1 {{PLURAL:$1|दिन|दिन}})",
        "tog-watchcreations": "हमरा द्वारा निर्मित पृष्ठ आ हमरा द्वारा लादल फ़ाइलन के हमार ध्यानसूची में जोड़ी",
        "tog-watchdefault": "हमरा द्वारा निर्मित पृष्ठ आ हमरा द्वारा लादल फ़ाइलन के हमार ध्यानसूची में जोड़ी",
        "tog-watchmoves": "हमरा द्वारा स्थानांतरित पृष्ठ आ लादल फाईल के हमरा ध्यानसूची में जोड़ी",
        "qbmyoptions": "हमार पन्ना",
        "faq": "साधारण सवाल",
        "faqpage": "Project:साधारण सवाल",
-       "vector-action-addsection": "विषय जोड़ीं",
-       "vector-action-delete": "मिटाईं",
-       "vector-action-move": "स्थांतरण",
-       "vector-action-protect": "संरक्षित करीं",
-       "vector-action-undelete": "मत मिटाईं",
-       "vector-action-unprotect": "सुरक्षा बदलीं",
-       "vector-view-create": "बनाईं",
-       "vector-view-edit": "सम्पादन",
-       "vector-view-history": "इतिहास देखीं",
-       "vector-view-view": "पढ़ीं",
-       "vector-view-viewsource": "स्त्रोत देखीं",
        "actions": "क्रिया",
        "namespaces": "नामस्थान",
        "variants": "संस्करण",
        "readonly_lag": "उपमुख्य डाटाबेस सर्वर मुख्य डाटाबेस के बराबर परावर्तित होत समय मुख्य डाटाबेस सर्वर अपने आप लॉक हो गइल।",
        "internalerror": "आन्तरिक त्रुटि",
        "internalerror_info": "आन्तरिक त्रुटि: $1",
-       "fileappenderrorread": "संलग्न करे के दौरान \"$1\" पढ़ल नईखे जा सकत।",
-       "fileappenderror": "\"$1\" के आगे \"$2\" ना जुड़ पावल",
        "filecopyerror": "\"$1\" फ़ाइल के \"$2\" पर प्रतिलिपि ना बन पाईल।",
        "filerenameerror": "\"$1\" फ़ाइल के नाम बदल के \"$2\" नइखे रखल जा सकत।",
        "filedeleteerror": "\"$1\" फ़ाइल के ना हटावल जा सकल।",
        "directorycreateerror": "\"$1\" डाइरेक्टरी ना बनावल जा सकल।",
        "filenotfound": "\"$1\" फ़ाइल ना मिलल।",
-       "fileexistserror": "फ़ाइल \"$1\" पर नइखी लिख सकत: फ़ाइल अस्तित्व में बा।",
        "unexpected": "अनपेक्षित मूल्य: \"$1\"=\"$2\".",
        "formerror": "त्रुटि: फ़ॉर्म सबमिट ना करल जा सकल।",
        "badarticleerror": "इ पन्ना पर इ कार्य नइखे करल जा सकत।",
        "gotaccountlink": "खाता में प्रवेश",
        "userlogin-resetlink": "का रउआ आपन प्रवेश जानकारी भूला गइल बानी?",
        "userlogin-resetpassword-link": "आपन गुप्तशब्द के फिर से बहाल करीं",
-       "createacct-join": "अपना बारे में जानकारी नीचे लिखीं",
-       "createacct-another-join": "नयका खाता के जानकारी नीचे लिखीं",
        "createacct-emailrequired": "ई-मेल पता",
        "createacct-emailoptional": "ई-मेल पता (वैकल्पिक)",
        "createacct-email-ph": "आपन ई-मेल पता लिखीं",
        "savearticle": "पन्ना सुरक्षित करीं",
        "preview": "पूर्वावलोकन",
        "showpreview": "पूर्वावलोकन देखाईं",
-       "showlivepreview": "सीधा पूर्वावलोकन",
        "showdiff": "परिवर्तन देखाईं",
        "anoneditwarning": "'''चेतावनी:''' रउआ आपन खाता में प्रवेश नईखीं कईले। ई पन्ना के सम्पादन इतिहास पर राउर आई पी पता दर्ज कईल जाई।",
        "anonpreviewwarning": "''रउआ खाता में प्रवेश नईखीं भईल। सुरक्षित करेब त ई पन्ना के सम्पादन इतिहास पर राउर आई पी पता दर्ज हो जाई।\"",
        "permissionserrors": "अनुमति त्रुटी",
        "log-fulllog": "पूरा लॉग देखीं",
        "edit-conflict": "संपादन अंतर्विरोध",
-       "postedit-confirmation": "राउर सम्पादन सुरक्षित कर दिहल गईल।",
+       "postedit-confirmation-saved": "राउर सम्पादन सुरक्षित कर दिहल गईल।",
        "invalid-content-data": "अवैध डाटा सामग्री",
        "content-model-wikitext": "विकीपाठ्य",
        "content-model-text": "सामान्य पाठ",
        "searchmenu-exists": "'''इ विकि पर ''[[:$1]]'' नाम से एगो पन्ना उपलब्ध बा'''",
        "searchmenu-new": "'''इ विकि पर ''[[:$1]]'' नाम से पन्ना बनाईं'''",
        "searchprofile-articles": "सामग्री पन्ना",
-       "searchprofile-project": "मदद आ परियोजना पन्ना",
        "searchprofile-images": "मल्टिमीडिया",
        "searchprofile-everything": "सब कुछ",
        "searchprofile-advanced": "अग्रिम",
        "searchprofile-articles-tooltip": "$1 में खोजीं",
-       "searchprofile-project-tooltip": "$1 में खोजीं",
        "searchprofile-images-tooltip": "फाईल खातिर खोज",
        "searchprofile-everything-tooltip": "सभन सामग्री में खोजीं (वार्ता पन्ना सहित)",
        "searchprofile-advanced-tooltip": "विशेष नामस्थान में खोजीं",
        "search-interwiki-default": "$1 के परिणाम:",
        "search-interwiki-more": "(अउर)",
        "search-relatedarticle": "संबंधित",
-       "searcheverything-enable": "सभन सन्दर्भ में खोजीं",
        "searchrelated": "संबंधित",
        "searchall": "सब",
        "showingresults": "नीचे देखावल जा रहल बा {{PLURAL:$1|'''1''' परिणाम|'''$1''' परिणाम}} #'''$2''' से शुरु होवे वाला।",
        "search-nonefound": "राउर खोज मे से मेल खात कउनो परिणाम नईखे बा",
        "powersearch-legend": "उन्नत खोज",
        "powersearch-ns": "सन्दर्भ में खोजीं",
-       "powersearch-redir": "पुन:निर्देश सूची",
        "powersearch-togglelabel": "जाँच:",
        "powersearch-toggleall": "सब",
        "powersearch-togglenone": "कउनो ना",
        "move": "स्थान्तरण",
        "movethispage": "ई पन्ना के स्थांतरण करीं",
        "booksources": "किताबी स्त्रोत",
-       "alphaindexline": "$1 से $2",
        "allarticles": "सभी पन्ना",
        "allpagessubmit": "जाईं",
        "allpagesprefix": "उपसर्ग के साथे पन्ना प्रदर्शन:",
        "namespacesall": "सब",
        "monthsall": "सब",
        "confirmemail": "इ-मेल पता कन्फर्म करीं",
+       "version-no-ext-name": "[अज्ञात नाम]",
        "specialpages": "ख़ाश पन्ना",
        "revdelete-restricted": "प्रबंधक पर प्रतिबंध लागू",
        "revdelete-unrestricted": "प्रबंधक पर से प्रतिबंध समाप्त"
index fd94b6b..4c15455 100644 (file)
@@ -36,8 +36,8 @@
        "tog-editsectiononrightclick": "পরিচ্ছেদের শিরোনামে ডান ক্লিকের মাধ্যমে সম্পাদনা করার ক্ষমতা দেয়া হোক",
        "tog-watchcreations": "আমার তৈরি পাতা এবং আপলোড করা ফাইলগুললো আমার নজরতালিকায় যোগ করা হোক",
        "tog-watchdefault": "আমার সম্পাদিত পাতা এবং ফাইলগুলো আমার নজরতালিকায় যোগ করা হোক",
-       "tog-watchmoves": "à¦\86মার à¦¸à¦°à¦¿à¦¯à¦¼à§\87 à¦«à§\87লা পাতা এবং ফাইলগুলো আমার নজরতালিকায় যোগ করা হোক",
-       "tog-watchdeletion": "à¦\86মার à¦®à§\81à¦\9bà§\87 à¦«à§\87লা পাতা এবং ফাইলগুলো আমার নজর তালিকায় যোগ করা হোক",
+       "tog-watchmoves": "à¦\86মার à¦¸à§\8dথানানà§\8dতরিত পাতা এবং ফাইলগুলো আমার নজরতালিকায় যোগ করা হোক",
+       "tog-watchdeletion": "à¦\86মার à¦\85পসারিত পাতা এবং ফাইলগুলো আমার নজর তালিকায় যোগ করা হোক",
        "tog-minordefault": "শুরুতেই সব সম্পাদনাকে অনুল্লেখ্য বলে চিহ্নিত করা হোক",
        "tog-previewontop": "সম্পাদনা বাক্সের আগে প্রাকদর্শন দেখানো হোক",
        "tog-previewonfirst": "প্রথম সম্পাদনার ক্ষেত্রে প্রাকদর্শন দেখানো হোক",
        "qbmyoptions": "আমার পাতাসমূহ",
        "faq": "সম্ভাব্য প্রশ্নসমূহ",
        "faqpage": "Project:প্রাজিপ্র",
-       "vector-action-addsection": "বিষয় যোগ",
-       "vector-action-delete": "অপসারণ",
-       "vector-action-move": "স্থানান্তর",
-       "vector-action-protect": "সুরক্ষা",
-       "vector-action-undelete": "পুনরুদ্ধার",
-       "vector-action-unprotect": "সুরক্ষা পরিবর্তন",
-       "vector-view-create": "তৈরি",
-       "vector-view-edit": "সম্পাদনা",
-       "vector-view-history": "ইতিহাস",
-       "vector-view-view": "পড়ুন",
-       "vector-view-viewsource": "উৎস দেখুন",
        "actions": "কার্যক্রম",
        "namespaces": "নামস্থান",
        "variants": "বিকল্পসমূহ",
        "jumptonavigation": "পরিভ্রমণ",
        "jumptosearch": "অনুসন্ধান",
        "view-pool-error": "দুঃখিত, সার্ভারে এ মূহুর্তে অতিরিক্ত চাপ রয়েছে।\nঅনেক বেশি সংখ্যক ব্যবহারকারী এই পাতাটি দেখার চেষ্টা করছেন।\nনতুন করে এ পাতাটি দেখার চেষ্টা করার আগে কিছুক্ষণ অপেক্ষা করুন।\n\n$1",
+       "generic-pool-error": "দুঃখিত, সার্ভারে এ মূহুর্তে অতিরিক্ত চাপ রয়েছে।\nঅনেক বেশি সংখ্যক ব্যবহারকারী এই পাতাটি দেখার চেষ্টা করছেন।\nনতুন করে এ পাতাটি দেখার চেষ্টা করার আগে কিছুক্ষণ অপেক্ষা করুন।",
        "pool-timeout": "সময় উত্তির্ণ লক-এর জন্য অপেক্ষারত",
        "pool-queuefull": "পুলের লাইন পূর্ণ",
        "pool-errorunknown": "অজানা ত্রুটি",
        "nouserspecified": "আপনাকে অবশ্যই ব্যবহারকারী নাম নির্দিষ্ট করতে হবে।",
        "login-userblocked": "এই ব্যবহারকারীকে বাধা দেওয়া হয়েছে। লগ-ইন সম্ভব নয়।",
        "wrongpassword": "আপনি ভুল শব্দচাবি ব্যবহার করেছেন। অনুগ্রহ করে আবার চেষ্টা করুন।",
-       "wrongpasswordempty": "শব্দচাবি (password) প্রবেশের ঘরটি খালি ছিল। দয়াকরে আবার চেষ্টা করুন।",
+       "wrongpasswordempty": "শব্দচাবি (password) প্রবেশের ঘরটি খালি ছিল। দয়া করে আবার চেষ্টা করুন।",
        "passwordtooshort": "শব্দচাবি অবশ্যই {{PLURAL:$1|১ অক্ষরের|$1 অক্ষরের}} হতে হবে।",
        "password-name-match": "আপনার শব্দচাবি আপনার ব্যবহারকারী নাম থেকে আলাদা হতে হবে।",
        "password-login-forbidden": "এই ব্যবহারকারীর নাম এবং শব্দচাবিটি ব্যবহার নিষিদ্ধ করা হয়েছে।",
        "passwordsent": "একটি নতুন শব্দচাবি \"$1\" ব্যবহারকারীর ই-মেইল ঠিকানায় পাঠানো হয়েছে। দয়াকরে তা পাওয়ার পর আবার লগ-ইন করুন।",
        "blocked-mailpassword": "আপনার আইপি ঠিকানাটি থেকে সম্পাদনা করতে বাধা আছে, তাই এই ঠিকানার অপব্যবহার করে শব্দচাবি ফেরত আনতে দেয়া যাবে না।",
        "eauthentsent": "মনোনীত ই-মেইল ঠিকানায় একটি নিশ্চিতকরণ ই-মেইল পাঠানো হয়েছে।\nঐ অ্যাকাউন্টটে অন্য কোন ই-মেইল পাঠানোর আগে আপনাকে ই-মেইলের নির্দেশগুলি অনুসরণ করতে হবে, যাতে অ্যাকাউন্টটি যে আসলেই আপনার, তা নিশ্চিত হয়।",
-       "throttled-mailpassword": "বিà¦\97ত {{PLURAL:$1|à¦\98নà§\8dà¦\9fার|$1 à¦\98নà§\8dà¦\9fার}} à¦®à¦§à§\8dযà§\87 à¦\87তিমধà§\8dযà§\87à¦\87 à¦\8fà¦\95বার à¦¶à¦¬à§\8dদà¦\9aাবি à¦¬à¦¦à¦²à§\87র à¦¤à¦¥à§\8dয à¦ªà¦¾à¦ à¦¾à¦¨à§\8b à¦¹à¦¯à¦¼à§\87à¦\9bà§\87। à¦\85পবà§\8dযবহার à¦°à§\8bধà§\87 à¦ªà§\8dরতি {{PLURAL:$1|à¦\98নà§\8dà¦\9fায়|$1 à¦\98ন্টায়}} কেবল একবার শব্দচাবি বদলের তথ্য পাঠানো যাবে।",
+       "throttled-mailpassword": "বিà¦\97ত {{PLURAL:$1|à¦\98ণà§\8dà¦\9fার|$1 à¦\98ণà§\8dà¦\9fার}} à¦®à¦§à§\8dযà§\87 à¦\87তিমধà§\8dযà§\87à¦\87 à¦\8fà¦\95বার à¦¶à¦¬à§\8dদà¦\9aাবি à¦¬à¦¦à¦²à§\87র à¦¤à¦¥à§\8dয à¦ªà¦¾à¦ à¦¾à¦¨à§\8b à¦¹à¦¯à¦¼à§\87à¦\9bà§\87। à¦\85পবà§\8dযবহার à¦°à§\8bধà§\87 à¦ªà§\8dরতি {{PLURAL:$1|à¦\98ণà§\8dà¦\9fায়|$1 à¦\98ণ্টায়}} কেবল একবার শব্দচাবি বদলের তথ্য পাঠানো যাবে।",
        "mailerror": "ইমেইল পাঠাতে সমস্যা: $1",
        "acct_creation_throttle_hit": "এই উইকির দর্শক আপনার IP থেকে বিগত সময়ে {{PLURAL:$1|1 টি অ্যাকাউন্ট|$1 গুলো অ্যাকাউন্ট}} তৈরি করেছেন, যা এই সময়ের জন্য সর্বোচ্চ অনুমোদনকৃত।\nফলে, এই IP থেকে দর্শক এই সময়ে নতুন অ্যাকাউন্ট তৈরি করতে পারবেন না।",
        "emailauthenticated": "আপনার ইমেইল ঠিকানাটি $2 তারিখের $3 এ নিশ্চিত করা হয়েছে।",
        "extlink_tip": "বহিঃসংযোগ (মনে রাখবেন http:// উপসর্গ)",
        "headline_sample": "শিরোনাম",
        "headline_tip": "২য় স্তরের শিরোনাম",
-       "nowiki_sample": "à¦\85-ফরমà§\8dযাà¦\9fà¦\95à§\83ত à¦\9fà§\87à¦\95à§\8dসà¦\9f à¦\8fà¦\96ানà§\87 à¦ªà§\8dরবিষà§\8dà¦\9f করুন",
+       "nowiki_sample": "à¦\85-ফরমà§\8dযাà¦\9fà¦\95à§\83ত à¦\9fà§\87à¦\95à§\8dসà¦\9f à¦\8fà¦\96ানà§\87 à¦¯à§\8bà¦\97 করুন",
        "nowiki_tip": "উইকি ফরম্যাটিং উপেক্ষা করা হোক",
        "image_sample": "উদাহরণ.jpg",
        "image_tip": "গ্রথিত ফাইল",
        "templatesusedsection": "এই অনুচ্ছেদে ব্যবহৃত {{PLURAL:$1|টেমপ্লেট|টেমপ্লেটসমূহ}}:",
        "template-protected": "(সুরক্ষিত)",
        "template-semiprotected": "(অর্ধ-সুরক্ষিত)",
-       "hiddencategories": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি {{PLURAL:$1|১à¦\9fি à¦²à§\81à¦\95ায়িত à¦¬à¦¿à¦·à¦¯à¦¼à¦¶à§\8dরà§\87ণà§\80র|$1à¦\9fি à¦²à§\81à¦\95ায়িত à¦¬à¦¿à¦·à¦¯à¦¼à¦¶à§\8dরà§\87ণà§\80সমà§\82হà§\87র}} à¦¸à¦¦à¦¸à§\8dয:",
+       "hiddencategories": "এই পাতাটি {{PLURAL:$1|১টি লুকায়িত বিষয়শ্রেণীর|$1টি লুকায়িত বিষয়শ্রেণীর}} সদস্য:",
        "edittools-upload": "-",
        "nocreatetext": "{{SITENAME}}-এ নতুন পাতা সৃষ্টি করার ক্ষমতা সীমাবদ্ধ করা হয়েছে।\nআপনি ফিরে গিয়ে ইতিমধ্যে বিদ্যমান কোন পাতা সম্পাদনা করতে পারেন, অথবা [[Special:UserLogin|অ্যাকাউন্টে প্রবেশ কিংবা অ্যাকাউন্ট সৃষ্টি করতে পারেন]]।",
        "nocreate-loggedin": "নতুন পাতা তৈরিতে আপনাকে অনুমোতি দেওয়া হয়নি।",
        "currentrev": "সর্বশেষ সংস্করণ",
        "currentrev-asof": "$1 তারিখে সম্পাদিত বর্তমান সংস্করণ",
        "revisionasof": "$1 তারিখের সংস্করণ",
-       "revision-info": "$1-এ $2-এর করা সংশোধন",
+       "revision-info": "$2 কর্তৃক $1 পর্যন্ত সংস্করণে $7",
        "previousrevision": "←পুর্বের সংস্করণ",
        "nextrevision": "পরবর্তী সংস্করণ→",
        "currentrevisionlink": "সর্বশেষ সংস্করণ",
        "revdelete-selected-text": "[[:$2]] পাতার {{PLURAL:$1|নির্বাচিত সংশোধন|নির্বাচিত সংশোধনসমূহ}}:",
        "revdelete-selected-file": "[[:$2]]-এর {{PLURAL:$1|নির্বাচিত ফাইল সংস্করণ|নির্বাচিত ফাইল সংস্করণগুলি}}:",
        "logdelete-selected": "{{PLURAL:$1|টি নির্বাচিত লগ-ঘটনা|টি নির্বাচিত লগ-ঘটনা}}:",
+       "revdelete-text-text": "অপসারিত সংস্করণসমূহ এখনও পাতা ইতিহাসে প্রদর্শিত হয়, কিন্তু সেই বিষয়বস্তুর অংশগুলি সর্বসাধারণ দেখতে পারবে না।",
+       "revdelete-text-file": "অপসারিত ফাইলের সংস্করণসমূহ এখনও ফাইল ইতিহাসে প্রদর্শিত হয়, কিন্তু সেই বিষয়বস্তুর অংশগুলি সর্বসাধারণ দেখতে পারবে না।",
+       "logdelete-text": "অপসারিত লগ ইভেন্টসমূহ এখনও লগে প্রদর্শিত হয়, কিন্তু সেই বিষয়বস্তুর অংশগুলি সর্বসাধারণ দেখতে পারেবে না।",
        "revdelete-confirm": "অনুগ্রহ করে নিশ্চিত করুন যে আপনি এটি করতে চাচ্ছিলেন, আপনি এর ফলাফল সম্পর্কে অবগত আছেন, এবং [[{{MediaWiki:Policy-url}}|নীতিমালার]] উপর ভিত্তি করেই এই কাজটি করছেন।",
        "revdelete-suppress-text": "নিচের বিষয়গুলোর ক্ষেত্রেই '''কেবলমাত্র'''  চাপাচাপি করা যাবে:\n* সম্ভাব্য মানহানিকর তথ্য\n* ভুল ব্যক্তিগত তথ্য\n*: ''বাসার ঠিকানা এবং ফোন নম্বর, সোসাল সিকিউরিটি নম্বর, ইত্যাদি।''",
        "revdelete-legend": "দৃষ্টিপাত সীমাবদ্ধ করো",
        "difference-missing-revision": "$1 পার্থক্যের {{PLURAL:$2|একটি সংস্করণ|$2টি সংস্করণসমূহ}} খুজে পাওয়া যাচ্ছে না।\n\nসাধারণত মুছে ফেলা হয়েছে এমন পাতার মেয়াদ উত্তীর্ণ ইতিহাস পাতার লিংক ওপেন করার কারণে এটি হতে পারে। \n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অপসারণ লগে] বিস্তারিত তথ্য জানা যাবে।",
        "searchresults": "অনুসন্ধানের ফলাফল",
        "searchresults-title": "\"$1\" অনুসন্ধানের ফলাফল",
-       "toomanymatches": "একই রকম অনেকগুলো উত্তর এসেছে, অনুগ্রহ করে অন্য কোন কুয়েরি দিন",
        "titlematches": "নিবন্ধের শিরোনাম মিলেছে",
        "textmatches": "পাতার লেখার সাথে মিলেছে",
        "notextmatches": "কোন পাতার লেখার সাথে মিলে নেই",
        "searchprofile-everything-tooltip": "সকল বিষয়বস্তু অনুসন্ধান করো (আলাপের পাতা সহ)",
        "searchprofile-advanced-tooltip": "স্বনির্ধারিত নামস্থানে অনুসন্ধান করো",
        "search-result-size": "$1 ({{PLURAL:$2|১টি শব্দ|$2টি শব্দ}})",
-       "search-result-category-size": "{{PLURAL:$1 | 1 সদস্য | $1 সদস্যবৃন্দ}} ({{PLURAL:$2 | 1 উপবিষয়শ্রেণীটি | $2 টি}}, {{PLURAL:$3 | 1 ফাইল | $3 ফাইল}})",
+       "search-result-category-size": "{{PLURAL:$1 |১টি সদস্য |$1টি সদস্য}} ({{PLURAL:$2 |১টি উপবিষয়শ্রেণী|$2টি উপবিষয়শ্রেণী}}, {{PLURAL:$3 |১টি ফাইল |$3টি ফাইল}})",
        "search-result-score": "মিলেছে: $1%",
        "search-redirect": "(পুনর্নিদেশনা $1)",
        "search-section": "(অনুচ্ছেদ $1)",
        "search-interwiki-default": "$1 থেকে ফলাফলসমূহ:",
        "search-interwiki-more": "(আরও)",
        "search-relatedarticle": "সম্পর্কিত",
-       "searcheverything-enable": "সকল নামস্থানে অনুসন্ধান করো",
        "searchrelated": "সম্পর্কিত",
        "searchall": "সমস্ত",
        "showingresults": "নিচে '''$2''' নং থেকে শুরু করে {{PLURAL:$1|'''1''' ফলাফল|'''$1''' ফলাফলসমূহ}} দেখানো হল।",
        "allowemail": "অন্য ব্যবহারকারীদেরকে আপনাকে ই-মেইল পাঠানোর অনুমতি দিন।",
        "prefs-searchoptions": "অনুসন্ধান",
        "prefs-namespaces": "নামস্থানসমূহ",
-       "defaultns": "নতুবা এই নামস্থানগুলিতে অনুসন্ধান করো:",
        "default": "আদি অবস্থা",
        "prefs-files": "ফাইল",
        "prefs-custom-css": "স্বনির্ধারিত CSS",
        "recentchanges-label-unpatrolled": "এই সম্পাদনাটি এখনও পরীক্ষিত নয়",
        "recentchanges-label-plusminus": "পাতার আকারে এই পরিমান বাইট পরিবর্তিত হয়েছে",
        "recentchanges-legend-heading": "'''ব্যাখ্যামূলক বর্ণনা:'''",
-       "recentchanges-legend-newpage": "(আরও দেখুন [[Special:NewPages|নতুন পাতার তালিকা]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (আরও দেখুন [[Special:NewPages|নতুন পাতার তালিকা]])",
        "recentchanges-legend-plusminus": "(''±১২৩'')",
        "rcnotefrom": "<strong>$2</strong>টা থেকে সংঘটিত পরিবর্তনগুলি (সর্বোচ্চ <strong>$1টি</strong> দেখানো হয়েছে)",
        "rclistfrom": "$2, $3 তারিখের পর সংঘটিত নতুন পরিবর্তনগুলো দেখাও",
        "pageswithprop-prophidden-binary": "বাইনারি প্রোপার্টি টেক্সটগুলো লুকানো রয়েছে ($1)",
        "doubleredirects": "দুইবার করা পুনর্নির্দেশনাগুলি",
        "doubleredirectstext": "এই পাতায় এমন পাতাগুলোর তালিকা আছে, যেগুলো অন্য কোন পুনর্নির্দেশনা পাতায় পুনর্নির্দেশিত হয়েছে। প্রতিটি সারিতে প্রথম ও দ্বিতীয় পুনর্নির্দেশনার জন্য সংযোগ আছে এবং দ্বিতীয় পুনর্নির্দেশনাটির লক্ষ্য সংযোগটিও দেওয়া আছে। এই লক্ষ্য সংযোগটিই সাধারণত \"আসল\" লক্ষ্য পাতা, যেটিতে প্রথম পুনর্নির্দেশনাটি থেকে সংযোগ থাকা উচিত।\n<del>কেটে দেওয়া</del> ভুক্তিগুলো ঠিক করা হয়েছে।",
-       "double-redirect-fixed-move": "[[$1]] সরিয়ে নেওয়া হয়েছে।\nএটি এখন [[$2]] এ পুনঃনির্দেশিত হয়েছে।",
+       "double-redirect-fixed-move": "[[$1]] à¦¸à¦°à¦¿à¦¯à¦¼à§\87 à¦¨à§\87à¦\93য়া à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।\nà¦\8fà¦\9fি à¦¸à§\8dবয়à¦\82à¦\95à§\8dরিয়ভাবà§\87 à¦¹à¦¾à¦²à¦¨à¦¾à¦\97াদ à¦¹à¦¯à¦¼à§\87à¦\9bà§\87 à¦\8fবà¦\82 à¦\8fà¦\9fি à¦\8fà¦\96ন [[$2]] à¦\8f à¦ªà§\81নà¦\83নিরà§\8dদà§\87শিত à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।",
        "double-redirect-fixed-maintenance": "রক্ষণাবেক্ষণ কাজ হিসাবে [[$1]] থেকে [[$2]] এর দ্বিপুনঃর্নিদেশ স্বয়ংক্রিয়ভাবে সংশোধন করা হয়েছে।",
        "double-redirect-fixer": "পুনঃনির্দেশনা মেরামতকারী",
        "brokenredirects": "অকার্যকর পুনর্নির্দেশনাসমূহ",
        "ncategories": "$1 {{PLURAL:$1|বিষয়শ্রেণী|বিষয়শ্রেণীসমূহ}}",
        "ninterwikis": "$1 {{PLURAL:$1|ইন্টারউইকি|ইন্টারউইকিসমূহ}}",
        "nlinks": "$1টি {{PLURAL:$1|সংযোগ|সংযোগসমূহ}}",
-       "nmembers": "$1 {{PLURAL:$1|সদস্য|সদস্যবৃন্দ}}",
+       "nmembers": "$1টি {{PLURAL:$1|সদস্য}}",
        "nmemberschanged": "$1 জন → $2 জন {{PLURAL:$2|সদস্য}}",
        "nrevisions": "$1 {{PLURAL:$1|সংশোধন|সংশোধনসমূহ}}",
        "nviews": "$1 {{PLURAL:$1|বার দেখা হয়েছে|বার দেখা হয়েছে}}",
        "deadendpagestext": "নিচের পাতাগুলি থেকে {{SITENAME}}-এর অন্য কোন পাতায় সংযোগ নেই।",
        "protectedpages": "সুরক্ষিত পাতাসমূহ",
        "protectedpages-indef": "শুধুমাত্র অসীম সুরক্ষা",
+       "protectedpages-summary": "এই পাতাটি বর্তমানে সুরক্ষিত থাকা বিদ্যমান পাতগুলির তালিকা। সৃষ্টি করা থেকে সুরক্ষিত রয়েছে এমন পাতার তালিকার জন্য, [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]] দেখুন।",
        "protectedpages-cascade": "শুধুমাত্র প্রপাতাকার সুরক্ষা",
        "protectedpages-noredirect": "পুনর্নির্দেশনাগুলো লুকাও",
        "protectedpagesempty": "কোন পাতা বর্তমানে এই প্যারামিটারগুলিসহ সুরক্ষিত নয়।",
        "wlheader-enotif": "ইমেল বিজ্ঞপ্তি সক্রিয় করা আছে।",
        "wlheader-showupdated": "আপনার শেষ আগমনের পর থেকে যেসব পাতায় পরিবর্তন হয়েছে সেগুলি '''গাঢ়''' করে দেখানো হয়েছে।",
        "wlnote2": "$3, $2 অনুসারে, সর্বশেষ {{PLURAL:$1|ঘণ্টার|<strong>$1</strong> ঘণ্টার}} পরিবর্তন নিচে দেয়া হয়েছে।",
-       "wlshowlast": "দà§\87à¦\96াà¦\93 à¦¸à¦°à§\8dবশà§\87ষ  $1 à¦\98ন্টা $2 দিন $3",
+       "wlshowlast": "দà§\87à¦\96াà¦\93 à¦¸à¦°à§\8dবশà§\87ষ  $1 à¦\98ণ্টা $2 দিন $3",
        "watchlist-options": "নজর তালিকা পছন্দসমূহ",
        "watching": "নজর রাখা হচ্ছে...",
        "unwatching": "নজর তুলে নেওয়া হচ্ছে...",
        "protect-otherreason-op": "অন্য কারণ",
        "protect-dropdown": "*সুরক্ষার প্রচলিত কারণ\n** অতিরিক্ত ধ্বংসপ্রবণতা\n** অতিরিক্ত অর্থহীন বিষয়বস্তু প্রবেশ করানো\n** পাল্টা-গঠনমূলক সম্পাদনা যুদ্ধ\n** বেশি মাত্রায় প্রদর্শনকৃত পাতা",
        "protect-edit-reasonlist": "সম্পাদনা সুরক্ষার কারণ",
-       "protect-expiry-options": "1 ঘন্টা:1 hour,1 দিন:1 day,1 সপ্তাহ:1 week,2 সপ্তাহ:2 weeks,1 মাস:1 month,3 মাস:3 months,6 মাস:6 months,1 বছর:1 year,অসীম:infinite",
+       "protect-expiry-options": "১ ঘণ্টা:1 hour,১ দিন:1 day,১ সপ্তাহ:1 week,২ সপ্তাহ:2 weeks,১ মাস:1 month,৩ মাস:3 months,৬ মাস:6 months,১ বছর:1 year,অসীম:infinite",
        "restriction-type": "অনুমতি:",
        "restriction-level": "বাধার স্তর:",
        "minimum-size": "ন্যূনতম আকার",
        "ipbenableautoblock": "এই ব্যবহারকারীর ব্যবহার করা সর্বশেষ আইপি ঠিকানা, এবং পরবর্তী যেসব আইপি ঠিকানা থেকে সম্পাদনার চেষ্টা করা হবে, সেগুলিকেও স্বয়ংক্রিয়ভাবে বাধা দেয়া হোক।",
        "ipbsubmit": "এই ব্যবহারকারীকে বাধা দেয়া হোক",
        "ipbother": "অন্য সময়:",
-       "ipboptions": "২ à¦\98ন্টা:2 hours,১ দিন:1 day,৩ দিন:3 days,১ সপ্তাহ:1 week,২ সপ্তাহ:2 weeks,১ মাস:1 month,৩ মাস:3 months,৬ মাস:6 months,১ বছর:1 year,অসীম:infinite",
+       "ipboptions": "২ à¦\98ণ্টা:2 hours,১ দিন:1 day,৩ দিন:3 days,১ সপ্তাহ:1 week,২ সপ্তাহ:2 weeks,১ মাস:1 month,৩ মাস:3 months,৬ মাস:6 months,১ বছর:1 year,অসীম:infinite",
        "ipbhidename": "সম্পাদনা ও তালিকা থেকে ব্যবহারকারী নাম লুকিয়ে রাখা হোক",
        "ipbwatchuser": "এই ব্যবহাকারীর পাতা এবং আলাপের পাতা নজরতালিকায় রাখো",
        "ipb-disableusertalk": "এই ব্যবহারকারীকে বাধাদানকৃত অবস্থায় নিচের আলাপ পাতায় সম্পাদনা করা থেকে বিরত রাখো",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] কে বাধা দেয়া হয়েছে।<br />\nবাধা দেয়া পুনর্বিবেচনা করতে হলে [[Special:BlockList|বাধা দেয়া তালিকা]] দেখুন।",
        "ipb-blockingself": "আপনি নিজেকেই বাধাপ্রদান করতে যাচ্ছেন! আপনি কী নিশ্চিত যে আপনি এটি-ই করতে চান?",
        "ipb-confirmhideuser": "\"hide user\" ক্ষমতার মাধ্যমে আপনি একজন ব্যবহারকারীকে বাধা দিতে যাচ্ছেন। এর মাধ্যমে এই ব্যবহারকারীর নাম সকল লিস্ট এবং লগএন্ট্রি থেকে সরিয়ে ফেলা হবে। আপনি কি নিশ্চিতভাবে এটি করতে চান?",
+       "ipb-confirmaction": "আপনি যদি নিশ্চিত হন আপনি এটি সত্যিকার অর্থেই করতে চান তাহলে অনুগ্রহ করে উপরের \"{{int:ipb-confirm}}\" ঘরটি দেখুন।",
        "ipb-edit-dropdown": "বাধাদানের কারণ সম্পাদনা করুন",
        "ipb-unblock-addr": "$1-এর উপর থেকে বাধা তুলে নেওয়া হোক",
        "ipb-unblock": "ব্যবহারকারী বা আইপি ঠিকানার উপর থেকে বাধা তুলে নেওয়া হোক",
        "imagetypemismatch": "নতুন ফাইল এক্সটেনশনটি ফাইলের ধরনের সাথে মিলছে না",
        "imageinvalidfilename": "ফাইল নামটি সঠিক নয়",
        "fix-double-redirects": "মূল শিরনামকে নির্দেশ করে এমন সকল রিডাইরেক্ট আপডেট করুন",
-       "move-leave-redirect": "রিডাà¦\87রà§\87à¦\95à§\8dà¦\9f à¦\89পà§\87à¦\95à§\8dষা à¦\95রà§\81ন",
+       "move-leave-redirect": "পà§\81নরà§\8dনিরà§\8dদà§\87শ à¦°à§\87à¦\96à§\87 à¦¦à¦¿ন",
        "protectedpagemovewarning": "'''সতর্কীকরণ:''' এই পাতাটি বন্ধ করা হয়েছে; কেবলমাত্র প্রশাসক মর্যাদার ব্যবহারকারীরাই এটি স্থানান্তর করতে পারবেন।\nআপনার সুবিধার্থে পাতাটির সাম্প্রতিক সংরক্ষণ লগের বিবরণ নিচে দেওয়া হলো।",
        "semiprotectedpagemovewarning": "'''নোট:''' এই পাতাটির ব্যবহার নিয়ন্ত্রণ করা হয়েছে তাই নিবন্ধনকৃত ব্যবহারকারী এটি স্থানান্তর করতে পারবেন।\nআপনার সুবিধার্থে পাতাটির সাম্প্রতিক সংরক্ষণ লগের বিবরণ নিচে দেওয়া হলো:",
        "move-over-sharedrepo": "== এই নামের ফাইল রয়েছে ==\n[[:$1]] নামের ফাইলটি শেয়ার্ড রিপোজিটরীতে রয়েছে। একই নামের একটি ফাইল এখানে স্থানান্তর করা হলে পূর্বের ফাইলটি প্রতিস্থাপিত হবে।",
        "pageinfo-category-pages": "পাতার সংখ্যা",
        "pageinfo-category-subcats": "উপবিষয়শ্রেণীর সংখ্যা",
        "pageinfo-category-files": "ফাইলের সংখ্যা",
-       "skinname-monobook": "মনোবুক",
-       "skinname-vector": "ভেক্টর",
        "markaspatrolleddiff": "পরীক্ষিত বলে চিহ্নিত করুন",
        "markaspatrolledtext": "এই নিবন্ধটিকে পরীক্ষিত বলে চিহ্নিত করুন",
        "markedaspatrolled": "পরীক্ষিত বলে চিহ্নিত করুন",
        "years": "{{PLURAL:$1|$1 বছর}}",
        "ago": "$1 আগে",
        "just-now": "এখনই",
-       "hours-ago": "$1 {{PLURAL:$1|à¦\98ন্টা}} পূর্বে",
+       "hours-ago": "$1 {{PLURAL:$1|à¦\98ণ্টা}} পূর্বে",
        "minutes-ago": "$1 {{PLURAL:$1|মিনিট}} পূর্বে",
        "seconds-ago": "$1 {{PLURAL:$1|সেকেন্ড}} পূর্বে",
        "monday-at": "সোমবার, $1",
        "exif-gpsstatus-v": "পরিমাপ একত্রীকরণ-ক্ষমতা",
        "exif-gpsmeasuremode-2": "দ্বিমাত্রিক পরিমাপ",
        "exif-gpsmeasuremode-3": "ত্রিমাত্রিক পরিমাপ",
-       "exif-gpsspeed-k": "à¦\95িলà§\8bমিà¦\9fার à¦ªà§\8dরতি à¦\98ন্টা",
-       "exif-gpsspeed-m": "মাà¦\87ল à¦ªà§\8dরতি à¦\98ন্টা",
+       "exif-gpsspeed-k": "à¦\95িলà§\8bমিà¦\9fার à¦ªà§\8dরতি à¦\98ণ্টা",
+       "exif-gpsspeed-m": "মাà¦\87ল à¦ªà§\8dরতি à¦\98ণ্টা",
        "exif-gpsspeed-n": "নট",
        "exif-gpsdestdistance-k": "কিলোমিটার",
        "exif-gpsdestdistance-m": "ফাইল",
        "api-error-verification-error": "সম্ভবত এই ফাইলটি ত্রুটিপূর্ণ অথবা এর এক্সটেনশনটি ভুল।",
        "duration-seconds": "$1 {{PLURAL:$1|সেকেন্ড|সেকেন্ড}}",
        "duration-minutes": "$1 {{PLURAL:$1|মিনিট|মিনিট}}",
-       "duration-hours": "$1 {{PLURAL:$1|à¦\98নà§\8dà¦\9fা|à¦\98ন্টা}}",
+       "duration-hours": "$1 {{PLURAL:$1|à¦\98ণ্টা}}",
        "duration-days": "$1 {{PLURAL:$1|দিন|দিন}}",
        "duration-weeks": "$1 {{PLURAL:$1|সপ্তাহ}}",
        "duration-years": "$1 {{PLURAL:$1|বছর|বছর}}",
index 4a6d6ce..f72ed9e 100644 (file)
@@ -14,7 +14,8 @@
                        "VIGNERON",
                        "Y-M D",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Pymouss"
                ]
        },
        "tog-underline": "Liammoù islinennet",
        "qbmyoptions": "Ma dibaboù",
        "faq": "FAG",
        "faqpage": "Project:FAG",
-       "vector-action-addsection": "Rannbennad nevez",
-       "vector-action-delete": "Diverkañ",
-       "vector-action-move": "Adenvel",
-       "vector-action-protect": "Gwareziñ",
-       "vector-action-undelete": "Diziverkañ",
-       "vector-action-unprotect": "Cheñch gwarez",
-       "vector-view-create": "Krouiñ",
-       "vector-view-edit": "Kemmañ",
-       "vector-view-history": "Gwelet an istor",
-       "vector-view-view": "Lenn",
-       "vector-view-viewsource": "Sellet ouzh tarzh an destenn",
        "actions": "Oberoù",
        "namespaces": "Esaouennoù anv",
        "variants": "Adstummoù",
        "userlogin-loggedin": "Kevreet oc'h dija evel {{GENDER:$1|$1}}.\nImplijit ar furmskrid amañ dindan evit kevreañ evel un implijer all.",
        "userlogin-createanother": "Krouiñ ur gont all",
        "createacct-emailrequired": "Chomlec'h postel",
-       "createacct-emailoptional": "Chomlec'h postel (direizh)",
+       "createacct-emailoptional": "Chomlec'h postel (diret)",
        "createacct-email-ph": "Skrivit ho chomlec'h postel",
        "createacct-another-email-ph": "Ebarzhiñ ur chomlec'h postel",
        "createaccountmail": "Implijout ur ger-tremen dibad ha kas anezhañ d'ar chomlec'h postel diferetDre bostel",
        "difference-missing-revision": "!!{{PLURAL:$2|Un adweladur|$2 adweladurioù}} eus an disheñvelder ($1) {{PLURAL:$2|n'eo ket bet kavet|n'int ket bet adkavet}}.\n\nC'hoarvezout a ra peurliesañ pa vez heuliet ul liamm disheñvel dispredet war-zu ur bajenn zo bet dilamet.\nGallout a reot kavout munudoù e [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} renabl an dilamadurioù].",
        "searchresults": "Disoc'hoù enklask",
        "searchresults-title": "Disoc'hoù klask evit \"$1\"",
-       "toomanymatches": "Re a respontoù a glot gant ar goulenn, klaskit gant ur goulenn all",
        "titlematches": "Klotadurioù gant an titloù",
        "textmatches": "Klotadurioù en testennoù",
        "notextmatches": "N'emañ ar ger(ioù) goulennet e testenn pennad ebet",
        "searchmenu-exists": "'''Ur bajenn anvet\"[[:$1]]\" zo war ar wiki-mañ'''",
        "searchmenu-new": "'''Krouiñ ar bajenn \"[[:$1]]\" war ar wiki-mañ !'''",
        "searchprofile-articles": "Pajennoù gant boued",
-       "searchprofile-project": "Pajennoù skoazell ha pajennoù ar raktres",
        "searchprofile-images": "Liesmedia",
        "searchprofile-everything": "Pep tra",
        "searchprofile-advanced": "Araokaet",
        "searchprofile-articles-tooltip": "Klask e $1",
-       "searchprofile-project-tooltip": "Klask e $1",
        "searchprofile-images-tooltip": "Klask ar restroù",
        "searchprofile-everything-tooltip": "Klask e pep lec'h (er pajennoù kaozeal ivez)",
        "searchprofile-advanced-tooltip": "Klask en esaouennoù anv personelaet",
        "search-interwiki-default": "Disoc'hoù eus $1 :",
        "search-interwiki-more": "(muioc'h)",
        "search-relatedarticle": "Disoc'hoù kar",
-       "searcheverything-enable": "Klask en holl esaouennoù anv",
        "searchrelated": "disoc'hoù kar",
        "searchall": "An holl",
        "showingresults": "Diskouez betek {{PLURAL:$1|'''1''' disoc'h|'''$1''' disoc'h}} o kregiñ gant #'''$2'''.",
        "allowemail": "Aotren ar posteloù a-berzh implijerien all",
        "prefs-searchoptions": "Klask",
        "prefs-namespaces": "Esaouennoù",
-       "defaultns": "Klask en esaouennoù-anv a-hend-all :",
        "default": "dre ziouer",
        "prefs-files": "Restroù",
        "prefs-custom-css": "CSS personelaet",
        "action-createpage": "krouiñ pajennoù",
        "action-createtalk": "krouiñ pajennoù kaozeal",
        "action-createaccount": "krouiñ ar gont implijer-mañ",
+       "action-history": "gwelet istor ar bajenn-mañ",
        "action-minoredit": "merkañ ar c'hemm-mañ evel dister",
        "action-move": "dilec'hiañ ar bajenn-mañ",
        "action-move-subpages": "dilec'hiañ ar bajenn-mañ hag an ispajennoù anezhi",
        "recentchanges-label-unpatrolled": "N'eo ket bet gwiriet ar c'hemm-mañ evit c'hoazh.",
        "recentchanges-label-plusminus": "Kemmet eo ment ar bajenn eus an niver-mañ a oktedoù",
        "recentchanges-legend-heading": "'''Alc'hwez :'''",
-       "recentchanges-legend-newpage": "(gwelet ivez [[Special:NewPages|roll ar pajennoù nevez]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (gwelet ivez [[Special:NewPages|roll ar pajennoù nevez]])",
        "rcnotefrom": "Setu aze roll ar c'hemmoù c'hoarvezet abaoe an <strong>$2</strong> (<strong>$1</strong> d'ar muiañ).",
        "rclistfrom": "Diskouez ar c'hemmoù diwezhañ abaoe an $3 $2",
        "rcshowhideminor": "$1 ar c'hemmoù dister",
        "watchnologin": "Digevreet",
        "addwatch": "Ouzhpennañ d'ar roll evezhiañ",
        "addedwatchtext": "Ouzh ho [[Special:Watchlist|rollad evezhiañ]] eo bet ouzhpennet ar bajenn \"[[:$1]]\".\nAmañ e vo rollet ar c'hemmoù da zont evit ar bajenn-mañ hag ar bajenn gaozeal stag outi.",
+       "addedwatchtext-short": "Ouzhpennet eo bet ar bajenn \"$1\" d'ho roll-evezhiañ.",
        "removewatch": "Lemel a-ziwar ar roll evezhiañ",
        "removedwatchtext": "Lamet eo bet ar bajenn \"[[:$1]]\" a-ziwar ho [[Special:Watchlist|roll evezhiañ]].",
+       "removedwatchtext-short": "Lamet eo bet ar bajenn \"$1\" eus ho roll-evezhiañ.",
        "watch": "Evezhiañ",
        "watchthispage": "Evezhiañ ar bajenn-mañ",
        "unwatch": "paouez da evezhiañ",
        "movenotallowedfile": "N'oc'h ket aoteret da adenvel restroù.",
        "cant-move-user-page": "Noc'h ket aotreet da adenvel pajennoù pennañ an implijerien (er-maez eus o ispajennoù).",
        "cant-move-to-user-page": "Noc'h ket aotreet da adenvel ur bajenn gant anv hini un implijer all (nemet un ispajenn e vefe).",
+       "cant-move-category-page": "N'oc'h ket aotreet da zilec'hiañ pajennoù rummad.",
        "newtitle": "anv nevez",
        "move-watch": "Evezhiañ ar bajenn-mañ",
        "movepagebtn": "Adenvel ar pennad",
        "tooltip-preferences-save": "Enrollañ ar penndibaboù",
        "tooltip-summary": "Skrivit un diveradenn verr",
        "common.css": "/** Talvezout a raio ar CSS lakaet amañ evit an holl wiskadurioù */",
-       "cologneblue.css": "/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Glaz Kologn */",
-       "monobook.css": "/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Monobook */",
-       "modern.css": "/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Modern */",
-       "vector.css": "/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Vektor */",
        "print.css": "/* Talvezout a raio ar CSS lakaet amañ evit ar moullañ */",
        "noscript.css": "/* Talvezout a raio ar CSS lakaet amañ evit an implijerien o deus diweredekaet JavaScript */",
        "group-autoconfirmed.css": "/* Talvezout a raio ar CSS lakaet amañ evit an impjerien bet kadarnaet ent emgefre hepken */",
        "group-sysop.css": "/* Talvezout a raio ar CSS lakaet amañ evit ar verourien hepken */",
        "group-bureaucrat.css": "/* Talvezout a raio ar CSS lakaet amañ evit ar vureveien hepken */",
        "common.js": "/* Kement JavaScript amañ a vo karget evit an holl implijerien war kement pajenn lennet ganto. */",
-       "cologneblue.js": "/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Glaz Kologn */",
-       "monobook.js": "/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur MonoBook */",
-       "modern.js": "/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Modern */",
-       "vector.js": "/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Vektor */",
        "anonymous": "{{PLURAL:$1|Implijer|Implijerien}} dizanv war {{SITENAME}}",
        "siteuser": "Implijer(ez) $1 eus {{SITENAME}}",
        "anonuser": "implijer dizanv $1 eus {{SITENAME}}",
        "pageinfo-category-pages": "Niver a bajennoù",
        "pageinfo-category-subcats": "Niver a isrummadoù",
        "pageinfo-category-files": "Niver a restroù",
-       "skinname-cologneblue": "Glaz Kologn",
-       "skinname-monobook": "MonoBook",
-       "skinname-modern": "Modern",
-       "skinname-vector": "Vektor",
        "markaspatrolleddiff": "Merkañ evel gwiriet",
        "markaspatrolledtext": "Merkañ ar pennad-mañ evel gwiriet",
        "markedaspatrolled": "Merkañ evel gwiriet",
        "watchlistedit-raw-done": "Nevesaet eo bet ho roll evezhiañ.",
        "watchlistedit-raw-added": "Ouzhpennet ez eus bet {{PLURAL:$1|1 pajenn|$1 pajenn}} :",
        "watchlistedit-raw-removed": "Tennet ez eus bet {{PLURAL:$1|1 pajenn|$1 pajenn}} :",
+       "watchlistedit-clear-legend": "Diverkañ ar roll-evezhiañ",
+       "watchlistedit-clear-titles": "Titloù :",
+       "watchlisttools-clear": "Diverkañ ar roll-evezhiañ",
        "watchlisttools-view": "Gwelet ar c'hemmoù degaset",
        "watchlisttools-edit": "Gwelet ha kemmañ ar roll evezhiañ",
        "watchlisttools-raw": "Kemmañ ar roll (mod diginkl)",
index 2310ae3..5aa1e21 100644 (file)
@@ -17,7 +17,8 @@
                        "Seha",
                        "Smooth O",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Milicevic01"
                ]
        },
        "tog-underline": "Podvuci veze:",
        "qbmyoptions": "Moje opcije",
        "faq": "ČPP",
        "faqpage": "Project:NPP",
-       "vector-action-addsection": "Dodaj temu",
-       "vector-action-delete": "Izbriši",
-       "vector-action-move": "Pomjeri",
-       "vector-action-protect": "Zaštiti",
-       "vector-action-undelete": "Vrati obrisano",
-       "vector-action-unprotect": "Promijeni zaštitu",
-       "vector-view-create": "Napravi",
-       "vector-view-edit": "Uredi",
-       "vector-view-history": "Pregled historije",
-       "vector-view-view": "Čitanje",
-       "vector-view-viewsource": "Pogledaj izvor",
        "actions": "Akcije",
        "namespaces": "Imenski prostori",
        "variants": "Varijante",
        "difference-missing-revision": "{{PLURAL:$2|Jedna izmjena|$2 izmjene}} od ove razlike ($1) ne {{PLURAL:$2|postoji|postoje}}.\n\nOvo se obično dešava kada pratite zastarjelu vezu na stranice koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protokol brisanja].",
        "searchresults": "Rezultati pretrage",
        "searchresults-title": "Rezultati pretrage za \"$1\"",
-       "toomanymatches": "Pronađeno je previše rezultata, molimo pokušajte unijeti konkretniji izraz",
        "titlematches": "Naslov članka odgovara",
        "textmatches": "Tekst stranice odgovara",
        "notextmatches": "Tekst članka ne odgovara",
        "searchmenu-exists": "'''Postoji stranica pod nazivom \"[[:$1]]\" na ovoj wiki'''",
        "searchmenu-new": "<strong>Napravi stranicu \"[[:$1]]\" na ovoj wiki!</strong> {{PLURAL:$2|0=|Pogledajte također straniu pronađenu vašom pretragom.|Pogledajte također i vaše rezultate pretrage.}}",
        "searchprofile-articles": "Stranice sadržaja",
-       "searchprofile-project": "Stranice pomoći i projekta",
        "searchprofile-images": "Multimedija",
        "searchprofile-everything": "Sve",
        "searchprofile-advanced": "Napredno",
        "searchprofile-articles-tooltip": "Pretraga u $1",
-       "searchprofile-project-tooltip": "Pretraga u $1",
        "searchprofile-images-tooltip": "Traži datoteke",
        "searchprofile-everything-tooltip": "Pretraži sve sadržaje (ukljujući i stranice za razgovor)",
        "searchprofile-advanced-tooltip": "Traži u ostalim imenskim prostorima",
        "search-interwiki-default": "$1 rezultati:",
        "search-interwiki-more": "(više)",
        "search-relatedarticle": "Povezano",
-       "searcheverything-enable": "Traži u svim imenskim prostorima",
        "searchrelated": "povezano",
        "searchall": "sve",
        "showingresults": "Dolje {{PLURAL:$1|je prikazan '''1''' rezultat|su prikazana '''$1''' rezultata|je prikazano '''$1''' rezultata}} počev od '''$2'''.",
        "allowemail": "Dozvoli e-poštu od ostalih korisnika",
        "prefs-searchoptions": "Traži",
        "prefs-namespaces": "Imenski prostori",
-       "defaultns": "Inače tražite u ovim imenskim prostorima:",
        "default": "standardno",
        "prefs-files": "Datoteke",
        "prefs-custom-css": "Prilagođeni CSS",
        "prefs-emailconfirm-label": "E-mail potvrda:",
        "youremail": "E-mail:",
        "username": "{{GENDER:$1|Korisničko}} ime:",
-       "uid": "{{GENDER:$1|Korisnički}} ID:",
        "prefs-memberingroups": "{{GENDER:$2|Korisnik|Korisnica}} je član {{PLURAL:$1|grupe|grupâ}}:",
        "prefs-registration": "Vrijeme registracije:",
        "yourrealname": "Vaše pravo ime:",
        "recentchanges-label-unpatrolled": "Ova izmjena još nije patrolirana",
        "recentchanges-label-plusminus": "Veličina stranice promijenila se za ovoliko bajtova",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "(također pogledajte [[Special:NewPages|spisak novih stranica]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (također pogledajte [[Special:NewPages|spisak novih stranica]])",
        "rcnotefrom": "Ispod su izmjene od <strong>$2</strong> (do <strong>$1</strong> prikazano).",
        "rclistfrom": "Prikaži nove izmjene počev od $3 $2",
        "rcshowhideminor": "$1 male izmjene",
        "newpages": "Nove stranice",
        "newpages-username": "Korisničko ime:",
        "ancientpages": "Najstarije stranice",
-       "move": "Pomjeri",
+       "move": "Preusmjeri",
        "movethispage": "Premjesti ovu stranicu",
        "unusedimagestext": "Slijedeće datoteke postoje ali nisu uključene ni u jednu stranicu.\nMolimo obratite pažnju da druge web stranice mogu biti povezane s datotekom putem direktnog URLa, tako da i pored toga mogu biti prikazane ovdje pored aktivne upotrebe.",
        "unusedcategoriestext": "Slijedeće stranice kategorija postoje iako ih ni jedan drugi članak ili kategorija ne koriste.",
        "log-title-wildcard": "Traži naslove koji počinju s ovim tekstom",
        "showhideselectedlogentries": "Pokaži/sakrij izabrane zapise u evidenciji",
        "allpages": "Sve stranice",
-       "alphaindexline": "$1 do $2",
        "nextpage": "Sljedeća strana ($1)",
        "prevpage": "Prethodna stranica ($1)",
        "allpagesfrom": "Prikaži stranice počev od:",
        "tooltip-preferences-save": "Sačuvaj podešavanja",
        "tooltip-summary": "Unesite kratki sažetak",
        "common.css": "/* CSS umetnut ovdje primijenit će se na sve skinove */",
-       "cologneblue.css": "/* CSS umetnut ovdje uticat će na korisnike koji koriste Cologne Blue skin */",
-       "monobook.css": "/* CSS umetnut ovdje uticat će na korisnike koji koriste Monobook skin */",
-       "modern.css": "/* CSS umetnut ovdje uticat će na korisnike koji koriste Modern skin */",
        "print.css": "/* CSS umetnut ovdje uticat će na izgled isprintane stranice */",
        "common.js": "/* Bilo koja JavaScript će biti učitana za sve korisnike pri svakom učitavanju stranice. */",
-       "cologneblue.js": "/* Bilo koja JavaScript će biti učitana za sve korisnike koji koriste Cologne Blue skin */",
-       "monobook.js": "/* Bilo koja JavaScript će biti učitana za sve korisnike koji koriste MonoBook skin */",
-       "modern.js": "/* Bilo koja JavaScript će biti učitana za sve korisnike koji koriste Modern skin */",
        "anonymous": "{{PLURAL:$1|Anonimni korisnik|$1 anonimna korisnika|$1 anonimnih korisnika}} projekta {{SITENAME}}",
        "siteuser": "{{SITENAME}} korisnik $1",
        "anonuser": "{{SITENAME}} anonimni korisnik $1",
        "pageinfo-category-pages": "Broj stranica",
        "pageinfo-category-subcats": "Broj podkategorija",
        "pageinfo-category-files": "Broj datoteka",
-       "skinname-cologneblue": "Kelnsko plavo",
-       "skinname-monobook": "MonoKnjiga",
-       "skinname-modern": "Moderna",
        "markaspatrolleddiff": "Označi kao patrolirano",
        "markaspatrolledtext": "Označi ovaj članak kao patroliran",
        "markedaspatrolled": "Označeno kao patrolirano",
        "confirmemail_needlogin": "Morate $1 da bi ste potvrdili Vašu e-mail adresu.",
        "confirmemail_success": "Adresa vaše e-pošte je potvrđena. Možete sad da se prijavite i uživate u viki.",
        "confirmemail_loggedin": "Adresa Vaše e-pošte je potvrđena.",
-       "confirmemail_subject": "Vikiriječnik adresa e-pošte za potvrđivanje",
+       "confirmemail_subject": "{{SITENAME}} – adresa e-pošte za potvrđivanje",
        "confirmemail_body": "Neko, vjerovatno Vi, je sa IP adrese $1 registrovao nalog \"$2\" sa ovom adresom e-pošte na {{SITENAME}}.\n\nDa potvrdite da ovaj nalog stvarno pripada vama i da aktivirate mogućnost e-pošte na {{SITENAME}}, otvorite ovaj link u vašem pregledniku:\n\n$3\n\nAko ovo niste vi, pratite ovaj link da prekinete prijavu:\n$5\n\nOvaj kod za potvrdu će isteći u $4.",
        "confirmemail_body_changed": "Neko, vjerovatno Vi, je sa IP adrese $1\nje promijenio adresu e-pošte računa \"$2\" na ovu adresu za {{SITENAME}}.\n\nDa potvrdite da ovaj nalog stvarno pripada Vama i da reaktivirate mogućnosti e-pošte na {{SITENAME}}, otvorite ovaj link u Vašem pregledniku:\n\n$3\n\nAko ovaj račun *ne* pripada Vama, pratite ovaj link da prekinete odobravanje adrese e-pošte:\n\n$5\n\nOvaj kod za potvrdu će isteći u $4.",
        "confirmemail_body_set": "Neko, vjerovatno Vi, je sa IP adrese $1\npostavio adresu e-pošte računa \"$2\" na ovu adresu za {{SITENAME}}.\n\nDa potvrdite da ovaj račun stvarno pripada Vama i da aktivirate mogućnosti e-pošte na {{SITENAME}}, otvorite ovaj link u Vašem pregledniku:\n\n$3\n\nAko ovaj račun *ne* pripada Vama, pratite ovaj link da prekinete odobravanje adrese e-pošte:\n\n$5\n\nOvaj kôd za potvrdu će isteći u $4.",
index 48922ec..97e7950 100644 (file)
@@ -40,7 +40,8 @@
                        "XVEC",
                        "Àlex",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Calak"
                ]
        },
        "tog-underline": "Subratlla els enllaços:",
        "qbmyoptions": "Pàgines pròpies",
        "faq": "PMF",
        "faqpage": "Project:PMF",
-       "vector-action-addsection": "Nova secció",
-       "vector-action-delete": "Esborra",
-       "vector-action-move": "Reanomena",
-       "vector-action-protect": "Protegeix",
-       "vector-action-undelete": "Restaura",
-       "vector-action-unprotect": "Desprotegeix",
-       "vector-view-create": "Crea",
-       "vector-view-edit": "Modifica",
-       "vector-view-history": "Mostra l'historial",
-       "vector-view-view": "Mostra",
-       "vector-view-viewsource": "Mostra el codi",
        "actions": "Accions",
        "namespaces": "Espais de noms",
        "variants": "Variants",
        "revdelete-nooldid-title": "La revisió objectiu no és vàlida",
        "revdelete-nooldid-text": "No heu especificat unes revisions objectius per a realitzar aquesta\nfunció, la revisió especificada no existeix, o bé esteu provant d'amagar l'actual revisió.",
        "revdelete-no-file": "El fitxer especificat no existeix.",
-       "revdelete-show-file-confirm": "Esteu segurs que voleu veure una revisió esborrada del fitxer «<nowiki>$1</nowiki>» de $2 a $3?",
+       "revdelete-show-file-confirm": "Esteu segur que voleu veure una revisió esborrada del fitxer «<nowiki>$1</nowiki>» de $2 a $3?",
        "revdelete-show-file-submit": "Sí",
        "revdelete-selected-text": "{{PLURAL:$1|Versió seleccionada|Versions seleccionades}} de [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Versió seleccionada|Versions seleccionades}} del fitxer [[:$2]]:",
        "pagemerge-logentry": "s'ha fusionat [[$1]] en [[$2]] (revisions fins a $3)",
        "revertmerge": "Desfusiona",
        "mergelogpagetext": "A sota hi ha una llista de les fusions més recents d'una pàgina d'historial en una altra.",
-       "history-title": "$1: Historial de revisions",
+       "history-title": "«$1»: Historial de revisions",
        "difference-title": "$1: Diferència entre les revisions",
        "difference-title-multipage": "$1 i $2: Diferència entre les pàgines",
        "difference-multipage": "(Diferència entre pàgines)",
        "difference-missing-revision": "{{PLURAL:$2|Una revisió|$2 revisions}} d'aquesta diferència ($1) no {{PLURAL:$2|s'ha|s'han}} trobat.\n\nAixò passa generalment en seguir un enllaç obsolet de diferències a una pàgina que s'ha suprimit.\nEs pot trobar més informació en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registre de supressions].",
        "searchresults": "Resultats de la cerca",
        "searchresults-title": "Resultats de la recerca de «$1»",
-       "toomanymatches": "S'han retornat masses coincidències. Proveu-ho amb una consulta diferent.",
        "titlematches": "Coincidències de títol de la pàgina",
        "textmatches": "Coincidències de text de pàgina",
        "notextmatches": "No hi ha cap coincidència de text de pàgina",
        "searchmenu-exists": "'''Hi ha una pàgina anomenada «[[:$1]]» en aquest wiki'''",
        "searchmenu-new": "<strong>Crea la pàgina «[[:$1]]» en aquest wiki!</strong> {{PLURAL:$2|0=|Vegeu també la pàgina trobada amb la cerca.|Vegeu també els resultats de cerca trobats.}}",
        "searchprofile-articles": "Pàgines de contingut",
-       "searchprofile-project": "Pàgines d'ajuda i de projecte",
        "searchprofile-images": "Multimèdia",
        "searchprofile-everything": "Tot",
        "searchprofile-advanced": "Avançat",
        "searchprofile-articles-tooltip": "Cerca a $1",
-       "searchprofile-project-tooltip": "Cerca a $1",
        "searchprofile-images-tooltip": "Cerca fitxers",
        "searchprofile-everything-tooltip": "Cerca tot tipus de contingut (s'hi inclouen pàgines de discussió)",
        "searchprofile-advanced-tooltip": "Cerca als espais de noms predefinits",
        "search-interwiki-default": "Resultats de $1:",
        "search-interwiki-more": "(més)",
        "search-relatedarticle": "Relacionat",
-       "searcheverything-enable": "Cerca a tots els espais de noms",
        "searchrelated": "relacionat",
        "searchall": "tots",
        "showingresults": "Tot seguit es {{PLURAL:$1|mostra el resultat|mostren els <b>$1</b> resultats començant pel número <b>$2</b>}}.",
        "powersearch-togglelabel": "Activar:",
        "powersearch-toggleall": "Tots",
        "powersearch-togglenone": "Cap",
+       "powersearch-remember": "Recorda la selecció en cerques futures",
        "search-external": "Cerca externa",
        "searchdisabled": "La cerca dins el projecte {{SITENAME}} està inhabilitada. Mentrestant, podeu cercar a través de Google, però tingueu en compte que la seua base de dades no estarà actualitzada.",
        "search-error": "S'ha produït un error durant la recerca: $1",
        "allowemail": "Permet que altres usuaris puguin enviar-me correus electrònics",
        "prefs-searchoptions": "Cerca",
        "prefs-namespaces": "Espais de noms",
-       "defaultns": "Cerca per defecte en els següents espais de noms:",
        "default": "per defecte",
        "prefs-files": "Fitxers",
        "prefs-custom-css": "CSS personalitzat",
        "recentchanges-label-unpatrolled": "Aquesta modificació encara no s'ha patrullat",
        "recentchanges-label-plusminus": "La mida de la pàgina ha canviat aquest nombre de bytes",
        "recentchanges-legend-heading": "'''Llegenda:'''",
-       "recentchanges-legend-newpage": "(vegeu també la [[Special:NewPages|llista de pàgines noves]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vegeu també la [[Special:NewPages|llista de pàgines noves]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "A sota hi ha els canvis des de <strong>$2</strong> (es mostren fins <strong>$1</strong>).",
        "rclistfrom": "Mostra els canvis nous des de $3 $2",
        "watchnologin": "No heu iniciat la sessió",
        "addwatch": "Afegeix a llista de seguiment",
        "addedwatchtext": "S'ha afegit la pàgina \"[[:$1]]\" a la vostra [[Special:Watchlist|llista de seguiment]].\nS'hi mostraran els canvis futurs que tinguin lloc en aquesta pàgina i la corresponent discussió.",
+       "addedwatchtext-short": "S’ha afegit la pàgina «$1» a la vostra llista de seguiment.",
        "removewatch": "Treu de la llista de seguiment",
        "removedwatchtext": "S'ha tret la pàgina «[[:$1]]» de la vostra [[Special:Watchlist|llista de seguiment]].",
+       "removedwatchtext-short": "S’ha tret la pàgina «$1» de la vostra llista de seguiment.",
        "watch": "Vigila",
        "watchthispage": "Vigila aquesta pàgina",
        "unwatch": "Desatén",
        "tooltip-summary": "Afegiu un breu resum",
        "interlanguage-link-title": "$1 - $2",
        "common.css": "/* Editeu aquest fitxer per personalitzar totes les aparences per al lloc sencer */",
-       "monobook.css": "/* Editeu aquest fitxer per personalitzar l'aparença del monobook per a tot el lloc sencer */",
        "common.js": "/* Es carregarà per a tots els usuaris, i per a qualsevol pàgina, el codi JavaScript que hi haja després d'aquesta línia. */",
        "anonymous": "Usuari{{PLURAL:$1| anònim|s anònims}} del projecte {{SITENAME}}",
        "siteuser": "{{GENDER:$2|l'usuari|la usuària}} $1 del projecte {{SITENAME}}",
        "pageinfo-category-pages": "Nombre de pàgines",
        "pageinfo-category-subcats": "ombre de subcategories",
        "pageinfo-category-files": "Nombre d'arxius",
-       "skinname-cologneblue": "Colònia blava",
        "markaspatrolleddiff": "Marca com a supervisat",
        "markaspatrolledtext": "Marca la pàgina com a supervisada",
        "markedaspatrolled": "Marca com a supervisat",
index 9b44207..d970933 100644 (file)
@@ -5,7 +5,8 @@
                        "Xqt",
                        "Yejianfei",
                        "Hakka",
-                       "아라"
+                       "아라",
+                       "Mywood"
                ]
        },
        "tog-underline": "下劃綫鏈接",
        "qbmyoptions": "我其頁面",
        "faq": "經稠碰著其問題",
        "faqpage": "Project:經稠碰著其問題",
-       "vector-action-addsection": "加話題",
-       "vector-action-delete": "刪掉咯",
-       "vector-action-move": "移動",
-       "vector-action-protect": "保護",
-       "vector-action-undelete": "取消刪除",
-       "vector-action-unprotect": "改變保護",
-       "vector-view-create": "創建",
-       "vector-view-edit": "修改",
-       "vector-view-history": "看歷史",
-       "vector-view-view": "讀",
-       "vector-view-viewsource": "看源代碼",
        "actions": "動作",
        "namespaces": "命名空間",
        "variants": "變體",
        "history_short": "歷史",
        "updatedmarker": "趁我最後蜀回訪問開始更新",
        "printableversion": "會拍印其版本",
-       "permalink": "永久鏈接",
+       "permalink": "固定链接",
        "print": "拍印",
        "view": "覷蜀覷",
        "edit": "修改",
        "searchprofile-everything": "所有乇",
        "searchprofile-advanced": "高級",
        "searchprofile-articles-tooltip": "敆$1𡅏尋討",
-       "searchprofile-project-tooltip": "敆$1𡅏尋討",
        "searchprofile-images-tooltip": "尋討文件",
        "search-result-size": "$1 ({{PLURAL:$2|$2萆單詞}})",
        "search-redirect": "(重定向 $1)",
        "prefs-files": "文件",
        "youremail": "電子郵件:",
        "username": "{{GENDER:$1|用戶名}}:",
-       "uid": "{{GENDER:$1|用戶}}ID:",
        "prefs-registration": "開賬戶時間",
        "yourrealname": "真實姓名:",
        "yourlanguage": "語言:",
        "alllogstext": "所有會使趁{{SITENAME}}獲得其日誌其都合併顯示。\n汝會使使揀選日誌類型、用戶名(大小寫敏感),或者受影響其頁面(大小寫敏感)其方法來縮小視角。",
        "logempty": "日誌底裏討要𣍐著項目",
        "allpages": "所有頁面",
-       "alphaindexline": "$1遘$2",
        "nextpage": "下蜀頁($1)",
        "prevpage": "前蜀頁($1)",
        "allpagesfrom": "使下底其乇開始顯示頁:",
        "whatlinkshere-filters": "過濾器",
        "blockip": "封鎖用戶",
        "blockiptext": "使下底其表單來封鎖趁指定IP地址或者用戶名其寫入訪問。茲囇使廮𡅏防止破壞,固加著符合[[{{MediaWiki:Policy-url}}|政策]]。敆下底填底指定其原因(比如講:引用乞破壞其頁面)。",
-       "ipadressorusername": "IP地址或者用戶名:",
+       "ipaddressorusername": "IP地址或者用戶名:",
        "ipbexpiry": "過期:",
        "ipbreason": "原因:",
        "ipbreason-dropdown": "*普通封鎖原因\n** 加添假其信息\n** 塗掉頁面內容\n** 發佈不實信息\n** 亂寫文字\n** 做獃/騷擾\n** 亂開賬戶\n** 亂起用戶名",
        "previousdiff": "← 舊其修改",
        "nextdiff": "新其修改 →",
        "file-nohires": "無更高決斷",
-       "showhidebots": "($1機器人)",
        "ilsubmit": "尋討",
        "bydate": "按日期",
        "metadata": "元數據",
index 14c5b3a..203382e 100644 (file)
@@ -14,7 +14,7 @@
        "tog-hideminor": "Къайладаха кигийра нисдарш оц могӀама керла хийцамехь",
        "tog-hidepatrolled": "Къайладаха гӀаролладина нисдарш оц могӀама керла нисдаршкахь",
        "tog-newpageshidepatrolled": "Къайлаяха гӀароллайина агӀонаш оьцу могӀама керла агӀонашкахь",
-       "tog-extendwatchlist": "Шорбина тlехьажарна могlам, ша беригге а хийцамаш чубогlуш, тlяхьабина боцурш а",
+       "tog-extendwatchlist": "Шорбина тӀехьажарна могӀам, ша беригге а хийцамаш чубогӀуш, тӀехьаббина боцурш а",
        "tog-usenewrc": "Лелабе дика могӀам керла чу хийцамашна (оьшу JavaScript)",
        "tog-numberheadings": "Ша шех хlитто терахь корташна",
        "tog-showtoolbar": "Гайта лакхара гӀирсан дакъа нисйеш аттон оц тадар чохь (JavaScript)",
        "qbmyoptions": "Хьан нисдарш",
        "faq": "СиХХ",
        "faqpage": "Project:СиХХ",
-       "vector-action-addsection": "ТӀетоха хьедар",
-       "vector-action-delete": "ДӀаяккха",
-       "vector-action-move": "ЦӀе хийца",
-       "vector-action-protect": "Гlаролла дé",
-       "vector-action-undelete": "Меттахlоттадé",
-       "vector-action-unprotect": "ГӀароллех къаста",
-       "vector-view-create": "Кхоллар",
-       "vector-view-edit": "Нисъе",
-       "vector-view-history": "АгӀона хийцамаш",
-       "vector-view-view": "Éшар",
-       "vector-view-viewsource": "Билглонашка хьажа",
        "actions": "Дийраш",
        "namespaces": "Цlерийн ана",
        "variants": "Кепараш",
        "generic-pool-error": "Бехк цабиллар доьха, хӀинц сервер йоьттина ю.\nКаьчна дуккха дехарш хӀокху агӀонтӀе хьажарца.\nДехар до, собардеш а юха хьажа хӀокху агӀонтӀе жим тӀаьхьо.",
        "pool-timeout": "Блоктоха еза хан тӀех йаьлла",
        "pool-queuefull": "Дехаршан чоь юьззина ю",
-       "pool-errorunknown": "Дойзаш доцу гlалат",
+       "pool-errorunknown": "Дойзаш доцу гӀалат",
        "pool-servererror": "Пулан ларар тӀекхочучехь дац ($1).",
        "aboutsite": "{{grammar:genitive|{{SITENAME}}}} лаьцна",
        "aboutpage": "Project:Цуьнах лаьцна",
        "nosuchactiontext": "ДӀаязйина URL нийса яц.\nURL язъеш гӀалат даьлла хила мега.\nИза кхин {{SITENAME}} пороектехь гӀалат хила мега.",
        "nosuchspecialpage": "Иштта белхан агӀо яц",
        "nospecialpagetext": "<strong>Иштта белхан агӀо яц.</strong>\n\nБелхан агӀонашан могӀам: [[Special:SpecialPages|{{int:specialpages}}]].",
-       "error": "Гlалат",
-       "databaseerror": "Гlалат хаамийн бухера",
+       "error": "ГӀалат",
+       "databaseerror": "ГӀалат хаамийн бухера",
        "databaseerror-text": "Хаамийн базан гӀалат даьлла.\nИза хила мега программин гӀалат.",
        "databaseerror-textcl": "Хаамийн базан гӀалат даьлла.",
        "databaseerror-query": "Дехар: $1",
        "missingarticle-rev": "(верси № $1)",
        "missingarticle-diff": "(тейп тайпнара: $1, $2)",
        "readonly_lag": "Хаамашан базина цхьана хан блоктоьхна, хаамашан базан сервераш нисялца.",
-       "internalerror": "Чоьхьара гlалат",
-       "internalerror_info": "Чоьхьара гlалат: $1",
+       "internalerror": "Чоьхьара гӀалат",
+       "internalerror_info": "Чоьхьара гӀалат: $1",
        "filecopyerror": "Йиш яц копий ян «$1» оцунах «$2».",
        "filerenameerror": "Файлан «$1» цӀе хийца «$2» йиш яц.",
        "filedeleteerror": "ДӀаяккха цатарло файл «$1».",
        "createacct-benefit-body3": "{{PLURAL:$1|декъашхо|декъашхой}} тӀаьхьарчу хенахь",
        "badretype": "Ахьа язъен ишарш цхьатера яц",
        "userexists": "Ахьа язъен декъашхочун цӀе йолуш ю, дехар до кхин цӀе харжар.",
-       "loginerror": "Гlалат ду декъашхо вовзарехь/йовзарехь",
+       "loginerror": "ГӀалат ду декъашхо вовзарехь/йовзарехь",
        "createacct-error": "ДӀаяздар кхуллуш гӀалат ду",
        "createaccounterror": "Декъашхочун дӀаяздар кхолла йиш яц: $1",
        "nocookiesnew": "Декъашхочун дӀаяздар ду амма системин чохь вац/яц. Декъашхой чу гӀош {{SITENAME}} «cookies» лелош ю. Хьа «cookies» лелаян магийна дац дехар до и магийтина керлачу цӀарца а паролаца а системин чугӀо.",
        "loginreqlink": "Логин",
        "loginreqpagetext": "Ахьа да деза $1, кхин агӀонаш хьажа.",
        "accmailtitle": "Пароль дlаяхьийтина.",
-       "accmailtext": "Пароль декъашхочуьна [[User talk:$1|$1]], йина ша шех хитта делла чу элпашах, дlаяхийтина хьокху $2 адрес тӀе.\n\nЧуваьлла/яла чул тӀехьа , кху гlирса чохь шуьга хийцалур ю ''[[Special:ChangePassword|шай пароль]]''.",
+       "accmailtext": "Пароль декъашхочуьнан [[User talk:$1|$1]], йина ша шех хитта делла чу элпашах, дӀаяхийтина хьокху $2 адрес тӀе.\n\nЧуваьлла/яла чул тӀехьа , кху гӀирса чохь шуьга хийцалур ю ''[[Special:ChangePassword|шай пароль]]''.",
        "newarticle": "(Kерла)",
-       "newarticletext": "Хьо веана хьажоригци хlокху агlон тlе, хlара агlо хlинца йоцаш ю.\nНагахь иза кхолла лаахь, хlотта де лахо гуш долу корехь йоза (мадарра хьажа. [$1 гlон агlон чу]).\nНагахь гlалат даьлла нисвелляхь кхузе, атта тlе тlаlа йе '''юха йоккхуриг''' хьай гlирса тlяхь.",
+       "newarticletext": "Хьо веана хьажоригци хӀокху агӀон тӀе, хӀара агӀо хӀинца йоцаш ю.\nНагахь иза кхолла лаахь, хӀотта де лахо гуш долу корехь йоза (мадарра хьажа. [$1 гӀон агӀон чу]).\nНагахь гӀалат даьлла цахууш кхечехь кхузе, атта тӀе тӀаӀа йе '''юха йоккхуриг''' хьай гӀирса тӀехь.",
        "anontalkpagetext": "----''ХӀара дийцаре агӀо къайлаха декъашхочуьна ю, хӀинца дӀаяздар доцу, я лелош воцуш/йоцуш.\nЦундела иза вовзийта/йовзийта лелош ду терахьца IP-адрес.\nИза терахь долу меттиг хила мега кхечу декъашхойчух терра.\nНагахь хьо къайлах волу декъашхо валахь хьайна хаам кхаьчна аьлла хеташн, хьуна хьажийна доцуш, дехар до, кхолла хьай меттиг кху чохь[[Special:UserLogin/signup|дӀаяздар кхоллар]] я [[Special:UserLogin|системин чугӀо]],",
        "noarticletext": "Хlокх хан чохь кху агlонца йоза дац.\nШуьга далундерг [[Special:Search/{{PAGENAME}}|лахар ишта хьехош йолу цlе]] кхечу яззамашкахь,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} лахар кхечу тептаршкахь],\nйа '''[{{fullurl:{{FULLPAGENAME}}|action=edit}} кхолла ишта цlе йолу агlо]'''</span>.",
        "noarticletext-nopermission": "ХӀокх хан чохь кху агӀонца йоза дац.\nШуьга далундерг [[Special:Search/{{PAGENAME}}|лахар ишта хьехош йолу цӀе]] кхечу яззамашкахь,\nйа <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} лаха оцуьнах терадерг кхечу тептаршкахь].</span>",
        "readonlywarning": "'''ДӀАХЬЕДО. ГӀирса бух блоктоьхна оьшуш долучу хьаштан, цундера хӀинц хьоьга дӀа ца йазло хийцам.\nХила мега, ахьа Ӏалаш дан дезаш хьайн йоза, юха тӀаьхьо леладан иза йоза.'''\n\nКуьйгалхочо блоктоьхна гӀирса бух, цо битина кхетош хӀара хаам: $1",
        "protectedpagewarning": "'''Дlахьедар. Хlара агlо гlаролла дина ю хийцам цабайта, иза хийца йа нисйа а бакъо йолуш адаманкуьйгалла лелош болу декъашхой бе бац.'''\nЛахахьа гойту хаамаш тlаьхьара бина болу хийцамна тептар чура:",
        "cascadeprotectedwarning": "<div id=\"cascadeprotectedwarning\" style=\"border:1px solid #ee0; padding:10px; background:#ffa; margin-bottom:1em\">[[file:Padlock.svg|left|25px|ДовгӀа|link=]]\nХӀара агӀо тада бакъо йолуш [[Project:Куьйгалхой|куьйгалхой]] бу, хӀунда аьлча и агӀо латийна кхечу агӀонашца хӀоттделлачу гӀаролле:</div>",
-       "templatesused": "{{PLURAL:$1|1=Кеп, лелийна|Кепаш, лелош ду}} хlокху агlон башхонца:",
-       "templatesusedpreview": "{{PLURAL:$1|1=Кеп, лелошдолу|Кепаш, лелошдолу}} оцу хьалх хьожучу агlонца:",
+       "templatesused": "{{PLURAL:$1|1=Кеп, лелийна|Кепаш, лелош ю}} хӀокху агон башхонца:",
+       "templatesusedpreview": "{{PLURAL:$1|1=Кеп, лелошдолу|Кепаш, лелойлу}} оцу хьалх хьожучу агӀонца:",
        "templatesusedsection": "ХӀокху декъан чохь {{PLURAL:$1|1=лелош йолу кеп|лелош йолу кепаш}}:",
        "template-protected": "(гlароллийца)",
        "template-semiprotected": "(дуьззина доцуш гlаролла)",
        "content-model-text": "цхьалхе йоза",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "expensive-parserfunction-warning": "'''Тидам бе!''' Ресурсийн функцийн дехарш сов даьлла агӀонаш .\n\nДукху хилла ца деза {{PLURAL:$2|$2 дехар|$2 дехарш|1=цхьана дехар}}, хӀинца $1 {{PLURAL:$1|дехар}} ду.",
+       "expensive-parserfunction-category": "Ресурсийн функцийн дехарш сов даьлла агӀонаш",
        "post-expand-template-inclusion-warning": "ДӀахьедар: юкъа тоьхна кепашан жамӀан барам тӀех бокха бу. Цхьайолу кепаш юкъа тухур яц.",
        "post-expand-template-inclusion-category": "Чу дуьхкуш долу кепашан барам тӀех баьлла агӀонаш",
        "post-expand-template-argument-category": "Кепашан аргументаш юкъахь йитина агӀонаш",
        "parser-template-loop-warning": "Карийна кепаш юкъахь хилла шад: [[$1]]",
        "parser-template-recursion-depth-warning": "Дозанал хьаладаьлла кӀоргенца юх юха дина кеп ($1)",
+       "node-count-exceeded-category": "Шедийн дукхалла сов даьлла агӀонаш",
+       "node-count-exceeded-warning": "Шедийн дукхалла сов даьлла агӀонаш",
        "expansion-depth-exceeded-category": "Схьаелларан кӀоргалла тӀех даьккхина агӀонаш",
        "expansion-depth-exceeded-warning": "АгӀонгахь чуйихкар тӀехдаьккхина",
        "parser-unstrip-loop-warning": "ДӀачӀагӀанца pre карина",
        "currentrev": "Карара верси",
        "currentrev-asof": "Карара верси оцу $1",
        "revisionasof": "Верси $1",
-       "revision-info": "Верси $1; $2 тӀера",
+       "revision-info": "Верси $1; {{GENDER:$6|$2}}$7",
        "previousrevision": "← Хьалха йоьдург",
        "nextrevision": "Тlаьхьайогlург →",
        "currentrevisionlink": "Карара верси",
        "search-interwiki-default": "$1 хилам.:",
        "search-interwiki-more": "(кхин)",
        "search-relatedarticle": "ХӀоттаделларг",
-       "searcheverything-enable": "Массо цIера анахь лахар",
        "searchrelated": "хlоттаделларг",
        "searchall": "массо",
        "showingresults": "Лахахьа {{PLURAL:$1|гойта|гойту|гойту}} <strong>$1</strong> {{PLURAL:$1|хилам|хиламаш|хиламаш}}, дlаболало кху № <strong>$2</strong>.",
        "allowemail": "Магийта декъашхошна хьайга электрони почтехула кехат кхехьийта",
        "prefs-searchoptions": "Лаха",
        "prefs-namespaces": "ЦӀерийн ана",
-       "defaultns": "Я лаха лахахь гайтинчу аннашкахь:",
        "default": "Iад йитарца",
        "prefs-files": "Файлаш",
        "prefs-custom-css": "Долахь йолу CSS",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|тӀеххьара чудаларца}}",
        "enhancedrc-history": "истори",
        "recentchanges": "Керла нисдарш",
-       "recentchanges-legend": "Ð\93lиÑ\80Ñ\81 Ð½Ð¸Ñ\81баÑ\80на ÐºÐµÑ\80ла Ð½Ð¸Ñ\81даÑ\80Ñ\88",
+       "recentchanges-legend": "Ð\9aеÑ\80ла Ð½Ð¸Ñ\81даÑ\80Ñ\88 Ð³Ð°Ñ\80 Ð½Ð¸Ñ\81даÑ\80",
        "recentchanges-summary": "Лахахь гайтина хене хьаьжна Википедин агӀонашкахь тӀаьхьара бина хийцамаш",
        "recentchanges-noresult": "Билгал йинчу хенахь цхьа хийцамаш бина бац.",
        "recentchanges-feed-description": "Тергам бе тlаьхьара вики хийцаман хlокху ларца.",
        "recentchanges-label-bot": "ХӀара нисдар шаболх бечо дина",
        "recentchanges-label-unpatrolled": "ХӀара нисдар хӀинца цхьано патрулировать дина дац",
        "recentchanges-label-plusminus": "байташкахь барам хийцар",
-       "recentchanges-legend-newpage": "(хьажа кхин [[Special:NewPages|керла агӀонийн могӀа]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (хьажа кхин [[Special:NewPages|керла агӀонийн могӀа]])",
        "rcnotefrom": "Лахахь гайтина тӀера <strong>$2</strong> (хийцамаш <strong>$1</strong> кӀезиг).",
        "rclistfrom": "Гайта хийцам оцу $3 $2",
        "rcshowhideminor": "$1 кегийра нисдарш",
        "unusedtemplates": "Лелош йоцу кепаш",
        "unusedtemplatestext": "Кхузахь дагар йина «{{ns:template}}» цӀерийн меттиган агӀонаш, кхечу агӀонийн юкъа тоьхна йоцу.\nДиц ма делахь хьажа кеп агӀонашкахь лелош юй.",
        "unusedtemplateswlh": "кхин хьажоргаш",
-       "randompage": "Цахууш нисйелла агӀо",
-       "randomincategory": "Категори чу цахууш нийса елла агӀо",
+       "randompage": "Цахууш нисъелла агӀо",
+       "randomincategory": "Категори чу цахууш нисъелла  агӀо",
        "randomincategory-selectcategory": "Категори чу цахууш нийса елла агӀона чу гӀо: $1 $2.",
        "randomincategory-selectcategory-submit": "Дехьа гӀо",
        "randomredirect": "Цахууш нисделла дIасахьажор",
        "statistics-views-total": "Массо хьажарш",
        "statistics-views-total-desc": "Ма лара дӀаяьхна а белхан а агӀонашка хьажар",
        "statistics-views-peredit": "Нисдаре хьажарш",
-       "statistics-users": "[[ВП:Дlаязвалар|Дlаязбелларш]] шаберигге декъашхой чохь болу [[Special:ListUsers|(могlам)]]",
+       "statistics-users": "[[ВП:ДӀаязвалар|ДӀаязбелларш]] берриге декъашхой чохь болу [[Special:ListUsers|(могӀам)]]",
        "statistics-users-active": "Жигара декъашхой",
        "statistics-users-active-desc": "Декъашхой, муьлха цхьа хӀум дина болу, кху {{PLURAL:$1|1=тӀаьххьара $1 динахь|тӀаьххьара $1 дийнахь}}",
        "statistics-mostpopular": "Дукху хьоьжу агӀонаш",
        "ntransclusions": "лелош ю $1 {{PLURAL:$1|агӀонгахь|агӀонашкахь}}",
        "specialpage-empty": "Дехаро хӀумма ца елла.",
        "lonelypages": "Байлахь йисина агIонаш",
-       "lonelypagestext": "Ð\9aÑ\85Ñ\83заÑ\85Ñ\8c Ñ\8e {{grammar:genitive|{{SITENAME}}}} ÐºÑ\85еÑ\87Ñ\83 Ð°Ð³Ó\80онаÑ\88каÑ\85Ñ\8c Ñ\82Ó\80е Ñ\85Ñ\8cажийна Ñ\85Ñ\8cажоÑ\80агаÑ\88 Ð¹Ð¾Ñ\86Ñ\83 Ð°Ð³Ó\80онаÑ\88.",
+       "lonelypagestext": "Кхузахь ю {{grammar:genitive|{{SITENAME}}}} кхечу агӀонашкахь тӀе хьажийна хьажоргаш йоцу агӀонаш.",
        "uncategorizedpages": "Категореш йоцу агIонаш",
        "uncategorizedcategories": "Категореш йоцу категореш",
        "uncategorizedimages": "Категореш йоцу файлаш",
        "prefixindex": "Хьалха агӀонашан цӀераш хӀотто йеза",
        "prefixindex-namespace": "Хьалха агӀонашан цӀераш хӀотто еза («{{ns:$1}}»)",
        "prefixindex-strip": "Хиламийн могӀам чура префикс къайлаяккха",
-       "shortpages": "Ð\91оÑ\86оа Ñ\8fззамаÑ\88",
+       "shortpages": "Боца яззамаш",
        "longpages": "Беха яззамаш",
        "deadendpages": "Дика йоцу агIонаш",
        "protectedpages": "ГIаролла дина агIонаш",
        "protectedpages-unknown-timestamp": "Хууш дац",
        "protectedpages-unknown-performer": "Хууш доцу декъашхо",
        "protectedtitles": "ГIаролла дина цIераш",
-       "listusers": "Декъашхой могlам",
+       "listusers": "Декъашхой могӀам",
        "listusers-editsonly": "Цхаъ мукъане а хийцам бина декъашхой гайта",
        "listusers-creationsort": "Кхоьллина хене хьаьжна нисъяр",
        "listusers-desc": "Харжа къезиг хиларца",
        "listusers-submit": "Гайта",
        "listusers-noresult": "Декъашхой цакарий.",
        "listusers-blocked": "(блоктоьхна)",
-       "activeusers": "Жигар декъашхой могlам",
+       "activeusers": "Жигар декъашхой могӀам",
        "activeusers-intro": "Лахахь гойтуш бу  {{PLURAL:$1|1=тӀаьхьара $1 динахь|тӀаьхьара $1 деношкахь}} хийцамаш бина декъашхой.",
        "activeusers-count": "{{PLURAL:$3|1=тӀаьхьарчу $3 динахь|тӀаьхьара $3 деношкахь}} $1 {{PLURAL:$1|1=нисдар|нисдарш}} дина",
        "activeusers-from": "Гучé баха декъашхой, болалуш болу тӀера:",
        "listgrouprights-group": "Тоба",
        "listgrouprights-rights": "Бакъонаш",
        "listgrouprights-helppage": "Help:Тобан бакъонаш",
-       "listgrouprights-members": "(тобан могlам)",
+       "listgrouprights-members": "(тобан могӀам)",
        "listgrouprights-addgroup": "{{PLURAL:$2|тоба|тобанаш}} тӀетоха ло: $1",
        "listgrouprights-removegroup": "{{PLURAL:$2|тобан чура дӀабаха|тобанаш чура дӀабаха}} ло: $1",
        "listgrouprights-addgroup-all": "массо тобанийн юкъатоха йиш ю",
        "listgrouprights-namespaceprotection-header": "ЦӀеран анан бехкам",
        "listgrouprights-namespaceprotection-namespace": "ЦӀерийн ана",
        "listgrouprights-namespaceprotection-restrictedto": "Декъашхочун хийцамаш бан таро хуьлуьйту бакъонаш",
+       "trackingcategories": "Хьожуш йолу категореш",
+       "trackingcategories-summary": "ХӀокху агӀонгахь ю хьожуш йолу категореш, MediaWikiс тӀеюзаш ю уьш. {{ns:8}} цӀерийн меттигера системин хаам хийцина цера цӀераш хийца йиш ю.",
        "trackingcategories-msg": "Категореш зер",
        "trackingcategories-name": "Хааман цӀе",
+       "trackingcategories-desc": "Категорин чутухуш йолчун хила деза хьал",
        "expensive-parserfunction-category-desc": "АгӀорахь тӀех дуккха ресурсийн функцеш лелош ю (<code>#ifexist</code> саниш). Мадарра ду — [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit] агӀонгахь.",
        "trackingcategories-nodesc": "Цунах лаьцна хӀума дац.",
        "trackingcategories-disabled": "Категори дӀаяйина ю",
        "watchnologin": "Системин чугӀо",
        "addwatch": "Тергаме могӀам юкъа тоха",
        "addedwatchtext": "ХӀара «[[:$1]]» агӀо тӀетоьхна хьан [[Special:Watchlist|тергаме могӀам чу]].\nОцу могӀам чохь дӀаязбийр бу агӀона а цуьнца йолу дийцаре агӀона а бина хийцамаш.",
+       "addedwatchtext-short": "«$1» агӀо хьан тергаман магӀам тӀетоьхна.",
        "removewatch": "ДӀаяккха тергаме могӀам юкъар",
        "removedwatchtext": "АгӀо «[[:$1]]» дӀаяьккхина яра хьан [[Special:Watchlist|тергаме могӀанан юкъар]].",
+       "removedwatchtext-short": "«$1» агӀо хьан тергаман магӀам чура дӀаяьккхина.",
        "watch": "Тидам бе",
        "watchthispage": "Тергам бé хlокху агlон",
        "unwatch": "Тергамах къаста",
        "enotif_body_intro_moved": "Проектан «{{SITENAME}}» агӀо «$1» $PAGEEDITDATE {{gender:$2|декъашхочо}} $2 цӀе хийцина, карара верси ю : $3",
        "enotif_body_intro_restored": "Проектан «{{SITENAME}}» агӀо «$1» $PAGEEDITDATE {{gender:$2|декъашхочо}} $2 кхоьллина, карара верси ю : $3",
        "enotif_body_intro_changed": "Проектан «{{SITENAME}}» агӀо «$1» $PAGEEDITDATE {{gender:$2|декъашхочо}} $2 хийцам бина, карара верси ю : $3",
+       "enotif_lastvisited": "Хьажа кхин. $1 хьуна тӀаьхьара гина чул тӀехьа бина хийцамашка хьажар.",
+       "enotif_lastdiff": "Кхин хьажа. $1 хийцам бовза.",
+       "enotif_anon_editor": "къайлаха декъашхо $1",
+       "enotif_body": "Ассалам Ӏалийкум, $WATCHINGUSERNAME!\n\n$PAGEINTRO $NEWPAGE\n\nХийцамах лаьцна доца яздар: $PAGESUMMARY $PAGEMINOREDIT\n\nХийцам биначунга хаам бар:\nэл. почта: $PAGEEDITOR_EMAIL\nвики: $PAGEEDITOR_WIKI\nХьо хьайн цӀарца хӀокху агӀон чц ца гӀаш, оьцуна кхин хийцамаш бича хьуна хаам бира бац. Кхин хьа йиш ю и опци массо агӀонашна дӀаяйа.\nХааман система {{grammar:genitive|{{SITENAME}}}}\n\n--\nХааман хийцам бар\n{{canonicalurl:{{#special:Preferences}}}}\n\nХьайн тергаме могӀам нисбар\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nХьайн тергаме могӀам чура агӀонаш дӀаяха\n$UNWATCHURL\n\nТхоьга зӀе а гӀо а\n$HELPPAGE",
        "changed": "хийцина",
        "deletepage": "ДӀаяккха агӀо",
        "confirm": "Бакъдан",
        "ipaddressorusername": "IP-адрес я декъашхочун цӀе:",
        "ipbexpiry": "Хан чекхйолу:",
        "ipbreason": "Бахьна:",
-       "ipbreason-dropdown": "* Ð\91елÑ\85ан Ð½ÐµÐºÑ\8a Ð´Ó\80акÑ\8aовлаÑ\80 Ð±Ð°Ñ\85Ñ\8cанаÑ\88:\n** Ð¥Ð°Ñ\80Ñ\86а Ñ\85аам Ð±Ð°Ñ\80\n** Ð\90гÓ\80онан Ñ\87Ñ\83Ñ\80аниг Ð´Ó\80аÑ\8fккÑ\85аÑ\80\n** Ð¡Ð¿Ð°Ð¼-Ñ\85Ñ\8cажоÑ\80агаÑ\88 Ð°Ñ\80аÑ\85Ñ\8cаÑ\80а Ñ\81айÑ\82аÑ\88на\n** Ð\9cаÑ\8cÓ\80на Ð´Ð¾Ñ\86Ñ\83 Ñ\82екÑ\81Ñ\82 Ñ\82Ó\80еÑ\82оÑ\85аÑ\80\n** Ð\94екÑ\8aаÑ\88Ñ\85ой Ñ\85Ñ\8cийзабаÑ\80, ÐºÑ\85еÑ\80амаÑ\88 Ñ\82иÑ\81Ñ\81аÑ\80\n** Ð\9cаÑ\81ийÑ\82Ñ\82а Ð»Ð°Ñ\80аман Ñ\8fздаÑ\80 Ð·Ñ\83ламан Ð»ÐµÐ»Ð°Ñ\8fÑ\80\n** Ð\9cагитина йоцу декъашхочун цӀе",
+       "ipbreason-dropdown": "* Ð\91елÑ\85ан Ð½ÐµÐºÑ\8a Ð´Ó\80акÑ\8aовлаÑ\80 Ð±Ð°Ñ\85Ñ\8cанаÑ\88:\n** Ð¥Ð°Ñ\80Ñ\86а Ñ\85аам Ð±Ð°Ñ\80\n** Ð\90гÓ\80онан Ñ\87Ñ\83Ñ\80аниг Ð´Ó\80аÑ\8fккÑ\85аÑ\80\n** Ð¡Ð¿Ð°Ð¼-Ñ\85Ñ\8cажоÑ\80гаÑ\88 Ð°Ñ\80аÑ\85Ñ\8cаÑ\80а Ñ\81айÑ\82аÑ\88на\n** Ð\9cаÑ\8cÓ\80на Ð´Ð¾Ñ\86Ñ\83 Ñ\82екÑ\81Ñ\82 Ñ\82Ó\80еÑ\82оÑ\85аÑ\80\n** Ð\94екÑ\8aаÑ\88Ñ\85ой Ñ\85Ñ\8cийзабаÑ\80, ÐºÑ\85еÑ\80амаÑ\88 Ñ\82ийÑ\81аÑ\80\n** Ð\9cаÑ\81ийÑ\82Ñ\82а Ð»Ð°Ñ\80аман Ñ\8fздаÑ\80 Ð·Ñ\83ламан Ð»ÐµÐ»Ð°Ñ\8fÑ\80\n** Ð\9cагийтина йоцу декъашхочун цӀе",
        "ipb-hardblock": "Шаш довзийтина болу декъашхошна бехкам бе хӀокху IP-адресца тадарш дан",
        "ipbcreateaccount": "Цамаго керла декъашхочун дӀаяздарш кхолла",
        "ipbemailban": "Цамагдо декъашхошка хааман кехаташ кхехьийта",
        "ipb-disableusertalk": "Цамагдо шин дийцаре агӀо та я блоктоьхна хан чекхъяллалц",
        "ipb-change-block": "Юхаблоктоха декъашхочун оьцу хийцамашца",
        "ipb-confirm": "Бакъде блоктохар",
+       "badipaddress": "Магийна доцу IP адрес",
        "blockipsuccesssub": "Блоктохар чакхдели",
        "blockipsuccesstext": "[[Special:Contributions/$1|«$1»]] {{GENDER:$1|блоктоьхна}}.<br />\nХьажа. [[Special:BlockList|блоктоьхна IP-адресийнн могӀам]].",
        "ipb-blockingself": "Хьо хьайна блоктоха гӀерта! Лаьий хьона и кхочушдан?",
        "block-log-flags-nousertalk": "шин дийцаре агӀо тая лууш дац",
        "block-log-flags-hiddenname": "декъашхочун цӀе къайлаяьккхина",
        "ipb_expiry_invalid": "Дешдерг дан нийса йоцу хан.",
+       "ipb_already_blocked": "«$1» хӀинцале блоктоьхна ю.",
        "ipb-needreblock": "ХӀокху $1 декъашхочун {{GENDER:$1|блоктоьхна ю}}. Лаьий хьуна блоктохаран параметраш хийца?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Кхин блоктохар|Кхин блоктохарш}}",
        "unblock-hideuser": "Декъашхочун тӀера блокдӀаяккха хьа таро яц, цуна цӀе хьулйина хилар бахьанехь.",
+       "ipb_cant_unblock": "ГӀалат: блоктохар цакарий $1. Иза хӀинцале дӀаяьккхина хила мега.",
        "ip_range_invalid": "IP-адресийн магийна йоцу диапазон.",
+       "proxyblocker": "Проксин блоктохар",
        "move-page": "$1 — цӀе хийцар",
        "move-page-legend": "ЦӀe хийца яр",
-       "movepagetext": "Бухахь йолу форманца агӀон цӀе хийцало. Цул совнах цуьна хийцаман журнал кхоьчу метте доккха. Хьалхалера цӀарахь хиръю керла кхоьллина агӀонан хьажораг.\n\nХьовсалаш [[Special:DoubleRedirects|шалха]] а [[Special:BrokenRedirects|йохна хьажорагаш]] юй техь аьлла.\n\nШу жоьпехь ду хьажорагаш нийса некъ гойтуш хиларан.\n\nТидам бе хьалхалера агӀон цӀе ‘’’хийцалур яц’’’ иштта цӀе йолу агӀо йолуш елахь. Юкъардаккхар: йолуш йолу агӀо кхоьчухьа хьажораг елахь, я еса елахь а, цуьна хьийцаме истори яцахь а.\n\nИ бохург ду шун агӀонан цӀе юха а хьалха хилларгчунтӀе хийца йиш ю, амма йолуш йолу агӀо дӀаяккха йиш яц.\n\n'''ДӀАХЬЕДАР!'''\n\nЦӀе хийцар бахьнехь гӀаръяьлла агӀонашна дукха дагахь боцу хийцамаш хила тарло. Цундела цӀе хийцале шеш хила тарлучу тӀехьонашах кхета аьлла тешна хила.",
-       "movepagetext-noredirectfixer": "Бухахь йолу форманца агӀон цӀе хийцало. Цул совнах цуьна хийцаман журнал кхоьчу метте доккха. Хьалхалера цӀарахь хиръю керла кхоьллина агӀонан хьажораг.\n\nХьовсалаш [[Special:DoubleRedirects|шалха]] а [[Special:BrokenRedirects|йохна хьажорагаш]] юй техь аьлла.\n\nШу жоьпехь ду хьажорагаш нийса некъ гойтуш хиларан.\n\nТидам бе хьалхалера агӀон цӀе ‘’’хийцалур яц’’’ иштта цӀе йолу агӀо йолуш елахь. Юкъардаккхар: йолуш йолу агӀо кхоьчухьа хьажораг елахь, я еса елахь а, цуьна хьийцаме истори яцахь а.\n\nИ бохург ду шун агӀонан цӀе юха а хьалха хилларгчунтӀе хийца йиш ю, амма йолуш йолу агӀо дӀаяккха йиш яц.\n\n'''ДӀАХЬЕДАР!'''\n\nЦӀе хийцар бахьнехь гӀаръялла агӀонашна дукха дагахь боцу хийцамаш хила тарло. Цундела цӀе хийцале шеш хила тарлучу тӀехьонашах кхета аьлла тешна хила.",
+       "movepagetext": "Бухахь йолу форманца агӀон цӀе хийцало. Цул совнах цуьна хийцаман тептар кхоьчу метте доккха. Хьалхалера цӀарахь хиръю керла кхоьллина агӀонан хьажораг.\n\nХьовсалаш [[Special:DoubleRedirects|шалха]] а [[Special:BrokenRedirects|йохна хьажоргаш]] юй техь аьлла.\n\nШу жоьпехь ду хьажоргаш нийса некъ гойтуш хиларан.\n\nТидам бе хьалхалера агӀон цӀе ‘’’хийцалур яц’’’ иштта цӀе йолу агӀо йолуш елахь. Юкъардаккхар: йолуш йолу агӀо кхоьчухьа хьажораг елахь, я еса елахь а, цуьна хийцаме истори яцахь а.\n\nИ бохург ду шун агӀонан цӀе юха а хьалха хилларгчунтӀе хийца йиш ю, амма йолуш йолу агӀо дӀаяккха йиш яц.\n\n'''ДӀАХЬЕДАР!'''\n\nЦӀе хийцар бахьнехь гӀаръяьлла агӀонашна дукха дагахь боцу хийцамаш хила тарло. Цундела цӀе хийцале шеш хила тарлучу тӀехьонашах кхета аьлла тешна хила.",
+       "movepagetext-noredirectfixer": "Бухахь йолу форманца агӀон цӀе хийцало. Цул совнах цуьна хийцаман тептар кхоьчу метте доккха. Хьалхалера цӀарахь хиръю керла кхоьллина агӀонан хьажораг.\n\nХьовсалаш [[Special:DoubleRedirects|шалха]] а [[Special:BrokenRedirects|йохна хьажоргаш]] юй техь аьлла.\n\nШу жоьпехь ду хьажоргаш нийса некъ гойтуш хиларан.\n\nТидам бе хьалхалера агӀон цӀе ‘’’хийцалур яц’’’ иштта цӀе йолу агӀо йолуш елахь. Юкъардаккхар: йолуш йолу агӀо кхоьчухьа хьажораг елахь, я еса елахь а, цуьна хийцаме истори яцахь а.\n\nИ бохург ду шун агӀонан цӀе юха а хьалха хилларгчунтӀе хийца йиш ю, амма йолуш йолу агӀо дӀаяккха йиш яц.\n\n'''ДӀАХЬЕДАР!'''\n\nЦӀе хийцар бахьнехь гӀаръяьлла агӀонашна дукха дагахь боцу хийцамаш хила тарло. Цундела цӀе хийцале шеш хила тарлучу тӀехьонашах кхета аьлла тешна хила.",
        "movepagetalktext": "ТӀе хӀоьттина йолу дийцаре агӀо ишта цӀе хийцина хира ю, '''цхьа йолу ханчохь, маца:'''\n\n*Йаьсса йоцу дийцаре агӀо йолуш ю оцу цӀарца йа\n*Ахьа къастаман харжам цабиняхь а къастам хӀотточехь.\n\nИшта чу ханчохь, ахьа дехьа яккха йезар ю йа куьйга хӀоттайар, нагахь иза хьашт йалахь.",
        "movearticle": "Цle хийца хlокху агlон",
        "moveuserpage-warning": "'''Тергам бе.''' Хьо декъашхочун агӀона цӀе хийца гӀерта. Дехар до, тергам бе, декъашхочун агӀона цӀе бен хийца лур яц, декъашхочун дӀаяздаран цӀе хийца лур яц.",
+       "movecategorypage-warning": "<strong>ДӀахьедар:</strong> Хьо категорин агӀон цӀе хийца гӀерта. Дехар до, терго йе, хӀокху агӀона бен цӀе хуьйцур яц, шира чу категори чура массо агӀонаш керла категори чу йохур <em>яц</em>.",
        "movenologintext": "АгӀона цӀе хийца [[Special:UserLogin|системин чугӀо]].",
        "movenotallowed": "Хьан бакъо яц керла агӀонаш кхолла.",
        "movenotallowedfile": "Хьан файлийн цӀераш хийца бакъо яц.",
        "tooltip-pt-mytalk": "Сан дийцаре агlо",
        "tooltip-pt-preferences": "Хьан гlирс нисбар",
        "tooltip-pt-watchlist": "Ахьа тергам бо агӀонийн хийцаман могӀам",
-       "tooltip-pt-mycontris": "Хьан нисдаран могlам",
+       "tooltip-pt-mycontris": "Хьан нисдаран могӀам",
        "tooltip-pt-login": "Хlокху гlирса чохь дlавазвала/яла мега, амма иза тlедожош дац.",
        "tooltip-pt-logout": "Дlадерзадо болх бар",
        "tooltip-ca-talk": "Дийцаре агlон чулацам",
        "tooltip-n-mainpage": "Коьрта агӀона дехьа гӀо",
        "tooltip-n-mainpage-description": "Коьрта агӀона дехьа гӀо",
        "tooltip-n-portal": "Оцу кхолламах, мичахь хlу йу лаьташ а хlудалур ду шуьга",
-       "tooltip-n-currentevents": "Дlаоьхуш болу хаамашна могlам",
-       "tooltip-n-recentchanges": "Тlаьххьаралера хийцаман могlам",
+       "tooltip-n-currentevents": "ДӀаоьхуш болу хаамашна могӀам",
+       "tooltip-n-recentchanges": "ТӀаьххьаралера хийцаман могӀам",
        "tooltip-n-randompage": "Хьажа цахууш нисйеллачу агlоне",
        "tooltip-n-help": "ГӀоде меттиг",
-       "tooltip-t-whatlinkshere": "Массо агlон могlам, хlокху агlонтlе хьажийна йолу",
+       "tooltip-t-whatlinkshere": "Массо агӀон могӀам, хӀокху агӀонтӀе хьажийна йолу",
        "tooltip-t-recentchangeslinked": "Тlаьхьарлера хийцамаш хlокху агlонашкахь, мичхьа хьажийна хlара агlо",
        "tooltip-feed-rss": "Хьагайтар оцу RSS цани хlокху агlон",
        "tooltip-feed-atom": "Хьагайтар оцу Atom цани хlокху агlон",
        "tooltip-undo": "ДӀабаккха бина болу хийцам а хьалхьажар гойтуш, дӀаяккхарна бахьна гайта аьтту беш",
        "tooltip-preferences-save": "ГӀирс нисбар Ӏалашде",
        "tooltip-summary": "Язъе йоца цӀе",
+       "interlanguage-link-title-nonlang": "$1 – $2",
        "common.css": "/** Чуйиллина йолу кхузе CSS хир ю лелош масхьа кечйечу чохь */",
-       "monobook.css": "/* Чуйиллина йолу кхузе CSS хир ю лелош масхьа Monobook чохь */",
        "print.css": "/* Чуйиллина йолу кхузе CSS хир ю лелош масхьа зорба тухучуче чохь */",
        "common.js": "/* Чуйиллина йолу кхузе JavaScript код гучу ера ю массо декъашхошна оцара схьаелларца хlора агlо */",
-       "monobook.js": "/* Кхузе чу язийна йолу JavaScript код, чу ера ю, массо MonoBook хатl лелош болу декъашхошна */",
        "anonymous": "{{PLURAL:$1|1=ЦӀе хьулйина декъашхо|ЦӀе хьулйина декъашхой}} {{grammar:genitive|{{SITENAME}}}}",
        "siteuser": "декъашхо {{grammar:genitive|{{SITENAME}}}} $1",
        "anonuser": "цӀе хьулйина декъашхо {{grammar:genitive|{{SITENAME}}}} $1",
        "siteusers": "{{PLURAL:$2|1=декъашхо|декъашхой}} {{grammar:genitive|{{SITENAME}}}} $1",
        "anonusers": "{{PLURAL:$2|1=цӀе хьулйина декъашхо|цӀе хьулйина декъашхой}} {{grammar:genitive|{{SITENAME}}}} $1",
        "creditspage": "Баркаллаш",
-       "nocredits": "Бац декъашхойн могlам хlокху яззамца",
+       "nocredits": "Бац декъашхойн могӀам хӀокху яззамца",
        "spamprotectiontitle": "Совбиларна литтар",
        "spamprotectiontext": "Хьо дӀаязъян гӀерта агӀо спам-литтаро дӀакъоьвлина.\nЦуна бахьна хила там бу агӀона чохь зулам литтаран чутоьхна йолу хьажораг хилар.",
        "spambot_username": "Спам дӀацӀаняр",
        "pageinfo-category-pages": "АгӀонийн дукхалла",
        "pageinfo-category-subcats": "Бухара категорийн дукхалла",
        "pageinfo-category-files": "Файлийн дукхалла",
-       "skinname-vector": "Векторни",
        "markaspatrolleddiff": "Билгалйе теллина санна",
        "markaspatrolledtext": "Билгала йе хӀара агӀо хьаьжна сана",
        "markedaspatrolled": "ДӀадахка теллина санна хилар",
        "show-big-image-preview": "Барам хьажале: $1.",
        "show-big-image-other": "{{PLURAL:$2|1=Кхин шоралла|Кхин шоралла}}: $1.",
        "show-big-image-size": "$1 × $2 пиксель",
+       "file-info-gif-looped": "чӀуг йиллина",
        "file-info-gif-frames": "$1 {{PLURAL:$1|фрейм|фреймаш}}",
+       "file-info-png-looped": "чӀуг йиллина",
        "file-info-png-repeat": "локху $1 {{PLURAL:$1|за}}",
        "file-info-png-frames": "$1 {{PLURAL:$1|кадр|кадраш}}",
        "newimages": "Керлачу файлийн галерей",
        "exif-compressedbitsperpixel": "Бесан кIоргалла дацдина чул тӀехьа",
        "exif-pixelydimension": "Суьртан шоралла",
        "exif-pixelxdimension": "Суьртан локхалла",
+       "exif-relatedsoundfile": "Къамелан аьзнийн файл",
        "exif-datetimeoriginal": "Дуьххьарлера терахь а хан",
        "exif-datetimedigitized": "Оцифровк йина терахь а хан а",
        "exif-subsectime": "Файлан хийцам баран хан секундашкахь",
+       "exif-subsectimeoriginal": "Оригинал хенан секундан дакъа",
+       "exif-subsectimedigitized": "Терахьийн хенан секундан дакъа",
        "exif-exposuretime": "Сурт доккхуш йолу серлон хьал",
        "exif-exposuretime-format": "$1 ($2) чура",
        "exif-fnumber": "Диафрагмин дукхалла",
        "exif-orientation-1": "Лартӏахь",
        "exif-xyresolution-i": "$1 тӏадамаш дюйман",
        "exif-xyresolution-c": "$1 тӀадамаш сантиметрна",
+       "exif-exposureprogram-1": "Куьйгаца",
        "exif-subjectdistance-value": "$1 {{PLURAL:$1|метр}}",
        "exif-meteringmode-0": "Хууш дац",
        "exif-meteringmode-1": "Юкъара",
        "exif-lightsource-9": "Хаза хенан хӀоттам",
        "exif-lightsource-10": "Мархаш йолу",
        "exif-lightsource-11": "ӀиндагӀ",
+       "exif-flash-mode-3": "авто хьал",
+       "exif-flash-function-1": "Серло яц",
        "exif-focalplaneresolutionunit-2": "дюйм",
+       "exif-sensingmethod-1": "Билгала ца йинарг",
        "exif-filesource-3": "Терахьийн суртдохку аппарат",
        "exif-scenetype-1": "Сурт даьккхина нис дуьххьал",
        "exif-customrendered-0": "ХӀума дийна дац",
        "table_pager_empty": "Цакарийна",
        "autosumm-blank": "Агӏон чулацам дӏабяккхина",
        "autosumm-replace": "АгӀона чуьраниг хийцина → «$1»",
-       "autoredircomment": "ДӀасахьажийна цуна [[$1]] тӏе",
+       "autoredircomment": "[[$1]] тӀе хьажийна",
        "autosumm-new": "Керла агlо: «$1»",
        "watchlistedit-normal-title": "Тергаме могӀанийн хийцамаш",
        "watchlistedit-normal-legend": "Тергаме могӀам юкъар дӀаяккхар",
        "watchlistedit-raw-submit": "МогӀам Ӏалашбар",
        "watchlistedit-raw-added": "{{PLURAL:$1|ТӀетоьхна}} $1 {{PLURAL:$1|дӀаяздар|дӀаяздарш}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|ДӀаяьккхина|ДӀаяьхна}} $1 {{PLURAL:$1|дӀаяздар|дӀаяздарш}}:",
+       "watchlistedit-clear-title": "Тергаман могӀам дӀацӀанбар",
+       "watchlistedit-clear-legend": "Тергаман могӀам дӀацӀанбан",
+       "watchlistedit-clear-explain": "Хьан тергаман могӀам чура массо дӀяздарш дӀадаьра ду",
        "watchlistedit-clear-titles": "Корта:",
+       "watchlistedit-clear-submit": "Тергаман могӀам дӀацӀанбан (иза сацадан лурдац)",
+       "watchlistedit-clear-done": "Хьан тергаман могӀам дӀацӀанбина",
        "watchlistedit-clear-removed": "{{PLURAL:$1|ДӀаяьккхина|ДӀаяьхна}} $1 {{PLURAL:$1|дӀаяздар|дӀаяздарш}}:",
+       "watchlistedit-too-many": "Кхуззахь гайта тӀехь дукха агӀонаш ю.",
+       "watchlisttools-clear": "Тергаман могӀам дӀацӀанбан",
        "watchlisttools-view": "МогӀам чура агӀонашан хийцамаш",
-       "watchlisttools-edit": "Хьажа/нисбé могlам",
+       "watchlisttools-edit": "Хьажа/нисбé могӀам",
        "watchlisttools-raw": "Йоза санна нисдé",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|дийцаре]])",
        "version": "Верси MediaWiki",
        "compare-invalid-title": "Ахьа язйина йолу цӀе ца магайо.",
        "compare-title-not-exists": "Иштта цӀе яц.",
        "compare-revision-not-exists": "Иштта версеш яц.",
-       "dberr-problems": "Бехк ма бил! Хlинц машан меттиган хилла гlирсаца халонаш.",
+       "dberr-problems": "Бехк ма бил! ХӀокху сайтехь техникан халонаш хила.",
        "dberr-again": "Хьажа карла йаккха агlо массех минот йаьлча.",
        "dberr-info": "(аьтто ца хили зӀе хӀотта серверца бухара хаамашца: $1)",
        "dberr-usegoogle": "ЦӀачун хьо хьажа лаха гӀоьнца Google.",
index 5e2b77e..35ea499 100644 (file)
        "qbmyoptions": "پەڕەکانم",
        "faq": "پرسیار و وەڵام (FAQ)",
        "faqpage": "Project:پرسیار و وەڵام",
-       "vector-action-addsection": "بابەت دابنێ",
-       "vector-action-delete": "بیسڕەوە",
-       "vector-action-move": "بیگوازەوە",
-       "vector-action-protect": "بیپارێزە",
-       "vector-action-undelete": "سڕینەوە بگەڕێنەوە",
-       "vector-action-unprotect": "پاراستن بگۆڕە",
-       "vector-view-create": "دروستکردن",
-       "vector-view-edit": "دەستکاریی بکە",
-       "vector-view-history": "مێژووەکەی ببینە",
-       "vector-view-view": "بیخوێنەوە",
-       "vector-view-viewsource": "سەرچاوەکەی ببینە",
        "actions": "کردەوەکان",
        "namespaces": "شوێنناوەکان",
        "variants": "شێوەزارەکان",
        "mergehistory-same-destination": "پەڕەی سەرچاوە و مەبەست نابێ یەک بن.",
        "mergehistory-reason": "هۆکار:",
        "mergelog": "لۆگی کردنەیەک",
-       "pagemerge-logentry": "[[$1]]ی لەگەڵ [[$2]] کردەیەک (پێداچوونەوەکان ھەتا $3)",
+       "pagemerge-logentry": "[[$1]]ی لەگەڵ [[$2]] کردە یەک (پێداچوونەوەکان ھەتا $3)",
        "revertmerge": "ھەڵوەشاندنەوەی کردنەیەک",
        "mergelogpagetext": "لە خوارەوە دوایین مێژووی‌لاپەڕە خستنە سەر لاپەڕەیەکی‌تر، دەبینی.",
        "history-title": "مێژووی پێداچوونەوەکانی «$1»",
        "editundo": "پووچەڵکردنەوە",
        "searchresults": "ئاکامەکانی گەڕان",
        "searchresults-title": "ئاکامەکانی گەڕان بۆ «$1»",
-       "toomanymatches": "هاوتای ئەوەی داوات کرد، زۆر هەیە. تکایە داوای‌تر تاقی بکەوە.",
        "titlematches": "سەردێڕی پەڕە پێی ئەخوا",
        "textmatches": "هاوتاکانی دەقی لاپەڕە",
        "notextmatches": "لە دەقی نووسراوەکان دا نەبینرا",
        "search-interwiki-default": "$1 ئەنجام:",
        "search-interwiki-more": "(زیاتر)",
        "search-relatedarticle": "پەیوەست",
-       "searcheverything-enable": "لە ھەموو بۆشاییی ناوەکاندا بگەڕێ",
        "searchrelated": "پەیوەست",
        "searchall": "ھەموو",
        "showingresults": "لە خوارەوە {{PLURAL:$1|'''یەک''' ئەنجام|'''$1''' ئەنجام}} نیشان دراوە، بە دەست پێ کردن لە ژمارەی '''$2'''ەوە.",
        "allowemail": "ڕێگە بدە بە بەکارھێنەرانی تر کە ئیمەیلم بۆ بنێرن",
        "prefs-searchoptions": "گەڕان",
        "prefs-namespaces": "بۆشایی ناوەکان",
-       "defaultns": "دەنا لەم بۆشاییی ناوانەدا بگەڕێ:",
        "default": "بنچینەیی",
        "prefs-files": "پەڕگەکان",
        "prefs-custom-css": "CSSی دڵخواز",
        "right-move": "گواستنەوەی پەڕەکان",
        "right-move-subpages": "گواستنەوەی پەڕەکان لەگەڵ ژێرپەڕەکانی",
        "right-move-rootuserpages": "گواستنەوەی پەڕە بنەڕەتییەکانی بەکارھێنەر",
+       "right-move-categorypages": "گواستنەوەی پەڕەکانی پۆل",
        "right-movefile": "گواستنەوەی پەڕگەکان",
        "right-suppressredirect": "دروست‌ نەکردنی ڕەوانەکەر لە پەڕەی سەرچاوەوە کاتی گواستنەوەی پەڕەکان",
        "right-upload": "بارکردنی پەڕگەکان",
        "recentchanges-label-unpatrolled": "ئەم دەستکارییە ھێشتا پاس نەدراوە",
        "recentchanges-label-plusminus": "قەبارەی پەڕە ئەوەندە بایت گۆڕاوە",
        "recentchanges-legend-heading": "'''کورتکراوەکان:'''",
-       "recentchanges-legend-newpage": "(ھەروەھا بڕوانە [[Special:NewPages|پێرستی پەڕە نوێکان]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ھەروەھا بڕوانە [[Special:NewPages|پێرستی پەڕە نوێکان]])",
        "recentchanges-legend-plusminus": "(''±۱٢٣'')",
        "rcnotefrom": "ژێرەوە گۆڕانکارییەکانە لە <strong>$2</strong>ەوە (ھەتا <strong>$1</strong> نیشان دراوە).",
        "rclistfrom": "گۆڕانکارییە نوێکان نیشان بدە بە دەستپێکردن لە $3 $2",
        "protect-expiry-indefinite": "بێسنوور",
        "protect-cascade": "پەڕەکانی نێو ئەم پەڕە بپارێزە (پاراستنی تاڤگەیی)",
        "protect-cantedit": "ناتوانی ئاستی پاراستنی ئەم پەڕە بگۆڕی، چونکوو تۆ ئیجازەی ئەم کارەت نیە.",
-       "protect-othertime": "کاتÛ\8c Ø¯Û\8cÚ©Û\95:",
-       "protect-othertime-op": "کاتÛ\8c Ø¯Û\8cÚ©Û\95",
+       "protect-othertime": "کاتÛ\8c ØªØ±:",
+       "protect-othertime-op": "کاتÛ\8c ØªØ±",
        "protect-existing-expiry": "ئەم کاتی بەسەرچوونی ماوە کە هەیە: $3، $2",
        "protect-otherreason": "ھۆکاری تر/زیاتر:",
        "protect-otherreason-op": "ھۆکاری تر",
        "pageinfo-category-pages": "ژمارەی پەڕەکان",
        "pageinfo-category-subcats": "ژمارەی ژێرپەڕەکان",
        "pageinfo-category-files": "ژمارەی پەڕگەکان",
-       "skinname-monobook": "مۆنۆ",
-       "skinname-vector": "ڤێکتۆر",
        "markaspatrolleddiff": "وەک پاس دراو نیشان بکە",
        "markaspatrolledtext": "ئەم پەڕەیە وەک پاس دراو نیشان بکە",
        "markedaspatrolled": "وەک پاس دراو نیشان کرا",
index c3c0736..96150d4 100644 (file)
        "qbedit": "Mudificà",
        "qbpageoptions": "Issa pagina",
        "qbmyoptions": "E mo pagine",
-       "vector-action-addsection": "Aghjunghje discussione",
-       "vector-action-delete": "Supprimà",
-       "vector-action-move": "Cullucà",
-       "vector-action-protect": "Pruteghje",
-       "vector-action-unprotect": "Cambià a prutezzione",
-       "vector-view-create": "Creà",
-       "vector-view-edit": "Mudificà",
-       "vector-view-history": "Vede a cronolugia",
-       "vector-view-view": "Leghje",
-       "vector-view-viewsource": "Vede a surghjente",
        "actions": "Azzione",
        "variants": "Variante",
        "errorpagetitle": "Errore",
        "categorypage": "Vede a pagina di categuria",
        "viewtalkpage": "Vede a discussione",
        "otherlanguages": "In altre lingue",
+       "redirectpagesub": "Pagina di reindirizzamentu",
        "lastmodifiedat": "Ultima mudifica di sta pagina u $1 à e $2.",
        "protectedpage": "Pagina prutetta",
        "jumpto": "Andà à:",
        "searchmenu-exists": "'''Esiste nantu à u situ una pagina intitulata \"[[:$1]]\"'''",
        "searchmenu-new": "Creà a pagina \"[[:$1]]\" annantu à 'ssu situ",
        "searchprofile-articles": "Pagine di cuntenuti",
-       "searchprofile-project": "Pagine di aiutu è relative à u prugettu",
        "searchprofile-everything": "Tuttu",
        "searchprofile-advanced": "Avanzatu",
        "searchprofile-articles-tooltip": "Circà in $1",
-       "searchprofile-project-tooltip": "Circà in $1",
        "searchprofile-everything-tooltip": "Circà dapertuttu (incluse e pagine di discussione)",
        "search-result-size": "$1 ({{PLURAL:$2|1 parolla|$2 parolle}})",
        "search-section": "(sezzione $1)",
        "recentchanges-label-bot": "Sta mudifica hè stata effettuata da un botu",
        "recentchanges-label-unpatrolled": "Sta mudifica ùn hè ancu stata verificata",
        "recentchanges-label-plusminus": "A dimensione di a pagina hè stata cambiata di 'ssu numaru d'ottetti",
-       "recentchanges-legend-newpage": "(vede ancu [[Special:NewPages|a lista di e pagine nove]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vede ancu [[Special:NewPages|a lista di e pagine nove]])",
        "rcnotefrom": "Quì seguitanu e mudifiche dapoi u '''$2''' ('''$1''' à u massimu).",
        "rclistfrom": "Mustrà e mudifiche dapoi u $3 $2",
        "rcshowhideminor": "$1 i cambiamenti minori",
        "filehist-dimensions": "Dimensione",
        "filehist-comment": "Cummentu",
        "imagelinks": "Usu di u schedariu",
+       "sharedupload": "'Ssu file pruvene da $1 è pò esse imprudatu da altri prugetti.",
        "filerevert-comment": "Mutivu:",
        "filedelete-comment": "Mutivu:",
        "filedelete-submit": "Supprimà",
index 5f27285..1aa90c0 100644 (file)
        "qbmyoptions": "Саифелерим",
        "faq": "Сыкъ берильген суаллер",
        "faqpage": "Project:Сыкъ берильген суаллер",
-       "vector-action-addsection": "Мевзу къош",
-       "vector-action-delete": "Ёкъ эт",
-       "vector-action-move": "Адыны денъиштир",
-       "vector-action-protect": "Къорчала",
-       "vector-action-undelete": "Янъыдан ярат",
-       "vector-action-unprotect": "Къорчалавны денъиштир",
-       "vector-view-create": "Ярат",
-       "vector-view-edit": "Денъиштир",
-       "vector-view-history": "Кечмишини косьтер",
-       "vector-view-view": "Окъу",
-       "vector-view-viewsource": "Менба кодуны косьтер",
        "actions": "Арекетлер",
        "namespaces": "Исим фезалары",
        "variants": "Вариантлар",
        "diff-multi-manyusers": "($2-ден зияде {{PLURAL:$2|1=къулланыджы|къулланыджы}}нынъ япкъан {{PLURAL:$1|1=бир ара версиясы|$1 ара версиясы}} косьтерильмей)",
        "searchresults": "Къыдырув нетиджелери",
        "searchresults-title": "«$1» ичюн къыдырув нетиджелери",
-       "toomanymatches": "Пек чокъ эшлешме чыкъты, лютфен, башкъа бир соратма сайланъыз.",
        "titlematches": "Макъале ады бир келе",
        "textmatches": "Саифе метни бир келе",
        "notextmatches": "Ич бир саифеде тапыламады",
        "search-interwiki-default": "$1 нетидже:",
        "search-interwiki-more": "(даа чокъ)",
        "search-relatedarticle": "Багълы",
-       "searcheverything-enable": "Бутюн исим фезаларында къыдыр",
        "searchrelated": "багълы",
        "searchall": "эписи",
        "showingresults": "Ашагъыда №&nbsp;<strong>$2</strong>ден башлап {{PLURAL:$1|1='''1''' нетидже|'''$1''' нетидже}} булуна.",
        "allowemail": "Дигер къулланыджылар манъа e-mail мектюплери ёллап олсун",
        "prefs-searchoptions": "Къыдырув сазламалары",
        "prefs-namespaces": "Исим фезалары",
-       "defaultns": "Акис алда бу исим фезаларында къыдыр:",
        "default": "оригинал",
        "prefs-files": "Файллар",
        "prefs-reset-intro": "Бу саифени сазламаларынъызны сайт ог бельгиленгенине къайтармакъ ичюн къуллана билесинъиз. Бу лягъу этилип оламаз.",
        "recentchanges-label-minor": "Бу, кичик бир денъиштирме",
        "recentchanges-label-bot": "Бу бир ботнынъ япкъан денъиштирмеси",
        "recentchanges-label-unpatrolled": "Бу денъиштирме аля даа тешкерильмеген",
-       "recentchanges-legend-newpage": "([[Special:NewPages|янъы саифелер джедвелине]] де бакъынъыз)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|янъы саифелер джедвелине]] де бакъынъыз)",
        "rcnotefrom": "'''$2''' тарихындан итибарен япылгъан денъиштирмелер ашагъыдадыр (энъ чокъ '''$1''' дане саифе косьтериле).",
        "rclistfrom": "$3 $2 тарихындан берли япылгъан денъиштирмелерни косьтер",
        "rcshowhideminor": "кичик денъиштирмелерни $1",
        "tooltip-upload": "Юкленип башла",
        "tooltip-rollback": "\"Кери къайтув\" сычаннен бир басув вастасынен бу саифени сонъки денъиштиргеннинъ денъишикликлерини кери ала",
        "tooltip-undo": "\"Кери ал\" бу денъишикликни кери ала ве денъишиклик пенджересини бакъып чыкъув режиминде ача. Кери алувнынъ себебини бильдирмеге изин бере.",
-       "monobook.css": "/* monobook темасынынъ аярларыны (настройкаларыны) денъиштирмек ичюн бу ерини денъиштиринъиз. Бутюн сайтта тесирли олур. */",
        "anonymous": "{{SITENAME}} сайтынынъ  {{PLURAL:$1|1=1|$1}} къайдсыз (аноним) къулланыджысы",
        "siteuser": "{{SITENAME}} сайтынынъ къулланыджысы $1",
        "anonuser": "{{SITENAME}} сайтынынъ къайдсыз (аноним) къулланыджысы $1",
        "spambot_username": "Спамдан темизлев",
        "spam_reverting": "$1 сайтына багълантысы олмагъан сонъки версиягъа кери кетирюв",
        "spam_blanking": "Бар олгъан версияларда $1 сайтына багълантылар бар, темизлев",
-       "skinname-monobook": "MonoBook",
        "patrol-log-page": "Тешкерюв журналы",
        "log-show-hide-patrol": "Тешкерюв журналыны $1",
        "deletedrevision": "$1 сайылы эски версия ёкъ этильди.",
index b27cb20..b43d98e 100644 (file)
        "qbmyoptions": "Saifelerim",
        "faq": "Sıq berilgen sualler",
        "faqpage": "Project:Sıq berilgen sualler",
-       "vector-action-addsection": "Mevzu qoş",
-       "vector-action-delete": "Yoq et",
-       "vector-action-move": "Adını deñiştir",
-       "vector-action-protect": "Qorçala",
-       "vector-action-undelete": "Yañıdan yarat",
-       "vector-action-unprotect": "Qorçalavnı deñiştir",
-       "vector-view-create": "Yarat",
-       "vector-view-edit": "Deñiştir",
-       "vector-view-history": "Keçmişini köster",
-       "vector-view-view": "Oqu",
-       "vector-view-viewsource": "Menba kodunı köster",
        "actions": "Areketler",
        "namespaces": "İsim fezaları",
        "variants": "Variantlar",
        "diff-multi-manyusers": "($2-den ziyade {{PLURAL:$2|qullanıcı|qullanıcı}}nıñ yapqan {{PLURAL:$1|bir ara versiyası|$1 ara versiyası}} kösterilmey)",
        "searchresults": "Qıdıruv neticeleri",
        "searchresults-title": "\"$1\" içün qıdıruv neticeleri",
-       "toomanymatches": "Pek çoq eşleşme çıqtı, lütfen, başqa bir soratma saylañız",
        "titlematches": "Saife adı bir kele",
        "textmatches": "Saife metni bir kele",
        "notextmatches": "İç bir saifede tapılamadı",
        "search-interwiki-default": "$1 netice:",
        "search-interwiki-more": "(daa çoq)",
        "search-relatedarticle": "Bağlı",
-       "searcheverything-enable": "Bütün isim fezalarında qıdır",
        "searchrelated": "bağlı",
        "searchall": "episi",
        "showingresults": "Aşağıda №&nbsp;<strong>$2</strong>den başlap {{PLURAL:$1|'''1''' netice|'''$1''' netice}} buluna.",
        "allowemail": "Diger qullanıcılar maña e-mail mektüpleri yollap olsun",
        "prefs-searchoptions": "Qıdıruv sazlamaları",
        "prefs-namespaces": "İsim fezaları",
-       "defaultns": "Akis alda bu isim fezalarında qıdır:",
        "default": "original",
        "prefs-files": "Fayllar",
        "prefs-reset-intro": "Bu saifeni sazlamalarıñıznı sayt ög belgilengenine qaytarmaq içün qullana bilesiñiz. Bu lâğu etilip olamaz.",
        "recentchanges-label-minor": "Bu, kiçik bir deñiştirme",
        "recentchanges-label-bot": "Bu bir botnıñ yapqan deñiştirmesi",
        "recentchanges-label-unpatrolled": "Bu deñiştirme alâ daa teşkerilmegen",
-       "recentchanges-legend-newpage": "([[Special:NewPages|yañı saifeler cedveline]] de baqıñız)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|yañı saifeler cedveline]] de baqıñız)",
        "rcnotefrom": "'''$2''' tarihından itibaren yapılğan deñiştirmeler aşağıdadır (eñ çоq '''$1''' dane saife kösterile).",
        "rclistfrom": "$3 $2 tarihından berli yapılğan deñiştirmelerni köster",
        "rcshowhideminor": "kiçik deñiştirmelerni $1",
        "tooltip-upload": "Yüklenip başla",
        "tooltip-rollback": "\"Keri qaytuv\" sıçannen bir basuv vastasınen bu saifeni soñki deñiştirgenniñ deñişikliklerini keri ala",
        "tooltip-undo": "\"Keri al\" bu deñişiklikni keri ala ve deñişiklik penceresini baqıp çıquv rejiminde aça. Keri aluvnıñ sebebini bildirmege izin bere.",
-       "monobook.css": "/* monobook temasınıñ ayarlarını (nastroykalarını) deñiştirmek içün bu yerini deñiştiriñiz. Bütün saytta tesirli olur. */",
        "anonymous": "{{SITENAME}} saytınıñ {{PLURAL:$1|1|$1}} qaydsız (anonim) qullanıcıları",
        "siteuser": "{{SITENAME}} saytınıñ qullanıcısı $1",
        "anonuser": "{{SITENAME}} saytınıñ qaydsız (anonim) qullanıcısı $1",
        "spambot_username": "Spamdan temizlev",
        "spam_reverting": "$1 saytına bağlantısı olmağan soñki versiyağa keri ketirüv",
        "spam_blanking": "Bar olğan versiyalarda $1 saytına bağlantılar bar, temizlev",
-       "skinname-monobook": "MonoBook",
        "patrol-log-page": "Teşkerüv jurnalı",
        "log-show-hide-patrol": "Teşkerüv jurnalını $1",
        "deletedrevision": "$1 sayılı eski versiya yoq etildi.",
index cb3d5a9..77c706e 100644 (file)
        "qbmyoptions": "Moje stránky",
        "faq": "Často kladené otázky",
        "faqpage": "Project:Často kladené otázky",
-       "vector-action-addsection": "Přidat téma",
-       "vector-action-delete": "Smazat",
-       "vector-action-move": "Přesunout",
-       "vector-action-protect": "Zamknout",
-       "vector-action-undelete": "Obnovit",
-       "vector-action-unprotect": "Změnit zámek",
-       "vector-view-create": "Založit",
-       "vector-view-edit": "Editovat",
-       "vector-view-history": "Zobrazit historii",
-       "vector-view-view": "Číst",
-       "vector-view-viewsource": "Zobrazit zdrojový kód",
        "actions": "Akce",
        "namespaces": "Jmenné prostory",
        "variants": "Varianty",
        "currentrev": "Aktuální verze",
        "currentrev-asof": "Aktuální verze z $1",
        "revisionasof": "Verze z $1",
-       "revision-info": "Verze z $1; $2",
+       "revision-info": "Verze z $1, kterou {{GENDER:$6|vytvořil|vytvořila}} $2$7",
        "previousrevision": "← Starší verze",
        "nextrevision": "Novější verze →",
        "currentrevisionlink": "zobrazit aktuální verzi",
        "mergehistory-empty": "Nelze sloučit žádnou verzi.",
        "mergehistory-success": "$3 {{PLURAL:$3|verze|verze|verzí}} stránky [[:$1]] {{PLURAL:$3|byla úspěšně sloučena|byly úspěšně sloučeny|bylo úspěšně sloučeno}} do stránky [[:$2]].",
        "mergehistory-fail": "Sloučení historií nelze provést. Překontrolujte zadané stránky a jejich historii.",
+       "mergehistory-fail-toobig": "Nelze provést sloučení historie, protože by se přesouvalo více revizí, než je limit $1.",
        "mergehistory-no-source": "Zdrojová stránka $1 neexistuje.",
        "mergehistory-no-destination": "Cílová stránka $1 neexistuje.",
        "mergehistory-invalid-source": "Zdrojová stránka musí mít platný název.",
        "difference-missing-revision": "{{PLURAL:$2|Jedna z revizí|$2 revize|$2 revizí}} k požadovanému porovnání ($1) {{PLURAL:$2|neexistuje|neexistují|neexistuje}}.\n\nToto je obvykle způsobeno tím, že jste následovali zastaralý odkaz na historickou verzi stránky, jež byla smazána.\nPodrobnosti mohou být uvedeny v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} knize smazaných stránek].",
        "searchresults": "Výsledky hledání",
        "searchresults-title": "Výsledky hledání „$1“",
-       "toomanymatches": "Požadavku odpovídá příliš mnoho záznamů, zkuste jiný dotaz.",
        "titlematches": "Stránky s odpovídajícím názvem",
        "textmatches": "Stránky s odpovídajícím textem",
        "notextmatches": "Žádné stránky textem neodpovídají.",
        "search-interwiki-default": "Výsledky z $1:",
        "search-interwiki-more": "(více)",
        "search-relatedarticle": "Související",
-       "searcheverything-enable": "Hledat ve všech jmenných prostorech",
        "searchrelated": "související",
        "searchall": "vše",
        "showingresults": "Níže zobrazuji nejvýše <strong>$1</strong> {{PLURAL:$1|výsledek|výsledky|výsledků}} počínaje od <strong>$2</strong>.",
        "powersearch-togglelabel": "Zaškrtnout:",
        "powersearch-toggleall": "Všechno",
        "powersearch-togglenone": "Nic",
+       "powersearch-remember": "Zapamatovat si výběr pro budoucí vyhledávání",
        "search-external": "Externí hledání",
        "searchdisabled": "<p>Omlouváme se. Plnotextové vyhledávání je dočasně nedostupné. Zatím můžete zkusit vyhledávání Googlem; je ale možné, že jeho výsledky nemusí být aktuální.</p>",
        "search-error": "Při hledání došlo k chybě: $1",
        "allowemail": "Povolit e-mail od ostatních uživatelů",
        "prefs-searchoptions": "Vyhledávání",
        "prefs-namespaces": "Jmenné prostory",
-       "defaultns": "Nebo hledat v těchto jmenných prostorech:",
        "default": "implicitní",
        "prefs-files": "Soubory",
        "prefs-custom-css": "Vlastní CSS",
        "recentchanges-label-unpatrolled": "Tato změna dosud nebyla prověřena",
        "recentchanges-label-plusminus": "Velikost stránky se změnila o tolik bajtů",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "(vizte též [[Special:NewPages|seznam nových stránek]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vizte též [[Special:NewPages|seznam nových stránek]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Níže jsou změny od <strong>$2</strong> ({{PLURAL:$1|zobrazena|zobrazeny|zobrazeno}} nejvýše <strong>$1</strong>).",
        "rclistfrom": "Ukázat nové změny, počínaje od $2, $3",
        "windows-nonascii-filename": "Tato wiki nepodporuje názvy souborů obsahující zvláštní znaky.",
        "fileexists": "Soubor s tímto jménem již existuje, prosím podívejte se na <strong>[[:$1]]</strong>, pokud nevíte jistě, zda chcete tento soubor nahradit.\n[[$1|thumb]]",
        "filepageexists": "Popisná stránka pro soubor s tímto jménem již byla na <strong>[[:$1]]</strong> založena, avšak odpovídající soubor dosud neexistuje.\nShrnutí, které zde uvedete, se na popisné stránce nezobrazí.\nPokud tam chcete své shrnutí zobrazit, budete muset příslušnou stránku editovat ručně. [[$1|thumb]]",
-       "fileexists-extension": "Již existuje soubor s podobným jménem: [[$2|thumb]]\n* Jméno načítaného souboru: <strong>[[:$1]]</strong>\n* Jméno existujícího souboru: <strong>[[:$2]]</strong>\nVyberte jiné jméno.",
+       "fileexists-extension": "Již existuje soubor s podobným jménem: [[$2|thumb]]\n* Jméno načítaného souboru: <strong>[[:$1]]</strong>\n* Jméno existujícího souboru: <strong>[[:$2]]</strong>\nNechcete raději použít odlišnější jméno?",
        "fileexists-thumbnail-yes": "Tento soubor je zřejmě obrázek ve zmenšené velikosti ''(náhled)''. [[$1|thumb]]\nZkontrolujte soubor <strong>[[:$1]]</strong>.\nPokud je zmiňovaný soubor větší, ale jinak stejný, není potřeba zvlášť načítat jeho zmenšenou verzi.",
        "file-thumbnail-no": "Jméno souboru začíná na <strong>$1</strong>.\nMožná to je obrázek ve zmenšené velikosti ''(náhled)''.\nNačtěte soubor v plném rozlišením, pokud je k dispozici, nebo změňte jméno souboru.",
        "fileexists-forbidden": "Soubor s tímto názvem již existuje a není dovoleno ho přepsat.\nPokud chcete přesto soubor načíst, vraťte se a zvolte jiný název.\n[[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Mazání a obnovování souborů je kvůli údržbě dočasně vypnuto.",
        "filedelete-maintenance-title": "Soubor nelze smazat",
        "mimesearch": "Hledání podle MIME typu",
-       "mimesearch-summary": "Tato stránka umožňuje filtrovat soubory podle MIME typu.<br />\nVstup: <code>typ obsahu/podtyp</code>, např. <code>image/jpeg</code>.",
+       "mimesearch-summary": "Tato stránka umožňuje filtrovat soubory podle MIME typu.<br />\nVstup: <code>typ obsahu/podtyp</code> nebo <code>typ obsahu/*</code>, např. <code>image/jpeg</code>.",
        "mimetype": "MIME typ:",
        "download": "stažení",
        "unwatchedpages": "Nesledované stránky",
        "wantedtemplates": "Chybějící šablony",
        "mostlinked": "Nejodkazovanější stránky",
        "mostlinkedcategories": "Nejpoužívanější kategorie",
-       "mostlinkedtemplates": "Nejvkládanější šablony",
+       "mostlinkedtemplates": "Nejvkládanější stránky",
        "mostcategories": "Stránky s nejvyšším počtem kategorií",
        "mostimages": "Nejpoužívanější soubory",
        "mostinterwikis": "Stránky s nejvyšším počtem mezijazykových odkazů",
        "tooltip-summary": "Zadejte stručné shrnutí",
        "interlanguage-link-title": "$1 – $2",
        "common.css": "/* Zde uvedené CSS bude ovlivňovat všechny styly */",
-       "monobook.css": "/* Zde uvedené CSS bude ovlivňovat pouze styl „Monobook“ */",
-       "vector.css": "/* Zde uvedené CSS bude ovlivňovat pouze styl „Vektor“ */",
        "print.css": "/* Zde uvedené CSS bude ovlivňovat tiskový výstup */",
        "noscript.css": "/* Zde uvedené CSS bude ovlivňovat uživatele s vypnutým JavaScriptem */",
        "group-autoconfirmed.css": "/* Zde uvedené CSS bude ovlivňovat pouze automaticky schválené uživatele */",
        "group-sysop.css": "/* Zde uvedené CSS bude ovlivňovat pouze správce */",
        "group-bureaucrat.css": "/* Zde uvedené CSS bude ovlivňovat pouze byrokraty */",
        "common.js": "/* Zde uvedený JavaScript bude použit pro všechny uživatele při načtení každé stránky. */",
-       "monobook.js": "/* JavaScript pro uživatele používající vzhled MonoBook */",
-       "vector.js": "/* JavaScript pro uživatele používající vzhled „Vektor“ */",
        "group-autoconfirmed.js": "/* Zde uvedený JavaScript bude použit pouze pro automaticky schválené uživatele */",
        "group-user.js": "/* Zde uvedený JavaScript bude použit pouze pro registrované uživatele */",
        "group-bot.js": "/* Zde uvedený JavaScript bude použit pouze pro boty */",
        "pageinfo-category-pages": "Počet stránek",
        "pageinfo-category-subcats": "Počet podkategorií",
        "pageinfo-category-files": "Počet souborů",
-       "skinname-vector": "Vektor",
        "markaspatrolleddiff": "Označit jako prověřené",
        "markaspatrolledtext": "Označit tuto stránku jako prověřenou",
        "markedaspatrolled": "Označeno jako prověřené",
        "version-hook-name": "Název přípojného bodu",
        "version-hook-subscribedby": "Volán z",
        "version-version": "($1)",
+       "version-no-ext-name": "[bez názvu]",
        "version-license": "Licence MediaWiki",
        "version-ext-license": "Licence",
        "version-ext-colheader-name": "Rozšíření",
index 7ee948e..1e14892 100644 (file)
        "vector-view-view": "чьтѥниѥ",
        "vector-view-viewsource": "страницѧ источьнъ обраꙁъ",
        "actions": "дѣиства",
+       "vector-more-actions": "вѧщє",
        "namespaces": "имєнъ просторꙑ",
        "errorpagetitle": "блаꙁна",
        "tagline": "{{grammar:genitive|{{SITENAME}}}} страница",
        "accountcreated": "мѣсто сътворєно ѥстъ",
        "accountcreatedtext": "польꙃєватєльско мѣсто [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|бєсѣда]]) сътворєно бѣ",
        "loginlanguagelabel": "ѩꙁꙑкъ : $1",
+       "pt-userlogout": "ис̾ходъ",
        "changepassword": "таина словєсє иꙁмѣнѥниѥ",
        "resetpass_header": "таина слова иꙁмѣнѥниѥ",
        "oldpassword": "старо таино слово :",
        "template-protected": "(ꙁабранєно ѥстъ)",
        "template-semiprotected": "(чѧстьно ꙁабранѥно)",
        "hiddencategories": "сꙗ страница въ {{PLURAL:$1|1 съкрꙑтѣи катигорїи|$1 съкрꙑтѣхъ катигорїѩ}} сѧ авлꙗѥтъ :",
-       "postedit-confirmation": "твоꙗ мѣна съхранѥна ѥстъ",
+       "postedit-confirmation-saved": "твоꙗ мѣна съхранѥна ѥстъ",
        "viewpagelogs": "си страницѧ їсторїѩ",
        "cur": "нꙑ҃н",
        "last": "пс҃лд",
        "searchmenu-exists": "'''страница имєньмь ⁖ [[:$1]] ⁖ ѥстъ створѥна ю'''",
        "searchmenu-new": "<strong>страницѫ \"⁖ [[:$1]] ⁖\" сътворити можєши</strong> {{PLURAL:$2|0=|ꙁъри такождє страница ижє по искании авлєна ѥстъ|ꙁьри такождє исканиꙗ слѣдьствиꙗ}}",
        "searchprofile-articles": "члѣни",
-       "searchprofile-project": "опꙑтьствовании и помощи страницѧ",
        "searchprofile-images": "дѣла",
        "searchprofile-everything": "вьсѩ страницѧ",
        "searchprofile-articles-tooltip": "ищи въ $1",
-       "searchprofile-project-tooltip": "исканиѥ въ $1",
        "searchprofile-images-tooltip": "исканиѥ дѣлъ",
        "searchprofile-everything-tooltip": "ищи вьсѩ страницѧ въкоупомь съ бѣсєдꙑ",
        "search-result-size": "$1 ({{PLURAL:$2|$2 слово|$2 слова|$2 словєсъ}})",
        "search-interwiki-more": "(вѧщє)",
        "searchall": "вьсꙗ",
        "search-nonefound": "исканиѥ сꙗ слова ничєсо жє нє авило ѥстъ",
-       "powersearch-redir": "прѣнаправлѥниꙗ",
        "preferences": "строи",
        "mypreferences": "строи",
        "prefs-edits": "мѣнъ число :",
        "prefs-namespaces": "имєнъ просторꙑ",
        "prefs-files": "дѣла",
        "username": "{{GENDER:$1|польꙃєватєлꙗ имѧ}} :",
-       "uid": "{{GENDER:$1|польꙃєватєлꙗ}} число :",
        "prefs-memberingroups": "{{GENDER:$2|польꙃєватєлꙗ}} {{PLURAL:$1|чинъ|чина|чинꙑ}} :",
        "yourrealname": "истиньно имѧ :",
        "yourlanguage": "ѩꙁꙑкъ :",
        "log": "їсторїѩ",
        "all-logs-page": "вьсѩ обьщѧ їсторїѩ",
        "allpages": "вьсѩ страницѧ",
-       "alphaindexline": "отъ $1 до $2",
        "allpagesfrom": "страницѧ видѣти хощѫ съ начѧльнами боукъвами :",
        "allarticles": "вьсѩ страницѧ",
        "allpagessubmit": "прѣиди",
        "block": "ꙁагради польꙃєватєл҄ь",
        "blockip": "ꙁагради польꙃєватєл҄ь",
        "blockip-legend": "ꙁагради польꙃєватєл҄ь",
-       "ipadressorusername": "IP число или польꙃєватєлꙗ имѧ :",
+       "ipaddressorusername": "IP число или польꙃєватєлꙗ имѧ :",
        "ipbreason": "какъ съмꙑслъ :",
        "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",
        "svg-long-desc": "дѣло SVG · обꙑчьнъ обраꙁъ : $1 × $2 п҃ѯ · дѣла мѣра : $3",
        "show-big-image": "источьнъ дѣла обраꙁъ",
        "show-big-image-size": "$1 × $2 пиѯєлъ",
-       "showhidebots": "($1 аѵтоматъ)",
        "ilsubmit": "ищи",
        "monday-at": "понєдѣл҄ьникъ · $1",
        "tuesday-at": "въторьникъ · $1",
        "specialpages": "нарочьнꙑ страницѧ",
        "tag-filter": "[[Special:Tags|мѣтъць]] сито :",
        "tags-edit": "исправи",
-       "dberr-header": "Вики тєхнїчьнꙑ отѧжєниꙗ имѣтъ",
        "htmlform-no": "нѣтъ",
        "htmlform-yes": "да",
        "logentry-delete-delete": "$1 {{GENDER:$2|поничьжилъ|поничьжила}} страницѫ ⁖ $3 ⁖",
index 9094b9c..0767119 100644 (file)
        "qbmyoptions": "Fy nhudalennau",
        "faq": "Cwestiynau cyffredin",
        "faqpage": "Project:Cwestiynau cyffredin",
-       "vector-action-addsection": "Ychwanegu adran",
-       "vector-action-delete": "Dileu",
-       "vector-action-move": "Symud",
-       "vector-action-protect": "Diogelu",
-       "vector-action-undelete": "Adfer",
-       "vector-action-unprotect": "Newid y diogelwch",
-       "vector-view-create": "Dechrau",
-       "vector-view-edit": "Golygu",
-       "vector-view-history": "Gweld yr hanes",
-       "vector-view-view": "Darllen",
-       "vector-view-viewsource": "Dangos côd y dudalen",
        "actions": "Gweithrediadau",
        "namespaces": "Parthau",
        "variants": "Amrywiolion",
        "editthispage": "Golygwch y dudalen hon",
        "create-this-page": "Creu'r dudalen",
        "delete": "Dileu",
-       "deletethispage": "Dileer y dudalen hon",
+       "deletethispage": "Dilëir y dudalen hon",
        "undeletethispage": "Adfer y dudalen hon",
        "undelete_short": "Adfer $1 {{PLURAL:$1|golygiad|golygiad|olygiad|golygiad}}",
        "viewdeleted_short": "Edrych ar y {{PLURAL:$1|golygiad sydd wedi'i ddileu|golygiad sydd wedi'i ddileu|$1 olygiad sydd wedi'u dileu|$1 golygiad sydd wedi'u dileu|$1 golygiad sydd wedi'u dileu|$1 golygiad sydd wedi'u dileu}}",
        "difference-missing-revision": "Ni chafwyd hyd i $1 {{PLURAL:$2|diwygiad|diwygiad|ddiwygiad|diwygiad}} o'r gwahaniaeth ($1) {{PLURAL:$2|hwn}}.\n\nFel arfer, fe ddigwydd hyn pan mae person wedi dilyn hen gyswllt gwahaniaeth i dudalen sydd erbyn hyn wedi cael ei ddileu.\nMae manylion pellach i'w cael yn [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} lòg y dileuon].",
        "searchresults": "Canlyniadau'r chwiliad",
        "searchresults-title": "Canlyniadau chwilio am \"$1\"",
-       "toomanymatches": "Cafwyd hyd i ormod o enghreifftiau o'r term chwilio; ceisiwch chwilio am derm arall",
        "titlematches": "Teitlau erthygl yn cyfateb",
        "textmatches": "Testun erthygl yn cyfateb",
        "notextmatches": "Does dim testun yn cyfateb",
        "searchmenu-exists": "'''Mae tudalen o'r enw \"[[$1]]\" ar y wici hwn'''",
        "searchmenu-new": "'''Creu'r dudalen \"[[:$1]]\" ar y wici hwn!''' {{PLURAL:$2||Gweler hefyd y dudalen a ganfyddwyd wrth chwilio.|Gweler hefyd y canlyniadau chwilio.}}",
        "searchprofile-articles": "Tudalennau pwnc (erthyglau/ffeiliau)",
-       "searchprofile-project": "Tudalennau Cymorth a Phrosiect",
        "searchprofile-images": "Ffeiliau amlgyfrwng",
        "searchprofile-everything": "Popeth",
        "searchprofile-advanced": "Uwch",
        "searchprofile-articles-tooltip": "Chwilio drwy $1",
-       "searchprofile-project-tooltip": "Chwilio drwy $1",
        "searchprofile-images-tooltip": "Chwilio am ffeiliau",
        "searchprofile-everything-tooltip": "Chwilio'r cynnwys cyfan (gan gynnwys tudalennau sgwrs)",
        "searchprofile-advanced-tooltip": "Chwilio drwy parthau dewisol",
        "search-interwiki-default": "Y canlyniadau o $1:",
        "search-interwiki-more": "(rhagor)",
        "search-relatedarticle": "Erthyglau eraill tebyg",
-       "searcheverything-enable": "Chwilio pob parth",
        "searchrelated": "erthyglau eraill tebyg",
        "searchall": "oll",
        "showingresults": "Yn dangos $1 {{PLURAL:$1|canlyniad|canlyniad|ganlyniad|chanlyniad|chanlyniad|canlyniad}} isod gan ddechrau gyda rhif '''$2'''.",
        "allowemail": "Galluogi e-bost oddi wrth ddefnyddwyr eraill",
        "prefs-searchoptions": "Chwilio",
        "prefs-namespaces": "Parthau",
-       "defaultns": "Neu chwilio'r parthau isod:",
        "default": "rhagosodyn",
        "prefs-files": "Ffeiliau",
        "prefs-custom-css": "CSS o hunan-ddewis",
        "recentchanges-label-unpatrolled": "Nid yw'r golygiad hwn wedi derbyn ymweliad patrôl eto",
        "recentchanges-label-plusminus": "Newidiodd maint y dudalen o'r nifer hwn o feitiau",
        "recentchanges-legend-heading": "'''Allwedd:'''",
-       "recentchanges-legend-newpage": "(gweler hefyd [[Special:NewPages|restr y tudalennau newydd]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (gweler hefyd [[Special:NewPages|restr y tudalennau newydd]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Isod rhestrir pob newid er <strong>'''$2'''</strong> (ymddengys hyd at <strong>'''$1'''</strong> ohonynt).",
        "rclistfrom": "Dangos newidiadau newydd, gan ddechrau ers $3 $2",
        "enotif_body": "Annwyl $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nCrynodeb y golygydd: $PAGESUMMARY $PAGEMINOREDIT\n\nCysylltu â'r golygydd:\ne-bost: $PAGEEDITOR_EMAIL\nwici: $PAGEEDITOR_WIKI\n\nOs bydd mwy o drin a thrafod ar y dudalen cyn i chi ymweld â hi tra eich bod wedi mewngofnodi, ni chewch ragor o negeseuon hysbysu. Nodwn bod modd i chi ailosod y fflagiau hysbysu ar eich rhestr wylio, ar gyfer y tudalennau rydych yn eu gwylio.\n\n             Sustem hysbysu {{SITENAME}}\n\n--\nI newid eich gosodiadau negeseuon hysbysu, ewch i \n{{canonicalurl:{{#special:Preferences}}}}\n\nI newid eich gosodiadau gwylio, ewch i\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nI dynnu'r dudalen oddi ar eich rhestr wylio, ewch i\n$UNWATCHURL\n\nAm fwy o gymorth ac adborth:\n$HELPPAGE",
        "created": "crëwyd",
        "changed": "Newidiwyd",
-       "deletepage": "Dileer y dudalen",
+       "deletepage": "Dilëir y dudalen",
        "confirm": "Cadarnhau",
        "excontent": "y cynnwys oedd: '$1'",
        "excontentauthor": "y cynnwys oedd: '$1' (a'r unig gyfrannwr oedd '[[Special:Contributions/$2|$2]]')",
        "pageinfo-category-pages": "Nifer y tudalennau",
        "pageinfo-category-subcats": "Nifer yr is-gategorïau",
        "pageinfo-category-files": "Nifer y ffeiliau",
-       "skinname-cologneblue": "Glas Cwlen",
        "markaspatrolleddiff": "Marcio ei bod wedi derbyn ymweliad patrôl",
        "markaspatrolledtext": "Marcio bod y dudalen wedi derbyn ymweliad patrôl",
        "markedaspatrolled": "Gosodwyd marc ei bod wedi derbyn ymweliad patrôl",
index f4749fb..0b54dc1 100644 (file)
        "qbmyoptions": "Mine indstillinger",
        "faq": "OSS",
        "faqpage": "Project:OSS",
-       "vector-action-addsection": "Nyt emne",
-       "vector-action-delete": "Slet",
-       "vector-action-move": "Flyt",
-       "vector-action-protect": "Beskyt",
-       "vector-action-undelete": "Gendan",
-       "vector-action-unprotect": "Ændr beskyttelse",
-       "vector-view-create": "Opret",
-       "vector-view-edit": "Redigér",
-       "vector-view-history": "Se historik",
-       "vector-view-view": "Læs",
-       "vector-view-viewsource": "Se kilden",
        "actions": "Handlinger",
        "namespaces": "Navnerum",
        "variants": "Varianter",
        "difference-missing-revision": "{{PLURAL:$2|En revision|$2 revisioner}} af denne forskel ($1) {{PLURAL:$2|blev|blev}} ikke fundet.\n\nDette skyldes normalt et forældet diff link til en side der er slettet.\nDetaljer kan findes i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sletningsloggen].",
        "searchresults": "Søgeresultater",
        "searchresults-title": "Søgeresultater for \"$1\"",
-       "toomanymatches": "Søgningen fandt for mange sider. Prøv venligst med en anden søgning.",
        "titlematches": "Artikeltitler der opfyldte forespørgslen",
        "textmatches": "Artikeltekster der opfyldte forespørgslen",
        "notextmatches": "Ingen artikeltekster opfyldte forespørgslen",
        "searchmenu-exists": "'''Der er en side med navnet \"[[:$1]]\" på denne wiki'''",
        "searchmenu-new": "<strong>Opret siden \"[[:$1]]\" på denne wiki!</strong> {{PLURAL:$2|0=|Se også siden der blev fundet for din søgning.|Se også de søgeresultater der blev fundet.}}",
        "searchprofile-articles": "Indholdssider",
-       "searchprofile-project": "Hjælpe- og projektsider",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Alt",
        "searchprofile-advanced": "Avanceret",
        "searchprofile-articles-tooltip": "Søg i $1",
-       "searchprofile-project-tooltip": "Søg i $1",
        "searchprofile-images-tooltip": "Søg efter filer",
        "searchprofile-everything-tooltip": "Søg i alt indhold (inklusive diskussionssider)",
        "searchprofile-advanced-tooltip": "Søg i bestemte navnerum",
        "search-interwiki-default": "Resultater fra $1:",
        "search-interwiki-more": "(mere)",
        "search-relatedarticle": "Relateret",
-       "searcheverything-enable": "Søg i alle navnerum",
        "searchrelated": "relateret",
        "searchall": "alle",
        "showingresults": "Nedenfor vises <b>$1</b> {{PLURAL:$1|resultat|resultater}} startende med nummer <b>$2</b>.",
        "allowemail": "Tillad e-mail fra andre brugere",
        "prefs-searchoptions": "Søg",
        "prefs-namespaces": "Navnerum",
-       "defaultns": "Ellers søg i disse navnerum:",
        "default": "standard",
        "prefs-files": "Filer",
        "prefs-custom-css": "Personlig CSS",
        "prefs-emailconfirm-label": "Bekræftelse af e-mail:",
        "youremail": "Din e-mailadresse:",
        "username": "{{GENDER:$1|Brugernavn}}:",
-       "uid": "{{GENDER:$1|Brugernummer}}:",
        "prefs-memberingroups": "{{GENDER:$2|Medlem}} af {{PLURAL:$1|gruppen|grupperne}}:",
        "prefs-registration": "Registreringstidspunkt:",
        "yourrealname": "Dit rigtige navn:",
        "recentchanges-label-unpatrolled": "Denne redigering er endnu ikke blevet patruljeret",
        "recentchanges-label-plusminus": "Størrelsen på siden blev ændret med dette antal bytes",
        "recentchanges-legend-heading": "'''Forklaring:'''",
-       "recentchanges-legend-newpage": "(se også [[Special:NewPages|listen over nye sider]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (se også [[Special:NewPages|listen over nye sider]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Nedenfor er op til '''$1''' ændringer siden '''$2''' vist.",
        "rclistfrom": "Vis nye ændringer startende fra $3 $2",
        "log-title-wildcard": "Søg i titler som begynder med teksten",
        "showhideselectedlogentries": "Vis/skjul de markerede loghændelser",
        "allpages": "Alle sider",
-       "alphaindexline": "$1 til $2",
        "nextpage": "Næste side ($1)",
        "prevpage": "Forrige side ($1)",
        "allpagesfrom": "Vis sider fra og med:",
        "tooltip-preferences-save": "Gem indstillinger",
        "tooltip-summary": "Indtast en kort opsummering",
        "common.css": "/** CSS inkluderet her vil være aktivt for alle brugere. */",
-       "monobook.css": "/** CSS inkluderet her vil være aktivt for brugere af Monobook-temaet . */",
        "common.js": "/* Javascript inkluderet her vil være aktivt for alle brugere. */",
-       "monobook.js": "/* JavaScript i denne fil vil indlæses for brugere af udseendet MonoBook */",
        "anonymous": "{{PLURAL:$1|Anonym bruger|Anonyme brugere}} på {{SITENAME}}",
        "siteuser": "{{SITENAME}} bruger $1",
        "anonuser": "{{SITENAME}} anonym bruger $1",
        "pageinfo-category-pages": "Antal sider",
        "pageinfo-category-subcats": "Antal underkategorier",
        "pageinfo-category-files": "Antal filer",
-       "skinname-cologneblue": "Kølnerblå",
-       "skinname-monobook": "MonoBook",
-       "skinname-modern": "Moderne",
        "markaspatrolleddiff": "Markér som patruljeret",
        "markaspatrolledtext": "Markér denne side som patruljeret",
        "markedaspatrolled": "Markeret som patruljeret",
index 7a6b218..b5c23a7 100644 (file)
        "qbmyoptions": "Meine Seiten",
        "faq": "Häufig gestellte Fragen",
        "faqpage": "Project:FAQ",
-       "vector-action-addsection": "Abschnitt hinzufügen",
-       "vector-action-delete": "Löschen",
-       "vector-action-move": "Verschieben",
-       "vector-action-protect": "Schützen",
-       "vector-action-undelete": "Wiederherstellen",
-       "vector-action-unprotect": "Seitenschutz ändern",
-       "vector-view-create": "Erstellen",
-       "vector-view-edit": "Bearbeiten",
-       "vector-view-history": "Versionsgeschichte",
-       "vector-view-view": "Lesen",
-       "vector-view-viewsource": "Quelltext anzeigen",
        "actions": "Aktionen",
        "namespaces": "Namensräume",
        "variants": "Varianten",
        "currentrev": "Aktuelle Version",
        "currentrev-asof": "Aktuelle Version vom $2, $3 Uhr",
        "revisionasof": "Version vom $2, $3 Uhr",
-       "revision-info": "Version vom $4, $5 Uhr von $2",
+       "revision-info": "Version vom $4, $5 Uhr von {{GENDER:$6|$2}}$7",
        "previousrevision": "← Nächstältere Version",
        "nextrevision": "Nächstjüngere Version →",
        "currentrevisionlink": "Aktuelle Version",
        "mergehistory-empty": "Es können keine Versionen vereinigt werden.",
        "mergehistory-success": "{{PLURAL:$3|1 Version|$3 Versionen}} von „[[:$1]]“ erfolgreich nach „[[:$2]]“ vereinigt.",
        "mergehistory-fail": "Versionsvereinigung nicht möglich, bitte prüfe die Seite und die Zeitangaben.",
+       "mergehistory-fail-toobig": "Die Versionsgeschichtenzusammenführung konnte nicht ausgeführt werden, da sonst mehr als {{PLURAL:$1|eine Version|$1 Versionen}} verschoben werden {{PLURAL:$1|würde|würden}}.",
        "mergehistory-no-source": "Ursprungsseite „$1“ ist nicht vorhanden.",
        "mergehistory-no-destination": "Zielseite „$1“ ist nicht vorhanden.",
        "mergehistory-invalid-source": "Ursprungsseite muss ein gültiger Seitenname sein.",
        "difference-missing-revision": "{{PLURAL:$2|Eine Version|$2 Versionen}} dieser Unterschiedsanzeige ($1) {{PLURAL:$2|wurde|wurden}} nicht gefunden.\n\nDieser Fehler wird normalerweise von einem veralteten Link zur Versionsgeschichte einer Seite verursacht, die zwischenzeitlich gelöscht wurde.\nEinzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lösch-Logbuch] vorhanden.",
        "searchresults": "Suchergebnisse",
        "searchresults-title": "Suchergebnisse für „$1“",
-       "toomanymatches": "Die Anzahl der Suchergebnisse ist zu groß, bitte versuche eine andere Abfrage.",
        "titlematches": "Übereinstimmungen mit Seitentiteln",
        "textmatches": "Übereinstimmungen mit Inhalten",
        "notextmatches": "Keine Übereinstimmungen mit Inhalten",
        "search-interwiki-default": "Ergebnisse von $1:",
        "search-interwiki-more": "(weitere)",
        "search-relatedarticle": "Verwandte",
-       "searcheverything-enable": "In allen Namensräumen suchen",
        "searchrelated": "verwandt",
        "searchall": "alle",
        "showingresults": "Hier {{PLURAL:$1|ist '''1''' Ergebnis|sind '''$1''' Ergebnisse}}, beginnend mit Nummer '''$2.'''",
        "powersearch-togglelabel": "Wähle aus:",
        "powersearch-toggleall": "Alle",
        "powersearch-togglenone": "Keine",
+       "powersearch-remember": "Auswahl für zukünftige Suchanfragen merken",
        "search-external": "Externe Suche",
        "searchdisabled": "Die {{SITENAME}}-Suche ist deaktiviert. Du kannst unterdessen mit Google suchen. Bitte bedenke, dass der Suchindex von {{SITENAME}} veraltet sein kann.",
        "search-error": "Bei der Suche ist ein Fehler aufgetreten: $1",
        "prefs-email": "E-Mail-Optionen",
        "prefs-rendering": "Aussehen",
        "saveprefs": "Einstellungen speichern",
-       "restoreprefs": "Alle Standardeinstellungen wiederherstellen (in allen Abschnitten)",
+       "restoreprefs": "Standardeinstellungen wiederherstellen (in allen Abschnitten)",
        "prefs-editing": "Bearbeiten",
        "rows": "Zeilen:",
        "columns": "Spalten:",
        "allowemail": "E-Mail-Empfang von anderen Benutzern ermöglichen",
        "prefs-searchoptions": "Suche",
        "prefs-namespaces": "Namensräume",
-       "defaultns": "Anderenfalls in diesen Namensräumen suchen:",
        "default": "Voreinstellung",
        "prefs-files": "Dateien",
        "prefs-custom-css": "Benutzerdefinierte CSS",
        "recentchanges-label-unpatrolled": "Nicht-kontrollierte Änderung",
        "recentchanges-label-plusminus": "Die Änderung der Seitengröße in Bytes",
        "recentchanges-legend-heading": "'''Legende:'''",
-       "recentchanges-legend-newpage": "(siehe auch die [[Special:NewPages|Liste neuer Seiten]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (siehe auch die [[Special:NewPages|Liste neuer Seiten]])",
        "recentchanges-legend-plusminus": "''(±123)''",
        "rcnotefrom": "Angezeigt werden die Änderungen seit <strong>$2</strong> (max. <strong>$1</strong> Einträge).",
        "rclistfrom": "Nur Änderungen seit $3, $2 Uhr zeigen.",
        "recentchangeslinked-title": "Änderungen an Seiten, die von „$1“ verlinkt sind",
        "recentchangeslinked-summary": "Diese Spezialseite listet die letzten Änderungen an den verlinkten Seiten auf (bzw. bei Kategorien an den Mitgliedern dieser Kategorie). Seiten auf deiner [[Special:Watchlist|Beobachtungsliste]] sind '''fett''' dargestellt.",
        "recentchangeslinked-page": "Seite:",
-       "recentchangeslinked-to": "Zeige Änderungen auf Seiten, die hierher verlinken",
+       "recentchangeslinked-to": "Zeige nur Änderungen auf Seiten, die auf diese Seite verlinken",
        "upload": "Datei hochladen",
        "uploadbtn": "Datei hochladen",
        "reuploaddesc": "Abbrechen und zurück zur Hochladen-Seite",
        "largefileserver": "Die Datei ist größer als die vom Server eingestellte Maximalgröße.",
        "emptyfile": "Die hochgeladene Datei ist leer. Der Grund kann ein Tippfehler im Dateinamen sein. Bitte kontrolliere, ob du die Datei wirklich hochladen willst.",
        "windows-nonascii-filename": "Dieses Wiki unterstützt keine Dateinamen, die Sonderzeichen enthalten.",
-       "fileexists": "Eine Datei dieses Namens ist bereits vorhanden. Bitte prüfe <strong>[[:$1]]</strong>, sofern du dir nicht sicher bist, ob du sie ändern möchtest.\n[[$1|thumb]]",
+       "fileexists": "Eine Datei dieses Namens ist bereits vorhanden. Bitte prüfe <strong>[[:$1]]</strong>, sofern {{GENDER:|du}} dir nicht sicher bist, ob du sie ändern möchtest.\n[[$1|thumb]]",
        "filepageexists": "Eine Beschreibungsseite wurde bereits als <strong>[[:$1]]</strong> erstellt, es ist aber keine Datei mit diesem Namen vorhanden.\nDie eingegebene Beschreibung wird nicht auf die Beschreibungsseite übernommen.\nDie Beschreibungsseite musst du nach dem Hochladen der Datei noch manuell bearbeiten.\n[[$1|thumb]]",
-       "fileexists-extension": "Eine Datei ähnlichen Namens ist bereits vorhanden: [[$2|thumb]]\n* Name der hochzuladenden Datei: <strong>[[:$1]]</strong>\n* Name der bereits vorhandenen Datei: <strong>[[:$2]]</strong>\nBitte wähle einen anderen Namen.",
+       "fileexists-extension": "Eine Datei ähnlichen Namens ist bereits vorhanden: [[$2|thumb]]\n* Name der hochzuladenden Datei: <strong>[[:$1]]</strong>\n* Name der bereits vorhandenen Datei: <strong>[[:$2]]</strong>\nMöchtest du vielleicht einen eindeutigeren Namen verwenden?",
        "fileexists-thumbnail-yes": "Bei der Datei scheint es sich um ein Bild verringerter Größe ''(Miniatur)'' zu handeln. [[$1|thumb]]\nBitte prüfe die Datei <strong>[[:$1]]</strong>.\nWenn es sich um das Bild in Originalgröße handelt, so braucht kein separates Vorschaubild hochgeladen zu werden.",
        "file-thumbnail-no": "Der Dateiname beginnt mit <strong>$1</strong>. Dies deutet auf ein Bild verringerter Größe ''(Minitatur)'' hin.\nBitte prüfe, ob du das Bild in voller Auflösung vorliegen hast und lade dieses unter dem Originalnamen hoch.",
        "fileexists-forbidden": "Unter diesem Namen existiert bereits eine Datei und sie kann nicht überschrieben werden. Bitte gehe zurück und lade die Datei unter einem anderen Namen hoch. [[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Das Löschen und Wiederherstellen von Dateien ist aufgrund von Wartungsarbeiten vorübergehend deaktiviert.",
        "filedelete-maintenance-title": "Die Datei kann nicht gelöscht werden.",
        "mimesearch": "Suche nach MIME-Typ",
-       "mimesearch-summary": "Auf dieser Spezialseite können die Dateien nach dem MIME-Typ gefiltert werden. Die Eingabe muss immer den Medien- und Subtyp beinhalten: <code>image/jpeg</code> (siehe Dateibeschreibungsseite).",
+       "mimesearch-summary": "Auf dieser Spezialseite können die Dateien nach dem MIME-Typ gefiltert werden.\nDie Eingabe muss immer den Medien- und Subtyp beinhalten: <code>image/jpeg</code> oder <code>image/*</code> (siehe Dateibeschreibungsseite).",
        "mimetype": "MIME-Typ:",
        "download": "Herunterladen",
        "unwatchedpages": "Nicht beobachtete Seiten",
        "wantedtemplates": "Gewünschte Vorlagen",
        "mostlinked": "Seiten mit den meisten Links",
        "mostlinkedcategories": "Meistbenutzte Kategorien",
-       "mostlinkedtemplates": "Meistbenutzte Vorlagen",
+       "mostlinkedtemplates": "Meisteingebundene Seiten",
        "mostcategories": "Seiten mit den meisten Kategorien",
        "mostimages": "Meistbenutzte Dateien",
        "mostinterwikis": "Seiten mit den meisten Interwikilinks",
        "tooltip-preferences-save": "Einstellungen speichern",
        "tooltip-summary": "Gib eine kurze Zusammenfassung ein.",
        "interlanguage-link-title": "$1 – $2",
+       "interlanguage-link-title-nonlang": "$1 – $2",
        "common.css": "/* Das folgende CSS wird für alle Benutzeroberflächen geladen. */",
-       "monobook.css": "/* Das folgende CSS wird für Benutzer der MonoBook-Benutzeroberfläche geladen */",
-       "vector.css": "/* Das folgende CSS wird für Benutzer der Vector-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */",
        "print.css": "/* Das folgende CSS wird in der Druckausgabe geladen. */",
        "noscript.css": "/* Das folgende CSS wirkt sich für Benutzer aus, die JavaScript deaktiviert haben */",
        "group-autoconfirmed.css": "/* CSS an dieser Stelle wirkt sich nur auf automatisch bestätigte Benutzer aus */",
        "group-sysop.css": "/* CSS an dieser Stelle wirkt sich nur auf Administratoren aus */",
        "group-bureaucrat.css": "/* Das folgende CSS wird nur für Bürokraten geladen. */",
        "common.js": "/* Das folgende JavaScript wird für alle Benutzer geladen. */",
-       "monobook.js": "/* Das folgende JavaScript wird für Benutzer der Monobook-Benutzeroberfläche geladen. */",
-       "vector.js": "/* Das folgende JavaScript wird für Benutzer der Vector-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */",
        "group-autoconfirmed.js": "/* Das folgende JavaScript wird nur für automatisch bestätigte Benutzer geladen. */",
        "group-user.js": "/* Das folgende JavaScript wird nur für angemeldete Benutzer geladen. */",
        "group-bot.js": "/* Das folgende JavaScript wird nur für Bots geladen. */",
        "pageinfo-category-pages": "Anzahl der Seiten",
        "pageinfo-category-subcats": "Anzahl der Unterkategorien",
        "pageinfo-category-files": "Anzahl der Dateien",
-       "skinname-monobook": "MonoBook",
-       "skinname-vector": "Vector",
        "markaspatrolleddiff": "Als kontrolliert markieren",
        "markaspatrolledtext": "Diese Seite als kontrolliert markieren",
        "markedaspatrolled": "Als kontrolliert markiert",
        "version-hook-name": "Schnittstellenname",
        "version-hook-subscribedby": "Aufruf von",
        "version-version": "($1)",
+       "version-no-ext-name": "[kein Name]",
        "version-svn-revision": "(Version $2)",
        "version-license": "MediaWiki-Lizenz",
        "version-ext-license": "Lizenz",
        "version-ext-colheader-license": "Lizenz",
        "version-ext-colheader-description": "Beschreibung",
        "version-ext-colheader-credits": "Autoren",
-       "version-license-title": "Lizenz für $1",
-       "version-license-not-found": "Es wurden keine detaillierten Lizenzinformationen für diese Erweiterung gefunden.",
+       "version-license-title": "Lizenz für „$1“",
+       "version-license-not-found": "Es wurden keine detaillierten Lizenzinformationen zu dieser Erweiterung gefunden.",
        "version-credits-title": "Danksagungen für $1",
        "version-credits-not-found": "Es wurden keine detaillierten Danksagungsinformationen für diese Erweiterung gefunden.",
        "version-poweredby-credits": "Diese Website nutzt '''[https://www.mediawiki.org/wiki/MediaWiki/de MediaWiki]''', Copyright © 2001–$1 $2.",
        "version-poweredby-others": "andere",
-       "version-poweredby-translators": "Übersetzer von translatewiki.net",
+       "version-poweredby-translators": "die Übersetzer von translatewiki.net",
        "version-credits-summary": "Wir danken folgenden Personen für ihre Beiträge zu [[Special:Version|MediaWiki]].",
        "version-license-info": "MediaWiki ist eine Freie Software, d. h. sie kann, gemäß den Bedingungen der von der Free Software Foundation veröffentlichten ''GNU General Public License'', weiterverteilt und/oder modifiziert werden. Dabei kann die Version 2, oder nach eigenem Ermessen, jede neuere Version der Lizenz verwendet werden.\n\nDie Software MediaWiki wird in der Hoffnung verteilt, dass sie nützlich sein wird, allerdings OHNE JEGLICHE GARANTIE und sogar ohne die implizierte Garantie einer MARKTGÄNGIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Hierzu sind weitere Hinweise in der ''GNU General Public License'' enthalten.\n\nEine [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie der ''GNU General Public License''] sollte zusammen mit diesem Programm verteilt worden sein. Sofern dies nicht der Fall war, kann eine Kopie bei der Free Software Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, schriftlich angefordert oder auf deren Website [//www.gnu.org/licenses/old-licenses/gpl-2.0.html online gelesen] werden.",
        "version-software": "Installierte Software",
index 80ee57c..fdd8b3d 100644 (file)
@@ -19,7 +19,8 @@
                        "Xoser",
                        "Geitost",
                        "Microchip08",
-                       "아라"
+                       "아라",
+                       "Calak"
                ]
        },
        "tog-underline": "Bınê gırey de xete bance:",
        "november-date": "Tışrino Peyên $1",
        "december-date": "Kanun $1",
        "pagecategories": "{{PLURAL:$1|Kategoriye|Kategoriy}}",
-       "category_header": "Pelê ke kategoriya \"$1\" derê",
+       "category_header": "Pelê ke kategoriya \"$1\" miyan derê",
        "subcategories": "Kategoriyê bınêni",
-       "category-media-header": "Dosyeyê ke kategoriya \"$1\" derê",
+       "category-media-header": "Dosyeyê ke kategoriya \"$1\" miyan derê",
        "category-empty": "''Ena kategoriye de hewna qet nuştey ya zi medya çıniyê.''",
        "hidden-categories": "{{PLURAL:$1|Kategoriya nımıtiye|Kategoriyê nımıtey}}",
        "hidden-category-category": "Kategoriyê nımıtey",
        "qbmyoptions": "Pelê mı",
        "faq": "PZP (Persê ke zehf persiyenê)",
        "faqpage": "Project: PZP",
-       "vector-action-addsection": "Mewzu vıraze",
-       "vector-action-delete": "Bestere",
-       "vector-action-move": "Bere",
-       "vector-action-protect": "Bışevekne",
-       "vector-action-undelete": "Esterıtışi peyser bıgê",
-       "vector-action-unprotect": "Starkerdışi bıvurne",
-       "vector-view-create": "Vıraze",
-       "vector-view-edit": "Bıvurne",
-       "vector-view-history": "Tarixê pele bıvêne",
-       "vector-view-view": "Bıwane",
-       "vector-view-viewsource": "Çımey bıvêne",
        "actions": "Hereketi",
        "namespaces": "Heruna naman",
        "variants": "Varyanti",
        "youhavenewmessagesfromusers": "Zey $1 ra {{PLURAL:$3|zewbi karber|$3 karberi}} ($2) esto.",
        "youhavenewmessagesmanyusers": "$1 ra tay karberi ($2) dı estê.",
        "newmessageslinkplural": "{{PLURAL:$1|yew mesaco newe|999=mesacê newey}}",
-       "newmessagesdifflinkplural": "{{PLURAL:$1|vırnayışa|999=vırnayışé}} peyéni",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|vurnayışo peyên|999=vurnayışê peyêni}}",
        "youhavenewmessagesmulti": "$1 mesaco newe esto",
        "editsection": "bıvurne",
        "editold": "bıvurne",
        "difference-missing-revision": "Ferqê {{PLURAL:$2|Yew rewizyonê|$2 rewizyonê}} {{PLURAL:$2|dı|dı}} ($1) sero çıniyo.\n\nNo normal de werênayış dê pelanê besterneyan dı ena xırabin asena.\nDetayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} tiya dı] aseno.",
        "searchresults": "Neticeyê geyrayışi",
        "searchresults-title": "Qandê \"$1\" neticeyê geyrayışi",
-       "toomanymatches": "Zêde teki (zewci) peyser çarnay, şıma rê zehmet, be persê do bin ra bıcerrebnên.",
        "titlematches": "Tekê (zewcê) sernameyê pele",
        "textmatches": "Tekê (zewcê) nuştey pele",
        "notextmatches": "tekê (zewcê) nuştey pele çıniyê",
        "search-interwiki-default": "$1 ra neticey:",
        "search-interwiki-more": "(véşi)",
        "search-relatedarticle": "Eleqeyın",
-       "searcheverything-enable": "cayê nameyê hemi de bigêre",
        "searchrelated": "eleqeyın",
        "searchall": "pêro",
        "showingresults": "#<strong>$2</strong> netican ra {{PLURAL:$1|<strong>1</strong> netice cêr dero|<strong>$1</strong> neticey cêr derê}}.",
        "allowemail": "Karberê bini wa bışê mı rê e-posta bırışê.",
        "prefs-searchoptions": "Cı geyre",
        "prefs-namespaces": "Heruna naman",
-       "defaultns": "Eke heni, enê cayanê namey de cı geyre (sae ke):",
        "default": "qısur",
        "prefs-files": "Dosyey",
        "prefs-custom-css": "CSSê xasi",
        "recentchanges-label-unpatrolled": "Eno vurnayış hewna dewriya nêbiyo",
        "recentchanges-label-plusminus": "Ebadê pele de bazê bayti de vayeyê cı",
        "recentchanges-legend-heading": "'''Kıtabek:'''",
-       "recentchanges-legend-newpage": "([[Special:NewPages|Lista pelanê neweyan]] zi bıvêne)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|Lista pelanê neweyan]] zi bıvêne)",
        "recentchanges-legend-plusminus": "''(±123)''",
        "rcnotefrom": "Cêr de <strong>$2</strong> ra nata vurnayışiyê asenê (tewr vêşi <strong>$1</strong> asenê).",
        "rclistfrom": "$3 $2 ra tepiya vurnayışanê neweyan bımocne",
        "rc-change-size-new": "Vurnayışa dıma $1 {{PLURAL:$1|bayt|bayt}}",
        "newsectionsummary": "/* $1 */ qısımo newe",
        "rc-enhanced-expand": "Detaya bıvin (JavaScript lazımo)",
-       "rc-enhanced-hide": "Detaya bınımnê",
+       "rc-enhanced-hide": "Melumat bınımne",
        "rc-old-title": "\"$1\"i orcinalê cı vıraşt",
        "recentchangeslinked": "Vurnayışê elaqeyıni",
        "recentchangeslinked-feed": "Vurnayışê elaqeyıni",
        "pageinfo-category-pages": "Amarê pelan",
        "pageinfo-category-subcats": "Amarê bınkategoriyan",
        "pageinfo-category-files": "Amarê dosyeyan",
-       "skinname-monobook": "MonoBook",
-       "skinname-vector": "Vektor",
        "markaspatrolleddiff": "Nişan bıke ke dewriya biyo",
        "markaspatrolledtext": "Ena pele nişan bike ke devriye biyo",
        "markedaspatrolled": "Nişan biyo ke verni de devriye biyo",
        "exif-imageuniqueid": "şınasnameyê resmê xususiyi",
        "exif-gpsversionid": "revizyonê GPSyi",
        "exif-gpslatituderef": "paralelê zıme û veroci",
-       "exif-gpslatitude": "Heralem",
+       "exif-gpslatitude": "Verıniye",
        "exif-gpslongituderef": "meridyenê rocvetış û rocawavi",
-       "exif-gpslongitude": "Lemen",
+       "exif-gpslongitude": "Derganiye",
        "exif-gpsaltituderef": "çımeyê berziyi",
        "exif-gpsaltitude": "Berziye",
        "exif-gpstimestamp": "Wextê GPSyi (se'eta atomiki)",
index 0756701..c77eb82 100644 (file)
        "qbmyoptions": "Móje boki",
        "faq": "FAQ (pšašanja a wótegrona)",
        "faqpage": "Project:FAQ (pšašanja a wótegrona)",
-       "vector-action-addsection": "Temu pśidaś",
-       "vector-action-delete": "Wulašowaś",
-       "vector-action-move": "Pśesunuś",
-       "vector-action-protect": "Šćitaś",
-       "vector-action-undelete": "Wótnowiś",
-       "vector-action-unprotect": "Šćit změniś",
-       "vector-view-create": "Napóraś",
-       "vector-view-edit": "Wobźěłaś",
-       "vector-view-history": "Wersije a awtory",
-       "vector-view-view": "Cytaś",
-       "vector-view-viewsource": "Žrědło se woglědaś",
        "actions": "Akcije",
        "namespaces": "Mjenjowe rumy",
        "variants": "Warianty",
        "currentrev": "Aktualna wersija",
        "currentrev-asof": "Aktualna wersija wót $1",
        "revisionasof": "Wersija z $1",
-       "revision-info": "Wersija z $1 wót wužywarja $2",
+       "revision-info": "Wersija z $1 wót wužywarja {{GENDER:$6|$2}}$7",
        "previousrevision": "← Zachadna rewizija",
        "nextrevision": "Pśiduca wersija →",
        "currentrevisionlink": "Aktualna wersija",
        "difference-missing-revision": "{{PLURAL:$2|Jadna wersija|$2 wersiji|$2 wersije|$2 wersijow}} toś togo rozdźěla ($1) {{PLURAL:$2|njejo se namakała|njejstej se namakałej|njejsu namakali|njejo se namakało}}.\n\nPśicyna jo zwětšego zestarjony diferencny wótkaz k bokoju, kótaryž jo se wulašował.\nDrobnostki móžoš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protokolu wulašowanjow] namakaś.",
        "searchresults": "Wuslědki pytanja",
        "searchresults-title": "Pytańske wuslědki za \"$1\"",
-       "toomanymatches": "Pśewjele pytańskich wuslědkow, pšosym wopytaj druge wótpšašanje.",
        "titlematches": "boki z wótpowědujucym napismom",
        "textmatches": "Boki z wótpowědujucym tekstom",
        "notextmatches": "Boki z wótpowědujucym tekstom njeeksistěruju.",
        "searchmenu-exists": "'''Jo bok z mjenim \"[[$1]]\" na toś tom wikiju'''",
        "searchmenu-new": "<strong>Napóraj bok \"[[:$1]]\" na toś tom wikiju!</strong> {{PLURAL:$2|0=|Glej teke bok namakany z twójim pytanim.|Glej teke namakane pytańske wuslědki.}}",
        "searchprofile-articles": "Wopśimjeśowe boki",
-       "searchprofile-project": "Pomoc a projektowe boki",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Wšykno",
        "searchprofile-advanced": "Rozšyrjony",
        "searchprofile-articles-tooltip": "W $1 pytaś",
-       "searchprofile-project-tooltip": "W $1 pytaś",
        "searchprofile-images-tooltip": "Za datajami pytaś",
        "searchprofile-everything-tooltip": "Cełe wopsímjeśe pśepytaś (inkluziwnje diskusijne boki)",
        "searchprofile-advanced-tooltip": "W swójskich mjenjowych rumach pytaś",
        "search-interwiki-default": "Wuslědki z $1:",
        "search-interwiki-more": "(wěcej)",
        "search-relatedarticle": "swójźbne",
-       "searcheverything-enable": "We wšych mjenjowych rumach pytaś",
        "searchrelated": "swójźbne",
        "searchall": "wše",
        "showingresults": "How {{PLURAL:|jo '''1''' wuslědk|stej '''$1''' wuslědka|su '''$1''' wuslědki}} wót cysła '''$2'''.",
        "allowemail": "Dostawanje e-mailow drugich wužywarjow zmóžniś.",
        "prefs-searchoptions": "Pytaś",
        "prefs-namespaces": "Mjenjowe rumy",
-       "defaultns": "Howac w toś tych mjenjowych rumach pytaś:",
        "default": "Standard",
        "prefs-files": "Dataje",
        "prefs-custom-css": "Swójski CSS",
        "recentchanges-label-unpatrolled": "Toś ta změna hyšći njejo se pśekontrolěrowała",
        "recentchanges-label-plusminus": "Změnjona wjelikosc boka (licba bajtow)",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "(glej teke [[Special:NewPages|lisćinu nowych bokow]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (glej teke [[Special:NewPages|lisćinu nowych bokow]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Dołojce pokazuju se změny wót <strong>$2</strong> (maks. <strong>$1</strong> zapisow).",
        "rclistfrom": "Nowe změny wót $3 $2 pokazaś",
        "wantedtemplates": "Brachujuce pśedłogi",
        "mostlinked": "Nejcesćej zalinkowane boki",
        "mostlinkedcategories": "Nejcesćej wužywane kategorije",
-       "mostlinkedtemplates": "Nejcesćej wužywane psedłogi",
+       "mostlinkedtemplates": "Nejcesćej zapśěgnjone boki",
        "mostcategories": "Boki z nejwěcej kategorijami",
        "mostimages": "Nejcesćej wótkazane dataje",
        "mostinterwikis": "Boki z nejwěcej mjazyrěcnymi wótkazami",
        "tooltip-summary": "Zapódaj krotke zespominanje",
        "interlanguage-link-title": "$1 – $2",
        "common.css": "/** Na toś tom městnje wustatkujo se CSS na wšykne šaty. */",
-       "monobook.css": "/* How zaměstnjony CSS wustatkujo se na wužywarje monobook-šata */",
        "common.js": "/* Kuždy JavaScript how lodujo se za wšykne wužywarje na kuždem boce. */",
-       "monobook.js": "/* Slědujucy JavaScript zacytajo se za wužywarjow, kótarež skin MonoBook wužywaju */",
        "anonymous": "{{PLURAL:$1|Anonymny wužywaŕ|Anonymnej wužywarja|Anonymne wužywarje}} na {{SITENAME}}",
        "siteuser": "{{SITENAME}}-wužywaŕ $1",
        "anonuser": "{{SITENAME}} anonymny wužywaŕ $1",
        "pageinfo-category-pages": "Licba bokow",
        "pageinfo-category-subcats": "Licba pódkategorijow",
        "pageinfo-category-files": "Licba datajow",
-       "skinname-cologneblue": "Kölnski Módry",
-       "skinname-monobook": "MonoBook",
-       "skinname-modern": "Moderny",
        "markaspatrolleddiff": "Ako kontrolěrowane markěrowaś",
        "markaspatrolledtext": "Markěruj toś ten bok ako kontrolěrowany",
        "markedaspatrolled": "jo se ako kontrolěrowany markěrował",
index 938621b..286f720 100644 (file)
        "qbmyoptions": "Al mē pàgini",
        "faq": "Dmândi fâti",
        "faqpage": "Project:Dmândi fâti despès",
-       "vector-action-addsection": "Zûnta discusiòun",
-       "vector-action-delete": "Scanşèla",
-       "vector-action-move": "Spôsta",
-       "vector-action-protect": "Prutēz",
-       "vector-action-undelete": "Fà al recóper",
-       "vector-action-unprotect": "Câmbia la prutesiòun",
-       "vector-view-create": "Invèinta",
-       "vector-view-edit": "Mudéfica",
-       "vector-view-history": "Guêrda la stôria",
-       "vector-view-view": "Lēş",
-       "vector-view-viewsource": "Guêrda la surzéia",
        "actions": "Asiòun",
        "namespaces": "Spâsi di nòm",
        "variants": "Mudéfichi",
        "sectioneditnotsupported-text": "Mudéfica dal sesiòun mìa sustgnûda in cla pàgina ché.",
        "permissionserrors": "I permès în mìa asê",
        "permissionserrorstext": "An 's gh'à mìa i permès necesâri per fêr còl ch'es pèinsa ed fêr per{{PLURAL:$1|cól mutîv ché|chi mutîv ché}}:",
-       "permissionserrorstext-withaction": "An 's gh'à mìa i permès necesâri per $2, per{{PLURAL:$1|cól mutîv ché|chi mutîv ché}}:",
+       "permissionserrorstext-withaction": "An 's gh'à mìa i permès necesâri per $2, per {{PLURAL:$1|cól mutîv ché|chi mutîv ché}}:",
        "recreate-moveddeleted-warn": "'''Atensiòun: a s'é drē serchêr ed fêr 'na pàgina bèle scanşlêda tèimp fa'''. \n\nAsicurêres che sìa dabòun necesâri cuntinvêr a mudifichêr cla pàgina ché.\nPer cumditê còst l'é l'èlèinch dal scanşladûri e di spustamèint relatîv a la pàgina.",
        "moveddeleted-notice": "Cla pàgina ché l'é stêda scanşlêda. Per infurmasiòun  còst l'é l'èlèinch relatîv dal scanşladûri e di spustemèint fât.",
        "log-fulllog": "Guêrda la stòria dal registrasiòun",
        "currentrev": "Ûltma versiòun",
        "currentrev-asof": "Ûltma versiòun dal $1",
        "revisionasof": "Versiòun dal $1",
-       "revision-info": "Versiòun ed $1, avtōr: $2",
+       "revision-info": "Versiòun dal $4 al $5 ed {{GENDER:$6|$2}}$7",
        "previousrevision": "← Versiòun pió vècia",
        "nextrevision": "Versiòun pió nōva →",
        "currentrevisionlink": "Ûltma versiòun",
        "revdelete-edit-reasonlist": "Câmbia i mutîv per la scanşladûra",
        "revdelete-offender": "Avtōr ed la versiòun:",
        "suppressionlog": "Tâj",
+       "suppressionlogtext": "Ed sègvit a gh'é l'elèinch dal saccnşladûri e i blôch cun 'd j elemèint lughê a j aministradōr. Guêrda l'[[Special:BlockList|elèinch di blôch]] per l'elèinch ed j avîş e di blôch in funsiòun adès.",
+       "mergehistory": "Unîr al stôri",
+       "mergehistory-header": "Cla pàgina ché la permèt 'd unîr al versiòun che fân pêrt ed la stòria 'd 'na pàgina (ciamêda pàgina 'd urégin) a la stòria ed 'na pàgina pió nōva. L'é necesâri sicurêres che la cuntinvasiòun stòrica 'd la pàgina l'an vègna mìa falsêda.",
+       "mergehistory-box": "Unés la stòria ed dō pàgini:",
+       "mergehistory-from": "Pàgina 'd urégin:",
+       "mergehistory-into": "Pàgina in dó la gh'à d' andêr:",
+       "mergehistory-list": "Stòria in dó 's pōl tachêr l'uniòun",
+       "mergehistory-merge": "L' é pusébil unîr al versiòun ed [[:$1]] sgnêdi ed sègvit al la stòria ed [[:$2]]. Druvêr la clòuna cun i ptòun ed siēlta per unîr tót al versiòun fîn a la dâta e ōra sgnêdi. Da nutêr che se vînen druvê i ptòun ed navigasiòun, la clòuna cun i ptòun ed siēlta l' an pōl mìa èsere druvêda.",
+       "mergehistory-go": "Fà vèder al mudéfichi che pōlen èser unîdi",
+       "mergehistory-submit": "Unés al versiòun",
+       "mergehistory-empty": "Nisòna versiòun da unîr",
+       "mergehistory-success": "{{PLURAL:$3|'Na versiòun ed [[:$1]] l'é stêda unîda|$3 versiòn ed [[:$1]] în stêdi unîdi}} al la stòria ed [[:$2]].",
+       "mergehistory-fail": "Impusébil unîr al stòri. Verifichêr la pàgina e al règoli dal mumèint.",
+       "mergehistory-fail-toobig": "Imposébil fêr l'uniòun ed la stòria cun pió 'd $1{{PLURAL:$1|revisiòun}} da spustêr",
+       "mergehistory-no-source": "La pàgina 'd urégin $1 l'an gh'é mìa.",
+       "mergehistory-no-destination": "La pàgina 'd arîv $1 l'an gh'é mìa.",
+       "mergehistory-invalid-source": "La pàgina 'd urégin la gh'à 'd avèir un tétol curèt.",
+       "mergehistory-invalid-destination": "La pàgina 'd arîv la gh'à 'd avèir un tétol curèt.",
+       "mergehistory-autocomment": "Uniòun 'd [[:$1]]in [[:$2]]",
+       "mergehistory-comment": "Uniòun ed [[:$1]] in [[:$2]]:$3",
+       "mergehistory-same-destination": "Al pàgini 'd urégin e 'd arîv an pōlen mìa cumbinêr",
+       "mergehistory-reason": "Mutîv:",
+       "mergelog": "Uniòun",
+       "pagemerge-logentry": "l'à unî [[$1]] a [[$2]] (versiòun fîn a $3)",
        "revertmerge": "Scanşèla l'uniòun",
+       "mergelogpagetext": "Ed sègvit în elenchêdi la j ûltmi operasiòun 'd uniòun ed la stòria ed dō pàgini.",
        "history-title": "$1 stòria dal mudéfichi",
+       "difference-title": "$1: diferèinsi tr' al versiòun",
+       "difference-title-multipage": "$1 e $2:diferèinsi tr' al pàgini",
+       "difference-multipage": "(Diferèinsi tr' al pàgini)",
        "lineno": "Rîga $1:",
        "compareselectedversions": "Cunfrûnta al versiòun sernîdi.",
+       "showhideselectedversions": "Fà vèder/lōga versiòun sernîdi",
        "editundo": "scanşèla",
+       "diff-empty": "(Nisóna diferèinsa)",
+       "diff-multi-sameuser": "({{PLURAL:$1|'Na versiòun ed mèz|$1 versiòun ed mèz }} 'd un stès uitèint în mìa mustrêdi)",
+       "diff-multi-otherusers": "({{PLURAL:$1|'Na versiòun ed mèz|$1 versiòun ed mèz }} ed {{PLURAL:$2|'n êter utèint|$2 utèint}} mìa fâti vèder)",
+       "diff-multi-manyusers": "({{PLURAL:$1|'Na versiòun ed mèz|$1 versiòun ed mèz }} pió in là ed $2{{PLURAL:$2|utèint}} mìa {{PLURAL:$1|mustrêda|mustrêdi}})",
+       "difference-missing-revision": "{{PLURAL:$2|'Na versiòun|$2 versiòun}} ed cla diferèinsa ché ($1) {{PLURAL:$2|an n'é mìa stêda catêda|în mìa stêdi catêdi}}. \n\nCòst a sucēd ed sôlit quând a's và adrē a un colegamèint vèc ed 'na diff a 'na pàgina scanşlêda. I particulêr a pōlen èser catê int al [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} regéster dal scanşladûri].",
        "searchresults": "Rişultê 'd la sērca",
        "searchresults-title": "Rişultê 'd la sērca ed \"$1\"",
+       "titlematches": "Rapôrt int al tétol dal pàgini",
+       "textmatches": "Rapôrt int al tèst dal pàgini",
+       "notextmatches": "Nisóna relasiòun int al tèst dal pàgini",
        "prevn": "{{PLURAL:$1|còl préma|quî préma $1}}",
        "nextn": "{{PLURAL:$1|al seguèint|i seguèint $1}}",
        "prevn-title": "{{PLURAL:$1|Al rişultêt ed préma|$1 i rişultêt ed préma}}",
        "searchprofile-advanced-tooltip": "Sērca int i spâsi di nòm fât só mzûra.",
        "search-result-size": "$1 ({{PLURAL:$2|'na parôla|$2 parôli}})",
        "search-result-category-size": "{{PLURAL:$1|1 utèint|$1 utèint}} ({{PLURAL:$2|1 sotcategoréia|$2 sotcategoréi}},{{PLURAL:$3|1 file|$3 files}})",
+       "search-result-score": "Impurtânsa: $1%",
        "search-redirect": "(redirect $1)",
        "search-section": "(sesiòun $1)",
+       "search-file-match": "(relasiòun dèinter al file)",
        "search-suggest": "Fōrsi 't serchêv $1",
        "search-interwiki-caption": "Prugèt fradē",
        "search-interwiki-default": "Rişultêt da $1:",
        "search-interwiki-more": "(êter)",
+       "search-relatedarticle": "Rişultêt coleghê",
        "searchrelated": "coleghê",
        "searchall": "tót",
+       "showingresults": "Ed sègvit {{PLURAL:$1|a vîn preşentê al mâsim <strong>1</strong> rişultêt| a vînen preşentê al mâsim <strong>$1</strong> rişultêt}} a partîr dal nómer #<strong>$2</strong>.",
+       "showingresultsinrange": "{{PLURAL:$1|A vîn mustrê| a vînen mustrê}} sòta {{PLURAL:$1|<strong>1</strong> rişultêt|<strong>$1</strong> rişultêt}} dal #<strong>$2</strong> al #<strong>$3</strong>.",
+       "showingresultsnum": "Ed sègvit {{PLURAL:$1|a vîn preşentê <strong>1</strong> rişultêt| a vînen preşentê  <strong>$3</strong> rişultêt}} a partîr dal nómer #<strong>$2</strong>.",
        "showingresultsheader": "{{PLURAL:$5|Al risultêt '''$1''' ed '''$3'''|I risultêt '''$1 - $2''' ed '''$3'''}} per '''$4'''",
        "search-nonefound": "La sērca an n'à mìa dê di rişultê.",
+       "powersearch-legend": "Sèirca specêla",
+       "powersearch-ns": "Sērca int al spâsi di nòm:",
+       "powersearch-togglelabel": "Sernés:",
        "powersearch-toggleall": "Tót",
        "powersearch-togglenone": "Nisûn",
+       "powersearch-remember": "Arcôrda la siēlta per êtri sèirchi ch'é vō fêr",
+       "search-external": "Sèirca fâta fōra",
        "preferences": "Preferèinsa",
        "mypreferences": "Preferèinsi",
        "prefs-edits": "Mudéfichi fâti:",
index 87fe5ba..4520b3b 100644 (file)
@@ -36,7 +36,8 @@
                        "Περίεργος",
                        "לערי ריינהארט",
                        "Kolega2357",
-                       "아라"
+                       "아라",
+                       "Calak"
                ]
        },
        "tog-underline": "Υπογράμμιση συνδέσμων:",
        "qbmyoptions": "Οι σελίδες μου",
        "faq": "Συχνές ερωτήσεις",
        "faqpage": "Project:Συχνές ερωτήσεις",
-       "vector-action-addsection": "Προσθήκη θέματος",
-       "vector-action-delete": "Διαγραφή",
-       "vector-action-move": "Μετακίνηση",
-       "vector-action-protect": "Προστασία",
-       "vector-action-undelete": "Επαναφορά",
-       "vector-action-unprotect": "Αλλαγή προστασίας",
-       "vector-view-create": "Δημιουργία",
-       "vector-view-edit": "Επεξεργασία",
-       "vector-view-history": "Προβολή ιστορικού",
-       "vector-view-view": "Ανάγνωση",
-       "vector-view-viewsource": "Προβολή κώδικα",
        "actions": "Ενέργειες",
        "namespaces": "Χώροι ονομάτων",
        "variants": "Παραλλαγές",
        "difference-missing-revision": "{{PLURAL:$2|Μία αναθεώρηση|$2 αναθεωρήσεις}} αυτής της διαφοράς ($1) δεν {{PLURAL:$2|μπόρεσε να βρεθεί|μπόρεσαν να βρεθούν}}.\n\nΑυτό συνήθως προκαλείται από παλιό σύνδεσμο διαφοράς προς σελίδα που έχει διαγραφεί.\nΛεπτομέρειες θα βρείτε στο [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ημερολόγιο καταγραφής διαγραφών].",
        "searchresults": "Αποτελέσματα αναζήτησης",
        "searchresults-title": "Αποτελέσματα αναζήτησης για \"$1\"",
-       "toomanymatches": "Ανταποκρίνονται πάρα πολλές περιπτώσεις, παρακαλούμε δοκιμάστε μια διαφορετική ερώτηση",
        "titlematches": "Τίτλοι άρθρων που ανταποκρίνονται",
        "textmatches": "Κείμενα σελίδων που ανταποκρίνονται:",
        "notextmatches": "Δεν υπάρχουν αντίστοιχα κείμενα σελίδων.",
        "searchmenu-exists": "'''Υπάρχει μια σελίδα που ονομάζεται «[[:$1]]» σε αυτό το wiki.'''",
        "searchmenu-new": "'''Δημιουργήστε τη σελίδα «[[:$1]]» σε αυτό το wiki!'''",
        "searchprofile-articles": "Σελίδες περιεχομένου",
-       "searchprofile-project": "Σελίδες Βοήθειας και Εγχειρήματος",
        "searchprofile-images": "Πολυμέσα",
        "searchprofile-everything": "Οτιδήποτε",
        "searchprofile-advanced": "Προχωρημένο",
        "searchprofile-articles-tooltip": "Αναζήτηση σε $1",
-       "searchprofile-project-tooltip": "Αναζήτηση σε $1",
        "searchprofile-images-tooltip": "Αναζήτηση αρχείων",
        "searchprofile-everything-tooltip": "Αναζήτηση σε όλο το περιεχόμενο (συμπεριλαμβανομένων των σελίδων συζήτησης)",
        "searchprofile-advanced-tooltip": "Αναζήτηση σε προσαρμοσμένους ονοματοχώρους",
        "search-interwiki-default": "$1 αποτελέσματα:",
        "search-interwiki-more": "(περισσότερα)",
        "search-relatedarticle": "Σχετικά",
-       "searcheverything-enable": "Αναζήτηση σε όλες τις περιοχές ονομάτων",
        "searchrelated": "σχετικά",
        "searchall": "όλα",
        "showingresults": "Δείτε παρακάτω μέχρι τα {{PLURAL:$1|'''1'''αποτέλεσμα|'''$1''' αποτελέσματα}} ξεκινώντας με #'''$2'''.",
        "allowemail": "Ενεργοποίηση παραλαβής μηνύματος ηλεκτρονικού ταχυδρομείου από άλλους χρήστες",
        "prefs-searchoptions": "Αναζήτηση",
        "prefs-namespaces": "Περιοχές ονομάτων",
-       "defaultns": "Ειδάλλως αναζήτηση σε αυτές τις περιοχές ονομάτων:",
        "default": "προεπιλογή",
        "prefs-files": "Αρχεία",
        "prefs-custom-css": "Προκαθορισμένη CSS",
        "prefs-emailconfirm-label": "Επιβεβαίωση e-mail:",
        "youremail": "Διεύθυνση ηλεκτρονικού ταχυδρομείου:",
        "username": "{{GENDER:$1|Όνομα χρήστη}}:",
-       "uid": "{{GENDER:$1|Αναγνωριστικό χρήστη}}:",
        "prefs-memberingroups": "{{GENDER:$2|Μέλος}} της {{PLURAL:$1|ομάδας|ομάδων}}:",
        "prefs-registration": "Χρόνος εγγραφής:",
        "yourrealname": "Πραγματικό όνομα:",
        "right-markbotedits": "Σήμανση επαναφερόμενων επεξεργασιών ως επεξεργασιών μποτ",
        "right-noratelimit": "Να μην επηρεάζεται από τα όρια ρυθμού",
        "right-import": "Εισαγωγή σελίδων από άλλα wikis",
-       "right-importupload": "Î\95ιÏ\83αγÏ\89γή Ï\83ελίδÏ\89ν Î±Ï\80Ï\8c Ï\86Ï\8cÏ\81Ï\84Ï\89Ï\83η αρχείου",
+       "right-importupload": "Î\95ιÏ\83αγÏ\89γή Ï\83ελίδÏ\89ν Î¼Îµ Î±Î½Î­Î²Î±Ï\83μα αρχείου",
        "right-patrol": "Σήμανση επεξεργασιών άλλων χρηστών ως ελεγμένες",
        "right-autopatrol": "Αυτόματη σημείωση των επεξεργασιών τους ως ελεγμένες",
        "right-patrolmarks": "Δείτε τις σημειώσεις 'υπό παρακολούθηση' των προσφάτων αλλαγών",
        "action-protect": "να αλλάξετε τα επίπεδα προστασίας για αυτή τη σελίδα",
        "action-rollback": "γρήγορη επαναφορά των επεξεργασιών του τελευταίου χρήστη που επεξεργάστηκε μια συγκεκριμένη σελίδα",
        "action-import": "εισάγετε σελίδες από άλλο wiki",
-       "action-importupload": "εισάγετε αυτή τη σελίδα από φόρτωση αρχείου",
+       "action-importupload": "εισάγετε σελίδες με ανέβασμα αρχείου",
        "action-patrol": "να επισημάνετε τις επεξεργασίες άλλων ως ελεγμένες",
        "action-autopatrol": "να επισημάνετε την επεξεργασία σας ως ελεγμένη",
        "action-unwatchedpages": "να εμφανίσετε τον κατάλογο μη παρακολουθούμενων σελίδων",
        "recentchanges-label-unpatrolled": "Αυτή η επεξεργασία δεν έχει ελεγχθεί ακόμα",
        "recentchanges-label-plusminus": "Μεταβολή του μεγέθους της σελίδας σε bytes",
        "recentchanges-legend-heading": "'''Υπόμνημα:'''",
-       "recentchanges-legend-newpage": "(δείτε [[Special:NewPages|Νέες σελίδες]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (δείτε [[Special:NewPages|Νέες σελίδες]])",
        "rcnotefrom": "Παρακάτω είναι οι αλλαγές από τις <strong>$2</strong>  (εμφανίζονται μέχρι <strong>$1</strong> ).",
        "rclistfrom": "Εμφάνιση νέων αλλαγών αρχίζοντας από $3 $2",
        "rcshowhideminor": "$1 μικροεπεξεργασιών",
        "recentchangeslinked-page": "Όνομα σελίδας:",
        "recentchangeslinked-to": "Εμφάνιση αλλαγών σε σελίδες συνδεδεμένες με την δεδομένη σελίδα αντί αυτής",
        "upload": "Ανέβασμα αρχείου",
-       "uploadbtn": "ΦÏ\8cÏ\81Ï\84Ï\89Ï\83η αρχείου",
+       "uploadbtn": "Î\91νέβαÏ\83μα αρχείου",
        "reuploaddesc": "Επιστροφή στη φόρμα φόρτωσης",
-       "upload-tryagain": "Î\97 ÎºÎ±Ï\84αÏ\87Ï\8eÏ\81ηÏ\83η Î¬Î»Î»Î±Î¾Îµ Ï\84ην Ï\80εÏ\81ιγÏ\81αÏ\86ή αρχείου",
+       "upload-tryagain": "Î¥Ï\80οβολή Ï\84Ï\81οÏ\80οÏ\80οιημένηÏ\82 Ï\80εÏ\81ιγÏ\81αÏ\86ήÏ\82 αρχείου",
        "uploadnologin": "Δεν έχετε συνδεθεί!",
        "uploadnologintext": "Παρακαλώ $1 για να επιφορτώσετε αρχεία.",
        "upload_directory_missing": "Λείπει το αποθηκευτήριο επιφορτώσεων ($1) και δεν μπορεί να δημιουργηθεί από τον webserver.",
        "upload_directory_read_only": "Δεν είναι δυνατή η εγγραφή στον κατάλογο ($1) από τον server.",
-       "uploaderror": "ΣÏ\86άλμα Ï\83Ï\84η Ï\86Ï\8cÏ\81Ï\84Ï\89Ï\83η αρχείου",
+       "uploaderror": "ΣÏ\86άλμα Ï\83Ï\84ο Î±Î½Î­Î²Î±Ï\83μα αρχείου",
        "upload-recreate-warning": "'''Προειδοποίηση: Ένα αρχείο με αυτό το όνομα έχει διαγραφεί ή μετακινηθεί.'''\n\nΤο αρχείο διαγραφών και μετακινήσεων για αυτή τη σελίδα παρέχεται εδώ για διευκόλυνση:",
        "uploadtext": "Μπορείτε να χρησιμοποιήσετε την παρακάτω φόρμα για να επιφορτώσετε αρχεία. Για να δείτε ήδη επιφορτωμένα αρχεία, πηγαίνετε στη [[Special:FileList|λίστα επιφορτωμένων αρχείων]] ή στο [[Special:Log/upload|ιστορικό επιφορτώσεων]]. Οι διαγραφές έχουν καταγραφεί στη σελίδα [[Special:Log/delete|αρχείο διαγραφών]].\n\nΓια να συμπεριληφθεί μια εικόνα σε μια σελίδα, χρησιμοποιήστε συνδέσμους της μορφής:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' (χρήση της πλήρους εκδοχής του αρχείου)\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' (χρήση μίας εκδοχής 200 pixel σε πλάτος σε ένα κουτάκι στο αριστερό περιθώριο με περιγραφή 'alt text')\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' (άμεση σύνδεση με το αρχείο χωρίς εμφάνιση του ίδιου του αρχείου)",
        "upload-permitted": "Επιτρεπτοί τύποι αρχείων: $1.",
        "filereuploadsummary": "Αλλαγές αρχείου:",
        "filestatus": "Κατάσταση του copyright:",
        "filesource": "Πηγή:",
-       "ignorewarning": "Î\91γνÏ\8cηÏ\83ε Ï\84ην Ï\80Ï\81οειδοÏ\80οίηÏ\83η ÎºÎ±Î¹ Î±Ï\80οθήκεÏ\85Ï\83ε Ï\84ο Î±Ï\81Ï\87είο",
+       "ignorewarning": "Î\91γνÏ\8cηÏ\83η Ï\84ηÏ\82 Ï\80Ï\81οειδοÏ\80οίηÏ\83ηÏ\82 ÎºÎ±Î¹ Î±Ï\80οθήκεÏ\85Ï\83η Ï\84οÏ\85 Î±Ï\81Ï\87είοÏ\85 Î¿Ï\8dÏ\84Ï\89Ï\82 Î® Î¬Î»Î»Ï\89Ï\82",
        "ignorewarnings": "Αγνόησε οποιεσδήποτε προειδοποιήσεις",
        "minlength1": "Τα ονόματα αρχείων πρέπει να είναι τουλάχιστον ένα γράμμα.",
        "illegalfilename": "Το όνομα του αρχείου \"$1\" περιέχει χαρακτήρες που δεν επιτρέπονται στους τίτλους των σελίδων. Παρακαλούμε δώστε άλλο όνομα στο αρχείο και προσπαθήστε ξανά να το ανεβάσετε.",
        "largefileserver": "Το μέγεθος αυτού του αρχείο είναι μεγαλύτερο από το μέγιστο μέγεθος που ο εξυπηρετητής είναι ρυθμισμένος να επιτρέπει.",
        "emptyfile": "Το αρχείο που φορτώσατε φαίνεται να είναι κενό. Αυτό μπορεί να οφείλεται σε λάθος πληκτρολόγησης του ονόματος του αρχείου. Παρακαλούμε ελέγξτε εαν αυτό είναι πραγματικά το αρχείο που θέλετε να φορτώσετε.",
        "windows-nonascii-filename": "Αυτό το wiki δεν υποστηρίζει ονόματα αρχείων με ειδικούς χαρακτήρες.",
-       "fileexists": "Υπάρχει ήδη αρχείο με αυτό το όνομα -παρακαλούμε ελέγξτε στο <strong>[[:$1]]</strong>.\nΕίστε βέβαιος (-η) πως θέλετε να αλλάξετε το όνομα του αρχείου; [[$1|thumb]]",
+       "fileexists": "Υπάρχει ήδη αρχείο με αυτό το όνομα, παρακαλούμε ελέγξτε το <strong>[[:$1]]</strong> εάν δεν είστε σίγουρος/η αν θέλετε να το αλλάξετε.\n[[$1|thumb]]",
        "filepageexists": "Η σελίδα περιγραφής για αυτό το αρχείο δημιουργήθηκε ήδη στο <strong>[[:$1]]</strong>, αλλά κανένα αρχείο με αυτό το όνομα δεν υπάρχει αυτή τη στιγμή.\nΗ περιγραφἠ που θα εισάγετε δεν θα εμφανιστεί στη σελίδα περιγραφής.\nΓια να εμφανιστεί η περιγραφή σας εκεί, θα πρέπει να την επεξεργαστείτε χειροκίνητα.\n[[$1|thumb]]",
        "fileexists-extension": "Ένα αρχείο με παρόμοιο όνομα υπάρχει: [[$2|thumb]]\n* Όνομα του προς επιφόρτωση αρχείου: <strong>[[:$1]]</strong>\n* Όνομα υπάρχοντος αρχείου: <strong>[[:$2]]</strong>\nΠαρακαλώ διαλέξτε ένα διαφορετικό όνομα.",
        "fileexists-thumbnail-yes": "Το αρχείο φαίνεται ότι είναι μια εικόνα μειωμένου μεγέθους ''(μικρογραφία)''. [[$1|thumb]]\nΠαρακαλώ ελέγξτε το αρχείο <strong>[[:$1]]</strong>.\nΑν το ελεγμένο αρχείο είναι η ίδια εικόνα στο αρχικό μέγεθος δεν είναι απαραίτητο να επιφορτώσετε μια επιπλέον μικρογραφία.",
        "savefile": "Αποθήκευση αρχείου",
        "uploadedimage": "ανέβασε το «[[$1]]»",
        "overwroteimage": "ανέβασμα νέας έκδοσης του \"[[$1]]\"",
-       "uploaddisabled": "Î\9bÏ\85Ï\80οÏ\8dμαÏ\83Ï\84ε, Î· Ï\86Ï\8cÏ\81Ï\84Ï\89Ï\83η Î­Ï\87ει Î±Ï\80ενεÏ\81γοÏ\80οιηθεί.",
+       "uploaddisabled": "Το Î±Î½Î­Î²Î±Ï\83μα Î±Ï\81Ï\87είÏ\89ν ÎµÎ¯Î½Î±Î¹ Î±Ï\80ενεÏ\81γοÏ\80οιημένο.",
        "copyuploaddisabled": "Το ανέβασμα μέσω URL έχει απενεργοποιηθεί.",
-       "uploaddisabledtext": "Î\97 Ï\86Ï\8cÏ\81Ï\84Ï\89Ï\83η Î±Ï\81Ï\87είÏ\89ν ÎµÎ¯Î½Î±Î¹ Î±Ï\80ενεÏ\81γοÏ\80οιημένη.",
+       "uploaddisabledtext": "Το Î±Î½Î­Î²Î±Ï\83μα Î±Ï\81Ï\87είÏ\89ν ÎµÎ¯Î½Î±Î¹ Î±Ï\80ενεÏ\81γοÏ\80οιημένο.",
        "php-uploaddisabledtext": "Οι επιφορτώσεις αρχείων ειναι απενεργοποιημένες στην PHP. Παρακαλούμε, ελέγξτε την ρύθμιση file_uploads.",
        "uploadscripted": "Αυτό το αρχείο περιέχει κώδικα HTML ή script που μπορεί να παρερμηνευθεί από μερικούς browser.",
        "uploadinvalidxml": "Δεν ήταν δυνατή η ανάλυση του κώδικα XML στο αρχείο.",
        "mostrevisions": "Άρθρα με τις περισσότερες αναθεωρήσεις",
        "prefixindex": "Όλες οι σελίδες με πρόθεμα",
        "prefixindex-namespace": "Όλες οι σελίδες με πρόθεμα (ονοματοχώρος $1)",
+       "prefixindex-strip": "Αφαίρεση του προθέματος στη λίστα",
        "shortpages": "Σύντομες σελίδες",
        "longpages": "Εκτενείς σελίδες",
        "deadendpages": "Αδιέξοδες σελίδες",
        "log-title-wildcard": "Αναζήτησε τίτλους που αρχίζουν με αυτό το κείμενο",
        "showhideselectedlogentries": "Εμφάνιση/απόκρυψη επιλεγμένων καταχωρήσεων στη λίστα καταγραφών",
        "allpages": "Όλες οι σελίδες",
-       "alphaindexline": "$1 έως $2",
        "nextpage": "Επόμενη σελίδα ($1)",
        "prevpage": "Προηγούμενη σελίδα ($1)",
        "allpagesfrom": "Εμφάνιση σελίδων που αρχίζουν από:",
        "tooltip-preferences-save": "Αποθήκευση προτιμήσεων",
        "tooltip-summary": "Εισαγάγετε μια σύντομη σύνοψη",
        "common.css": "/* Το τοποθετημένο εδώ CSS θα εφαρμοστεί σε όλα τα skins */",
-       "cologneblue.css": "/* Το τοποθετημένο εδώ CSS θα επηρεάσει χρήστες του Cologne Blue skin */",
-       "monobook.css": "/* Το τοποθετημένο εδώ CSS θα επηρεάσει χρήστες του Monobook skin */",
-       "modern.css": "/* Το τοποθετημένο εδώ CSS θα επηρεάσει χρήστες του Modern skin */",
-       "vector.css": "/* Το τοποθετημένο εδώ CSS θα επηρεάσει χρήστες του Vector skin */",
        "print.css": "/* Το τοποθετημένο εδώ CSS θα επηρεάσει το αποτέλεσμα της εκτύπωσης */",
        "common.js": "/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για όλους τους χρήστες σε κάθε φόρτωση σελίδας. */",
-       "cologneblue.js": "/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για χρήστες που χρησιμοποιούν το Cologne Blue skin */",
-       "monobook.js": "/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για χρήστες που χρησιμοποιούν το MonoBook skin */",
-       "modern.js": "/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για χρήστες που χρησιμοποιούν το Modern skin */",
-       "vector.js": "/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για χρήστες που χρησιμοποιούν το Vector skin */",
        "anonymous": "{{PLURAL:$1|Ανώνυμος χρήστης|Ανώνυμοι χρήστες}} του {{SITENAME}}",
        "siteuser": "{{SITENAME}} χρήστης $1",
        "anonuser": "ανώνυμος χρήστης $1 του {{SITENAME}}",
        "pageinfo-category-pages": "Αριθμός σελίδων",
        "pageinfo-category-subcats": "Αριθμός υποκατηγοριών",
        "pageinfo-category-files": "Αριθμός αρχείων",
-       "skinname-modern": "Μοντέρνο",
        "markaspatrolleddiff": "Να σημειωθεί 'υπό παρακολούθηση'",
        "markaspatrolledtext": "Να σημειωθεί αυτό το άρθρο ως 'υπό παρακολούθηση'.",
        "markedaspatrolled": "Σημειωμένο ως 'υπό παρακολούθηση'",
index 85e1bdc..a664f4d 100644 (file)
        "faqpage": "Project:FAQ",
        "sitetitle": "{{SITENAME}}",
        "sitesubtitle": "",
-       "vector-action-addsection": "Add topic",
-       "vector-action-delete": "Delete",
-       "vector-action-move": "Move",
-       "vector-action-protect": "Protect",
-       "vector-action-undelete": "Undelete",
-       "vector-action-unprotect": "Change protection",
-       "vector-view-create": "Create",
-       "vector-view-edit": "Edit",
-       "vector-view-history": "View history",
-       "vector-view-view": "Read",
-       "vector-view-viewsource": "View source",
        "actions": "Actions",
        "namespaces": "Namespaces",
        "variants": "Variants",
        "currentrev": "Latest revision",
        "currentrev-asof": "Latest revision as of $1",
        "revisionasof": "Revision as of $1",
-       "revision-info": "Revision as of $1 by $2",
+       "revision-info": "Revision as of $1 by {{GENDER:$6|$2}}$7",
        "revision-info-current": "-",
        "revision-nav": "($1) $2{{int:pipe-separator}}$3 ($4){{int:pipe-separator}}$5 ($6)",
        "previousrevision": "← Older revision",
        "mergehistory-empty": "No revisions can be merged.",
        "mergehistory-success": "$3 {{PLURAL:$3|revision|revisions}} of [[:$1]] successfully merged into [[:$2]].",
        "mergehistory-fail": "Unable to perform history merge, please recheck the page and time parameters.",
+       "mergehistory-fail-toobig" : "Unable to perform history merge as more than the limit of $1 {{PLURAL:$1|revision|revisions}} would be moved.",
        "mergehistory-no-source": "Source page $1 does not exist.",
        "mergehistory-no-destination": "Destination page $1 does not exist.",
        "mergehistory-invalid-source": "Source page must be a valid title.",
        "search-summary": "",
        "searchresults": "Search results",
        "searchresults-title": "Search results for \"$1\"",
-       "toomanymatches": "Too many matches were returned, please try a different query",
        "titlematches": "Page title matches",
        "textmatches": "Page text matches",
        "notextmatches": "No page text matches",
        "search-interwiki-custom": "",
        "search-interwiki-more": "(more)",
        "search-relatedarticle": "Related",
-       "searcheverything-enable": "Search in all namespaces",
        "searchrelated": "related",
        "searchall": "all",
        "showingresults": "Showing below up to {{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> results}} starting with #<strong>$2</strong>.",
        "powersearch-togglelabel": "Check:",
        "powersearch-toggleall": "All",
        "powersearch-togglenone": "None",
+       "powersearch-remember": "Remember selection for future searches",
        "search-external": "External search",
        "searchdisabled": "{{SITENAME}} search is disabled.\nYou can search via Google in the meantime.\nNote that their indexes of {{SITENAME}} content may be out of date.",
        "googlesearch": "<form method=\"get\" action=\"//www.google.com/search\" id=\"googlesearch\">\n\t<input type=\"hidden\" name=\"domains\" value=\"{{SERVER}}\" />\n\t<input type=\"hidden\" name=\"num\" value=\"50\" />\n\t<input type=\"hidden\" name=\"ie\" value=\"$2\" />\n\t<input type=\"hidden\" name=\"oe\" value=\"$2\" />\n\n\t<input type=\"text\" name=\"q\" size=\"31\" maxlength=\"255\" value=\"$1\" />\n\t<input type=\"submit\" name=\"btnG\" value=\"$3\" />\n  <div>\n\t<input type=\"radio\" name=\"sitesearch\" id=\"gwiki\" value=\"{{SERVER}}\" checked=\"checked\" /><label for=\"gwiki\">{{SITENAME}}</label>\n\t<input type=\"radio\" name=\"sitesearch\" id=\"gWWW\" value=\"\" /><label for=\"gWWW\">WWW</label>\n  </div>\n</form>",
        "allowemail": "Enable email from other users",
        "prefs-searchoptions": "Search",
        "prefs-namespaces": "Namespaces",
-       "defaultns": "Otherwise search in these namespaces:",
        "default": "default",
        "prefs-files": "Files",
        "prefs-custom-css": "Custom CSS",
        "recentchanges-label-unpatrolled": "This edit has not yet been patrolled",
        "recentchanges-label-plusminus": "The page size changed by this number of bytes",
        "recentchanges-legend-heading": "'''Legend:'''",
-       "recentchanges-legend-newpage": "(also see [[Special:NewPages|list of new pages]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (also see [[Special:NewPages|list of new pages]])",
+       "recentchanges-legend-minor": "{{int:recentchanges-label-minor}}",
+       "recentchanges-legend-bot": "{{int:recentchanges-label-bot}}",
+       "recentchanges-legend-unpatrolled": "{{int:recentchanges-label-unpatrolled}}",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "rcnotefrom": "Below are the changes since <strong>$2</strong> (up to <strong>$1</strong> shown).",
        "rclistfrom": "Show new changes starting from $2, $3",
        "largefileserver": "This file is bigger than the server is configured to allow.",
        "emptyfile": "The file you uploaded seems to be empty.\nThis might be due to a typo in the filename.\nPlease 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.\n[[$1|thumb]]",
+       "fileexists": "A file with this name exists already, please check <strong>[[:$1]]</strong> if {{GENDER:|you}} are not sure if you want to change it.\n[[$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.\nThe summary you enter will not appear on the description page.\nTo make your summary appear there, you will need to manually edit it.\n[[$1|thumb]]",
-       "fileexists-extension": "A file with a similar name exists: [[$2|thumb]]\n* Name of the uploading file: <strong>[[:$1]]</strong>\n* Name of the existing file: <strong>[[:$2]]</strong>\nPlease choose a different name.",
+       "fileexists-extension": "A file with a similar name exists: [[$2|thumb]]\n* Name of the uploading file: <strong>[[:$1]]</strong>\n* Name of the existing file: <strong>[[:$2]]</strong>\nDo you perhaps want to use a more distinctive name?",
        "fileexists-thumbnail-yes": "The file seems to be an image of reduced size <em>(thumbnail)</em>.\n[[$1|thumb]]\nPlease check the file <strong>[[:$1]]</strong>.\nIf the checked file is the same image of original size it is not necessary to upload an extra thumbnail.",
        "file-thumbnail-no": "The filename begins with <strong>$1</strong>.\nIt seems to be an image of reduced size <em>(thumbnail)</em>.\nIf you have this image in full resolution upload this one, otherwise change the filename please.",
        "fileexists-forbidden": "A file with this name already exists, and cannot be overwritten.\nIf you still want to upload your file, please go back and use a new name.\n[[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Deletion and restoration of files temporarily disabled during maintenance.",
        "filedelete-maintenance-title": "Cannot delete file",
        "mimesearch": "MIME search",
-       "mimesearch-summary": "This page enables the filtering of files for their MIME type.\nInput: contenttype/subtype, e.g. <code>image/jpeg</code>.",
+       "mimesearch-summary": "This page enables the filtering of files for their MIME type.\nInput: contenttype/subtype or contenttype/*, e.g. <code>image/jpeg</code>.",
        "mimetype": "MIME type:",
        "download": "download",
        "unwatchedpages": "Unwatched pages",
        "mostlinked-summary": "",
        "mostlinkedcategories": "Most linked-to categories",
        "mostlinkedcategories-summary": "",
-       "mostlinkedtemplates": "Most linked-to templates",
+       "mostlinkedtemplates": "Most transcluded pages",
        "mostlinkedtemplates-summary": "",
        "mostcategories": "Pages with the most categories",
        "mostcategories-summary": "",
        "tooltip-summary": "Enter a short summary",
        "interlanguage-link-title": "$1 – $2",
        "interlanguage-link-title-langonly": "$1",
+       "interlanguage-link-title-nonlang": "$1 – $2",
+       "interlanguage-link-title-nonlangonly": "$1",
        "common.css": "/* CSS placed here will be applied to all skins */",
-       "monobook.css": "/* CSS placed here will affect users of the MonoBook 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-sysop.css": "/* CSS placed here will affect sysops only */",
        "group-bureaucrat.css": "/* CSS placed here will affect bureaucrats only */",
        "common.js": "/* Any JavaScript here will be loaded for all users on every page load. */",
-       "monobook.js": "/* Any JavaScript here will be loaded for users using the MonoBook 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-user.js": "/* Any JavaScript here will be loaded for registered users only */",
        "group-bot.js": "/* Any JavaScript here will be loaded for bots only */",
        "pageinfo-category-pages": "Number of pages",
        "pageinfo-category-subcats": "Number of subcategories",
        "pageinfo-category-files": "Number of files",
-       "skinname-monobook": "MonoBook",
-       "skinname-vector": "Vector",
        "markaspatrolleddiff": "Mark as patrolled",
        "markaspatrolledlink": "[$1]",
        "markaspatrolledtext": "Mark this page as patrolled",
        "version-hook-name": "Hook name",
        "version-hook-subscribedby": "Subscribed by",
        "version-version": "($1)",
+       "version-no-ext-name": "[no name]",
        "version-svn-revision": "r$1",
        "version-license": "MediaWiki License",
        "version-ext-license": "License",
index dd696b5..5989982 100644 (file)
        "category_header": "Artikoloj en kategorio \"$1\"",
        "subcategories": "Subkategorioj",
        "category-media-header": "Dosieroj en kategorio \"$1\"",
-       "category-empty": "''Ĉi tiu kategorio momente ne enhavas artikolojn aŭ mediojn.''",
+       "category-empty": "<em>Tiu ĉi kategorio nuntempe enhavas neniun artikolon aŭ plurmedian dosieron.</em>",
        "hidden-categories": "{{PLURAL:$1|Kaŝita kategorio|Kaŝitaj kategorioj}}",
        "hidden-category-category": "Kaŝitaj kategorioj",
        "category-subcat-count": "{{PLURAL:$2|Ĉi tiu kategorio havas nur la jenan subkategorion.|Ĉi tiu kategorio havas la {{PLURAL:$1|jenan subkategorion|$1 jenajn subkategoriojn}}, el $2 entute.}}",
        "qbmyoptions": "Miaj paĝoj",
        "faq": "Oftaj demandoj",
        "faqpage": "Project:Oftaj demandoj",
-       "vector-action-addsection": "Aldoni temon",
-       "vector-action-delete": "Forigi",
-       "vector-action-move": "Alinomigi",
-       "vector-action-protect": "Protekti",
-       "vector-action-undelete": "Malforigi",
-       "vector-action-unprotect": "Ŝanĝi protektadon",
-       "vector-view-create": "Krei",
-       "vector-view-edit": "Redakti",
-       "vector-view-history": "Vidi historion",
-       "vector-view-view": "Legi",
-       "vector-view-viewsource": "Vidi fonton",
        "actions": "Agoj",
        "namespaces": "Nomspacoj",
        "variants": "Variantoj",
        "permalink": "Konstanta ligilo",
        "print": "Printi",
        "view": "Vidi",
+       "view-foreign": "Rigardi en $1",
        "edit": "Redakti",
        "edit-local": "Redakti lokan priskribon",
        "create": "Krei",
        "undo-nochange": "Ŝajne la redakto jam estis malfarita.",
        "undo-summary": "Nuligis version $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskuto]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]])",
        "undo-summary-username-hidden": "Malfari ŝanĝon $1 de kaŝita uzulo",
-       "cantcreateaccounttitle": "Ne povas krei konton",
+       "cantcreateaccounttitle": "Ne eblas krei konton",
        "cantcreateaccount-text": "Konto-kreado de ĉi tiu IP-adreso ('''$1''') estis forbarita de [[User:$3|$3]].\n\nLa kialo donata de $3 estas ''$2''.",
        "cantcreateaccount-range-text": "La kreado de kontoj de IP-adresoj en la intervalo '''$1''', kiu inkludas vian IP-adreson ('''$4'''), estis blokita de [[User:$3|$3]].\n\nLa donita kialo de $3 estas ''$2''",
        "viewpagelogs": "Rigardi la protokolojn por tiu ĉi paĝo",
        "difference-missing-revision": "{{PLURAL:$2|Unu revizio|$2 revizioj}} de ĉi tiu malsameco ($1) ne {{PLURAL:$2|estis|estis}} trovebla.\n\nLa kutima kaŭzo estas sekvi malaktualan malsamo-ligilon al paĝo forviŝita.\nDetaloj troveblos en la [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de forviŝoj].",
        "searchresults": "Serĉrezultoj",
        "searchresults-title": "Serĉrezultoj por \"$1\"",
-       "toomanymatches": "Tro da serĉo-trafoj estis trovitaj; bonvolu provi malsaman serĉomendon.",
        "titlematches": "Trovitaj laŭ titolo",
        "textmatches": "Trovitaj laŭ enhavo",
        "notextmatches": "Neniu trovita laŭ enhavo",
        "searchmenu-exists": "'''Estas paĝo nomita \"[[:$1]]\" en ĉi tiu vikio'''",
        "searchmenu-new": "<strong>Krei la paĝon \"[[:$1]]\" en ĉi tiu vikio!</strong>{{PLURAL:$2|0=|Vidu ankaŭ la paĝon trovitan per via serĉo.|Vidu ankaŭ la trovitajn serĉrezultojn.}}",
        "searchprofile-articles": "Enhavaj paĝoj",
-       "searchprofile-project": "Paĝoj pri Helpo kaj Projektoj",
        "searchprofile-images": "Plurmedio",
        "searchprofile-everything": "Ĉio",
        "searchprofile-advanced": "Progresa",
        "searchprofile-articles-tooltip": "Serĉo en $1",
-       "searchprofile-project-tooltip": "Serĉo en $1",
        "searchprofile-images-tooltip": "Serĉi dosierojn",
        "searchprofile-everything-tooltip": "Traserĉi ĉiun enhavon (inkluzivante diskuto-paĝojn)",
        "searchprofile-advanced-tooltip": "Serĉi en specialaj nomspacoj",
        "search-interwiki-default": "Rezultoj de $1:",
        "search-interwiki-more": "(plu)",
        "search-relatedarticle": "Relataj",
-       "searcheverything-enable": "Traserĉi ĉiujn nomspacojn",
        "searchrelated": "rilataj",
        "searchall": "ĉiuj",
        "showingresults": "Montras {{PLURAL:$1|'''1''' trovitan|'''$1''' trovitajn}} ekde la #'''$2'''-a.",
        "datedefault": "Nenia prefero",
        "prefs-labs": "Ecoj el Laboratorio",
        "prefs-user-pages": "Uzantopaĝoj",
-       "prefs-personal": "Uzanta profilo",
+       "prefs-personal": "Profilo de uzanto",
        "prefs-rc": "Lastaj ŝanĝoj",
        "prefs-watchlist": "Atentaro",
        "prefs-watchlist-days": "Kiom da tagoj montriĝu en la atentaro:",
        "timezoneregion-europe": "Eŭropo",
        "timezoneregion-indian": "Hinda Oceano",
        "timezoneregion-pacific": "Pacifiko",
-       "allowemail": "Rajtigi retmesaĝojn de aliaj uzantoj",
+       "allowemail": "Ebligi akceptadon de retmesaĝoj de aliaj uzantoj",
        "prefs-searchoptions": "Serĉi",
        "prefs-namespaces": "Nomspacoj",
-       "defaultns": "Alimaniere, traserĉi la jenajn nomspacojn:",
        "default": "defaŭlte",
        "prefs-files": "Dosieroj",
        "prefs-custom-css": "Propra CSS",
        "prefs-emailconfirm-label": "Retpoŝta konfirmado:",
        "youremail": "Retadreso:",
        "username": "{{GENDER:$1|Salutnomo}}:",
-       "uid": "{{GENDER:$1|Uzanto}}-identaĵo:",
        "prefs-memberingroups": "{{GENDER:$2|Ano}} de {{PLURAL:$1|grupo|grupoj}}:",
        "prefs-registration": "Tempo de registrado:",
        "yourrealname": "Vera nomo:",
        "right-move": "Movi paĝojn",
        "right-move-subpages": "Alinomigi paĝojn kun ĝiaj subpaĝoj",
        "right-move-rootuserpages": "Movi radikajn uzanto-paĝojn",
+       "right-move-categorypages": "Alinomigi kategoriajn paĝojn",
        "right-movefile": "Alinomigi dosierojn",
        "right-suppressredirect": "Ne krei alidirektilon de la malnova nomo kiam movante paĝon",
        "right-upload": "Alŝuti dosierojn",
        "action-createpage": "krei paĝojn",
        "action-createtalk": "krei diskuto-paĝojn",
        "action-createaccount": "krei ĉi tiun uzanto-konton",
+       "action-history": "rigardi historion de tiu ĉi paĝo",
        "action-minoredit": "marki ĉi tiun redakton eta",
        "action-move": "movi ĉi tiun paĝon",
        "action-move-subpages": "movi ĉi tiun paĝon, kaj ties subpaĝojn",
        "action-move-rootuserpages": "movi radikajn uzanto-paĝojn",
+       "action-move-categorypages": "alinomigi kategoriajn paĝojn",
        "action-movefile": "alinomigi ĉi tiun dosieron",
        "action-upload": "alŝuti ĉi tiun dosieron",
        "action-reupload": "anstataŭigi ĉi tiun ekzistantan dosieron",
        "recentchanges-label-unpatrolled": "Ĉi tiu redakto ne jam estis patrolata.",
        "recentchanges-label-plusminus": "La paĝa grandeco ŝanĝiĝis je ĉi tiu nombro de bajtoj",
        "recentchanges-legend-heading": "'''Klarigo:'''",
-       "recentchanges-legend-newpage": "(vidu ankaŭ [[Special:NewPages|liston de novaj paĝoj]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vidu ankaŭ [[Special:NewPages|liston de novaj paĝoj]])",
        "rcnotefrom": "Malsupre estas ŝanĝoj ekde <strong>$2</strong> ({{PLURAL:$1|lasta|lastaj}} <strong>$1</strong>).",
        "rclistfrom": "Montri novajn ŝanĝojn ekde \"$3 $2\"",
        "rcshowhideminor": "$1 redaktetojn",
        "pageswithprop-prophidden-binary": "duuma trajta valoro kaŝita ($1)",
        "doubleredirects": "Duoblaj alidirektadoj",
        "doubleredirectstext": "Ĉi tiu paĝo montras paĝojn kiuj alidirektas al aliaj alidirektiloj.\nĈiu vico enhavas ligilojn ĉe la unua kaj dua alidirektadoj, kaj la unua linio de la dua alidirektado, kiu ĝenerale montras la \"veran\" celpaĝon, kiu celu la unuan alidirektadon.\n<del>Forstrekitaj</del> listeroj estis riparitaj.",
-       "double-redirect-fixed-move": "[[$1]] estis alinomita; ĝi nun alidirektas al [[$2]]",
+       "double-redirect-fixed-move": "[[$1]] estis alinomigita. Ĝi estis ĝisdatigita kaj nun ĝi alidirektas al [[$2]].",
        "double-redirect-fixed-maintenance": "Riparas duoblan alidirektilon de [[$1]] al [[$2]].",
        "double-redirect-fixer": "Alidirektila riparilo",
        "brokenredirects": "Rompitaj alidirektadoj",
        "wantedtemplates": "Dezirataj ŝablonoj",
        "mostlinked": "Plej ligitaj paĝoj",
        "mostlinkedcategories": "Plej ligitaj kategorioj",
-       "mostlinkedtemplates": "Plej ligitaj ŝablonoj",
+       "mostlinkedtemplates": "Plej transkludataj paĝoj",
        "mostcategories": "Artikoloj kun la plej multaj kategorioj",
        "mostimages": "Plej ligitaj bildoj",
        "mostinterwikis": "Artikoloj kun la plej multaj interlingvaj ligiloj",
        "log-title-wildcard": "Serĉi titolojn komencantajn kun ĉi tiu teksto",
        "showhideselectedlogentries": "Montri/kaŝi elektitajn protokolerojn",
        "allpages": "Ĉiuj paĝoj",
-       "alphaindexline": "$1 ĝis $2",
        "nextpage": "Sekvanta paĝo ($1)",
        "prevpage": "Antaŭa paĝo ($1)",
        "allpagesfrom": "Montri paĝojn ekde:",
        "unwatchthispage": "Malatenti paĝon",
        "notanarticle": "Ne estas artikolo",
        "notvisiblerev": "Versio estis forigita",
-       "watchlist-details": "{{PLURAL:$1|$1 paĝon|$1 paĝojn}} en via atentaro, krom diskutpaĝoj.",
+       "watchlist-details": "{{PLURAL:$1|$1 paĝo|$1 paĝoj}} en via atentaro, ne aparte kalkulante diskutpaĝojn.",
        "wlheader-enotif": "Retpoŝta sciigo estas ŝalta.",
        "wlheader-showupdated": "Paĝoj montriĝis per '''dikaj literoj''' kiuj estis ŝanĝitaj ekde vi laste vizitis.",
        "wlnote2": "Malsupre estas la ŝanĝoj en la {{PLURAL:$1|lasta horo|lastaj <strong>$1</strong> horoj}}, ekde $2, $3.",
        "contributions-title": "Kontribuoj de uzanto $1",
        "mycontris": "Kontribuoj",
        "contribsub2": "De {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Uzanto-konto \"$1\" ne estas registrita.",
        "nocontribs": "Trovis neniajn redaktojn laŭ tiu kriterio.",
        "uctop": " (aktuala)",
        "month": "Ekde monato (kaj pli frue):",
        "tooltip-summary": "Enigu mallongan resumon",
        "interlanguage-link-title": "$1 — $2",
        "common.css": "/* La jena CSS influos la aspekton de ĉiaj temoj. */",
-       "cologneblue.css": "/* La jena CSS influos la paĝaspekton por uzantoj de la Kolonja Blua temo. */",
-       "monobook.css": "/* La jena CSS influos la paĝaspekton por uzantoj de la Libreja temo. */",
-       "modern.css": "/* La jena CSS influos la paĝaspekton por uzantoj de la Moderna temo. */",
-       "vector.css": "/* La jena CSS influos la paĝaspekton por uzantoj de la Vektora temo. */",
        "print.css": "/* La jena CSS influos la prezentadon de la presaĵo. */",
        "noscript.css": "/* La jena CSS influos uzantojn, kiuj desebligis Ĝavaskripton. */",
        "group-autoconfirmed.css": "/* La jena CSS sole influos auxtokonfirmatajn uzantojn. */",
        "group-sysop.css": "/* La jena CSS sole influos administrantojn. */",
        "group-bureaucrat.css": "/* La jena CSS sole influos burokratojn. */",
        "common.js": "/* La jena Ĝavaskripto ŝargiĝos por ĉiaj uzantoj ĉe ĉiu paĝoŝargado. */",
-       "cologneblue.js": "/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Kolonja Blua temo. */",
-       "monobook.js": "/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Libreja temo. */",
-       "modern.js": "/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Moderna temo. */",
-       "vector.js": "/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Vektora temo. */",
        "group-autoconfirmed.js": "/* La jena Ĝavaskripto sole ŝargiĝos por auxtokonfirmataj uzantoj. */",
        "group-bot.js": "/* La jena Ĝavaskripto sole ŝargiĝos por robotoj. */",
        "group-sysop.js": "/* La jena Ĝavaskripto sole ŝargiĝos por administrantoj. */",
        "pageinfo-category-pages": "Nombro de paĝoj",
        "pageinfo-category-subcats": "Nombro de subkategorioj",
        "pageinfo-category-files": "Nombro de dosieroj",
-       "skinname-cologneblue": "Kolonja Bluo",
-       "skinname-monobook": "Librejo",
-       "skinname-modern": "Moderno",
-       "skinname-vector": "Vektoro",
        "markaspatrolleddiff": "Marki kiel patrolitan",
        "markaspatrolledtext": "Marki ĉi tiun paĝon kiel patrolitan",
        "markedaspatrolled": "Markita kiel patrolita",
        "watchlistedit-normal-title": "Redakti atentaron",
        "watchlistedit-normal-legend": "Forigi titolojn de atentaro",
        "watchlistedit-normal-explain": "Jen titoloj de via atentaro.\nForigi titolon, marku la skatoleto apude de ĝi, kaj klaku \"{{int:Watchlistedit-normal-submit}}\".\nVi ankaŭ povas [[Special:EditWatchlist/raw|redakti la krudan liston]].",
-       "watchlistedit-normal-submit": "Forigi Titolojn",
+       "watchlistedit-normal-submit": "Forigi titolojn",
        "watchlistedit-normal-done": "{{PLURAL:$1|1 titolo estis forigita|$1 titoloj estis forigitaj}} de via atentaro:",
        "watchlistedit-raw-title": "Redakti krudan atentaron",
        "watchlistedit-raw-legend": "Redakti krudan atentaron",
        "watchlistedit-raw-done": "Via atentaro estas ĝisdatigita.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 titolo estis aldonita|$1 titoloj estis aldonitaj}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 titolo estis forigita|$1 titoloj estis forigitaj}}:",
+       "watchlistedit-clear-title": "Malplenigita atentaro",
+       "watchlistedit-clear-legend": "Malplenigi la atentaron",
+       "watchlistedit-clear-explain": "Ĉiuj el la titoloj estos forigitaj el via atentaro",
+       "watchlistedit-clear-titles": "Titoloj:",
+       "watchlistedit-clear-submit": "Malplenigi la atentaron (Tio estas definitiva!)",
+       "watchlistedit-clear-done": "Via atentaro estas malplenigita.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 titolo estis forigita|$1 titoloj estis forigitaj}}:",
+       "watchlistedit-too-many": "Estas tro da pagoj por montri ĉi tie.",
+       "watchlisttools-clear": "Malplenigi la atentaron",
        "watchlisttools-view": "Rigardi koncernajn ŝanĝojn",
        "watchlisttools-edit": "Rigardi kaj redakti atentaron",
        "watchlisttools-raw": "Redakti krudan atentaron",
        "htmlform-no": "Ne",
        "htmlform-yes": "Jes",
        "htmlform-chosen-placeholder": "Elektu opcion",
+       "htmlform-cloner-create": "Aldoni plian",
+       "htmlform-cloner-delete": "Forigi",
+       "htmlform-cloner-required": "Almenaŭ unu valoro estas nepra.",
        "sqlite-has-fts": "$1 kun tut-teksta subteno",
        "sqlite-no-fts": "$1 sen tut-teksta subteno",
        "logentry-delete-delete": "$1 forigis paĝon $3",
        "limitreport-templateargumentsize": "Grandeco de argumentoj de ŝablonoj",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|bitoko|bitokoj}}",
        "limitreport-expensivefunctioncount": "Nombro de kostaj sintaks-analizilaj funkcioj",
-       "expandtemplates": "Ampleksigi ŝablonojn",
+       "expandtemplates": "Ŝablonetendilo",
        "expand_templates_intro": "Ĉi tiu speciala paĝo traktas tekston kaj ampleksigas ĉiujn ŝablonojn en ĝi rekursie.\nĜi ankaŭ ampleksigas sintaksajn funkciojn kiel\n<code><nowiki>{{</nowiki>#language:…}}</code> kaj variablojn kiel\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>. Fakte preskaŭ iujn ajn en duoblaj krampoj.",
        "expand_templates_title": "Kunteksta titolo, por {{FULLPAGENAME}}, ktp.:",
        "expand_templates_input": "Enigita teksto:",
index 780cbfa..1bb9b51 100644 (file)
                        "Csbotero",
                        "아라",
                        "Mcervera",
-                       "Wifidel"
+                       "Wifidel",
+                       "Macofe",
+                       "Koavf"
                ]
        },
        "tog-underline": "Subrayar los enlaces:",
        "tog-usenewrc": "Agrupar los cambios por página en los cambios recientes y en la lista de seguimiento",
        "tog-numberheadings": "Numerar automáticamente los encabezados",
        "tog-showtoolbar": "Mostrar la barra de edición",
-       "tog-editondblclick": "Editar las páginas al hace doble clic",
-       "tog-editsectiononrightclick": "Activar la edición de secciones pulsando el botón derecho en los títulos de secciones",
+       "tog-editondblclick": "Editar las páginas al hacer doble clic",
+       "tog-editsectiononrightclick": "Permitir modificar secciones al pulsar con el botón secundario del ratón en sus títulos",
        "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-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 mensajes que envíe a otros usuarios",
-       "tog-diffonly": "No mostrar bajo las ''diferencias'' el contenido de la página",
-       "tog-showhiddencats": "Mostrar las categorías escondidas",
+       "tog-ccmeonemails": "Enviarme copias de los correos electrónicos que envíe a otros usuarios",
+       "tog-diffonly": "No mostrar el contenido de la página bajo las diferencias",
+       "tog-showhiddencats": "Mostrar las categorías ocultas",
        "tog-norollbackdiff": "Omitir la diferencia después de revertir",
-       "tog-useeditwarning": "Advertirme cuando abandone una página editada con cambios sin grabar",
+       "tog-useeditwarning": "Avisarme cuando abandone una página de edición con cambios sin guardar",
        "tog-prefershttps": "Utilizar una conexión segura siempre que haya iniciado una sesión",
        "underline-always": "Siempre",
        "underline-never": "Nunca",
        "category_header": "Páginas en la categoría «$1»",
        "subcategories": "Subcategorías",
        "category-media-header": "Archivos multimedia en la categoría «$1»",
-       "category-empty": "''La categoría no contiene ninguna página o archivo.''",
+       "category-empty": "<em>Esta categoría no contiene ninguna página o archivo.</em>",
        "hidden-categories": "{{PLURAL:$1|Categoría oculta|Categorías ocultas}}",
        "hidden-category-category": "Categorías ocultas",
        "category-subcat-count": "{{PLURAL:$2|Esta categoría solo contiene la siguiente subcategoría.|Esta categoría contiene {{PLURAL:$1|la siguiente subcategoría|las siguientes $1 subcategorías}}, de un total de $2.}}",
        "qbedit": "Editar",
        "qbpageoptions": "Opciones de página",
        "qbmyoptions": "Mis páginas",
-       "faq": "Preguntas más frecuentes",
+       "faq": "Preguntas frecuentes",
        "faqpage": "Project:P+F",
-       "vector-action-addsection": "Nueva sección",
-       "vector-action-delete": "Borrar",
-       "vector-action-move": "Trasladar",
-       "vector-action-protect": "Proteger",
-       "vector-action-undelete": "Restaurar",
-       "vector-action-unprotect": "Cambiar protección",
-       "vector-view-create": "Crear",
-       "vector-view-edit": "Editar",
-       "vector-view-history": "Ver historial",
-       "vector-view-view": "Leer",
-       "vector-view-viewsource": "Ver código",
        "actions": "Acciones",
        "namespaces": "Espacios de nombres",
        "variants": "Variantes",
        "jumptonavigation": "navegación",
        "jumptosearch": "buscar",
        "view-pool-error": "Lo sentimos, los servidores están sobrecargados en este momento.\nHay demasiados usuarios que están tratando de ver esta página.\nEspera un momento antes de tratar de acceder nuevamente a esta página.\n\n$1",
-       "generic-pool-error": "Lo sentimos, los servidores están sobrecargados por el momento.\nHay demasiados usuarios tratando de ver esta página.\nIntentes acceder nuevamente a esta página dentro de un rato.",
+       "generic-pool-error": "Lo sentimos, los servidores están sobrecargados en este momento.\nHay demasiados usuarios que están tratando de ver este recurso.\nEspera un momento antes de tratar de acceder nuevamente a este recurso.",
        "pool-timeout": "Tiempo limite agotado para el bloqueo",
        "pool-queuefull": "La cola de trabajo está llena",
        "pool-errorunknown": "Error desconocido",
        "policy-url": "Project:Políticas",
        "portal": "Portal de la comunidad",
        "portal-url": "Project:Portal de la comunidad",
-       "privacy": "Política de protección de datos",
-       "privacypage": "Project:Política de protección de datos",
+       "privacy": "Política de privacidad",
+       "privacypage": "Project:Política de privacidad",
        "badaccess": "Error de permisos",
        "badaccess-group0": "No estás autorizado a ejecutar la acción solicitada.",
        "badaccess-groups": "La acción que has solicitado está restringida a los usuarios {{PLURAL:$2|del grupo|de uno de estos $2 grupos}}: $1.",
        "editlink": "modificar",
        "viewsourcelink": "ver código",
        "editsectionhint": "Editar sección: $1",
-       "toc": "Contenido",
+       "toc": "Contenidos",
        "showtoc": "mostrar",
        "hidetoc": "ocultar",
        "collapsible-collapse": "Contraer",
        "nstab-help": "Ayuda",
        "nstab-category": "Categoría",
        "nosuchaction": "No existe esa acción",
-       "nosuchactiontext": "La acción especificada en la dirección no es válida.\nEs posible que hayas escrito mal la URL o que hayas seguido un enlace incorrecto. Esto también podría indicar un error en el software utilizado en {{SITENAME}}.",
+       "nosuchactiontext": "La acción especificada en la URL no es válida.\nEs posible que hayas escrito mal la URL o que hayas seguido un enlace incorrecto.\nEsto también podría indicar un error en el software utilizado en {{SITENAME}}.",
        "nosuchspecialpage": "No existe esa página especial",
        "nospecialpagetext": "<strong>Ha solicitado una página especial inexistente.</strong>\n\nPuedes ver una lista de las páginas especiales en [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Error",
        "databaseerror": "Error de la base de datos",
-       "databaseerror-text": "Ocurrió un error de consulta de la base de datos.\nEsto puede indicar un fallo en el software.",
-       "databaseerror-textcl": "Se ha producido un error en la base de datos.",
+       "databaseerror-text": "Ocurrió un error de consulta a la base de datos.\nEsto puede indicar un fallo en el software.",
+       "databaseerror-textcl": "Se ha producido un error de consulta a la base de datos.",
        "databaseerror-query": "Consulta: $1",
        "databaseerror-function": "Función: $1",
        "databaseerror-error": "Error: $1",
-       "laggedslavemode": "'''Aviso:''' puede que falten las actualizaciones más recientes en esta página.",
+       "laggedslavemode": "<strong>Avertencia:</strong> puede que falten las actualizaciones más recientes en esta página.",
        "readonly": "Base de datos bloqueada",
        "enterlockreason": "Explica el motivo del bloqueo, incluyendo una estimación de cuándo se producirá el desbloqueo",
        "readonlytext": "La base de datos no permite nuevas entradas u otras modificaciones de forma temporal, probablemente por mantenimiento rutinario, tras lo cual volverá a la normalidad.\n\nLa explicación dada por el administrador que la bloqueó fue: $1",
        "missing-article": "La base de datos no encuentra el texto de una página que debería hallarse, llamada «$1» $2.\n\nLa causa de esto suele deberse a un ''diff'' anacrónico o un enlace al historial de una página que ha sido borrada.\n\nSi no fuera el caso, puedes haber encontrado un fallo en el software.\n\nPor favor, avisa a un [[Special:ListUsers/sysop|administrador]], tomando nota de la URL.",
        "missingarticle-rev": "(n.º de revisión: $1)",
        "missingarticle-diff": "(Dif.: $1, $2)",
-       "readonly_lag": "La base de datos se ha bloqueado temporalmente mientras los servidores se sincronizan.",
+       "readonly_lag": "La base de datos se ha bloqueado automáticamente mientras los servidores de base de datos esclavos se sincronizan con el maestro.",
        "internalerror": "Error interno",
        "internalerror_info": "Error interno: $1",
        "filecopyerror": "No se pudo copiar el archivo «$1» a «$2».",
        "badtitle": "Título incorrecto",
        "badtitletext": "El título de la página solicitada está vacío, no es válido, o es un enlace interidioma o interwiki incorrecto.\nPuede que contenga uno o más caracteres que no se pueden usar en los títulos.",
        "perfcached": "Los siguientes datos provienen de la caché y pueden no estar actualizados. La caché puede contener {{PLURAL:$1|un resultado|$1 resultados}} como máximo.",
-       "perfcachedts": "Los siguientes datos provienen de la caché y su última fecha y hora de actualización es: $1. La caché puede contener {{PLURAL:$4|un resultado|$4 resultados}} como máximo.",
+       "perfcachedts": "Los siguientes datos provienen de la caché y su última actualización fue: $1. La caché puede contener {{PLURAL:$4|un resultado|$4 resultados}} como máximo.",
        "querypage-no-updates": "Actualmente las actualizaciones de esta página están desactivadas. Estos datos no serán actualizados a corto plazo.",
        "viewsource": "Ver código",
        "viewsource-title": "Ver el código de «$1»",
        "actionthrottledtext": "Como medida contra el ''spam'', la acción que estás realizando está limitada a un número determinado de veces en un periodo corto de tiempo, y has excedido ese límite. Por favor inténtalo de nuevo en unos minutos.",
        "protectedpagetext": "Esta página ha sido protegida para evitar su edición u otras acciones.",
        "viewsourcetext": "Puedes ver y copiar el código fuente de esta página:",
-       "viewyourtext": "Puedes ver y copiar el código de '''tus ediciones''' a esta página:",
+       "viewyourtext": "Puedes ver y copiar el código de <strong>tus ediciones</strong> a esta página:",
        "protectedinterface": "Esta página proporciona el texto de la interfaz del software en este wiki, y está protegida para prevenir el abuso.\nPara agregar o cambiar las traducciones para todos los wikis, por favor, usa [//translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.",
-       "editinginterface": "<strong>Aviso:</strong> Estás editando una página usada para proporcionar el texto de la interfaz para el software. \nLos cambios en esta página afectarán la apariencia de la interfaz para los demás usuarios de este wiki. \nPara añadir o cambiar las traducciones utiliza [//translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.",
+       "editinginterface": "<strong>Advertencia:</strong> Estás editando una página usada para proporcionar el texto de la interfaz para el software. \nLos cambios en esta página afectarán la apariencia de la interfaz para los demás usuarios de este wiki. \nPara añadir o cambiar las traducciones de todos los wikis utiliza [//translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.",
        "cascadeprotected": "Esta página ha sido protegida para su edición, porque está incluida en {{PLURAL:$1|la siguiente página|las siguientes páginas}}, que están protegidas con la opción de «cascada»:\n$2",
-       "namespaceprotected": "No tienes permiso para editar las páginas del espacio de nombres '''$1'''.",
+       "namespaceprotected": "No tienes permiso para editar las páginas del espacio de nombres <strong>$1</strong>.",
        "customcssprotected": "No tienes permiso para editar esta página CSS, porque contiene configuraciones personales de otro usuario.",
        "customjsprotected": "No tienes permiso para editar esta página JavaScript, porque contiene configuraciones personales de otro usuario.",
        "mycustomcssprotected": "No tienes permiso para editar esta página CSS.",
        "myprivateinfoprotected": "No tienes permiso para editar tu información privada.",
        "mypreferencesprotected": "No tienes permiso para editar tus preferencias.",
        "ns-specialprotected": "No se pueden editar las páginas especiales.",
-       "titleprotected": "Esta página ha sido protegida contra creación por [[User:$1|$1]].\nEl motivo dado fue: \"''$2''\".",
+       "titleprotected": "Esta página ha sido protegida contra creación por [[User:$1|$1]].\nEl motivo dado fue \"<em>$2</em>\".",
        "filereadonlyerror": "No se puede modificar el archivo \"$1\" porque el repositorio de archivos \"$2\" está en modo de sólo lectura.\nEl administrador que lo ha bloqueado ofrece esta explicación: \"$3\".",
-       "invalidtitle-knownnamespace": "Título no válido con el espacio de nombres \"$2\" y el texto \"$3\"",
-       "invalidtitle-unknownnamespace": "Título no válido con número de espacio de nombres desconocido  $1  y el texto \"$2\"",
+       "invalidtitle-knownnamespace": "El título con el espacio de nombres «$2» y el texto «$3» no es válido",
+       "invalidtitle-unknownnamespace": "El título con el espacio de nombres desconocido (n.º $1) y el texto «$2» no es válido",
        "exception-nologin": "No has iniciado sesión",
        "exception-nologin-text": "[[Special:Userlogin|Inicia sesión]] para acceder a esta página o acción.",
        "exception-nologin-text-manual": "Necesitas $1 para acceder a esta página o acción.",
        "virus-scanfailed": "falló el análisis (código $1)",
        "virus-unknownscanner": "antivirus desconocido:",
        "logouttext": "<strong>Ha finalizado tu sesión.</strong>\n\nPuede que algunas páginas continúen mostrándose como si la sesión estuviera iniciada hasta que vacíes la memoria caché del navegador.",
-       "welcomeuser": "¡Te damos la bienvenida, $1!",
-       "welcomecreation-msg": "Se ha creado tu cuenta.\nNo olvides personalizar tus [[Special:Preferences|preferencias de {{SITENAME}}]].",
-       "yourname": "Nombre de usuario:",
+       "welcomeuser": "¡Bienvenido, $1!",
+       "welcomecreation-msg": "Se ha creado tu cuenta.\nPuedes cambiar tus [[Special:Preferences|preferencias]] de {{SITENAME}} si lo deseas.",
+       "yourname": "Usuario:",
        "userlogin-yourname": "Usuario",
        "userlogin-yourname-ph": "Escribe tu nombre de usuario",
        "createacct-another-username-ph": "Escribe el nombre de usuario",
        "userlogin-remembermypassword": "Mantener mi sesión iniciada",
        "userlogin-signwithsecure": "Usar conexión segura",
        "yourdomainname": "Tu dominio:",
-       "password-change-forbidden": "No puedes cambiar las contraseñas de este wiki.",
-       "externaldberror": "Hubo un error de autenticación externa de la base de datos o bien no tienes autorización para actualizar tu cuenta externa.",
+       "password-change-forbidden": "No puedes cambiar las contraseñas en este wiki.",
+       "externaldberror": "Hubo un error de autenticación de la base de datos o bien no tienes autorización para actualizar tu cuenta externa.",
        "login": "Iniciar sesión",
        "nav-login-createaccount": "Acceder/crear cuenta",
        "loginprompt": "Hay que activar las ''cookies'' en el navegador para iniciar sesión en {{SITENAME}}.",
        "gotaccountlink": "Acceder",
        "userlogin-resetlink": "¿Olvidaste tus datos de acceso?",
        "userlogin-resetpassword-link": "¿Has olvidado tu contraseña?",
-       "userlogin-helplink2": "Ayuda con el registro",
+       "userlogin-helplink2": "Ayuda con el acceso",
        "userlogin-loggedin": "Ya estás conectado como {{GENDER:$1|$1}}.\nUsa el formulario de abajo para iniciar sesión como otro usuario.",
        "userlogin-createanother": "Crear otra cuenta",
        "createacct-emailrequired": "Dirección de correo electrónico",
        "createacct-emailoptional": "Dirección de correo electrónico (opcional)",
        "createacct-email-ph": "Escribe tu dirección de correo electrónico",
-       "createacct-another-email-ph": "Introduzca la dirección de correo electrónico",
+       "createacct-another-email-ph": "Escribe la dirección de correo electrónico",
        "createaccountmail": "Utilizar una contraseña aleatoria temporal y enviarla a la dirección de correo electrónico especificada",
        "createacct-realname": "Nombre real (opcional)",
        "createaccountreason": "Motivo:",
        "nocookieslogin": "{{SITENAME}} utiliza <em>cookies</em> para la autenticación de usuarios. Las <em>cookies</em> están desactivadas en tu navegador. Por favor, actívalas e inténtalo de nuevo.",
        "nocookiesfornew": "No se pudo crear la cuenta de usuario, porque no pudimos confirmar su origen.\nAsegúrate de que tienes las cookies activadas, luego recarga esta página e inténtalo de nuevo.",
        "noname": "No se ha especificado un nombre de usuario válido.",
-       "loginsuccesstitle": "Has accedido correctamente",
-       "loginsuccess": "'''Has iniciado sesión en {{SITENAME}} como «$1».'''",
+       "loginsuccesstitle": "Ya iniciaste sesión",
+       "loginsuccess": "<strong>Has accedido a {{SITENAME}} como «$1».</strong>",
        "nosuchuser": "No existe ningún usuario llamado «$1».\nLos nombres de usuario son sensibles a las mayúsculas.\nRevisa la ortografía, o [[Special:UserLogin/signup|crea una cuenta nueva]].",
        "nosuchusershort": "No hay un usuario con el nombre «$1». Comprueba que lo has escrito correctamente.",
        "nouserspecified": "Debes especificar un nombre de usuario.",
        "password-name-match": "Tu contraseña debe ser diferente de tu nombre de usuario.",
        "password-login-forbidden": "El uso de este nombre de usuario y contraseña han sido prohibidos.",
        "mailmypassword": "Restablecer la contraseña",
-       "passwordremindertitle": "Recordatorio de contraseña de {{SITENAME}}",
+       "passwordremindertitle": "Nueva contraseña temporal para {{SITENAME}}",
        "passwordremindertext": "Alguien (probablemente tú, desde la dirección IP $1) solicitó que te enviáramos una nueva contraseña para tu cuenta en {{SITENAME}} ($4).\nSe ha creado la siguiente contraseña temporal para el usuario «$2»: «$3»\nAhora deberías iniciar sesión y cambiar tu contraseña. Tu contraseña temporal expirará en {{PLURAL:$5|un día|$5 días}}.\n\nSi fue otro quien solicitó este mensaje o has recordado tu contraseña y ya no deseas cambiarla, puedes ignorar este mensaje y seguir usando tu contraseña original.",
        "noemail": "No hay una dirección de correo electrónico registrada para «$1».",
        "noemailcreate": "Necesitas proveer una dirección de correo electrónico válida",
        "noemailprefs": "Especifica una dirección electrónica para habilitar estas características.",
        "emailconfirmlink": "Confirmar dirección de correo electrónico",
        "invalidemailaddress": "La dirección electrónica no puede ser aceptada, pues parece que tiene un formato no válido.\nPor favor, escribe una dirección en el formato adecuado o deja el campo en blanco.",
-       "cannotchangeemail": "Las direcciones de la correo electrónico de las cuentas de usuario no puedes cambiarse en esta wiki.",
-       "emaildisabled": "Este sitio no puede enviar mensajes de correo electrónico.",
+       "cannotchangeemail": "Las direcciones de la correo electrónico de las cuentas de usuario no pueden cambiarse en esta wiki.",
+       "emaildisabled": "Este sitio no puede enviar correos electrónicos.",
        "accountcreated": "Se ha creado la cuenta",
        "accountcreatedtext": "La cuenta de usuario de [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) ha sido creada.",
        "createaccount-title": "Creación de cuenta para {{SITENAME}}",
-       "createaccount-text": "Alguien creó en {{SITENAME}} ($4) una cuenta asociada a este correo electrónico con el nombre «$2».\nLa contraseña asignada automáticamente es «$3». Por favor entra ahora y cambia tu contraseña.\n\nPuedes ignorar este mensaje si esta cuenta fue creada por error.",
-       "login-throttled": "Has intentado demasiadas veces iniciar sesión. Por favor espera $1 antes de intentarlo nuevamente.",
+       "createaccount-text": "Alguien creó en {{SITENAME}} ($4) una cuenta asociada a este correo electrónico con el nombre «$2» y contraseña «$3». Por favor entra ahora y cambia tu contraseña.\n\nPuedes ignorar este mensaje si esta cuenta fue creada por error.",
+       "login-throttled": "Has intentado demasiadas veces iniciar sesión recientemente. Por favor espera $1 antes de intentarlo nuevamente.",
        "login-abort-generic": "Tu inicio de sesión no fue exitoso - Cancelado",
        "loginlanguagelabel": "Idioma: $1",
        "suspicious-userlogout": "Tu solicitud de desconexión ha sido denegada, pues parece haber sido enviada desde un navegador defectuoso o un proxy caché.",
        "retypenew": "Confirmar la contraseña nueva:",
        "resetpass_submit": "Establecer contraseña e iniciar sesión",
        "changepassword-success": "La contraseña se modificó correctamente.",
-       "changepassword-throttled": "Has intentado acceder demasiadas veces.\nEspera $1 antes de intentarlo de nuevo.",
+       "changepassword-throttled": "Has intentado acceder demasiadas veces recientemente.\nEspera $1 antes de intentarlo de nuevo.",
        "resetpass_forbidden": "No se pueden cambiar las contraseñas",
        "resetpass-no-info": "Debes iniciar sesión para acceder directamente a esta página.",
        "resetpass-submit-loggedin": "Cambiar contraseña",
        "resetpass-submit-cancel": "Cancelar",
-       "resetpass-wrong-oldpass": "La contraseña antigua no es correcta.\nPuede que ya hayas cambiado la contraseña o que hayas pedido una temporal.",
+       "resetpass-wrong-oldpass": "La contraseña actual, o temporal, no es correcta.\nPuede que ya hayas cambiado exitosamente tu contraseña o que hayas pedido una nueva contraseña temporal.",
        "resetpass-recycled": "Restablece tu contraseña a algo distinto de tu contraseña actual.",
-       "resetpass-temp-emailed": "Has iniciado sesión con un código temporal por correo electrónico.\nPara terminar la sesión, debes establecer una nueva contraseña aquí:",
+       "resetpass-temp-emailed": "Has iniciado sesión con un código temporal por correo electrónico.\nPara terminar el acceso, debes establecer una nueva contraseña aquí:",
        "resetpass-temp-password": "Contraseña temporal:",
        "resetpass-abort-generic": "Una extensión ha cancelado el cambio de la contraseña.",
        "resetpass-expired": "Tu contraseña ha caducado. Por favor, establece una nueva contraseña para iniciar sesión.",
-       "resetpass-expired-soft": "Su contraseña ha caducado y necesita reajustarse. Elija una nueva contraseña ahora, o haga clic en \"{{int:resetpass-enviar-cancelar}}\" para restaurarla más adelante.",
+       "resetpass-expired-soft": "Tu contraseña ha caducado y necesita restablecerse. Elije una nueva contraseña ahora, o haga clic en \"{{int:resetpass-submit-cancel}}\" para restaurarla más adelante.",
        "resetpass-validity-soft": "Tu contraseña no es válida: $1\n\nCámbiala ahora por una nueva, o haz clic en \"{{int:resetpass-submit-cancel}}\" para cambiarla más tarde.",
-       "passwordreset": "Restablecimiento de contraseña",
-       "passwordreset-text-one": "Completa este formulario para restablecer tu contraseña.",
-       "passwordreset-text-many": "{{PLURAL:$1|Rellena uno de los campos para restablecer la contraseña.}}",
+       "passwordreset": "Restablecer contraseña",
+       "passwordreset-text-one": "Completa este formulario para recibir una contraseña temporal por correo electrónico.",
+       "passwordreset-text-many": "{{PLURAL:$1|Rellena uno de los campos para  recibir una contraseña temporal por correo electrónico.}}",
        "passwordreset-legend": "Restablecer contraseña",
        "passwordreset-disabled": "Se ha desactivado el restablecimiento de contraseñas en este wiki.",
        "passwordreset-emaildisabled": "Las funciones de correo electrónico han sido desactivadas en esta wiki.",
        "passwordreset-email": "Dirección de correo electrónico:",
        "passwordreset-emailtitle": "Detalles de la cuenta en {{SITENAME}}",
        "passwordreset-emailtext-ip": "Alguien (probablemente tú, desde la dirección IP $1) ha solicitado la renovación de tu clave para {{SITENAME}} ($4). {{PLURAL:$3|La siguiente cuenta está asociada|Las siguientes cuentas están asociadas}}\ncon esta dirección de correo electrónico:\n\n$2\n\n{{PLURAL:$3|Esta contraseña temporal|Estas contraseñas temporales}} caducarán en {{PLURAL:$5|un día|$5 días}}.\nDeberías iniciar sesión y establecer una contraseña nueva ahora. Si otra persona ha realizado este solicitud\no si recuerdas tu contraseña original y no deseas cambiarla, puedes\nignorar este mensaje y continuar usando tu contraseña anterior.",
-       "passwordreset-emailtext-user": "El usuario $1 en {{SITENAME}} pidió un recordatorio de tus datos de cuenta para {{SITENAME}}\n($4). {{PLURAL:$3|La siguiente cuenta está asociada|Las siguientes cuentas están asociadas}} con esta dirección de correo electrónico:\n\n$2\n\n{{PLURAL:$3|Esta contraseña temporal|Estas contraseñas temporales}} expirarán en {{PLURAL:$5|un día|$5 días}}.\nDeberías iniciar sesión y establecer una contraseña nueva ahora. Si alguien más hizo este pedido,\no recuerdas tu contraseña original, y no deseas cambiarla, puedes\nignorar este mensaje y continuar usando tu contraseña anterior.",
+       "passwordreset-emailtext-user": "El usuario $1 en {{SITENAME}} pidió un restablecer tu contraseña para {{SITENAME}}\n($4). {{PLURAL:$3|La siguiente cuenta está asociada|Las siguientes cuentas están asociadas}} con esta dirección de correo electrónico:\n\n$2\n\n{{PLURAL:$3|Esta contraseña temporal|Estas contraseñas temporales}} expirarán en {{PLURAL:$5|un día|$5 días}}.\nDeberías iniciar sesión y establecer una contraseña nueva ahora. Si alguien más hizo este pedido,\no recuerdas tu contraseña original, y no deseas cambiarla, puedes\nignorar este mensaje y continuar usando tu contraseña anterior.",
        "passwordreset-emailelement": "Nombre de usuario: $1\nContraseña temporal: $2",
        "passwordreset-emailsent": "Se ha enviado un correo electrónico para el restablecimiento de tu contraseña.",
        "passwordreset-emailsent-capture": "Se ha enviado un correo para el restablecimiento de la contraseña, el cual se muestra a continuación.",
-       "passwordreset-emailerror-capture": "Se generó un correo electrónico de restablecimiento de contraseña, que se muestra a continuación, pero el envío {{GENDER:$2|al usuario|a la usuaria}} falló. $1",
+       "passwordreset-emailerror-capture": "Se generó un correo electrónico de restablecimiento de contraseña, que se muestra a continuación, pero el envío {{GENDER:$2|al usuario|a la usuaria}} falló: $1",
        "changeemail": "Cambiar la dirección de correo electrónico",
        "changeemail-header": "Cambiar la dirección de correo de la cuenta",
        "changeemail-text": "Rellena este formulario para cambiar tu dirección de correo electrónico. Debes introducir la contraseña para confirmar este cambio.",
        "preview": "Previsualizar",
        "showpreview": "Mostrar previsualización",
        "showdiff": "Mostrar los cambios",
-       "anoneditwarning": "'''Aviso:''' No has iniciado sesión con una cuenta de usuario.\nTu dirección IP se almacenará en el historial de ediciones de la página.",
-       "anonpreviewwarning": "''No has iniciado sesión con una cuenta de usuario. Al guardar los cambios se almacenará tu dirección IP en el historial de edición de la página.''",
-       "missingsummary": "'''Atención:''' No has escrito un resumen de edición. Si haces clic nuevamente en «{{int:savearticle}}» tu edición se grabará sin él.",
+       "anoneditwarning": "<strong>Advertencia:</strong> No has iniciado sesión.\nTu dirección IP se almacenará en el historial de edición de esta página.",
+       "anonpreviewwarning": "<em>No has iniciado sesión. Al guardar los cambios se almacenará tu dirección IP en el historial de edición de esta página.</em>",
+       "missingsummary": "<strong>Recordatorio:</strong> No has escrito un resumen de edición.\nSi haces clic nuevamente en «{{int:savearticle}}» tu edición se grabará sin él.",
        "missingcommenttext": "Escribe un comentario a continuación.",
-       "missingcommentheader": "'''Recordatorio:''' No has escrito un título para este comentario. Si haces clic nuevamente en \"{{int:savearticle}}\" tu edición se grabará sin él.",
+       "missingcommentheader": "<strong>Recordatorio:</strong> No has escrito un asunto/encabezado para este comentario.\nSi haces clic nuevamente en \"{{int:savearticle}}\" tu edición se grabará sin él.",
        "summary-preview": "Previsualización del resumen:",
-       "subject-preview": "Previsualización del tema/título:",
+       "subject-preview": "Previsualización del asunto/encabezado:",
        "blockedtitle": "El usuario está bloqueado",
-       "blockedtext": "'''Tu nombre de usuario o dirección IP ha sido bloqueada.'''\n\nEl bloqueo fue hecho por $1.\nLa razón dada es ''$2''.\n\n* Inicio del bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n\nPuedes contactar con $1 u otro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir el bloqueo.\nNo puedes utilizar la función «enviar correo electrónico a este usuario»  a menos que tengas una dirección de correo electrónico válida registrada en tus [[Special:Preferences|preferencias de usuario]] y que el bloqueo no haya inhabilitado esta función.\n\nTu dirección IP actual es $3, y el identificador del bloqueo es #$5.\nPor favor incluye todos los datos aquí mostrados en cualquier consulta que hagas.",
-       "autoblockedtext": "Tu dirección IP ha sido bloqueada automáticamente porque fue utilizada por otro usuario que fue bloqueado por $1.\nLa razón dada es esta:\n\n:''$2''\n\n* Inicio del bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n\nPuedes contactar con $1 o con otro de los [[{{MediaWiki:Grouppage-sysop}}|administradores]] para discutir el bloqueo.\n\nTen en cuenta que no podrás utilizar la herramienta de «enviar correo electrónico a este usuario» a menos que tengas una dirección de correo electrónico válida registrada en tus [[Special:Preferences|preferencias de usuario]] y que el bloqueo no haya inhabilitado esta función.\n\nTu actual dirección IP es $3, y el identificador del bloqueo es #$5.\nPor favor, incluye todos los datos mostrados aquí en cualquier consulta que hagas.",
+       "blockedtext": "<strong>Tu nombre de usuario o dirección IP ha sido bloqueada.</strong>\n\nEl bloqueo fue hecho por $1.\nLa razón dada es <em>$2</em>.\n\n* Inicio del bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n\nPuedes contactar a $1 u otro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir el bloqueo.\nNo puedes utilizar la función «enviar correo electrónico a este usuario»  a menos que tengas una dirección de correo electrónico válida registrada en tus [[Special:Preferences|preferencias de usuario]] y que el bloqueo no haya inhabilitado esta función.\n\nTu dirección IP actual es $3, y el identificador del bloqueo es #$5.\nPor favor incluye todos los datos aquí mostrados en cualquier consulta que hagas.",
+       "autoblockedtext": "Tu dirección IP ha sido bloqueada automáticamente porque fue utilizada por otro usuario que fue bloqueado por $1.\nLa razón dada es esta:\n\n:<em>$2</em>\n\n* Inicio del bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n\nPuedes contactar con $1 o con otro de los [[{{MediaWiki:Grouppage-sysop}}|administradores]] para discutir el bloqueo.\n\nTen en cuenta que no podrás utilizar la herramienta de «enviar correo electrónico a este usuario» a menos que tengas una dirección de correo electrónico válida registrada en tus [[Special:Preferences|preferencias de usuario]] y que el bloqueo no haya inhabilitado esta función.\n\nTu actual dirección IP es $3, y el identificador del bloqueo es #$5.\nPor favor, incluye todos los datos mostrados aquí en cualquier consulta que hagas.",
        "blockednoreason": "no se ha especificado el motivo",
        "whitelistedittext": "Tienes que $1 para editar artículos.",
        "confirmedittext": "Debes confirmar tu dirección electrónica antes de editar páginas. Por favor, establece y valida una dirección electrónica a través de tus [[Special:Preferences|preferencias de usuario]].",
        "loginreqlink": "acceder",
        "loginreqpagetext": "Debes $1 para ver otras páginas.",
        "accmailtitle": "Se ha enviado la contraseña",
-       "accmailtext": "Se ha enviado a $2 una contraseña generada aleatoriamente para [[User talk:$1|$1]].\n\nLa contraseña para esta nueva cuenta puede cambiarse en [[Special:ChangePassword|la página destinada para ello]] después de haber iniciado sesión.",
+       "accmailtext": "Se ha enviado a $2 una contraseña generada aleatoriamente para [[User talk:$1|$1]]. Puede cambiarse en la página [[Special:ChangePassword|destinada para ello]] después de haber iniciado sesión.",
        "newarticle": "(Nuevo)",
        "newarticletext": "Has seguido un enlace a una página que aún no existe.\nPara crear esta página, escribe en el campo a continuación. Para más información, consulta la [$1 página de ayuda].\nSi llegaste aquí por error, vuelve a la página anterior.",
        "anontalkpagetext": "---- ''Esta es la página de discusión de un usuario anónimo que aún no ha creado una cuenta, o no la usa. Por lo tanto, tenemos que usar su dirección IP para identificarlo. Una dirección IP puede ser compartida por varios usuarios. Si eres un usuario anónimo y crees que se han dirigido a ti con comentarios improcedentes, por favor [[Special:UserLogin/signup|crea una cuenta]] o si ya la tienes [[Special:UserLogin|identifícate]] para evitar confusiones futuras con otros usuarios anónimos.''",
        "session_fail_preview_html": "'''Lo sentimos, no hemos podido procesar tu cambio debido a una pérdida de datos de sesión.'''\n\n''Puesto que este wiki tiene el HTML puro habilitado, la visión preliminar está oculta para prevenirse contra ataques en JavaScript.''\n\n'''Si éste es un intento legítimo de modificación, por favor, inténtalo de nuevo. Si aún así no funcionase, [[Special:UserLogout|cierra la sesión]] e ingresa de nuevo.'''",
        "token_suffix_mismatch": "'''Tu edición ha sido rechazada porque tu cliente ha mezclado los signos de puntuación en el token de edición.\nSe rechazó la edición para evitar que el texto de la página se corrompa.\nEsto sucede en ocasiones cuando se usa un servicio de proxy anónimo defectuoso.'''",
        "edit_form_incomplete": "'''Algunas partes del formulario de edición no llegaron al servidor, comprueba que tus ediciones están intactas e inténtalo de nuevo'''.",
-       "editing": "Editar $1",
+       "editing": "Edición de «$1»",
        "creating": "Crear la página $1",
        "editingsection": "Editar $1 (sección)",
-       "editingcomment": "Editar $1 (sección nueva)",
+       "editingcomment": "Edición de «$1» (sección nueva)",
        "editconflict": "Conflicto de edición: $1",
        "explainconflict": "Alguien más ha cambiado esta página desde que empezaste a editarla.\nEl área de texto superior contiene el texto de la página como existe actualmente.\nTus cambios se muestran en el área de texto inferior.\nSi quieres grabar tus cambios, has de trasladarlos al área superior.\n'''Sólo''' el texto en el área de texto superior será grabado cuando pulses «{{int:savearticle}}».",
        "yourtext": "Tu texto",
        "edit-hook-aborted": "Edición cancelada por la extensión.\nNo se aportaron explicaciones.",
        "edit-gone-missing": "No se pudo actualizar la página.\nParece que ha sido borrada.",
        "edit-conflict": "Conflicto de edición.",
-       "edit-no-change": "Se ignoró tu revisión, porque no se hizo ningún cambio al texto.",
+       "edit-no-change": "Se ignoró tu edición porque no se hizo ningún cambio en el texto.",
        "postedit-confirmation-created": "Se ha creado la página.",
        "postedit-confirmation-restored": "Se ha restaurado la página.",
        "postedit-confirmation-saved": "Se ha guardado tu edición.",
        "currentrev": "Revisión actual",
        "currentrev-asof": "Última revisión de $1",
        "revisionasof": "Revisión de $1",
-       "revision-info": "Revisión a fecha de $1; $2",
+       "revision-info": "Revisión de $1 por {{GENDER:$6|$2}}$7",
        "previousrevision": "← Revisión anterior",
        "nextrevision": "Revisión siguiente →",
        "currentrevisionlink": "Revisión actual",
        "showhideselectedversions": "Mostrar/ocultar versiones seleccionadas",
        "editundo": "deshacer",
        "diff-empty": "(Sin diferencias)",
-       "diff-multi-sameuser": "({{PLURAL:$1|Una revisión intermedia|$1 revisiones intermedias}} por el mismo usuario no mostrado)",
+       "diff-multi-sameuser": "(No se {{PLURAL:$1|muestra una edición intermedia|muestran $1 ediciones intermedias}} del mismo usuario)",
        "diff-multi-otherusers": "(No se {{PLURAL:$1|muestra una edición intermedia|muestran $1 ediciones intermedias}} de {{PLURAL:$2|un usuario|$2 usuarios}})",
        "diff-multi-manyusers": "(No se {{PLURAL:$1|muestra una edición intermedia|muestran $1 ediciones intermedias}} de {{PLURAL:$2|un usuario|$2 usuarios}})",
        "difference-missing-revision": "No {{PLURAL:$2|se ha encontrado|se han encontrado}} {{PLURAL:$2|una revisión|$2 revisiones}} de esta diferencia ($1).\n\nEsto suele deberse a seguir un enlace obsoleto hacia una página que ya ha sido borrada.\nLos detalles pueden encontrarse en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrado].",
        "searchresults": "Resultados de la búsqueda",
        "searchresults-title": "Resultados de la búsqueda de «$1»",
-       "toomanymatches": "Se han obtenido muchos resultados; por favor intenta una consulta diferente",
        "titlematches": "Coincidencias de título de artículo",
        "textmatches": "Coincidencias de texto de artículo",
        "notextmatches": "No hay coincidencias de texto de artículo",
        "search-interwiki-default": "Resultados de $1:",
        "search-interwiki-more": "(más)",
        "search-relatedarticle": "Relacionado",
-       "searcheverything-enable": "Buscar en todos los espacios de nombres",
        "searchrelated": "relacionado",
        "searchall": "todos",
        "showingresults": "Abajo se {{PLURAL:$1|muestra '''1''' resultado|muestran hasta '''$1''' resultados}} comenzando por el n.º '''$2'''.",
        "powersearch-togglelabel": "Seleccionar:",
        "powersearch-toggleall": "Todos",
        "powersearch-togglenone": "Ninguno",
+       "powersearch-remember": "Recordar la selección en búsquedas futuras",
        "search-external": "Búsqueda externa",
        "searchdisabled": "Las búsquedas en {{SITENAME}} están temporalmente desactivadas.\nMientras tanto puedes buscar mediante Google, pero ten en cuenta que sus índices relativos a {{SITENAME}} pueden estar desactualizados.",
        "search-error": "Ha ocurrido un error al buscar: $1",
        "allowemail": "Aceptar correo electrónico de otros usuarios",
        "prefs-searchoptions": "Buscar",
        "prefs-namespaces": "Espacios de nombres",
-       "defaultns": "De lo contrario, buscar en estos espacios de nombres:",
        "default": "predeterminado",
        "prefs-files": "Archivos",
        "prefs-custom-css": "CSS personalizado",
        "prefs-advancedrendering": "Opciones avanzadas",
        "prefs-advancedsearchoptions": "Opciones avanzadas",
        "prefs-advancedwatchlist": "Opciones avanzadas",
-       "prefs-displayrc": "Opciones de mostrado",
+       "prefs-displayrc": "Opciones de visualización",
        "prefs-displaywatchlist": "Opciones de visualización",
        "prefs-tokenwatchlist": "Clave",
        "prefs-diffs": "Diferencias",
        "recentchanges-summary": "Sigue los cambios más recientes de la wiki en esta página.",
        "recentchanges-noresult": "No hubo cambios durante el período seleccionado que respondan a esos criterios.",
        "recentchanges-feed-description": "Realiza un seguimiento de los cambios más recientes en el wiki en este canal.",
-       "recentchanges-label-newpage": "Esta edición creó una nueva página",
+       "recentchanges-label-newpage": "Esta edición inició una página",
        "recentchanges-label-minor": "Esta es una edición menor",
        "recentchanges-label-bot": "Esta edición fue realizada por un robot",
        "recentchanges-label-unpatrolled": "Esta edición todavía no se ha patrullado",
        "recentchanges-label-plusminus": "El tamaño de la página cambió esta cantidad de bytes",
        "recentchanges-legend-heading": "'''Leyenda:'''",
-       "recentchanges-legend-newpage": "(véase también la [[Special:NewPages|lista de páginas nuevas]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (véase también la [[Special:NewPages|lista de páginas nuevas]])",
        "rcnotefrom": "A continuación se presentan los cambios desde <strong> $2 </strong> (hasta <strong> $1 </strong> se muestra).",
        "rclistfrom": "Mostrar nuevos cambios desde $2, $3",
        "rcshowhideminor": "$1 ediciones menores",
        "largefileserver": "El tamaño de este archivo es mayor del que este servidor admite por configuración.",
        "emptyfile": "El archivo que has intentado subir parece estar vacío; por favor, verifica que realmente se trate del archivo que intentabas subir.",
        "windows-nonascii-filename": "Este wiki no admite nombres de archivo con caracteres especiales.",
-       "fileexists": "Ya existe un archivo con este nombre, por favor comprueba <strong>[[:$1]]</strong> si no estás seguro de querer cambiarlo.\n[[$1|thumb]]",
+       "fileexists": "Ya existe un archivo con este nombre, por favor comprueba <strong>[[:$1]]</strong> si {{GENDER:|tú}} no estás seguro de querer cambiarlo.\n[[$1|thumb]]",
        "filepageexists": "La página de descripción de este archivo ya ha sido creada en <strong>[[:$1]]</strong>, pero no existe actualmente ningún fichero con este nombre.\nEl resumen que ha ingresado no aparecerá en la página de descripción. Para que el sumario aparezca, deberá editarlo manualmente.\n[[$1|thumb]]",
-       "fileexists-extension": "Existe un archivo con un nombre similar: [[$2|thumb]]\n* Nombre del archivo que se está subiendo: <strong>[[:$1]]</strong>\n* Nombre del archivo ya existente: <strong>[[:$2]]</strong>\nPor favor, elige un nombre diferente.",
+       "fileexists-extension": "Existe un archivo con un nombre similar: [[$2|thumb]]\n* Nombre del archivo que se está subiendo: <strong>[[:$1]]</strong>\n* Nombre del archivo ya existente: <strong>[[:$2]]</strong>\n¿Quieres cambiar el nombre para que sea más distintivo?",
        "fileexists-thumbnail-yes": "El archivo parece ser una imagen de tamaño reducido ''(thumbnail)''. [[$1|thumb]]\nPor favor comprueba el archivo <strong>[[:$1]]</strong>.\nSi el archivo comprobado es la misma imagen a tamaño original no es necesario subir un thumbnail más.",
        "file-thumbnail-no": "El nombre del archivo comienza con <strong>$1</strong>.\nParece ser una imagen de tamaño reducido ''(thumbnail)''.\nSi tiene esta imagen a toda resolución súbala, si no, por favor cambie el nombre del archivo.",
        "fileexists-forbidden": "Ya existe un archivo con este nombre, y no puede ser grabado encima de otro. Si quiere subir su archivo de todos modos, por favor vuelva atrás y utilice otro nombre. [[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Borrado y restauración de archivos temporalmente deshabilitados durante el mantenimiento.",
        "filedelete-maintenance-title": "No se puede eliminar el archivo",
        "mimesearch": "Búsqueda por MIME",
-       "mimesearch-summary": "Esta página permite el filtrado de ficheros por su tipo MIME.\nEntrada: contenttype/subtype, p. ej. <code>image/jpeg</code>.",
+       "mimesearch-summary": "Esta página permite el filtrado de ficheros por su tipo MIME.\nEntrada: contenttype/subtype o contenttype/*, p. ej. <code>image/jpeg</code>.",
        "mimetype": "Tipo MIME:",
        "download": "descargar",
        "unwatchedpages": "Páginas no vigiladas",
        "wantedtemplates": "Plantillas requeridas",
        "mostlinked": "Artículos más enlazados",
        "mostlinkedcategories": "Categorías más enlazadas",
-       "mostlinkedtemplates": "Plantillas más enlazadas",
+       "mostlinkedtemplates": "Páginas más transcluídas",
        "mostcategories": "Páginas con más categorías",
        "mostimages": "Imágenes más usadas",
        "mostinterwikis": "Páginas con más interwikis",
        "movepage-moved": "'''«$1» ha sido trasladado a «$2».'''",
        "movepage-moved-redirect": "Se ha creado una redirección.",
        "movepage-moved-noredirect": "Se ha suprimido la creación de la redirección.",
-       "articleexists": "Ya existe una página con ese nombre, o el nombre que has escogido no es válido.\nPor favor, elige otro nombre.",
+       "articleexists": "Ya existe una página con ese nombre o el nombre que elegiste no es válido.\nElige otro nombre.",
        "cantmove-titleprotected": "No puedes trasladar la página a esta ubicación, porque el nuevo título ha sido protegido para evitar su creación.",
        "movetalk": "Renombrar la página de discusión asociada",
        "move-subpages": "Intentar trasladar las subpáginas (hasta $1)",
        "tooltip-summary": "Introduce un breve resumen",
        "interlanguage-link-title": "$1 ($2)",
        "common.css": "/* El CSS colocado en esta página será aplicado a todas las apariencias */",
-       "monobook.css": "/* El CSS colocado en esta página afectará a los usuarios que usen la apariencia \"MonoBook\" */",
-       "vector.css": "/* El CSS colocado en esta página afectará a los usuarios que usen la apariencia \"Vector\" */",
        "print.css": "/* Los estilos CSS colocados aquí afectarán la impresión */",
        "noscript.css": "/* Los estilos CSS colocados aquí se aplicarán a los usuarios que hayan desactivado el JavaScript en su navegador */",
        "group-autoconfirmed.css": "/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios del grupo Usuarios autoconfirmados */",
        "group-sysop.css": "/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios del grupo Administradores */",
        "group-bureaucrat.css": "/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios del grupo Burócratas */",
        "common.js": "/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios en cada carga de página */",
-       "monobook.js": "/* El código JavaScript que se ponga aquí será cargado por los usuarios de la apariencia MonoBook */",
-       "vector.js": "/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la apariencia Vector */",
        "group-autoconfirmed.js": "/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios del grupo Usuarios autoconfirmados */",
        "group-bot.js": "/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios del grupo Bots */",
        "group-sysop.js": "/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios del grupo Administradores */",
        "spam_blanking": "Todas las revisiones contienen enlaces a $1, blanqueando",
        "spam_deleting": "Todas las revisiones que contienen enlaces a $1, en proceso de eliminación",
        "simpleantispam-label": "Comprobación anti-spam\n¡NO rellenes esto!",
-       "pageinfo-title": "Información para «$1»",
+       "pageinfo-title": "Información de «$1»",
        "pageinfo-not-current": "Lo sentimos, no es posible mostrar esta información para las revisiones antiguas.",
        "pageinfo-header-basic": "Información básica",
        "pageinfo-header-edits": "Historial de ediciones",
        "pageinfo-header-restrictions": "Protección de página",
        "pageinfo-header-properties": "Propiedades de página",
-       "pageinfo-display-title": "Visualizar el título",
+       "pageinfo-display-title": "Título visualizado",
        "pageinfo-default-sort": "Criterio de ordenación predeterminado",
        "pageinfo-length": "Longitud de la página (en bytes)",
-       "pageinfo-article-id": "Identificador ID de la página",
+       "pageinfo-article-id": "Identificador de la página",
        "pageinfo-language": "Idioma de la página",
        "pageinfo-content-model": "Modelo de contenido de la página",
        "pageinfo-robot-policy": "Indización por robots",
        "pageinfo-category-pages": "Número de páginas",
        "pageinfo-category-subcats": "Número de subcategorías",
        "pageinfo-category-files": "Número de archivos",
-       "skinname-monobook": "MonoBook",
-       "skinname-vector": "Vector",
        "markaspatrolleddiff": "Marcar como revisado",
        "markaspatrolledtext": "Marcar este artículo como revisado",
        "markedaspatrolled": "Marcado como revisado",
        "version-hook-name": "Nombre de la extensión",
        "version-hook-subscribedby": "Suscrito por",
        "version-version": "($1)",
+       "version-no-ext-name": "[sin nombre]",
        "version-license": "Licencia de MediaWiki",
        "version-ext-license": "Licencia",
        "version-ext-colheader-name": "Extensión",
index d311c95..8a5745e 100644 (file)
        "qbmyoptions": "Minu leheküljed",
        "faq": "KKK",
        "faqpage": "Project:KKK",
-       "vector-action-addsection": "Lisa teema",
-       "vector-action-delete": "Kustuta",
-       "vector-action-move": "Teisalda",
-       "vector-action-protect": "Kaitse",
-       "vector-action-undelete": "Taasta",
-       "vector-action-unprotect": "Muuda kaitset",
-       "vector-view-create": "Loo",
-       "vector-view-edit": "Muuda",
-       "vector-view-history": "Näita ajalugu",
-       "vector-view-view": "Vaata",
-       "vector-view-viewsource": "Vaata lähteteksti",
        "actions": "Toimingud",
        "namespaces": "Nimeruumid",
        "variants": "Variandid",
        "noname": "Sa ei sisestanud kasutajanime lubataval kujul.",
        "loginsuccesstitle": "Sisselogimine õnnestus",
        "loginsuccess": "Oled sisse loginud. Sinu kasutajanimi on \"$1\".",
-       "nosuchuser": "Kasutajat \"$1\" ei ole olemas.\nKasutajanimed on tõstutundlikud.\nKontrollige kirjapilti või [[Special:UserLogin/signup|looge uus kasutajakonto]].",
-       "nosuchusershort": "Kasutajat nimega \"$1\" ei ole olemas. Kontrollige kirjapilti.",
+       "nosuchuser": "Kasutajat \"$1\" pole.\nKasutajanimed on tõstutundlikud.\nKontrolli kirjapilti või [[Special:UserLogin/signup|loo uus konto]].",
+       "nosuchusershort": "Kasutajat nimega \"$1\" pole.\nKontrolli kirjapilti.",
        "nouserspecified": "Kasutajanimi puudub.",
        "login-userblocked": "See kasutaja on blokeeritud. Sisselogimine pole lubatud.",
        "wrongpassword": "Vale parool. Proovi uuesti.",
        "templatesusedpreview": "Eelvaates {{PLURAL:$1|kasutatav mall|kasutatavad mallid}}:",
        "templatesusedsection": "Selles alaosas {{PLURAL:$1|kasutatav mall|kasutatavad mallid}}:",
        "template-protected": "(kaitstud)",
-       "template-semiprotected": "(osaliselt kaitstud)",
+       "template-semiprotected": "(poolkaitstud)",
        "hiddencategories": "See lehekülg kuulub {{PLURAL:$1|1 peidetud kategooriasse|$1 peidetud kategooriasse}}:",
        "nocreatetext": "Lehekülje loomise õigus on {{GRAMMAR:inessive|{{SITENAME}}}} piiratud.\nVõid pöörduda tagasi ja toimetada olemasolevat lehekülge või [[Special:UserLogin|sisse logida või uue konto luua]].",
        "nocreate-loggedin": "Sul ei ole luba luua uusi lehekülgi.",
        "currentrev": "Viimane redaktsioon",
        "currentrev-asof": "Viimane redaktsioon: $1",
        "revisionasof": "Redaktsioon: $1",
-       "revision-info": "Redaktsioon seisuga $1 kasutajalt $2",
+       "revision-info": "Redaktsioon seisuga $1 kasutajalt {{GENDER:$6|$2}}$7",
        "previousrevision": "←Vanem redaktsioon",
        "nextrevision": "Uuem redaktsioon→",
        "currentrevisionlink": "Viimane redaktsiooni",
        "mergehistory-empty": "Ühtegi redaktsiooni ei saa liita.",
        "mergehistory-success": "Lehekülje [[:$1]] {{PLURAL:$3|üks redaktsioon|$3 redaktsiooni}} liideti lehega [[:$2]].",
        "mergehistory-fail": "Muudatuste ajaloo liitmine ebaõnnestus. Palun kontrolli lehekülje ja aja parameetreid.",
+       "mergehistory-fail-toobig": "Ajalugusid ei õnnestu liita, sest teisaldada tuleks rohkem kui {{PLURAL:$1|üks redaktsioon|$1 redaktsiooni}}, mis on piirmäär.",
        "mergehistory-no-source": "Alliklehekülge $1 pole olemas.",
        "mergehistory-no-destination": "Sihtlehekülge $1 pole olemas.",
        "mergehistory-invalid-source": "Allikleheküljel peab olema lubatav pealkiri.",
        "difference-missing-revision": "Selle erinevuste vaate {{PLURAL:$2|üht|$2}} redaktsiooni ($1) ei leitud.\n\nHarilikult tähendab see seda, et sind siia juhatanud link on vananenud ja siin asunud lehekülg on kustutatud.\nÜksikasjad leiad [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} kustutamislogist].",
        "searchresults": "Otsingu tulemused",
        "searchresults-title": "Otsingu \"$1\" tulemused",
-       "toomanymatches": "Liiga palju tulemusi, ürita teistsugust päringut",
        "titlematches": "Vasted lehekülje pealkirjades",
        "textmatches": "Vasted lehekülje tekstides",
        "notextmatches": "Vasted lehekülje tekstides puuduvad.",
        "search-interwiki-default": "Tulemused asukohast $1:",
        "search-interwiki-more": "(veel)",
        "search-relatedarticle": "Seotud",
-       "searcheverything-enable": "Otsi kõigist nimeruumidest",
        "searchrelated": "seotud",
        "searchall": "kõik",
        "showingresults": "Allpool näidatakse '''{{PLURAL:$1|ühte|$1}}''' tulemust alates '''$2'''. tulemusest.",
        "powersearch-togglelabel": "Vali:",
        "powersearch-toggleall": "Kõik",
        "powersearch-togglenone": "Ei ühtegi",
+       "powersearch-remember": "Pea valik meeles",
        "search-external": "Välisotsing",
        "searchdisabled": "Otsimine on preagu keelatud.\nVahepeal saad otsimiseks Google'it kasutada.\nPane tähele, et Google'is talletatud {{GRAMMAR:genitive|{{SITENAME}}}} sisu võib olla iganenud.",
        "search-error": "Otsimise ajal ilmnes tõrge: $1",
        "allowemail": "Luba teistel kasutajatel mulle e-kirju saata",
        "prefs-searchoptions": "Otsimine",
        "prefs-namespaces": "Nimeruumid",
-       "defaultns": "Muul juhul otsi järgmistest nimeruumidest:",
        "default": "vaikeväärtus",
        "prefs-files": "Failid",
        "prefs-custom-css": "kohandatud CSS",
        "right-sendemail": "Saata teistele kasutajatele e-kirju",
        "right-passwordreset": "Vaadata parooli lähtestamise e-kirju",
        "newuserlogpage": "Kasutaja loomise logi",
-       "newuserlogpagetext": "See logi sisaldab infot äsja loodud uute kasutajate kohta.",
+       "newuserlogpagetext": "Siin on logitud kasutajate registreerimine.",
        "rightslog": "Kasutajaõiguste logi",
        "rightslogtext": "See on logi kasutajate õiguste muutuste kohta.",
        "action-read": "seda lehekülge lugeda",
        "recentchanges-label-unpatrolled": "Seda muudatust ei ole veel kontrollitud",
        "recentchanges-label-plusminus": "Lehekülje suuruse muutus baitides",
        "recentchanges-legend-heading": "'''Seletus:'''",
-       "recentchanges-legend-newpage": "(vaata ka [[Special:NewPages|uute lehekülgede loendit]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vaata ka [[Special:NewPages|uute lehekülgede loendit]])",
        "rcnotefrom": "Allpool on toodud muudatused alates: <strong>$2</strong> (näidatakse kuni <strong>$1</strong> muudatust)",
        "rclistfrom": "Näita muudatusi alates: $3, kell $2",
        "rcshowhideminor": "Pisiparandused ($1)",
        "windows-nonascii-filename": "Sellel vikil puudub erimärkidega failinimede tugi.",
        "fileexists": "Sellise nimega fail on juba olemas. Palun vaata lehekülge <strong>[[:$1]]</strong>, kui sa pole kindel, kas soovid seda muuta.\n[[$1|thumb]]",
        "filepageexists": "Selle faili kirjelduslehekülg <strong>[[:$1]]</strong> on juba loodud, aga selle nimega faili hetkel pole.\nSinu sisestatud kokkuvõtet ei kuvata kirjeldusleheküljel.\nSinu kokkuvõtte kuvamiseks tuleb kirjelduslehekülge eraldi redigeerida.\n[[$1|thumb]]",
-       "fileexists-extension": "Sarnase nimega fail on olemas: [[$2|thumb]]\n* Üleslaetava faili nimi: <strong>[[:$1]]</strong>\n* Olemasoleva faili nimi: <strong>[[:$2]]</strong>\nPalun vali teistsugune nimi.",
+       "fileexists-extension": "Sarnase nimega fail on olemas: [[$2|thumb]]\n* Üleslaaditava faili nimi: <strong>[[:$1]]</strong>\n* Olemasoleva faili nimi: <strong>[[:$2]]</strong>\nKas tahaksid ehk kasutada paremini eristavat nime?",
        "fileexists-thumbnail-yes": "See paistab olevat vähendatud suurusega pilt (''pisipilt''). [[$1|thumb]]\nPalun vaata faili <strong>[[:$1]]</strong>.\nKui vaadatud fail on sama pilt algupärases suuruses, pole vaja täiendavat pisipilti üles laadida.",
        "file-thumbnail-no": "Failinimi algab eesliitega <strong>$1</strong>.\nSee paistab vähendatud suurusega pilt (''pisipilt'') olevat.\nKui sul on ka selle pildi täislahutusega versioon, laadi palun hoopis see üles, vastasel korral muuda palun faili nime.",
        "fileexists-forbidden": "Sellise nimega fail on juba olemas, seda ei saa üle kirjutada.\nPalun pöörduge tagasi ja laadige fail üles mõne teise nime all. [[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Failide kustutamine ja taastamine on hoolduse ajaks keelatud.",
        "filedelete-maintenance-title": "Faili ei saa kustutada",
        "mimesearch": "MIME otsing",
-       "mimesearch-summary": "Selle leheküljega saab faile otsida MIME tüübi järgi.\nSisesta kujul tüüp/alamtüüp, näiteks <code>image/jpeg</code>.",
+       "mimesearch-summary": "Selle leheküljega saab faile otsida MIME tüübi järgi.\nSisesta kujul sisutüüp/alamtüüp või sisutüüp/*, näiteks <code>image/jpeg</code>.",
        "mimetype": "MIME tüüp:",
        "download": "laadi alla",
        "unwatchedpages": "Jälgimata lehed",
        "listduplicatedfiles-summary": "Siin on loetletud failid, mille viimane versioon on mõne teise faili viimase versiooni duplikaat. Arvesse võetakse ainult kohalikke faile.",
        "listduplicatedfiles-entry": "Failil [[:File:$1|$1]] on [[$3|{{PLURAL:$2|üks duplikaat|$2 duplikaati}}]].",
        "unusedtemplates": "Kasutamata mallid",
-       "unusedtemplatestext": "See lehekülg loetleb kõik leheküljed nimeruumis {{ns:template}}, mida teistel lehekülgedel ei kasutata. Enne kustutamist palun kontrollige, kas siia pole muid linke.",
+       "unusedtemplatestext": "See lehekülg loetleb kõik leheküljed nimeruumis {{ns:template}}, mida teistel lehekülgedel ei kasutata.\nEnne kustutamist kontrolli ka muid malli juurde viitavaid linke.",
        "unusedtemplateswlh": "teised lingid",
        "randompage": "Juhuslik artikkel",
        "randompage-nopages": "{{PLURAL:$2|Järgmises nimeruumis|Järgmistes nimeruumides}} ei ole ühtegi lehekülge: $1.",
        "wantedtemplates": "Kõige oodatumad mallid",
        "mostlinked": "Kõige viidatumad leheküljed",
        "mostlinkedcategories": "Kõige viidatumad kategooriad",
-       "mostlinkedtemplates": "Kõige viidatumad mallid",
+       "mostlinkedtemplates": "Kõige kasutatumad mallid",
        "mostcategories": "Enim kategoriseeritud leheküljed",
        "mostimages": "Kõige kasutatumad failid",
        "mostinterwikis": "Suurima keelelinkide arvuga leheküljed",
        "pageinfo-category-pages": "Lehekülgede arv",
        "pageinfo-category-subcats": "Alamkategooriate arv",
        "pageinfo-category-files": "Failide arv",
-       "skinname-monobook": "MonoBook",
-       "skinname-vector": "Vektor",
        "markaspatrolleddiff": "Märgi kontrollituks",
        "markaspatrolledtext": "Märgi see leht kontrollituks",
        "markedaspatrolled": "Kontrollituks märgitud",
        "version-hook-name": "Haagi nimi",
        "version-hook-subscribedby": "Tellijad",
        "version-version": "($1)",
+       "version-no-ext-name": "[nimi puudub]",
        "version-license": "MediaWiki litsents",
        "version-ext-license": "Litsents",
        "version-ext-colheader-name": "Lisa",
index 2d44aa6..ee397f3 100644 (file)
        "qbmyoptions": "Nire orrialdeak",
        "faq": "Maiz egindako galderak",
        "faqpage": "Project:Maiz egindako galderak",
-       "vector-action-addsection": "Gehitu atala",
-       "vector-action-delete": "Ezabatu",
-       "vector-action-move": "Mugitu",
-       "vector-action-protect": "Babestu",
-       "vector-action-undelete": "Berreskuratu",
-       "vector-action-unprotect": "Babesa aldatu",
-       "vector-view-create": "Sortu",
-       "vector-view-edit": "Aldatu",
-       "vector-view-history": "Ikusi historia",
-       "vector-view-view": "Irakurri",
-       "vector-view-viewsource": "Kodea ikusia",
        "actions": "Ekintzak",
        "namespaces": "Izen-tarteak",
        "variants": "Aldaerak",
        "revdelete-hide-user": "Egilearen erabiltzaile izena/IPa ezkutatu",
        "revdelete-hide-restricted": "Mugapen hauek administratzaileei zein besteei aplikatu",
        "revdelete-radio-same": "(ez aldatu)",
-       "revdelete-radio-set": "Izkutua",
+       "revdelete-radio-set": "Ezkutua",
        "revdelete-radio-unset": "Ikusgarria",
        "revdelete-suppress": "Administratzaileen eta bestelakoen datuak kendu",
        "revdelete-unsuppress": "Berrezarritako aldaketen mugak kendu",
        "diff-empty": "(Ez dago alderik)",
        "searchresults": "Bilaketaren emaitzak",
        "searchresults-title": "\"$1(e)rako\" emaitzak bilatu",
-       "toomanymatches": "Aukera gehiegi aurkitu dira, saia zaitez beste eskaera ezberdin batekin",
        "titlematches": "Emaitzak artikuluen izenburuetan",
        "textmatches": "Emaitza orrialde testuetan",
        "notextmatches": "Ez dago bat datorren orrialde testurik",
        "search-interwiki-default": "$1(r)en emaitzak:",
        "search-interwiki-more": "(gehiago)",
        "search-relatedarticle": "Erlazionatua",
-       "searcheverything-enable": "Bilatu izen-tarte guztietan",
        "searchrelated": "erlazionatua",
        "searchall": "guztia",
        "showingresults": "Jarraian {{PLURAL:$1|emaitza '''1''' ikus daiteke|'''$1''' emaitza ikus daitezke}}, #'''$2'''.etik hasita.",
        "allowemail": "Beste erabiltzaileengandik e-posta mezuak jasotzea gaitu",
        "prefs-searchoptions": "Bilatu",
        "prefs-namespaces": "Izen-tarteak",
-       "defaultns": "Bestela izen-tarte hauetan bilatu:",
        "default": "lehenetsia",
        "prefs-files": "Fitxategiak",
        "prefs-custom-css": "CSS pertsonalizatua",
        "recentchanges-label-unpatrolled": "Aldaketa hau ez da oraindik patruilatua izan",
        "recentchanges-label-plusminus": "Orriaren neurriak byte kopuru honen gorabehera izan du",
        "recentchanges-legend-heading": "'''Azalpenak:'''",
-       "recentchanges-legend-newpage": "(ikus, gainera, [[Special:NewPages|orri berrien zerrenda]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ikus, gainera, [[Special:NewPages|orri berrien zerrenda]])",
        "rcnotefrom": "Jarraian azaltzen diren aldaketak data honetatik aurrerakoak dira: <b>$2</b> (gehienez <b>$1</b> erakusten dira).",
        "rclistfrom": "Erakutsi $3 $2 ondorengo aldaketa berriak",
        "rcshowhideminor": "$1 aldaketa txikiak",
        "tooltip-preferences-save": "Hobespenak gorde",
        "tooltip-summary": "Laburpen labur bat sar ezazu",
        "common.css": "/** Hemen idatzitako CSS kodeak itxura guztietan izango du eragina */",
-       "monobook.css": "/* Hemen idatzitako CSS kodeak Monobook itxuran bakarrik izango du eragina */",
        "common.js": "/* Hemen idatzitako JavaScript kode oro erabiltzaile guztiek edozein orrialde irekitzerakoan kargatuko da. */",
        "anonymous": "{{SITENAME}}(e)ko lankide {{PLURAL:$1|anonimoa|anonimoak}}",
        "siteuser": "{{SITENAME}}(e)ko $1 erabiltzailea",
index a206e08..2815f28 100644 (file)
        "qbmyoptions": "صفحه‌های من",
        "faq": "پرسش‌های متداول",
        "faqpage": "Project:پرسش‌های متداول",
-       "vector-action-addsection": "افزودن بخش",
-       "vector-action-delete": "حذف",
-       "vector-action-move": "انتقال",
-       "vector-action-protect": "محافظت",
-       "vector-action-undelete": "احیا",
-       "vector-action-unprotect": "تغییر سطح حفاظت",
-       "vector-view-create": "ایجاد",
-       "vector-view-edit": "ویرایش",
-       "vector-view-history": "نمایش تاریخچه",
-       "vector-view-view": "خواندن",
-       "vector-view-viewsource": "نمایش مبدأ",
        "actions": "عملکردها",
        "namespaces": "فضاهای نام",
        "variants": "گویش‌ها",
        "currentrev": "نسخهٔ فعلی",
        "currentrev-asof": "نسخهٔ کنونی تا $1",
        "revisionasof": "نسخهٔ $1",
-       "revision-info": "نسخهٔ تاریخ $1 توسط $2",
+       "revision-info": "نسخهٔ تاریخ $1 توسط {{GENDER:$6|$2}}$7",
        "previousrevision": "→ نسخهٔ قدیمی‌تر",
        "nextrevision": "نسخهٔ جدیدتر ←",
        "currentrevisionlink": "نمایش نسخهٔ فعلی",
        "mergehistory-empty": "هیچ‌یک از نسخه‌ها قابل ادغام نیستند.",
        "mergehistory-success": "$3 نسخه از [[:$1]]  با موفقیت در [[:$2]] ادغام {{PLURAL:$3|شد|شدند}}.",
        "mergehistory-fail": "ادغام تاریخچه ممکن نیست، لطفاً گزینه‌های صفحه و زمان را بازبینی کنید.",
+       "mergehistory-fail-toobig": "نمی‌توان ادغام تاریخچه را انجام داد که بیشتر از محدودیت $1 {{PLURAL:$1|نسخه}} انتقال داده خواهد شد.",
        "mergehistory-no-source": "صفحهٔ مبدأ $1 وجود ندارد.",
        "mergehistory-no-destination": "صفحهٔ مقصد $1 وجود ندارد.",
        "mergehistory-invalid-source": "صفحهٔ مبدأ باید عنوانی معتبر داشته باشد.",
        "mergehistory-comment": "[[:$1]] را در [[:$2]] ادغام کرد: $3",
        "mergehistory-same-destination": "صفحهٔ مبدأ و مقصد نمی‌تواند یکی باشد",
        "mergehistory-reason": "دلیل:",
-       "mergelog": "سیاهه ادغام",
+       "mergelog": "سیاههٔ ادغام",
        "pagemerge-logentry": "[[$1]] در [[$2]] ادغام شد (نسخه‌های تا $3)",
        "revertmerge": "واگردانی ادغام",
-       "mergelogpagetext": "در زیر سیاهه آخرین موارد ادغام تاریخچه یک صفحه در صفحه‌ای دیگر را می‌بینید.",
+       "mergelogpagetext": "در زیر سیاههٔ آخرین موارد ادغام تاریخچهٔ یک صفحه در صفحه‌ای دیگر را می‌بینید.",
        "history-title": "$1: تاریخچهٔ ویرایش‌ها",
        "difference-title": "$1: تفاوت بین نسخه‌ها",
        "difference-title-multipage": "$1 و $2: تفاوت بین صفحه‌ها",
        "difference-missing-revision": "{{PLURAL:$2|یک ویرایش|$2 ویرایش}}  از تفاوت نسخه‌ها ($1) {{PLURAL:$2|یافت|یافت}}  نشد.\n\nمعمولاً در اثر پیوند به تاریخچهٔ به‌روز نشدهٔ صفحهٔ حذف شده است.\nمی‌توانید جزئیات بیشتر را در [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] بیابید.",
        "searchresults": "نتایج جستجو",
        "searchresults-title": "نتایج جستجو برای «$1»",
-       "toomanymatches": "تعداد موارد مطابق خیلی زیاد بود، لطفاً درخواست دیگری را امتحان کنید",
        "titlematches": "تطبیق عنوان مقاله",
        "textmatches": "تطبیق متن مقاله",
        "notextmatches": "متن هیچ مقاله‌ای مطابقت ندارد",
        "search-interwiki-default": "نتایج از $1 :",
        "search-interwiki-more": "(بیشتر)",
        "search-relatedarticle": "مرتبط",
-       "searcheverything-enable": "جستجو در تمام فضاهای نام",
        "searchrelated": "مرتبط",
        "searchall": "همه",
        "showingresults": "نمایش حداکثر {{PLURAL:$1|'''۱''' نتیجه|'''$1''' نتیجه}} در پایین، آغاز از شماره '''$2'''.",
        "powersearch-togglelabel": "بررسی:",
        "powersearch-toggleall": "همه",
        "powersearch-togglenone": "هیچ‌کدام",
+       "powersearch-remember": "انتخاب را برای جستجوهای بعدی به خاطر داشته‌باش",
        "search-external": "جستجوی خارجی",
        "searchdisabled": "جستجو در {{SITENAME}} فعال نیست.\nموقتاً می‌توانید از جستجوی Google استفاده کنید.\nتوجه کنید که نتایج حاصل از جستجو با آن روش ممکن است به‌روز نباشند.",
        "search-error": "خطایی هنگام جست‌وجو رخ داده است: $1",
        "allowemail": "امکان دریافت رایانامه از دیگر کاربران",
        "prefs-searchoptions": "جستجو",
        "prefs-namespaces": "فضاهای نام",
-       "defaultns": "در غیر این صورت جستجو در این فضاهای نام:",
        "default": "پیش‌فرض",
        "prefs-files": "پرونده‌ها",
        "prefs-custom-css": "سی‌اس‌اس شخصی",
        "recentchanges-label-unpatrolled": "این ویرایش هنوز گشت‌زنی نشده‌است",
        "recentchanges-label-plusminus": "حجم صفحه به اندازه این بایت‌ها تغییر یافته‌است",
        "recentchanges-legend-heading": "'''اختصارها:'''",
-       "recentchanges-legend-newpage": "(همچنین به [[Special:NewPages|فهرست صفحات جدید]] نگاه کنید)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (همچنین به [[Special:NewPages|فهرست صفحات جدید]] نگاه کنید)",
        "recentchanges-legend-plusminus": "('' ±۱۲۳'')",
        "rcnotefrom": "در زیر تغییرات از <strong>$2</strong> (تا <strong>$1</strong> نشان داده شده‌است).",
        "rclistfrom": "نمایش تغییرات جدید با شروع از $3 $2",
        "largefileserver": "این پرونده از اندازه‌ای که سرور پیکربندی شده تا بپذیرد بزرگتر است.",
        "emptyfile": "پروندهٔ بارگذاری‌شده خالی به نظر می‌رسد.\nاین مشکل ممکن است به علت خطای تایپی در نام پرونده باشد.\nلطفاً تأیید کنید که می‌خواهید این پرونده را با همین شرایط بارگذاری کنید.",
        "windows-nonascii-filename": "این ویکی از نام پرونده با نویسه‌های خاص پشتیبانی نمی‌کند.",
-       "fileexists": "پرونده‌ای با همین نام از قبل موجود است، اگر مطمئن نیستید که می‌خواهید آن پرونده را تغییر دهید، لطفاً <strong>[[:$1]]</strong> را بررسی کنید.\n[[$1|thumb]]",
+       "fileexists": "پرونده‌ای با همین نام از قبل موجود است، اگر مطمئن {{GENDER:|نیستید}} که می‌خواهید آن پرونده را تغییر دهید، لطفاً <strong>[[:$1]]</strong> را بررسی کنید.\n[[$1|thumb]]",
        "filepageexists": "صفحهٔ توضیح برای این پرونده از قبل در <strong>[[:$1]]</strong> ایجاد شده‌است، اما پرونده‌ای با این نام وجود ندارد.\nخلاصه‌ای که وارد می‌کنید در صفحهٔ توضیح نمایش نخواهد یافت.\nبرای آن که خلاصه شما نمایش یابد، باید آن را به صورت دستی ویرایش کنید.\n[[$1|thumb]]",
-       "fileexists-extension": "پرونده‌ای با نام مشابه وجود دارد: [[$2|thumb]]\n* نام پرونده‌ای که بارگذاری کردید این بود:<strong>[[:$1]]</strong>\n* نام پرونده‌ای که از قبل موجود است این است:<strong>[[:$2]]</strong>\nلطفاً یک نام دیگر انتخاب کنید.",
+       "fileexists-extension": "پرونده‌ای با نام مشابه وجود دارد: [[$2|thumb]]\n* نام پرونده‌ای که بارگذاری می‌کردید: <strong>[[:$1]]</strong>\n* نام پرونده‌ای که از قبل موجود بود: <strong>[[:$2]]</strong>\nمی‌خواهید بیش از یک نام متمایز استفاده کنید؟",
        "fileexists-thumbnail-yes": "به نظر می‌رسد که این پرونده، یک تصویر کوچک شده (''بندانگشتی'' یا ''thumbnail'') باشد.\n[[$1|thumb]]\nلطفاً پروندهٔ <strong>[[:$1]]</strong> را بررسی کنید.\nاگر پرونده‌ای که بررسی کردید، همین تصویر در اندازهٔ اصلی‌اش است، نیازی به بارگذاری یک نسخهٔ بندانگشتی اضافه نیست.",
        "file-thumbnail-no": "نام پرونده با <strong>$1</strong> آغاز می‌شود.\nبه نظر می‌رسد که این پرونده، یک تصویر ''بندانگشتی'' ''(thumbnail)'' از تصویر بزرگتر اصلی باشد.\nاگر تصویر با اندازهٔ اصلی را دارید، آن را بارگذاری کنید؛ در غیر این صورت، نام پرونده را تغییر دهید.",
        "fileexists-forbidden": "در حال حاضر، پرونده‌ای به همین نام وجود دارد، و قابل رونویسی نیست.\nاگر هم‌چنان می‌خواهید که پروندهٔ خود را بارگذاری کنید، لطفاً برگردید و نام دیگری استفاده کنید.\n[[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "حذف و احیای پرونده‌ها در مدت نگهداری به طور موقت غیرفعال است.",
        "filedelete-maintenance-title": "نمی‌تواند پرونده را حذف کند",
        "mimesearch": "جستجوی بر اساس MIME",
-       "mimesearch-summary": "با کمک این صفحه شما می‌توانید پرونده‌هایی که یک نوع MIME به خصوص دارند را پیدا کنید.\nورودی: به صورت contenttype/subtype ، نظیر <code>image/jpeg</code>.",
+       "mimesearch-summary": "با کمک این صفحه شما می‌توانید پرونده‌هایی که یک نوع MIME به خصوص دارند را پیدا کنید.\nورودی: به صورت contenttype/subtype یا contenttype/*&lrm;، نظیر <code>image/jpeg</code>.",
        "mimetype": "نوع MIME:",
        "download": "دریافت",
        "unwatchedpages": "صفحه‌های پی‌گیری‌نشده",
        "wantedtemplates": "الگوهای مورد نیاز",
        "mostlinked": "صفحه‌هایی که بیشتر از همه به آن‌ها پیوند داده شده‌است",
        "mostlinkedcategories": "رده‌هایی که بیشتر از همه به آن‌ها پیوند داده شده‌است",
-       "mostlinkedtemplates": "اÙ\84Ú¯Ù\88Ù\87اÛ\8cÛ\8c Ú©Ù\87 Ø¨Û\8cشتر Ø§Ø² Ù\87Ù\85Ù\87 Ø¨Ù\87 Ø¢Ù\86â\80\8cÙ\87ا Ù¾Û\8cÙ\88Ù\86د Ø¯Ø§Ø¯Ù\87 Ø´Ø¯Ù\87â\80\8cاست",
+       "mostlinkedtemplates": "ببشترÛ\8cÙ\86 ØµÙ\81Ø­Ù\87â\80\8cÙ\87اÛ\8c ØªØ±Ø§Ú¯Ù\86جاÛ\8cØ´â\80\8cشدÙ\87",
        "mostcategories": "صفحه‌های دارای بیشترین رده",
        "mostimages": "پرونده‌هایی که بیشتر از همه به آن‌ها پیوند داده شده‌است",
        "mostinterwikis": "صفحه‌های دارای بیشترین میان‌ویکی",
        "watchnologin": "به سامانه وارد نشده‌اید",
        "addwatch": "افزودن به فهرست پی‌گیری",
        "addedwatchtext": "صفحهٔ «[[:$1]]» به [[Special:Watchlist|فهرست پی‌گیری‌های]] شما اضافه شد.\nتغییرات این صفحه و صفحهٔ بحث متناظرش در آینده در اینجا فهرست خواهد شد.",
+       "addedwatchtext-short": "صفحه \" $1 \" به فهرست پیگیریهای خود اضافه شده است.",
        "removewatch": "حذف از فهرست پی‌گیری",
        "removedwatchtext": "صفحهٔ «[[:$1]]» از [[Special:Watchlist|فهرست پی‌گیری‌های شما]] برداشته شد.",
+       "removedwatchtext-short": "صفحهٔ \"$1\" از فهرست پیگیری‌های شما حذف شده‌است.",
        "watch": "پی‌گیری",
        "watchthispage": "پی‌گیری این صفحه",
        "unwatch": "توقف پی‌گیری",
        "tooltip-preferences-save": "ذخیره کردن ترجیحات",
        "tooltip-summary": "خلاصه‌ای وارد کنید",
        "interlanguage-link-title": "$1–$2",
+       "interlanguage-link-title-nonlang": "$1 – $2",
        "common.css": "/* دستورات این بخش همهٔ کاربران را تحت تاثیر قرار می‌دهند. */",
-       "monobook.css": "/* دستورات این بخش کاربرانی را که از پوستهٔ مونوبوک استفاده کنند تحت تاثیر قرار می‌دهند. */",
        "anonymous": "{{PLURAL:$1|کاربر|کاربران}} گمنام {{SITENAME}}",
        "siteuser": "$1، کاربر {{SITENAME}}",
        "anonuser": "$1 کاربر ناشناس {{SITENAME}}",
        "pageinfo-category-pages": "تعداد صفحه‌ها",
        "pageinfo-category-subcats": "تعداد زیررده‌ها",
        "pageinfo-category-files": "تعداد پرونده‌ها",
-       "skinname-monobook": "مونوبوک",
-       "skinname-vector": "برداری",
        "markaspatrolleddiff": "برچسب گشت بزن",
        "markaspatrolledtext": "به این صفحه برچسب گشت بزن",
        "markedaspatrolled": "برچسب گشت زده شد",
index 69f021f..91d72bc 100644 (file)
        "qbmyoptions": "Omat sivut",
        "faq": "Usein kysytyt kysymykset",
        "faqpage": "Project:Usein kysytyt kysymykset",
-       "vector-action-addsection": "Lisää aihe",
-       "vector-action-delete": "Poista",
-       "vector-action-move": "Siirrä",
-       "vector-action-protect": "Suojaa",
-       "vector-action-undelete": "Palauta",
-       "vector-action-unprotect": "Muuta suojausta",
-       "vector-view-create": "Luo",
-       "vector-view-edit": "Muokkaa",
-       "vector-view-history": "Näytä historia",
-       "vector-view-view": "Lue",
-       "vector-view-viewsource": "Näytä lähdekoodi",
        "actions": "Toiminnot",
        "namespaces": "Nimiavaruudet",
        "variants": "Kirjoitusjärjestelmät",
        "changeemail-oldemail": "Nykyinen sähköpostiosoite:",
        "changeemail-newemail": "Uusi sähköpostiosoite:",
        "changeemail-none": "(ei asetettu)",
-       "changeemail-password": "Salasanasi sivustolla {{SITENAME}}",
+       "changeemail-password": "{{SITENAME}}-salasanasi:",
        "changeemail-submit": "Muuta sähköpostiosoite",
        "changeemail-cancel": "Peruuta",
        "changeemail-throttled": "Olet tehnyt liian monta kirjautumisyritystä.\nOdota $1 ennen kuin yrität uudelleen.",
        "currentrev": "Nykyinen versio",
        "currentrev-asof": "Nykyinen versio $1",
        "revisionasof": "Versio $1",
-       "revision-info": "Versio hetkellä $1 – tehnyt $2",
+       "revision-info": "Versio hetkellä $1 – tehnyt {{GENDER:$6|$2}}$7",
        "previousrevision": "← Vanhempi versio",
        "nextrevision": "Uudempi versio →",
        "currentrevisionlink": "Nykyinen versio",
        "difference-missing-revision": "{{PLURAL:$2|Yhtä versiota|$2 versiota}} tästä vertailusta ($1) {{PLURAL:$2|ei}} löytynyt.\n\nUseimmiten tämä johtuu vanhentuneesta vertailulinkistä poistettuun sivuun.\nLisätietoja löytyy [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} poistolokista].",
        "searchresults": "Hakutulokset",
        "searchresults-title": "Haun tulokset hakusanalle ”$1”",
-       "toomanymatches": "Liian monta osumaa. Kokeile erilaista kyselyä.",
        "titlematches": "Osumat sivujen otsikoissa",
        "textmatches": "Osumat sivujen teksteissä",
        "notextmatches": "Hakusanaa ei löytynyt sivujen teksteistä",
        "search-interwiki-default": "Tulokset osoitteesta $1:",
        "search-interwiki-more": "(lisää)",
        "search-relatedarticle": "Hae samankaltaisia sivuja",
-       "searcheverything-enable": "Hae kaikista nimiavaruuksista",
        "searchrelated": "samankaltainen",
        "searchall": "kaikki",
        "showingresults": "Alla on vain {{PLURAL:$1|<strong>1</strong> hakutulos|<strong>$1</strong> hakutulosta}} alkaen tuloksesta nro <strong>$2</strong>.",
        "powersearch-togglelabel": "Muuta valintaa",
        "powersearch-toggleall": "Valitse kaikki",
        "powersearch-togglenone": "Ei mitään",
+       "powersearch-remember": "Muista valinta tulevia hakuja varten",
        "search-external": "Ulkoinen haku",
        "searchdisabled": "Tekstihaku on poistettu toistaiseksi käytöstä suuren kuorman vuoksi. Voit käyttää alla olevaa Googlen hakukenttää sivujen etsimiseen, kunnes haku tulee taas käyttöön. <small>Huomaa, että ulkopuoliset kopiot {{GRAMMAR:genitive|{{SITENAME}}}} sisällöstä eivät välttämättä ole ajan tasalla.</small>",
        "search-error": "Virhe ilmaantui haettaessa: $1",
        "allowemail": "Salli sähköpostin lähetys osoitteeseen",
        "prefs-searchoptions": "Haku",
        "prefs-namespaces": "Nimiavaruudet",
-       "defaultns": "Muussa tapauksessa hae näistä nimiavaruuksista:",
        "default": "oletus",
        "prefs-files": "Tiedostot",
        "prefs-custom-css": "Käyttäjäkohtainen CSS-tyylisivu",
        "recentchanges-label-unpatrolled": "Tätä muutosta ei ole vielä tarkastettu",
        "recentchanges-label-plusminus": "Sivun koon muutos tavuina",
        "recentchanges-legend-heading": "'''Selitys:'''",
-       "recentchanges-legend-newpage": "(katso myös [[Special:NewPages|lista uusista sivuista]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (katso myös [[Special:NewPages|lista uusista sivuista]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Alla ovat muutokset <strong>$2</strong> lähtien. (Enintään <strong>$1</strong> näytetään.)",
        "rclistfrom": "Näytä uudet muutokset $3 $2 alkaen",
        "upload_directory_read_only": "Palvelimella ei ole kirjoitusoikeuksia tallennushakemistoon $1.",
        "uploaderror": "Tallennusvirhe",
        "upload-recreate-warning": "<strong>Varoitus: Tiedosto tällä nimellä on poistettu tai siirretty.</strong>\n\nPoisto- ja siirtoloki tälle sivulle näkyy alla:",
-       "uploadtext": "Voit tallentaa tiedostoja alla olevalla lomakkeella. [[Special:FileList|Tiedostoluettelo]] sisältää listan tallennetuista tiedostoista. Tallennukset kirjataan myös [[Special:Log/upload|tallennuslokiin]], ja poistot [[Special:Log/delete|poistolokiin]].\n\nVoit käyttää tiedostoja wikisivuilla seuraavilla tavoilla:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Tiedosto.jpg]]</nowiki></code>''', käyttääksesi tiedoston täyttä versiota.\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Tiedosto.png|200px|thumb|left|Kuvausteksti]]</nowiki></code>''', käyttääksesi tiedostoa sovitettuna 200 kuvapistettä leveään laatikkoon kuvaustekstillä.\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Tiedosto.ogg]]</nowiki></code>''', jos haluat suoran linkin tiedostoon.",
+       "uploadtext": "Käytä tätä alla olevaa lomaketta tiedostojen tallentamiseen.\nVoit katsella luetteloa aiemmin tallennetuista tiedostoista sivulla [[Special:FileList|tiedostoluettelo]]. Kaikki tallennukset kirjataan myös [[Special:Log/upload|tallennuslokiin]] ja tiedostojen poistot [[Special:Log/delete|poistolokiin]].\n\nJotta saat tiedoston näkymään sivulla, käytä jotakin seuraavista muotoiluista linkkinä siihen:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Tiedosto.jpg]]</nowiki></code></strong> käyttääksesi tiedoston kokonaista versiota.\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Tiedosto.png|200px|thumb|left|teksti tähän]]</nowiki></code></strong> käyttääksesi tiedostoa sovitettuna 200 kuvapistettä leveään laatikkoon kuvatekstillä \"teksti tähän\".\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Tiedosto.ogg]]</nowiki></code></strong>, jos haluat suoran linkin tiedostoon ilman että tiedostoa näytetään.",
        "upload-permitted": "Sallitut tiedostomuodot: $1.",
        "upload-preferred": "Suositellut tiedostomuodot: $1.",
        "upload-prohibited": "Kielletyt tiedostomuodot: $1.",
        "uploadlogpagetext": "Alla on luettelo uusimmista tiedostonlisäyksistä. Kaikki ajat näytetään palvelimen aikavyöhykkeessä.",
        "filename": "Tiedoston nimi:",
        "filedesc": "Yhteenveto",
-       "fileuploadsummary": "Yhteenveto",
-       "filereuploadsummary": "Muutokset",
+       "fileuploadsummary": "Yhteenveto:",
+       "filereuploadsummary": "Muutokset tiedostoon:",
        "filestatus": "Tiedoston tekijänoikeudet",
        "filesource": "Lähde",
        "ignorewarning": "Tallenna tiedosto varoituksesta huolimatta.",
        "largefileserver": "Tämä tiedosto on suurempi kuin mitä palvelin sallii.",
        "emptyfile": "Tiedosto, jota yritit lähettää, näyttää olevan tyhjä. Tarkista, että kirjoitit polun ja nimen oikein ja että se ei ole liian suuri kohdepalvelimelle.",
        "windows-nonascii-filename": "Tämä wiki ei tue tiedostonimiä, joissa on erikoismerkkejä.",
-       "fileexists": "Samanniminen tiedosto on jo olemassa.\nKatso tiedoston sivu <strong>[[:$1]]</strong>, jos et ole varma, haluatko muuttaa sitä.\n[[$1|thumb]]",
+       "fileexists": "Samanniminen tiedosto on jo olemassa.\nTarkasta tiedosto <strong>[[:$1]]</strong>, mikäli et ole varma, että haluat tehdä muutoksia tiedostoon.\n[[$1|thumb]]",
        "filepageexists": "Kuvaussivu <strong>[[:$1]]</strong> on ho olemassa, mutta vastaavaa tiedostoa ei ole olemassa.\nKirjoittamasi yhteenveto ei ilmesty kuvaussivulle,\nellet lisää sitä muokkaamalla sivua manuaalisesti.\n[[$1|thumb]]",
        "fileexists-extension": "Tiedosto, jolla on samankaltainen nimi, on jo olemassa: [[$2|thumb]]\n* Tallennetun tiedoston nimi: <strong>[[:$1]]</strong>\n* Olemassa olevan tiedoston nimi: <strong>[[:$2]]</strong>\nValitse toinen tiedostonimi.",
        "fileexists-thumbnail-yes": "Tiedosto näyttäisi olevan pienennetty kuva ''(pienoiskuva)''. [[$1|thumb]]\nTarkista tiedosto <strong>[[:$1]]</strong>.\nJos yllä oleva tiedosto on alkuperäisversio samasta kuvasta, ei sille tarvitse tallentaa pienoiskuvaa.",
        "uploadvirus": "Tiedosto sisältää viruksen. Tarkemmat tiedot: $1",
        "uploadjava": "Tämä tiedosto on ZIP-tiedosto, joka sisältää Java .class-tiedoston.\nJava-tiedostojen tallentaminen ei ole sallittua, sillä ne saattavat aiheuttaa tietoturvariskejä.",
        "upload-source": "Lähdetiedosto",
-       "sourcefilename": "Lähdenimi",
+       "sourcefilename": "Lähdetiedoston nimi:",
        "sourceurl": "URL-lähde",
-       "destfilename": "Kohdenimi",
+       "destfilename": "Kohdetiedoston nimi:",
        "upload-maxfilesize": "Suurin sallittu tiedostokoko: $1",
        "upload-description": "Tiedoston kuvaus",
        "upload-options": "Tallennusasetukset",
        "wantedtemplates": "Halutut mallineet",
        "mostlinked": "Viitatuimmat sivut",
        "mostlinkedcategories": "Viitatuimmat luokat",
-       "mostlinkedtemplates": "Viitatuimmat mallineet",
+       "mostlinkedtemplates": "Eniten sisällytetyt sivut",
        "mostcategories": "Luokitelluimmat sivut",
        "mostimages": "Viitatuimmat tiedostot",
        "mostinterwikis": "Sivut, joilla on eniten kielilinkkejä",
        "delete_and_move_text": "==Poistamista edellyttävä siirto==\nKohdesivu [[:$1]] on jo olemassa. \nHaluatko poistaa sen, jotta nykyinen sivu voitaisiin siirtää?",
        "delete_and_move_confirm": "Kyllä, poista kohdesivu",
        "delete_and_move_reason": "Sivu on sivun [[$1]] siirron tiellä.",
-       "selfmove": "Lähde- ja kohdenimi ovat samat.",
+       "selfmove": "Lähteen ja kohteen nimi on sama.\nSivua ei voi siirtää itsensä päälle.",
        "immobile-source-namespace": "Sivuja ei voi siirtää nimiavaruudessa ”$1”",
        "immobile-target-namespace": "Sivuja ei voi siirtää nimiavaruuteen ”$1”",
        "immobile-target-namespace-iw": "Kielilinkki ei ole kelvollinen kohde sivun siirrolle.",
        "imagenocrossnamespace": "Tiedostoja ei voi siirtää pois tiedostonimiavaruudesta.",
        "nonfile-cannot-move-to-file": "Sivuja ei voi siirtää tiedostonimiavaruuteen.",
        "imagetypemismatch": "Uusi tiedostopääte ei vastaa tiedoston tyyppiä",
-       "imageinvalidfilename": "Kohdenimi on virheellinen",
+       "imageinvalidfilename": "Kohdetiedoston nimi on virheellinen",
        "fix-double-redirects": "Päivitä kaikki vanhalle nimelle viittaavat ohjaukset ohjaamaan uudelle nimelle",
        "move-leave-redirect": "Jätä paikalle ohjaus",
        "protectedpagemovewarning": "'''Varoitus:''' Tämä sivu on lukittu siten, että vain ylläpitäjät voivat siirtää sitä.\nAlla on viimeisin lokitapahtuma:",
        "tooltip-preferences-save": "Tallenna asetukset",
        "tooltip-summary": "Kirjoita lyhyt yhteenveto",
        "interlanguage-link-title": "$1 — $2",
+       "interlanguage-link-title-nonlang": "$1 – $2",
        "common.css": "/* Tämä sivu sisältää koko sivustoa muuttavia tyylejä. */",
-       "monobook.css": "/* Tämä sivu sisältää Monobook-ulkoasua muuttavia tyylejä. */",
-       "vector.css": "/* Tämä sivu sisältää Vector-ulkoasua muuttavia tyylejä. */",
        "print.css": "/* Tämä sivu sisältää tulostettua sivua muuttavia tyylejä */",
        "noscript.css": "/* Tämä sivun tyylit muuttavat niiden käyttäjien tyylejä, joilla JavaScript ei ole käytössä */",
        "group-autoconfirmed.css": "/* Tämä sivun tyylit muuttavat automaattisesti hyväksyttyjen käyttäjien tyylejä */",
        "group-sysop.css": "/* Tämä sivun tyylit muuttavat ylläpitäjien tyylejä */",
        "group-bureaucrat.css": "/* Tämä sivun tyylit muuttavat byrokraattien tyylejä */",
        "common.js": "/* Tämän sivun JavaScript-koodi liitetään jokaiseen sivulataukseen */",
-       "monobook.js": "/* Tämän sivun JavaScript-koodi liitetään Monobook-tyyliin */",
-       "vector.js": "/* Tämän sivun JavaScript-koodi liitetään Vector-tyyliin */",
        "group-autoconfirmed.js": "/* Tämän sivun JavaScript-koodi liitetään vain automaattisesti hyväksytyille käyttäjille */",
        "group-bot.js": "/* Tämän sivun JavaScript-koodi liitetään vain boteille */",
        "group-sysop.js": "/* Tämän sivun JavaScript-koodi liitetään vain ylläpitäjille */",
        "pageinfo-category-pages": "Sivujen määrä",
        "pageinfo-category-subcats": "Alaluokkien määrä",
        "pageinfo-category-files": "Tiedostojen määrä",
-       "skinname-monobook": "Monobook",
        "markaspatrolleddiff": "Merkitse tarkastetuksi",
        "markaspatrolledtext": "Merkitse muutos tarkastetuksi",
        "markedaspatrolled": "Muutos on tarkastettu",
index cd41181..85cd19f 100644 (file)
        "qbmyoptions": "Mínar síður",
        "faq": "OSS",
        "faqpage": "Project:OSS",
-       "vector-action-addsection": "Nýtt evni",
-       "vector-action-delete": "Strika",
-       "vector-action-move": "Flyt",
-       "vector-action-protect": "Friða",
-       "vector-action-undelete": "Endurstovna",
-       "vector-action-unprotect": "Broyt verju",
-       "vector-view-create": "Stovna",
-       "vector-view-edit": "Rætta",
-       "vector-view-history": "Vís søgu",
-       "vector-view-view": "Les",
-       "vector-view-viewsource": "Vís keldu",
        "actions": "Gerningar",
        "namespaces": "Navnarúm",
        "variants": "Ymisk sløg",
        "permalink": "Støðug slóð",
        "print": "Prenta",
        "view": "Vís",
+       "view-foreign": "Vís á $1",
        "edit": "Rætta",
+       "edit-local": "Rætta lokala frágreiðing",
        "create": "Stovna",
+       "create-local": "Skriva lokala frágreiðing",
        "editthispage": "Rætta hesa síðuna",
        "create-this-page": "Stovna hesa síðuna",
        "delete": "Strika",
        "loginlanguagelabel": "Mál: $1",
        "suspicious-userlogout": "Tín fyrispurningur um at útrita var noktaður, tí tað sær út til at hann varð sendur frá einum oyðiløgdum kaga ella caching proxy.",
        "createacct-another-realname-tip": "Veruligt navn er valfrítt.\nUm tú velur at skriva tað, so verður tað nýtt til at geva brúkaranum æruna fyri hennara/hansara  arbeiði.",
+       "pt-login": "Rita inn",
+       "pt-login-button": "Rita inn",
+       "pt-createaccount": "Stovna kontu",
+       "pt-userlogout": "Rita út",
        "php-mail-error-unknown": "Ókend villa í PHP'sa teldupost () funktión.",
        "user-mail-no-addy": "Royndi at senda t-post uttan eina t-post adressu.",
        "user-mail-no-body": "Tú royndi at senda ein teldupost við ongum ella órímiliga stuttum innihaldi.",
        "changepassword": "Broyt loyniorð",
-       "resetpass_announce": "Tú ritaði inn við einum fyribils loyniorði, sum tú hevur fingið við telduposti.\nFyri at gera innritanina lidna, mást tú velja tær eitt nýtt loyniorð her:",
+       "resetpass_announce": "Fyri at gera innritanina lidna, mást tú velja tær eitt nýtt loyniorð.",
        "resetpass_header": "Broyt loyniorði á kontuni",
        "oldpassword": "Gamalt loyniorð:",
        "newpassword": "Nýtt loyniorð:",
        "edit-gone-missing": "Tað var ikki møguligt at dagføra síðuna.\nTað sær út til at hon er blivin strikað.",
        "edit-conflict": "Rættingar trupulleiki (konflikt).",
        "edit-no-change": "Tín rætting var sæð burtur frá, tí ongin broyting varð gjørd í tekstinum.",
-       "postedit-confirmation": "Tín rætting varð goymd.",
+       "postedit-confirmation-saved": "Tín rætting varð goymd.",
        "edit-already-exists": "Tað var ikki møguligt at upprætta nýggja síðu.\nSíðan er longu til.",
        "defaultmessagetext": "Standard boðtekstur",
        "content-failed-to-parse": "Kláraði ikki at tulka $2 innihaldi fyri $1 modell: $3",
        "diff-multi-manyusers": "({{PLURAL:$1|Ein versjón sum liggur ímillum|$1 versjónir sum liggja ímillum}} skrivaðar av meira enn $2 {{PLURAL:$2|brúkara|brúkarum}} ikki víst)",
        "searchresults": "Leitúrslit",
        "searchresults-title": "Leiti úrslit fyri \"$1\"",
-       "toomanymatches": "Alt ov nógvar úrslit vóru funnin, vinarliga royn aftur við nýggjum fyrispurningi",
        "titlematches": "Síðu heiti samsvarar",
        "textmatches": "Teksturin á síðuni samsvarar",
        "notextmatches": "Ongin síðutekstur samsvarar",
        "searchmenu-exists": "'''Tað er longu ein síða sum eitur \"[[:$1]]\" á hesi wiki.'''",
        "searchmenu-new": "<strong>'''Stovna síðuna \"[[:$1]]\" á hesi wiki!</strong> {{PLURAL:$2|0=|Sí eisini síðuna sum varð funnin við tínari leiting.|Sí eisini leitiúrslitini ið funnin vóru.}}",
        "searchprofile-articles": "Innihaldssíður",
-       "searchprofile-project": "Hjálpar og verkætlanar síður",
        "searchprofile-images": "Fjølmiðlar - multimedia",
        "searchprofile-everything": "Alt",
        "searchprofile-advanced": "Víðkað",
        "searchprofile-articles-tooltip": "Leita í $1",
-       "searchprofile-project-tooltip": "Leita í $1",
        "searchprofile-images-tooltip": "Leita eftir fílum",
        "searchprofile-everything-tooltip": "Leita í øllum innihaldi (eisini í kjaksíðum)",
        "searchprofile-advanced-tooltip": "Leita í ávísum navnaøkjum",
        "search-interwiki-default": "$1 úrslit:",
        "search-interwiki-more": "(meira)",
        "search-relatedarticle": "Líknandi",
-       "searcheverything-enable": "Leita í øllum navnaøkjum",
        "searchrelated": "líknandi",
        "searchall": "alt",
        "showingresults": "Niðanfyri standa upp til {{PLURAL:$1|'''$1''' úrslit, sum byrjar|'''$1''' úrslit, sum byrja}} við #<b>$2</b>.",
        "allowemail": "Tilset t-post frá øðrum brúkarum",
        "prefs-searchoptions": "Leita",
        "prefs-namespaces": "Navnarúm",
-       "defaultns": "Um ikki, leita so í hesum navnateigum:",
        "default": "standard",
        "prefs-files": "Fílur",
        "prefs-custom-css": "Tilpassað CSS",
        "prefs-emailconfirm-label": "Vátta tína t-post adressu:",
        "youremail": "T-postur (sjálvboðið)*:",
        "username": "{{GENDER:$1|Brúkaranavn}}:",
-       "uid": "{{GENDER:$1|Brúkari}} ID:",
        "prefs-memberingroups": "{{GENDER:$2|Limur}} í {{PLURAL:$1|bólki|bólkum}}:",
        "prefs-registration": "Skrásett tíðspunkt:",
        "yourrealname": "Títt navn*:",
        "recentchanges-label-bot": "Henda rætting varð gjørd av einum botti",
        "recentchanges-label-unpatrolled": "Henda rætting er ikki blivin eftirkannað enn",
        "recentchanges-legend-heading": "'''Teknfrágreiðing:'''",
-       "recentchanges-legend-newpage": "(sí eisini [[Special:NewPages|yvirlit yvir nýggjar síður]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sí eisini [[Special:NewPages|yvirlit yvir nýggjar síður]])",
        "rcnotefrom": "Niðanfyri standa broytingarnar síðani '''$2''', (upp til '''$1''' er sýndar).",
        "rclistfrom": "Sýn nýggjar broytingar byrjandi við $3 $2",
        "rcshowhideminor": "$1 minni rættingar",
        "log-title-wildcard": "Leita í heitum sum byrja við hesum teksti",
        "showhideselectedlogentries": "Vís/fjal útvaldu loggarnir",
        "allpages": "Allar síður",
-       "alphaindexline": "$1 til $2",
        "nextpage": "Næsta síða ($1)",
        "prevpage": "Fyrrverandi síða ($1)",
        "allpagesfrom": "Vís síður sum byrja við:",
        "unblock": "Tak sperring av brúkara burtur",
        "blockip": "Banna brúkara",
        "blockip-legend": "Sperra brúkara",
-       "ipadressorusername": "IP-adressa ella brúkaranavn:",
+       "ipaddressorusername": "IP-adressa ella brúkaranavn:",
        "ipbexpiry": "Gongur út:",
        "ipbreason": "Orsøk:",
        "ipbreason-dropdown": "*Vanligar orsøkir fyri sperring\n** Innsetan av følskum upplýsingum\n** Tekur burtur innihald av síðum\n** Spammar leinkjur til uttanhýsis síður\n** Skrivar tvætl á síður\n** Ber seg skeivt at/ger seg inn á brúkarar\n** Misnýtir fleiri kontur\n** Brúkaranavn ið ikki kann góðtakast",
        "pageinfo-category-pages": "Tal av síðum",
        "pageinfo-category-subcats": "Tal av undirbólkum",
        "pageinfo-category-files": "Tal av fílum",
-       "skinname-cologneblue": "Cologne-bláur",
        "markaspatrolleddiff": "Merk síðuna sum eftirhugda",
        "markaspatrolledtext": "Merk hesa síðu sum eftirhugda",
        "markedaspatrolled": "Merk sum eftirkannað",
        "newimages": "Nýggjar myndir",
        "newimages-legend": "Filtur",
        "newimages-label": "Fílunavn (ella ein partur av tí):",
-       "showhidebots": "($1 bottar)",
        "noimages": "Einki at síggja.",
        "ilsubmit": "Leita",
        "bydate": "eftir dato",
index 8d195e5..6a47d6f 100644 (file)
                        "Горан Анђелковић",
                        "לערי ריינהארט",
                        "아라",
-                       "Scoopfinder"
+                       "Scoopfinder",
+                       "Akeron",
+                       "Linedwell"
                ]
        },
        "tog-underline": "Souligner les liens :",
        "qbmyoptions": "Mes pages",
        "faq": "FAQ",
        "faqpage": "Project:FAQ",
-       "vector-action-addsection": "Ajouter un sujet",
-       "vector-action-delete": "Supprimer",
-       "vector-action-move": "Renommer",
-       "vector-action-protect": "Protéger",
-       "vector-action-undelete": "Rétablir",
-       "vector-action-unprotect": "Changer la protection",
-       "vector-view-create": "Créer",
-       "vector-view-edit": "Modifier",
-       "vector-view-history": "Afficher l’historique",
-       "vector-view-view": "Lire",
-       "vector-view-viewsource": "Voir la source",
        "actions": "Actions",
        "namespaces": "Espaces de noms",
        "variants": "Variantes",
        "preview": "Prévisualisation",
        "showpreview": "Prévisualiser",
        "showdiff": "Voir les modifications",
-       "anoneditwarning": "'''Attention :''' vous n’êtes pas identifié(e). Votre adresse IP sera enregistrée dans l’historique de cette page.",
+       "anoneditwarning": "<strong>Attention :</strong> Vous n’êtes pas identifié(e). Votre adresse IP sera enregistrée dans l’historique de cette page.",
        "anonpreviewwarning": "''Vous n’êtes pas identifié(e). Sauvegarder enregistrera votre adresse IP dans l’historique des modifications de la page.''",
        "missingsummary": "'''Rappel :''' vous n'avez pas encore fourni le résumé de votre modification.\nSi vous cliquez de nouveau sur le bouton « {{int:savearticle}} », la publication sera faite sans nouvel avertissement.",
        "missingcommenttext": "Veuillez entrer un commentaire ci-dessous.",
        "currentrev": "Version actuelle",
        "currentrev-asof": "Version actuelle en date du $1",
        "revisionasof": "Version du $1",
-       "revision-info": "Version du $1 par $2",
+       "revision-info": "Révision de $1 par {{GENDER:$6|$2}}$7",
        "previousrevision": "← Version précédente",
        "nextrevision": "Version suivante →",
        "currentrevisionlink": "Voir la version courante",
        "mergehistory-empty": "Aucune version ne peut être fusionnée.",
        "mergehistory-success": "$3 version{{PLURAL:$3||s}} de [[:$1]] fusionnée{{PLURAL:$3||s}} dans [[:$2]].",
        "mergehistory-fail": "Impossible de procéder à la fusion des historiques. Resélectionner la page ainsi que les paramètres de date.",
+       "mergehistory-fail-toobig": "Impossible d’effectuer la fusion de l’historique car un nombre de {{PLURAL:$1|révisions}} supérieur à la limite de $1 devrait être déplacé.",
        "mergehistory-no-source": "La page d'origine $1 n'existe pas.",
        "mergehistory-no-destination": "La page de destination $1 n'existe pas.",
        "mergehistory-invalid-source": "La page d'origine doit avoir un titre valide.",
        "difference-missing-revision": "{{PLURAL:$2|Une révision|$2 révisions}} de cette différence ($1) {{PLURAL:$2|n'a pas été trouvée|n'ont pas été trouvées}}.\n\nCela survient en général en suivant un lien de différence obsolète vers une page qui a été supprimée.\nVous pouvez trouver des détails dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des suppressions].",
        "searchresults": "Résultats de la recherche",
        "searchresults-title": "Résultats de recherche pour « $1 »",
-       "toomanymatches": "Un trop grand nombre d'occurrences a été renvoyé, veuillez soumettre une requête différente.",
        "titlematches": "Correspondances dans les titres des pages",
        "textmatches": "Correspondances dans le texte des pages",
        "notextmatches": "Aucun texte de page ne correspond à la recherche.",
        "search-interwiki-default": "Résultats de $1 :",
        "search-interwiki-more": "(plus)",
        "search-relatedarticle": "Reliés",
-       "searcheverything-enable": "Rechercher dans tous les espaces de noms",
        "searchrelated": "reliés",
        "searchall": "tout",
        "showingresults": "Affichage de <b>$1</b> résultat{{PLURAL:$1||s}} à partir du n°<b>$2</b>.",
        "powersearch-togglelabel": "Cocher :",
        "powersearch-toggleall": "Tout",
        "powersearch-togglenone": "Aucune",
+       "powersearch-remember": "Se souvenir de la sélection pour les prochaines recherches",
        "search-external": "Recherche externe",
        "searchdisabled": "La recherche sur {{SITENAME}} est désactivée. En attendant la réactivation, vous pouvez effectuer une recherche via Google. Attention, leur indexation du contenu de {{SITENAME}} peut ne pas être à jour.",
        "search-error": "Une erreur s'est produite en recherchant : $1",
        "allowemail": "Autoriser l'envoi de courriels venant d'autres utilisateurs",
        "prefs-searchoptions": "Recherche",
        "prefs-namespaces": "Espaces de noms",
-       "defaultns": "Rechercher par défaut dans ces espaces de noms :",
        "default": "défaut",
        "prefs-files": "Fichiers",
        "prefs-custom-css": "CSS personnalisé",
        "recentchanges-label-unpatrolled": "Cette modification n'a pas encore été patrouillée.",
        "recentchanges-label-plusminus": "La taille de la page a changé de ce nombre d’octets.",
        "recentchanges-legend-heading": "'''Légende :'''",
-       "recentchanges-legend-newpage": "(voir aussi la [[Special:NewPages|liste des nouvelles pages]]).",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (voir aussi la [[Special:NewPages|liste des nouvelles pages]]).",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Ci-dessous les modifications effectuées depuis le <strong>$2</strong> (jusqu’à <strong>$1</strong> affichés).",
        "rclistfrom": "Afficher les nouvelles modifications depuis le $3 à $2",
        "largefileserver": "La taille de ce fichier est supérieure au maximum autorisé.",
        "emptyfile": "Le fichier que vous voulez importer semble vide.\nCeci peut être dû à une erreur dans le nom du fichier.\nVeuillez vérifier que vous désirez vraiment importer ce fichier.",
        "windows-nonascii-filename": "Ce wiki ne supporte pas les noms de fichiers avec des caractères spéciaux.",
-       "fileexists": "Un fichier existe déjà sous ce nom.\nMerci de vérifier <strong>[[:$1]]</strong> si vous n'êtes pas certain{{GENDER:||e|}} de vouloir le modifier.\n[[$1|thumb]]",
+       "fileexists": "Un fichier existe déjà sous ce nom.\nMerci de vérifier <strong>[[:$1]]</strong> si vous n'êtes pas certain{{GENDER:||e|}} de vouloir le remplacer.\n[[$1|thumb]]",
        "filepageexists": "La page de description pour ce fichier a déjà été créée ici <strong>[[:$1]]</strong>, mais aucun fichier n'existe actuellement sous ce nom.\nLe résumé que vous allez spécifier n'apparaîtra pas sur la page de description.\nPour que ce soit le cas, vous devrez modifier manuellement la page. [[$1|thumb]]",
-       "fileexists-extension": "Un fichier existe avec un nom proche : [[$2|thumb]]\n* Nom du fichier à importer : <strong>[[:$1]]</strong>\n* Nom du fichier existant : <strong>[[:$2]]</strong>\nVeuillez choisir un autre nom.",
+       "fileexists-extension": "Un fichier existe avec un nom proche : [[$2|thumb]]\n* Nom du fichier à importer : <strong>[[:$1]]</strong>\n* Nom du fichier existant : <strong>[[:$2]]</strong>\nPeut-être voulez-vous utiliser un nom plus explicite ?",
        "fileexists-thumbnail-yes": "Le fichier semble être une image en taille réduite ''(vignette)''. [[$1|thumb]]\nVeuillez vérifier le fichier <strong>[[:$1]]</strong>.\nSi le fichier vérifié est la même image avec la taille initiale, il n'y a pas besoin d'importer une version réduite.",
        "file-thumbnail-no": "Le nom du fichier commence par <strong>$1</strong>.\nIl est possible qu'il s'agisse d'une version réduite ''(vignette)''.\nSi vous disposez du fichier en haute résolution, importez-le, sinon veuillez modifier son nom.",
        "fileexists-forbidden": "Un fichier avec ce nom existe déjà et ne peut pas être écrasé.\nSi vous voulez toujours importer votre fichier, veuillez revenir en arrière et utiliser un autre nom. [[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "La suppression et restauration de fichiers est temporairement désactivée durant la maintenance.",
        "filedelete-maintenance-title": "Impossible de supprimer le fichier",
        "mimesearch": "Recherche par type de contenu MIME",
-       "mimesearch-summary": "Cette page vous permet de lister les fichiers accessibles par ce wiki en fonction de leur type de contenu MIME.\nEntrée : ''typedecontenu''/''sous-type'', par exemple <code>image/jpeg</code>.",
+       "mimesearch-summary": "Cette page vous permet de filtrer les fichiers par leur type de contenu MIME.\nEntrée : type_de_contenu/sous-type ou type_de_contenu/*, par ex. <code>image/jpeg</code>.",
        "mimetype": "Type MIME :",
        "download": "télécharger",
        "unwatchedpages": "Pages ne faisant partie d’aucune liste de suivi",
        "wantedtemplates": "Modèles demandés",
        "mostlinked": "Pages les plus liées",
        "mostlinkedcategories": "Catégories les plus utilisées",
-       "mostlinkedtemplates": "Modèles les plus utilisés",
+       "mostlinkedtemplates": "Pages les plus incluses",
        "mostcategories": "Pages utilisant le plus de catégories",
        "mostimages": "Fichiers les plus utilisés",
        "mostinterwikis": "Pages avec le plus d'interwikis",
        "tooltip-preferences-save": "Sauvegarder les préférences",
        "tooltip-summary": "Entrez un bref résumé",
        "interlanguage-link-title": "$1 — $2",
+       "interlanguage-link-title-nonlang": "$1 — $2",
        "common.css": "/* Le CSS placé ici sera appliqué à tous les habillages. */",
-       "monobook.css": "/* Le CSS placé ici affectera les utilisateurs de l’habillage Monobook. */",
-       "vector.css": "/* Le CSS placé ici affectera les utilisateurs de l’habillage Vector. */",
        "print.css": "/* Le CSS placé ici affectera les impressions */",
        "noscript.css": "/* Le CSS placé ici affectera les utilisateurs ayant désactivé Javascript. */",
        "group-autoconfirmed.css": "/* Le CSS placé ici affectera les utilisateurs auto-confirmés seulement. */",
        "group-sysop.css": "/* Le CSS inclus ici n’affectera que les administrateurs */",
        "group-bureaucrat.css": "/* Le CSS inclus ici n’affectera que les bureaucrates */",
        "common.js": "/* Tout JavaScript ici sera chargé avec chaque page accédée par n’importe quel utilisateur. */",
-       "monobook.js": "/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage MonoBook uniquement. */",
-       "vector.js": "/* Tout code JavaScript placé ici sera chargé pour les utilisateurs de l’habillage Vector */",
        "group-autoconfirmed.js": "/* Le JavaScript inclus ici n’affectera que les utilisateurs auto-confirmés */",
        "group-user.js": "/* Le JavaScript placé ici ne sera chargé que pour les utilisateurs enregistrés. */",
        "group-bot.js": "/* Le JavaScript inclus ici n’affectera que les robots */",
        "pageinfo-category-pages": "Nombre de pages",
        "pageinfo-category-subcats": "Nombre de sous-catégories",
        "pageinfo-category-files": "Nombre de fichiers",
-       "skinname-monobook": "Monobook",
-       "skinname-vector": "Vector",
        "markaspatrolleddiff": "Marquer comme relue",
        "markaspatrolledtext": "Marquer cette page comme relue",
        "markedaspatrolled": "Marquée comme relue",
        "version-hook-name": "Nom du greffon",
        "version-hook-subscribedby": "Abonnés :",
        "version-version": "(version $1)",
+       "version-no-ext-name": "[pas de nom]",
        "version-license": "Licence MediaWiki",
        "version-ext-license": "Licence",
        "version-ext-colheader-name": "Extension",
index 1d41451..e5203bc 100644 (file)
@@ -5,7 +5,8 @@
                        "ChrisPtDe",
                        "Reedy",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Soul Train"
                ]
        },
        "tog-underline": "Solegnér los lims :",
        "searchmenu-exists": "'''Y at na pâge apelâye « [[:$1]] » sur ceti vouiqui.'''",
        "searchmenu-new": "'''Fâre la pâge « [[:$1|$1]] » sur ceti vouiqui !'''",
        "searchprofile-articles": "Pâges de contegnu",
-       "searchprofile-project": "Pâges d’éde et pâges projèt",
        "searchprofile-images": "Multimèdia",
        "searchprofile-everything": "Tot",
        "searchprofile-advanced": "Rechèrche avanciêe",
        "searchprofile-articles-tooltip": "Rechèrchiér dedens $1",
-       "searchprofile-project-tooltip": "Rechèrchiér dedens $1",
        "searchprofile-images-tooltip": "Rechèrchiér des fichiérs",
        "searchprofile-everything-tooltip": "Rechèrchiér dedens tot lo contegnu (les pâges de discussion avouéc)",
        "searchprofile-advanced-tooltip": "Chouèsir los èspâços de noms por la rechèrche",
        "search-interwiki-default": "Rèsultats dessus $1 :",
        "search-interwiki-more": "(més)",
        "search-relatedarticle": "Aparentâ",
-       "searcheverything-enable": "Rechèrchiér dedens tôs los èspâços de noms",
        "searchrelated": "aparentâ",
        "searchall": "tot",
        "showingresults": "Vua de '''$1''' rèsultat{{PLURAL:$1||s}} dês lo numerô '''$2'''.",
        "allowemail": "Activar l’èxpèdicion de mèssâjos que vegnont d’ôtros utilisators",
        "prefs-searchoptions": "Rechèrche",
        "prefs-namespaces": "Èspâços de noms",
-       "defaultns": "Ôtrament rechèrchiér dedens cetos èspâços de noms :",
        "default": "dèfôt",
        "prefs-files": "Fichiérs",
        "prefs-custom-css": "CSS pèrsonalisâ",
        "prefs-emailconfirm-label": "Confirmacion de l’adrèce èlèctronica :",
        "youremail": "Adrèce èlèctronica :",
        "username": "Nom d’utilisat{{GENDER:$1|or|rice}} :",
-       "uid": "Identifient d’utilisat{{GENDER:$1|or|rice}} :",
        "prefs-memberingroups": "{{GENDER:$2|Membro}} de l{{PLURAL:$1|a tropa|es tropes}} :",
        "prefs-registration": "Dâta d’encartâjo :",
        "yourrealname": "Veré nom :",
        "grouppage-user": "{{ns:project}}:Utilisators",
        "grouppage-autoconfirmed": "{{ns:project}}:Utilisators ôtoconfirmâs",
        "grouppage-bot": "{{ns:project}}:Robots",
-       "grouppage-sysop": "{{ns:project}}:Administrators",
+       "grouppage-sysop": "{{ns:project}}:Администраторар",
        "grouppage-bureaucrat": "{{ns:project}}:Grata-papiérs",
        "grouppage-suppress": "{{ns:project}}:Supèrvisors",
        "right-read": "Liére les pâges",
        "log-title-wildcard": "Chèrchiér entre-mié los titros que començont per cél tèxto",
        "showhideselectedlogentries": "Montrar / cachiér les entrâs de jornal chouèsies",
        "allpages": "Totes les pâges",
-       "alphaindexline": "de $1 a $2",
        "nextpage": "Pâge aprés ($1)",
        "prevpage": "Pâge devant ($1)",
        "allpagesfrom": "Fâre vêre les pâges dês :",
        "tooltip-preferences-save": "Encartar les prèferences",
        "tooltip-summary": "Buchiéd un côrt rèsumâ",
        "common.css": "/* Lo code CSS betâ ique serat aplicâ a tôs los habelyâjos. */",
-       "cologneblue.css": "/* Lo code CSS betâ ique afècterat los usanciérs de l’habelyâjo « Blu de Cologne ». */",
        "monobook.css": "/* Lo code CSS betâ ique afècterat los usanciérs de l’habelyâjo « MonoBook ». */",
-       "modern.css": "/* Lo code CSS betâ ique afècterat los usanciérs de l’habelyâjo « Modèrno ». */",
        "vector.css": "/* Lo code CSS betâ ique afècterat los usanciérs de l’habelyâjo « Vèctor ». */",
        "print.css": "/* Lo code CSS betâ ique afècterat les emprèssions. */",
        "noscript.css": "/* Lo code CSS betâ ique afècterat los usanciérs qu’ont dèsactivâ lo code JavaScript. */",
        "group-sysop.css": "/* Lo code CSS betâ ique afècterat ren que los administrators. */",
        "group-bureaucrat.css": "/* Lo code CSS betâ ique afècterat ren que los grata-papiérs. */",
        "common.js": "/* Tot code JavaScript betâ ique serat chargiê per tôs los usanciérs avouéc châque chargement de pâge. */",
-       "cologneblue.js": "/* Tot code JavaScript betâ ique serat chargiê per los usanciérs de l’habelyâjo « Blu de Cologne ». */",
        "monobook.js": "/* Tot code JavaScript betâ ique serat chargiê per los usanciérs de l’habelyâjo « MonoBook ». */",
-       "modern.js": "/* Tot code JavaScript betâ ique serat chargiê per los usanciérs de l’habelyâjo « Modèrno ». */",
        "vector.js": "/* Tot code JavaScript betâ ique serat chargiê per los usanciérs de l’habelyâjo « Vèctor ». */",
        "group-autoconfirmed.js": "/* Tot code JavaScript betâ ique serat chargiê ren que por los usanciérs encartâs. */",
        "group-bot.js": "/* Tot code JavaScript betâ ique serat chargiê ren que por los bots. */",
        "pageinfo-contentpage": "Comptâ coment pâge de contegnu",
        "pageinfo-contentpage-yes": "Ouè",
        "pageinfo-protect-cascading-yes": "Ouè",
-       "skinname-cologneblue": "Blu de Cologne",
        "skinname-monobook": "MonoBook",
-       "skinname-modern": "Modèrno",
        "skinname-vector": "Vèctor",
        "markaspatrolleddiff": "Marcar coment survelyê",
        "markaspatrolledtext": "Marcar ceta pâge coment survelyê",
index 624a890..f928602 100644 (file)
        "qbmyoptions": "Min sidjen",
        "faq": "FAQ",
        "faqpage": "Project:FAQ",
-       "vector-action-addsection": "Nei kirew began",
-       "vector-action-delete": "Strik",
-       "vector-action-move": "Fersküüw",
-       "vector-action-protect": "Seekre",
-       "vector-action-undelete": "Weder iinstel",
-       "vector-action-unprotect": "Sidjenseekerhaid",
-       "vector-view-create": "Maage",
-       "vector-view-edit": "Bewerke",
-       "vector-view-history": "Ferluup uunluke",
-       "vector-view-view": "Lees",
-       "vector-view-viewsource": "Kweltekst uunluke",
        "actions": "Aktjuunen",
        "namespaces": "Nöömrümer",
        "variants": "Warianten",
        "difference-missing-revision": "{{PLURAL:$2|Ian werjuun|$2 werjuunen}} faan di ferskeel ($1) {{PLURAL:$2|as|san}} ei fünjen wurden.\n\nDet komt diar miast faan, dat en ual ferwisang stregen wurden as.\nDü könst det uun't [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} logbuk faan stregen sidjen] efterlees.",
        "searchresults": "Fünjen sidjen",
        "searchresults-title": "Fünjen sidjen för „$1“",
-       "toomanymatches": "Diar kaam tuföl resultaaten üüb din uunfraag. Ferschük det ööders.",
        "titlematches": "Auerianstemangen mä sidjennöömer",
        "textmatches": "Auerianstemangen mä teksten",
        "notextmatches": "Nian auerianstemangen mä teksten",
        "searchmenu-exists": "'''Deer as en sid nååmd \"[[:$1]]\" önj jüdeer Wiki'''",
        "searchmenu-new": "<strong>Maage det sidj „[[:$1]]“ uun detheer wiki!</strong> {{PLURAL:$2|0=|Luke uk bi det fünjen sidj.|Luke uk bi a fünjen sidjen.}}",
        "searchprofile-articles": "Artiikler",
-       "searchprofile-project": "Halep- an Projektsidjen",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Ales",
        "searchprofile-advanced": "Ütjwidjet",
        "searchprofile-articles-tooltip": "Schük uun $1",
-       "searchprofile-project-tooltip": "Schük uun $1",
        "searchprofile-images-tooltip": "Bilen schük",
        "searchprofile-everything-tooltip": "Schük aueraal (uk diskusjuunssidjen)",
        "searchprofile-advanced-tooltip": "Uun ööder nöömrümer schük",
        "search-interwiki-default": "Resultaaten faan $1:",
        "search-interwiki-more": "(muar)",
        "search-relatedarticle": "Ferbünjen",
-       "searcheverything-enable": "Uun arke nöömrüm schük",
        "searchrelated": "ferbünjen",
        "searchall": "aaltumaal",
        "showingresults": "Heer {{PLURAL:$1|as '''1''' resultaat|san '''$1''' resultaaten}}, jo began mä numer '''$2.'''",
        "allowemail": "E-mail faan ööder brükern tuläät",
        "prefs-searchoptions": "Schük",
        "prefs-namespaces": "Nöömrümer",
-       "defaultns": "Ööders schük uun jodiar nöömrümer:",
        "default": "Fööriinstelang",
        "prefs-files": "Datein",
        "prefs-custom-css": "Salew maaget CSS",
        "prefs-emailconfirm-label": "E-Mail gudkäänd:",
        "youremail": "E-mail:",
        "username": "{{GENDER:$1|Brükernööm}}:",
-       "uid": "{{GENDER:$1|Brükerkäänang}}:",
        "prefs-memberingroups": "{{GENDER:$2|Lasmoot}} faan {{PLURAL:$1|brükerskööl|brükersköölen}}:",
        "prefs-registration": "Uunmelde-tidj",
        "yourrealname": "Rocht nööm:",
        "recentchanges-label-unpatrolled": "Detdiar feranrang as noch ei efterluket wurden",
        "recentchanges-label-plusminus": "Feranert sidjengrate (am soföl bytes)",
        "recentchanges-legend-heading": "'''Ferklaarang:'''",
-       "recentchanges-legend-newpage": "(luke uk bi't [[Special:NewPages|list mä nei sidjen]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (luke uk bi't [[Special:NewPages|list mä nei sidjen]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Diar wurd a feranrangen sant <strong>$2</strong>uunwiset (ei muar üs <strong>$1</strong> feranrangen).",
        "rclistfrom": "Bluas feranrangen sant $3 $2 wise",
        "log-title-wildcard": "Sidjennööm begant mä ...",
        "showhideselectedlogentries": "Wise/fersteeg jodiar logbukiindracher",
        "allpages": "Aal a sidjen",
-       "alphaindexline": "$1 bit $2",
        "nextpage": "Naist sidj ($1)",
        "prevpage": "Leetst sidj ($1)",
        "allpagesfrom": "Sidjen wise sant:",
index 747f40c..f1db4fd 100644 (file)
@@ -11,7 +11,8 @@
                        "Urhixidur",
                        "Vipuser",
                        "Xiaomingyan",
-                       "아라"
+                       "아라",
+                       "Mywood"
                ]
        },
        "tog-underline": "下划链接",
        "qbmyoptions": "偶𠮶选项",
        "faq": "FAQ",
        "faqpage": "Project:问得蛮多𠮶问题",
-       "vector-action-addsection": "添主题",
-       "vector-action-delete": "删吥",
-       "vector-action-move": "移吥",
-       "vector-action-protect": "护到",
-       "vector-action-undelete": "望下删吥𠮶页面",
-       "vector-action-unprotect": "更改保护",
-       "vector-view-create": "创建",
-       "vector-view-edit": "编辑",
-       "vector-view-history": "望下历史",
-       "vector-view-view": "读",
-       "vector-view-viewsource": "望下原始码",
        "actions": "动作",
        "namespaces": "空间名",
        "variants": "变换",
        "history_short": "历史",
        "updatedmarker": "最末道浏览后𠮶改动",
        "printableversion": "可打印版本",
-       "permalink": "永久链接",
+       "permalink": "固定链接",
        "print": "打印",
        "view": "眵",
        "edit": "编写",
        "enterlockreason": "请输入锁到数据库𠮶理由,包括预计几时间解锁",
        "readonlytext": "数据库上嘞锁改伓正,可能佢正维修中,搞正嘞仰上会还原。管理员𠮶解释: $1",
        "missing-article": "资料库冇寻到倷要𠮶版面,「$1」 $2。\n\n通常个系因为修订历史页上头,过时𠮶连结连到删吥𠮶版面咁舞得𠮶。\n\n如果不系咁,倷可能系寻到软件里头𠮶bug。\n请记得 URL 𠮶地址,向[[Special:ListUsers/sysop|管理员]]报告。",
-       "missingarticle-rev": "(修订#: $1)",
+       "missingarticle-rev": "(版本#: $1)",
        "missingarticle-diff": "(差异: $1, $2)",
        "readonly_lag": "附属数据库服务器拿缓存更新到主服务器,数据库自动锁到嘞",
        "internalerror": "内部错误",
        "rev-delundel": "显示/弆到",
        "rev-showdeleted": "敨开",
        "revisiondelete": "删除/反删除修改",
-       "revdelete-nooldid-title": "冇目标修订",
+       "revdelete-nooldid-title": "无效目标版本",
        "revdelete-nooldid-text": "倷冇话个只操作𠮶目标修改。",
        "logdelete-selected": "拣$1𠮶$2只日志事件:",
        "revdelete-legend": "设置可见性𠮶限制",
        "editundo": "还原",
        "searchresults": "寻到𠮶结果",
        "searchresults-title": "对\"$1\"寻到𠮶结果",
-       "toomanymatches": "返回多伤喽𠮶结果,请试吖用别𠮶词语寻过",
        "titlematches": "文章标题符合",
        "textmatches": "页面内容符合",
        "notextmatches": "冇页面内容符合",
        "searchmenu-exists": "'''个只wiki已有一只叫「[[:$1]]」𠮶页。'''",
        "searchmenu-new": "'''嘚个只wiki上建立「[[:$1]]」页!'''",
        "searchprofile-articles": "内容页",
-       "searchprofile-project": "帮助同得计划页",
        "searchprofile-images": "多媒体",
        "searchprofile-everything": "所有",
        "searchprofile-advanced": "高级",
        "searchprofile-articles-tooltip": "到$1里头寻",
-       "searchprofile-project-tooltip": "到$1里头寻",
        "searchprofile-images-tooltip": "寻档案",
        "searchprofile-everything-tooltip": "寻所有内容(包括谈𫍡页)",
        "searchprofile-advanced-tooltip": "到自定名字空间里头寻",
        "servertime": "服务器时间",
        "guesstimezone": "到浏览器上填",
        "allowemail": "接受别𠮶用户𠮶邮件",
-       "defaultns": "默认搜索𠮶名字空间:",
        "default": "默认",
        "prefs-files": "档案",
        "youremail": "电子邮件:",
        "username": "用户名:",
-       "uid": "用户ID:",
        "yourrealname": "真名:",
        "yourlanguage": "语言:",
        "yourvariant": "多款内容语言:",
        "logempty": "日志里头冇符合𠮶项目。",
        "log-title-wildcard": "寻吖个只字开头𠮶标题",
        "allpages": "所有𠮶页面",
-       "alphaindexline": "$1到$2",
        "nextpage": "下页($1)",
        "prevpage": "上页($1)",
        "allpagesfrom": "显示以个底开始𠮶页面:",
        "exbeforeblank": "拖清空之前𠮶内容系: '$1'",
        "delete-confirm": "删卟\"$1\"去",
        "delete-legend": "删卟去",
-       "historywarning": "'''警告''': 倷要删卟𠮶页面含到$1到{{PLURAL:$1|修订|修订}}𠮶历史",
+       "historywarning": "'''警告''': 倷要删卟𠮶页面含到$1到{{PLURAL:$1|版本}}𠮶历史",
        "confirmdeletetext": "仰上倷就要永久删卟数据库𠮶一只页面或图像同佢𠮶历史。请确定倷要啖做,哈要晓得佢𠮶后果,更加伓能违反[[{{MediaWiki:Policy-url}}]]。",
        "actioncomplete": "扤正嘞",
        "actionfailed": "操作冇舞正",
        "undelete-search-prefix": "显示以下底开头𠮶页面:",
        "undelete-search-submit": "寻吖",
        "undelete-no-results": "删卟记录冇合到𠮶结果。",
-       "undelete-filename-mismatch": "删伓正带到时间标记𠮶档案修订 $1: 档案伓匹配",
+       "undelete-filename-mismatch": "删伓正带到时间标记𠮶档案版本$1: 档案伓匹配",
        "undelete-bad-store-key": "删伓正带到时间标记𠮶档案修订 $1: 档案删卟之前就跌卟嘞。",
        "undelete-cleanup-error": "删卟冇用𠮶存盘文件 \"$1\" 时出错。",
        "undelete-missing-filearchive": "数据库冇档案存盘 ID $1 ,故系佢也就到档案存盘恢复伓正。佢话伓定早反删除嘞。",
        "sp-contributions-userrights": "用户权限管理",
        "sp-contributions-search": "寻贡献",
        "sp-contributions-username": "IP地址或用户名:",
-       "sp-contributions-toponly": "光显示最晏修订版本𠮶编辑",
+       "sp-contributions-toponly": "光显示最晏版本𠮶编辑",
        "sp-contributions-submit": "寻",
        "whatlinkshere": "有什哩连到个首",
        "whatlinkshere-title": "连到 $1 𠮶页面",
        "tooltip-t-upload": "上传图像或多媒体文件",
        "tooltip-t-specialpages": "全部特殊页列表",
        "tooltip-t-print": "个只页面𠮶打印版",
-       "tooltip-t-permalink": "个只页面𠮶永久链接",
+       "tooltip-t-permalink": "个只页面𠮶固定链接",
        "tooltip-ca-nstab-main": "望吖内容页",
        "tooltip-ca-nstab-user": "望吖用户页",
        "tooltip-ca-nstab-media": "望吖媒体页",
        "tooltip-undo": "『复原』可以到编辑模式里头开只编辑表以便复原。佢容许到摘要里头加进原因。",
        "tooltip-summary": "输入只简要",
        "common.css": "/** 个首𠮶CSS会用到全部𠮶皮肤 */",
-       "monobook.css": "/* 个首𠮶 CSS 会碍到正用Monobook皮肤𠮶用户 */",
        "common.js": "/* 个首𠮶JavaScript仰上载进到所有用户全部页面。 */",
-       "monobook.js": "/* 伓再使用;请用[[MediaWiki:common.js]] */",
        "anonymous": "{{SITENAME}}𠮶匿名用户",
        "siteuser": "{{SITENAME}}用户$1",
        "anonuser": "{{SITENAME}}匿名用户$1",
index d98fe23..2ff24b1 100644 (file)
@@ -8,7 +8,8 @@
                        "Urhixidur",
                        "Vipuser",
                        "Xiaomingyan",
-                       "아라"
+                       "아라",
+                       "Mywood"
                ]
        },
        "tog-underline": "下劃連結",
        "qbmyoptions": "我嗰頁面",
        "faq": "FAQ",
        "faqpage": "Project:問得蠻多嗰問題",
-       "vector-action-addsection": "添主題",
-       "vector-action-delete": "刪吥",
-       "vector-action-move": "移吥",
-       "vector-action-protect": "護到",
-       "vector-action-undelete": "望下刪吥嗰頁面",
-       "vector-action-unprotect": "解除保護",
-       "vector-view-create": "創建",
-       "vector-view-edit": "編輯",
-       "vector-view-history": "望下歷史",
-       "vector-view-view": "讀",
-       "vector-view-viewsource": "望下原始碼",
        "actions": "動作",
        "namespaces": "空間名",
        "variants": "變換",
        "history_short": "歷史",
        "updatedmarker": "頂晏嗰許到瀏覽後嗰改動",
        "printableversion": "可打印版本",
-       "permalink": "永久連結",
+       "permalink": "固定連結",
        "print": "打印",
        "view": "眵",
        "edit": "編寫",
        "editundo": "還原",
        "searchresults": "尋到嗰結果",
        "searchresults-title": "對「$1」尋到嗰結果",
-       "toomanymatches": "返回多傷哩嗰結果,請較下用別嗰詞語尋過",
        "titlematches": "文章標題符合",
        "textmatches": "頁面內容符合",
        "notextmatches": "冇頁面內容符合",
        "searchmenu-exists": "'''箇隻wiki已有一隻叫「[[:$1]]」嗰頁。'''",
        "searchmenu-new": "'''到箇隻wiki上建立「[[:$1]]」頁!'''",
        "searchprofile-articles": "內容頁",
-       "searchprofile-project": "幫助同得計劃頁",
        "searchprofile-images": "多媒體",
        "searchprofile-everything": "所有",
        "searchprofile-advanced": "高級",
        "searchprofile-articles-tooltip": "到$1裡頭尋",
-       "searchprofile-project-tooltip": "到$1裡頭尋",
        "searchprofile-images-tooltip": "尋檔案",
        "searchprofile-everything-tooltip": "尋所有內容(包括談詑頁)",
        "searchprofile-advanced-tooltip": "到自定名字空間裡頭尋",
        "servertime": "服務器時間",
        "guesstimezone": "到瀏覽器上填",
        "allowemail": "接受別嗰用戶嗰郵件",
-       "defaultns": "默認搜索嗰名字空間:",
        "default": "預設",
        "prefs-files": "檔案",
        "youremail": "電子郵件:",
        "username": "用戶名:",
-       "uid": "用戶ID:",
        "yourrealname": "真名:",
        "yourlanguage": "語言:",
        "yourvariant": "多款內容語言:",
        "logempty": "日誌裡頭冇符合嗰項目。",
        "log-title-wildcard": "尋吖箇隻字開頭嗰標題",
        "allpages": "所有嗰頁面",
-       "alphaindexline": "$1到$2",
        "nextpage": "下頁($1)",
        "prevpage": "上頁($1)",
        "allpagesfrom": "顯示以箇底開始嗰頁面:",
        "tooltip-t-upload": "上傳圖像或多媒體文件",
        "tooltip-t-specialpages": "全部特殊頁嗰清單",
        "tooltip-t-print": "箇隻頁面嗰打印版",
-       "tooltip-t-permalink": "箇隻頁面嗰永久連結",
+       "tooltip-t-permalink": "箇隻頁面嗰固定連結",
        "tooltip-ca-nstab-main": "望下內容頁",
        "tooltip-ca-nstab-user": "望下用戶頁",
        "tooltip-ca-nstab-media": "望吖媒體頁",
        "tooltip-undo": "『復原』可以到編輯模式裡頭開隻編輯表以便復原。佢容許到摘要裡頭加進原因。",
        "tooltip-summary": "輸入隻簡要",
        "common.css": "/** 箇首嗰CSS會用到全部嗰皮膚 */",
-       "monobook.css": "/* 箇首嗰 CSS 會礙到正用Monobook皮膚嗰用戶 */",
        "common.js": "/* 箇首嗰JavaScript仰上載進到所有用戶全部頁面。 */",
-       "monobook.js": "/* 伓再使用;請用[[MediaWiki:common.js]] */",
        "anonymous": "{{SITENAME}}嗰匿名用戶",
        "siteuser": "{{SITENAME}}用戶$1",
        "anonuser": "{{SITENAME}}匿名用戶$1",
index faa032d..45dffab 100644 (file)
@@ -7,13 +7,14 @@
                        "Sionnach",
                        "Steafan31",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "GunChleoc"
                ]
        },
        "tog-underline": "Fo-loidhneadh nan ceanglaichean:",
        "tog-hideminor": "Falaich mùthaidhean beaga ann an liosta nam mùthaidhean ùra",
-       "tog-hidepatrolled": "Falaich mùthaidhean fo fhaire ann an liosta nam mùthaidhean ùra",
-       "tog-newpageshidepatrolled": "Falaich duilleagan fo fhaire ann an liosta nan duilleagan ùra",
+       "tog-hidepatrolled": "Falaich mùthaidhean fo fhreiceadan ann an liosta nam mùthaidhean ùra",
+       "tog-newpageshidepatrolled": "Falaich duilleagan fo fhreiceadan ann an liosta nan duilleagan ùra",
        "tog-extendwatchlist": "Leudaich an clàr-faire gus an seall e gach mùthadh 's chan ann an fheadhainn as ùire a-mhàin",
        "tog-usenewrc": "Buidhnich na h-atharraichean a-rèir duilleige sna mùthaidhean ùra agus air a' chlàr-fhaire",
        "tog-numberheadings": "Cuir àireamhan ri ceann-sgrìobhaidhean leis fhèin",
@@ -28,9 +29,9 @@
        "tog-previewontop": "Nochd an ro-shealladh os cionn a' bhogsa deasachaidh",
        "tog-previewonfirst": "Nochd an ro-shealladh nuair a nithear a' chiad deasachadh",
        "tog-enotifwatchlistpages": "Cuir post-dealain thugam nuair a mhùthar duilleag a tha air a' chlàr-fhaire agam",
-       "tog-enotifusertalkpages": "Cuir post-dealain thugam nuair a mhùthaichear duilleag mo chonaltraidh",
+       "tog-enotifusertalkpages": "Cuir post-dealain thugam nuair a thèid duilleag mo dheasbaireachd atharrachadh",
        "tog-enotifminoredits": "Cuir post-dealain thugam nuair a nithear mùthadh beag air duilleagan cuideachd",
-       "tog-enotifrevealaddr": "Nochd an seòladh puist-dhealain agam ann am teachdaireachdan fiosrachaidh",
+       "tog-enotifrevealaddr": "Nochd an seòladh puist-d agam ann am brathan-naidheachd puist-d",
        "tog-shownumberswatching": "Nochd àireamh nan cleachdaichean a tha a' cumail sùil air",
        "tog-oldsig": "An t-earr-sgrìobhadh làithreach:",
        "tog-fancysig": "Làimhsich an t-earr-sgrìobhadh mar wikitext (gun cheangal leis fhèin)",
        "tog-watchlisthideminor": "Falaich mùthaidhean beaga air mo chlàr-faire",
        "tog-watchlisthideliu": "Falaich mùthaidhean le cleachdaichean a tha air logadh a-steach air mo chlàr-faire",
        "tog-watchlisthideanons": "Falaich mùthaidhean le cleachdaichean gun ainm air mo chlàr-faire",
-       "tog-watchlisthidepatrolled": "Falaich mùthaidhean air duilleagan fo fhreiceadan air mo chlàr-faire",
+       "tog-watchlisthidepatrolled": "Falaich mùthaidhean air duilleagan fo fhreiceadan air a' chlàr-fhaire agam",
        "tog-ccmeonemails": "Cuir lethbhric de phuist-dhealain a chuireas mi do chleachdaichean eile thugam",
-       "tog-diffonly": "Na seall susbaint nan duilleagan fo na diofaichean",
-       "tog-showhiddencats": "Seall na roinnean falaichte",
-       "tog-norollbackdiff": "Na dèan diof às dèidh roiligeadh air ais",
+       "tog-diffonly": "Na seall susbaint nan duilleagan fo na diofaran",
+       "tog-showhiddencats": "Seall na roinnean-seòrsa falaichte",
+       "tog-norollbackdiff": "Na seall na diofaran às dèidh roladh air ais",
        "tog-useeditwarning": "Thoir rabhadh dhomh ma bhios mi an impis duilleag deasachaidh fhàgail mus do shàbhail mi na mùthaidhean agam",
        "tog-prefershttps": "Cleachd ceangal tèarainte an-còmhnaidh nuair a bhios mi clàraichte a-staigh",
        "underline-always": "An-còmhnaidh",
        "october-date": "$1 dhen Dàmhair",
        "november-date": "$1 dhen t-Samhain",
        "december-date": "$1 dhen Dùbhlachd",
-       "pagecategories": "{{PLURAL:$1|Roinn-seòrsa|Roinn-seòrsa|Roinnean-seòrsa|Roinn-seòrsa}}",
-       "category_header": "Duilleagan sa roinn \"$1\"",
-       "subcategories": "Fo-roinnean",
-       "category-media-header": "Meadhanan sa roinn \"$1\"",
-       "category-empty": "''Chan eil duilleagan no meadhanan san roinn seo an-dràsta.''",
-       "hidden-categories": "{{PLURAL:$1|Roinn-seòrsa fhalaichte|Roinn-seòrsa fhalaichte|Roinnean-seòrsa falaichte|Roinn-seòrsa fhalaichte}}",
-       "hidden-category-category": "Roinnean falaichte",
-       "category-subcat-count": "{{PLURAL:$2|Chan eil san roinn-seòrsa ach an fho-roinn-seòrsa a leanas.|Tha {{PLURAL:$1|an fho-roinn-seòrsa|an $1 fho-roinn-seòrsa|na $1 fo-roinnean-seòrsa|na $1 fo-roinn-seòrsa}}, aig an roinn-seòrsa a leanas, a-mach à $2 uile gu lèir.}}",
-       "category-subcat-count-limited": "Tha {{PLURAL:$1|an fho-roinn-seòrsa|na fo-roinntean-seòrsa}} a leanas sa roinn-seòrsa seo.",
-       "category-article-count": "{{PLURAL:$2|Chan eil ach an duilleag a leanas san fho-roinn-seòrsa seo.|Tha {{PLURAL:$1|an duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas san roinn-seòrsa seo, a-mach à $2 uile gu lèir.}}",
-       "category-article-count-limited": "Tha {{PLURAL:$1|an duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas san roinn-seòrsa làithreach.",
-       "category-file-count": "{{PLURAL:$2|Chan eil ach am faidhle a leanas san fho-roinn-seòrsa seo.|Tha {{PLURAL:$1|am faidhle|an $1 fhaidhle|na $1 faidhlichean|na $1 faidhle}} a leanas san roinn-seòrsa seo, a-mach à $2 uile gu lèir.}}",
-       "category-file-count-limited": "Tha {{PLURAL:$1|am faidhle|an $1 fhaidhle|na $1 faidhlichean|na $1 faidhle}} a leanas san roinn-seòrsa làithreach.",
+       "pagecategories": "{{PLURAL:$1|Roinn-seòrsa|Roinnean-seòrsa}}",
+       "category_header": "Duilleagan san roinn-seòrsa \"$1\"",
+       "subcategories": "Fo-roinnean-seòrsa",
+       "category-media-header": "Meadhanan san roinn-seòrsa \"$1\"",
+       "category-empty": "<em>Chan eil duilleagan no meadhanan san roinn-seòrsa seo an-dràsta.</em>",
+       "hidden-categories": "{{PLURAL:$1|Roinn-seòrsa fhalaichte|Roinnean-seòrsa falaichte}}",
+       "hidden-category-category": "Roinnean-seòrsa falaichte",
+       "category-subcat-count": "{{PLURAL:$2|Chan eil ach an fho-roinn-seòrsa a leanas san roinn-seòrsa seo.|Tha {{PLURAL:$1|an fho-roinn-seòrsa|na $1 fo-roinnean-seòrsa}} a leanas san roinn-seòrsa (a-mach à $2 uile gu lèir).}}",
+       "category-subcat-count-limited": "Tha {{PLURAL:$1|an fho-roinn-seòrsa|na fo-roinnean-seòrsa}} a leanas san roinn-seòrsa seo.",
+       "category-article-count": "{{PLURAL:$2|Chan eil ach an duilleag a leanas san roinn-seòrsa seo.|Tha {{PLURAL:$1|an $1 duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas san roinn-seòrsa seo (a-mach à $2 uile gu lèir).}}",
+       "category-article-count-limited": "Tha {{PLURAL:$1|an $1 duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas san roinn-seòrsa làithreach.",
+       "category-file-count": "{{PLURAL:$2|Chan eil ach am faidhle a leanas san roinn-seòrsa seo.|Tha {{PLURAL:$1|an $1 fhaidhle|an $1 fhaidhle|na $1 faidhlichean|na $1 faidhle}} a leanas san roinn-seòrsa seo (a-mach à $2 uile gu lèir).}}",
+       "category-file-count-limited": "Tha {{PLURAL:$1|an $1 fhaidhle|an $1 fhaidhle|na $1 faidhlichean|na $1 faidhle}} a leanas san roinn-seòrsa làithreach.",
        "listingcontinuesabbrev": "(an corr)",
        "index-category": "Duilleagan air a' chlàr-innse",
        "noindex-category": "Duilleagan nach eil air a' chlàr-innse",
        "broken-file-category": "Duilleagan sa bheil ceanglaichean faidhle a tha briste",
+       "categoryviewer-pagedlinks": "($1) ($2)",
        "about": "Mu",
        "article": "Duilleag susbainte",
        "newwindow": "(a' fosgladh ann an uinneag ùr)",
        "morenotlisted": "Chan eil an liosta seo iomlan.",
        "mypage": "Duilleag",
        "mytalk": "Deasbaireachd",
-       "anontalk": "Conaltradh airson an IP seo",
+       "anontalk": "Deasbaireachd airson an IP seo",
        "navigation": "Seòladh",
        "and": "&#32;agus",
        "qbfind": "Lorg",
        "qbmyoptions": "Na duilleagan agam",
        "faq": "CÀBHA",
        "faqpage": "Project:CÀBHA",
-       "vector-action-addsection": "Cuir ris cuspair",
-       "vector-action-delete": "Sguab às",
-       "vector-action-move": "Gluais",
-       "vector-action-protect": "Dìon",
-       "vector-action-undelete": "Neo-dhèan an sguabadh às",
-       "vector-action-unprotect": "Atharraich an dìon",
-       "vector-view-create": "Cruthaich",
-       "vector-view-edit": "Deasaich",
-       "vector-view-history": "Seall an eachdraidh",
-       "vector-view-view": "Leugh",
-       "vector-view-viewsource": "Seall an tùs",
        "actions": "Gnìomhan",
-       "namespaces": "Namespaces",
+       "namespaces": "Ainm-spàsan",
        "variants": "Tionndaidhean",
        "navigation-heading": "Clàr-taice na seòladaireachd",
        "errorpagetitle": "Mearachd",
        "delete": "Sguab às",
        "deletethispage": "Sguab às an duilleag seo",
        "undeletethispage": "Neo-dhèan sguabadh às na duilleige seo",
-       "undelete_short": "Neo-dhèan sguabadh às de {{PLURAL:$1|dh'aon deasachadh|$1 dheasachadh|$1 deasachaidhean|$1 deasachadh}}",
-       "viewdeleted_short": "Seall {{PLURAL:$1|aon deasachadh|$1 dheasachadh|$1 deasachaidhean|$1 deasachadh}} a chaidh a sguabadh às",
+       "undelete_short": "Neo-dhèan an sguabadh às air $1 {{PLURAL:$1|deasachadh|dheasachadh|deasachaidhean|deasachadh}}",
+       "viewdeleted_short": "Seall $1 {{PLURAL:$1|deasachadh|dheasachadh|deasachaidhean|deasachadh}} a chaidh a sguabadh às",
        "protect": "Dìon",
        "protect_change": "mùth",
        "protectthispage": "Dìon an duilleag seo",
        "mediawikipage": "Seall duilleag na teachdaireachd",
        "templatepage": "Seall duilleag na teamplaide",
        "viewhelppage": "Seall an duilleag cobharach",
-       "categorypage": "Seall duilleag na roinne",
+       "categorypage": "Seall duilleag na roinn-seòrsa",
        "viewtalkpage": "Seall an deasbaireachd",
        "otherlanguages": "Ann an cànain eile",
        "redirectedfrom": "(Air ath-sheòladh o $1)",
        "redirectpagesub": "Ath-sheòl an duilleag",
        "lastmodifiedat": "Chaidh an duilleag seo a mhùthadh $1 aig $2 turas mu dheireadh.",
-       "viewcount": "Chaidh inntrigeadh a dhèanamh dhan duilleag seo {{PLURAL:$1|aon turas|$1 thuras|$1 turais|$1 turas}}.",
+       "viewcount": "Chaidh inntrigeadh a dhèanamh dhan duilleag seo $1 {{PLURAL:$1|turas|thuras|tursan|turas}}.",
        "protectedpage": "Duilleag fo dhìon",
        "jumpto": "Gearr leum gu:",
        "jumptonavigation": "seòladh",
        "aboutsite": "Mu dhèidhinn {{SITENAME}}",
        "aboutpage": "Project:Mu dhèidhinn",
        "copyright": "Tha susbaint ri làimh fo $1 mur eil an caochladh 'ga innse.",
-       "copyrightpage": "{{ns:project}}:Còraichean lethbhric",
+       "copyrightpage": "{{ns:project}}:Còraichean-lethbhreac",
        "currentevents": "Cùisean an latha",
        "currentevents-url": "Project:Cùisean an latha",
        "disclaimers": "Aithrisean-àichidh",
        "privacypage": "Project:Am polasaidh prìobhaideachd",
        "badaccess": "Meareachd le cead",
        "badaccess-group0": "Chan eil cead agad an gnìomh a dh'iarr thu a thoirt gu buil.",
-       "badaccess-groups": "Tha an gnìomh a dh'iarr thu cuingichte 's cha dèan ach buill {{PLURAL:$2|a' bhuidhinn|nam buidhnean}} a leanas e: $1.",
+       "badaccess-groups": "Chan fhaod ach buill {{PLURAL:$2|dhen bhuidheann|dhe na buidhnean}} an gnìomh a dh'iarr thu a dhèanamh: $1.",
        "versionrequired": "Feum air tionndadh $1 de MhediaWiki",
        "versionrequiredtext": "Tha feum air tionndadh $1 de MhediaWiki mus faicear an duilleag seo.\nSeall air [[Special:Version|duilleag an tionndaidh]].",
        "ok": "Ceart ma-thà",
+       "pagetitle": "$1 - {{SITENAME}}",
+       "pagetitle-view-mainpage": "{{SITENAME}}",
+       "backlinksubtitle": "← $1",
        "retrievedfrom": "Air a tharraing à \"$1\"",
-       "youhavenewmessages": "Tha $1 ($2) agad.",
-       "youhavenewmessagesfromusers": "Tha $1 o {{PLURAL:$3|aon chleachdaiche|$3 chleachdaiche|$3 cleachdaichean|$3 cleachdaiche}} agad ($2).",
+       "youhavenewmessages": "Tha $1 agad ($2).",
+       "youhavenewmessagesfromusers": "Tha $1 o $3 {{PLURAL:$3|chleachdaiche|chleachdaiche|cleachdaichean|cleachdaiche}} agad ($2).",
        "youhavenewmessagesmanyusers": "Tha $1 agad o iomadh cleachdaiche ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|teachdaireachd ùr|theachdaireachd ùr|theachdaireachdan ùra|teachdaireachd ùr}}",
-       "newmessagesdifflinkplural": "{{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}} mu dheireadh",
+       "newmessageslinkplural": "{{PLURAL:$1|teachdaireachd ùr|teachdaireachdan ùra}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|am mùthadh|na mùthaidhean}} mu dheireadh",
        "youhavenewmessagesmulti": "Tha teachdaireachdan ùra agad ann an $1",
        "editsection": "deasaich",
        "editold": "deasaich",
        "hidetoc": "falaich",
        "collapsible-collapse": "Co-theannaich",
        "collapsible-expand": "Leudaich",
-       "thisisdeleted": "Seall no aisig $1?",
-       "viewdeleted": "Seall $1?",
-       "restorelink": "{{PLURAL:$1|aon deasachadh|$1 dheasachadh|$1 deasachaidhean|$1 deasachadh}} a chaidh a sguabadh às",
+       "thisisdeleted": "A bheil thu airson $1 a shealltainn no aiseag?",
+       "viewdeleted": "A bheil thu airson $1 a shealltainn?",
+       "restorelink": "$1 {{PLURAL:$1|deasachadh|dheasachadh|deasachaidhean|deasachadh}} a chaidh a sguabadh às",
        "feedlinks": "Inbhir:",
        "feed-invalid": "Seòrsa mì-dhligheach de dh'fho-sgrìobhadh inbhir.",
        "feed-unavailable": "Chan eil inbhirean co-bhanntachd ri fhaighinn",
        "site-atom-feed": "$1 Inbhir Atom",
        "page-rss-feed": "\"$1\" Inbhir RSS",
        "page-atom-feed": "\"$1\" Inbhir Atom",
+       "feed-atom": "Atom",
+       "feed-rss": "RSS",
        "red-link-title": "$1 (chan eil duilleag ann fhathast)",
        "sort-descending": "Seòrsaich a' tèarnadh",
        "sort-ascending": "Seòrsaich a' dìreadh",
        "nstab-mediawiki": "Teachdaireachd",
        "nstab-template": "Teamplaid",
        "nstab-help": "Cuideachadh",
-       "nstab-category": "Roinn",
+       "nstab-category": "Roinn-seòrsa",
        "nosuchaction": "Chan eil a leithid de ghnìomh ann",
        "nosuchactiontext": "Tha an gnìomh a shònraich an t-URL mì-dhligheach.\nFaodaidh gun do chuir thu a-steach URL mearachdach no gun do lean thu ri ceangal mearachdach.\nCuideachd, faodaidh gu bheil seo 'na chomharradh air buga sa bhathar-bhog aig {{SITENAME}}",
        "nosuchspecialpage": "Chan eil duilleag shònraichte d' a leithid ann",
        "databaseerror-query": "Ceist: $1",
        "databaseerror-function": "Foincsean: $1",
        "databaseerror-error": "Mearachd: $1",
-       "laggedslavemode": "'''Rabhadh:''' Faodaidh nach eil ùrachaidhean a rinneadh o chionn ghoirid a' nochdadh san duilleag.",
+       "laggedslavemode": "<strong>Rabhadh:</strong> Faodaidh nach eil ùrachaidhean a rinneadh o chionn ghoirid a' nochdadh san duilleag.",
        "readonly": "Stòr-dàta glaiste",
        "enterlockreason": "Cuir a-steach adhbhar a' ghlais, a' gabhail a-steach tuairmeas air fuasgladh a' ghlais.",
        "readonlytext": "Tha an stòr-dàta glaiste do chlàir ùra 's mùthaidhean eile, ma dh'fhaoidte air sgàth obair-chàraidh chunbhalach an stòir-dhàta 's bidh e mar as àbhaist às dèidh sin.\n\nChuir an rianadair a ghlas e an cèill na leanas: $1",
-       "missing-article": "Cha do lorg an stòr-dàta teacsa de dhuilleag a bu chòir a bhith air a lorg aige 's air a bheil \"$1\" $2.\n\n'S e mùthaidhean no ceangal eachdraidheil ro shean ri duilleag a chaidh a sguabadh às a bhios coireach à seo mar is trice.\n\nMur eil seo fìor, faodaidh gun do lorg thu buga sa bhathar-bhog.\nAn dèan thu aithris air seo do [[Special:ListUsers/sysop|rianadair]], ag innse dhaibh dè an t-URL a bha ann.",
+       "missing-article": "Cha do lorg an stòr-dàta teacsa de dhuilleag a bu chòir a bhith air a lorg aige 's air a bheil \"$1\" $2.\n\n'S e diofar no ceangal eachdraidheil ro shean ri duilleag a chaidh a sguabadh às a bhios coireach à seo mar is trice.\n\nMur eil seo fìor, faodaidh gun do lorg thu buga sa bhathar-bhog.\nAn dèan thu aithris air seo do [[Special:ListUsers/sysop|rianadair]], ag innse dhaibh dè an t-URL a bha ann.",
        "missingarticle-rev": "(mùthadh#: $1)",
-       "missingarticle-diff": "(Diof: $1, $2)",
+       "missingarticle-diff": "(Diofar: $1, $2)",
        "readonly_lag": "Chaidh an stòr-dàta a ghlasadh leis fhèin fhad 's a tha frithealaichean nan stòr-dàta tràilleach air dheireadh a' mhaighstir",
        "internalerror": "Ion-mhearachd",
        "internalerror_info": "Ion-mhearachd: $1",
-       "filecopyerror": "Cha do ghabh lethbhreac dhen fhaidhle \"$1\" gu \"$2\".",
+       "filecopyerror": "Cha b' urrainn dhuinn lethbhreac dhen fhaidhle \"$1\" a chur gu \"$2\".",
        "filerenameerror": "Cha do ghabh ainm an fhaidhle \"$1\" atharrachadh gu \"$2\".",
        "filedeleteerror": "Cha do ghabh am faidhle \"$1\" a sguabadh às.",
        "directorycreateerror": "Cha do ghabh am pasgan \"$1\" a chruthachadh.",
        "cannotdelete": "Cha do ghabh an duilleag no am faidhle \"$1\" a sguabadh às.\nFaodaidh gun deach a sguabadh às le cuideigin eile mu thràth.",
        "cannotdelete-title": "Cha ghabh an duilleag \"$1\" a sguabadh às",
        "delete-hook-aborted": "Sguireadh dhen sguabadh às ri linn dubhain.\nCha deach adhbhar a thoirt seachad.",
-       "no-null-revision": "Cha b' urrainn dhuinn lèirmheas neoinitheach ùr a chruthachadh dhan duilleag \"$1\"",
+       "no-null-revision": "Cha b' urrainn dhuinn mùthadh neoinitheach ùr a chruthachadh dhan duilleag \"$1\"",
        "badtitle": "Droch thiotal",
-       "badtitletext": "Bha an duilleag a dh'iarr thu mì-dhligheach, falamh no le tiotal eadar-chànanach no eadar-uici air a dhroch cheangal.\nFaodaidh gu bheil aon no barrachd charactairean ann nach urrainn dhut a chleachdadh ann an tiotalan.",
+       "badtitletext": "Bha an duilleag a dh'iarr thu mì-dhligheach, falamh no le tiotal eadar-chànanach no eadar-uicidh air a dhroch cheangal.\nFaodaidh gu bheil aon no barrachd charactairean ann nach urrainn dhut a chleachdadh ann an tiotalan.",
        "perfcached": "Chaidh an dàta a leanas a thasgadh 's faodaidh gu bheil e air dheireadh. Tha {{PLURAL:$1|$1 toradh|$1 thoradh|$1 toraidhean|$1 toradh}} ri fhaighinn san tasgadan air a' char as motha.",
        "perfcachedts": "Chaidh an dàta a leanas a thasgadh agus chaidh ùrachadh $1 turas mu dheireadh. Tha {{PLURAL:$4|$4 toradh|$4 thoradh|$4 toraidhean|$4 toradh}} ri fhaighinn san tasgadan air a' char as motha.",
        "querypage-no-updates": "Tha ùrachadh air a chur à comas air an duilleag seo an-dràsta.\nCha dèid an dàta an-seo ùrachadh aig an àm seo.",
        "actionthrottledtext": "Gus casg a chur air spama, chan urrainn dhut an gnìomh seo a dhèanamh ro thric am broinn ùine ghoirid agus chaidh thu thairis air a' chrìoch seo.\nFeuch ris a-rithist às a dhèidh seo.",
        "protectedpagetext": "Chaidh an duilleag seo a dhìon gus casg a chur air deasachadh.",
        "viewsourcetext": "'S urrainn dhut coimhead air tùs na duilleige seo 's lethbhreac a dhèanamh dheth:",
-       "viewyourtext": "'S urrainn dhut coimhead air '''na mhùthaich thu''' 's lethbhreac a dhèanamh dheth air an duilleag seo:",
-       "protectedinterface": "Bheir an duilleag seo dhut teacsa eadar-aghaidh airson a' bhathar-bhog air an uicipeid seo 's chaidh a ghlasadh gus casg a chur air mì-chleachdadh. Gus eadar-theangachadh atharrachadh no a chur ris airson gach uicipeid, cleachd [//translatewiki.net/ translatewiki.net], pròiseactan eadar-theangachadh MediaWiki.",
-       "editinginterface": "'''Rabhadh:''' Tha thu a' deasachadh duilleag a tha 'ga chleachdadh a chum teacsa eadar-aghaidh a sholar airson a' bhathar-bhog.\nMa dh'atharraicheas tu an duilleag seo, bidh buaidh ann air coltas na h-eadar-aghaidh mar a chì càch e air an uicipeid seo.\nGus eadar-theangachadh atharrachadh no a chur ris airson gach uicipeid, cleachd [//translatewiki.net/ translatewiki.net], pròiseactan eadar-theangachadh MediaWiki.",
-       "cascadeprotected": "Chaidh an duilleag seo a dhìon o dheasachadh a chionn 's gu bheil e am broinn {{PLURAL:$1|na duilleige|nan duilleagan}} a leanas a chaidh an dìon 's an roghainn \"mar eas\" air:\n$2",
-       "namespaceprotected": "Chan eil cead agad duilleagan san namespace '''$1''' a dheasachadh.",
+       "viewyourtext": "'S urrainn dhut coimhead air <strong>na dheasaich thu</strong> 's lethbhreac a dhèanamh dheth air an duilleag seo:",
+       "protectedinterface": "Bheir an duilleag seo dhut teacsa eadar-aghaidh airson a' bhathar-bhog air an uicidh seo 's chaidh a ghlasadh gus casg a chur air mì-chleachdadh. Gus eadar-theangachadh atharrachadh no a chur ris airson gach uicidh, cleachd [//translatewiki.net/ translatewiki.net], pròiseactan eadar-theangachadh MediaWiki.",
+       "editinginterface": "<strong>Rabhadh:</strong> Tha thu a' deasachadh duilleag a tha 'ga chleachdadh a chum teacsa eadar-aghaidh a sholar airson a' bhathar-bhog.\nMa dh'atharraicheas tu an duilleag seo, bidh buaidh ann air coltas na h-eadar-aghaidh mar a chì càch e air an uicidh seo.\nGus eadar-theangachadh atharrachadh no a chur ris airson gach uicidh, cleachd [//translatewiki.net/ translatewiki.net], pròiseactan eadar-theangachadh MediaWiki.",
+       "cascadeprotected": "Chaidh an duilleag seo a dhìon o dheasachadh a chionn 's gu bheil e am broinn {{PLURAL:$1|na duilleige|nan duilleagan}} a leanas a chaidh a dhìon 's an roghainn \"mar eas\" air:\n$2",
+       "namespaceprotected": "Chan eil cead agad duilleagan san ainm-spàs <strong>$1</strong> a dheasachadh.",
        "customcssprotected": "Chan eil cead agad an duilleag CSS seo a dheasachadh a chionn 's gu bheil na roghainnean pearsanta aig cleachdaiche eile innte.",
        "customjsprotected": "Chan eil cead agad an duilleag JavaScript seo a dheasachadh a chionn 's gu bheil na roghainnean pearsanta aig cleachdaiche eile innte.",
        "mycustomcssprotected": "Chan eil cead agad an duilleag CSS seo a dheasachadh.",
        "myprivateinfoprotected": "Chan eil cead agad am fiosrachadh prìobhaideach agad a dheasachadh.",
        "mypreferencesprotected": "Chan eil cead agad na roghainnean agad a dheasachadh.",
        "ns-specialprotected": "Chan ghabh duilleagan sònraichte a dheasachadh.",
-       "titleprotected": "Chaidh an duilleag seo a dhìon o chruthachadh le [[User:$1|$1]].\nSeo am mìneachadh: \"''$2''\".",
+       "titleprotected": "Chaidh an duilleag seo a dhìon o chruthachadh le [[User:$1|$1]].\nSeo am mìneachadh: \"<em>$2</em>\".",
        "filereadonlyerror": "Cha ghabh am faidhle \"$1\" atharrachadh a chionn 's gu bheil ionad-tasgaidh fhaidhlichean \"$2\" ri leughadh a-mhàin.\nThug an rianaire a ghlais e seachad an t-adhbhar a leanas: \"$3\".",
-       "invalidtitle-knownnamespace": "Tiotal mì-dhligheach leis an namespace \"$2\" agus an teacsa \"$3\"",
-       "invalidtitle-unknownnamespace": "Tiotal mì-dhligheach leis an àireamh namespace $1 agus an teacsa \"$2\"",
+       "invalidtitle-knownnamespace": "Tiotal mì-dhligheach leis an ainm-spàs \"$2\" agus an teacsa \"$3\"",
+       "invalidtitle-unknownnamespace": "Tiotal mì-dhligheach leis an àireamh ainm-spàis $1 agus an teacsa \"$2\"",
        "exception-nologin": "Chan eil thu air clàradh a-steach",
        "exception-nologin-text": "Feumaidh tu [[Special:Userlogin|clàradh a-steach]] mus fhaic thu an duilleag seo no mus urrainn dhut seo a dhèanamh.",
        "exception-nologin-text-manual": "Ma tha thu ag iarraidh cothrom air an duilleag no air a' ghnìomh seo, $1.",
-       "virus-badscanner": "Droch cho-dhealbhachd: sganair bhìorasan neo-aithnichte: ''$1''",
+       "virus-badscanner": "Droch cho-dhealbhachd: sganair bhìorasan neo-aithnichte: <em>$1</em>",
        "virus-scanfailed": "dh'fhàillig an sganadh (còd $1)",
        "virus-unknownscanner": "sganair bhìorasan neo-aithnichte:",
-       "logouttext": "'''Chaidh do chlàradh a-mach.'''\n\nThoir an aire gum bi coltas air cuid dhe na duilleagan mar gum biodh tu air clàradh a-steach gus am falamhaich thu tasgadan a' bhrabhsair agad.",
+       "logouttext": "<strong>Chaidh do chlàradh a-mach.</strong>\n\nThoir an aire gum bi coltas air cuid dhe na duilleagan mar gum biodh tu air clàradh a-steach gus am falamhaich thu tasgadan a' bhrabhsair agad.",
        "welcomeuser": "Fàilte ort, $1",
        "welcomecreation-msg": "Chaidh an cunntas agad a chruthachadh.\nNa dìochuimhnich na [[Special:Preferences|roghainnean agad air {{SITENAME}}]] a ghleusadh dhut fhèin.",
        "yourname": "Ainm-cleachdaiche:",
        "userlogin-resetlink": "Na dhìochuimhnich thu d' ainm is facal-faire?",
        "userlogin-resetpassword-link": "Na dhìochuimhnich thu am facal-faire agad?",
        "userlogin-helplink2": "Taic le clàradh a-steach",
-       "userlogin-loggedin": "Chaidh do chlàradh mar {{GENDER:$1|$1}} mu thràth.\nCleachd am foirm gu h-ìosal airson clàradh a-steach mar chleachdaiche eile.",
+       "userlogin-loggedin": "Chaidh do chlàradh mar $1 mu thràth.\nCleachd am foirm gu h-ìosal airson clàradh a-steach mar chleachdaiche eile.",
        "userlogin-createanother": "Cruthaich cunntas eile",
        "createacct-emailrequired": "Seòladh puist-d",
        "createacct-emailoptional": "Seòladh puist-d (roghainneil)",
        "createacct-submit": "Cruthaich an cunntas agad",
        "createacct-another-submit": "Cruthaich cunntas eile",
        "createacct-benefit-heading": "Tha {{SITENAME}} 'ga chruthachadh le daoine mar thu fhèin.",
-       "createacct-benefit-body1": "{{PLURAL:$1|deasachadh|dheasachadh|deasachaidhean|deasachadh}}",
-       "createacct-benefit-body2": "{{PLURAL:$1|duilleag|dhuilleag|duilleagan|duilleag}}",
-       "createacct-benefit-body3": "{{PLURAL:$1|chom-pàirtiche|chom-pàirtiche|com-pàirtichean|com-pàirtiche}} o chionn goirid",
+       "createacct-benefit-body1": "{{PLURAL:$1|deasachadh|deasachaidhean}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|duilleag|duilleagan}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|deasaiche|deasaichean}} o chionn goirid",
        "badretype": "Chan eil an dà fhacal-faire a chuir thu a-steach a' freagairt ri chèile.",
        "userexists": "Tha an t-ainm-cleachdaiche a chuir thu a-steach 'ga chleachdadh mu thràth.\nNach tagh thu ainm eile?",
        "loginerror": "Mearachd log a-steach",
        "nocookiesnew": "Chaidh an cunntas a chruthachadh ach cha do rinn thu logadh a-steach.\nTha {{SITENAME}} a' cleachdadh briosgaidean gus daoine a logadh a-steach.\nChuir thu na briosgaidean à comas.\nCuir am comas iad agus log a-steach leis an ainm-chleachdaiche 's am facal-faire agad an uairsin.",
        "nocookieslogin": "Tha {{SITENAME}} a' cleachdadh briosgaidean gus daoine a logadh a-steach.\nChuir thu briosgaidean à comas.\nCuir an comas iad is feuch ris a-rithist.",
        "nocookiesfornew": "Cha deach an cunntas a chruthachadh oir cha b' urrainn dhuinn a thùs a dhearbhadh.\nDèan cinnteach gu bheil briosgaidean an comas, ath-luchdaich an duilleag seo 's feuch ris a-rithist.",
+       "nocookiesforlogin": "{{int:nocookieslogin}}",
        "noname": "Cha do thagh thu ainm-cleachdaiche dligheach.",
        "loginsuccesstitle": "Rinn thu logadh a-steach",
-       "loginsuccess": "'''Rinn thu logadh a-steach air {{SITENAME}} mar \"$1\".'''",
+       "loginsuccess": "<strong>Rinn thu logadh a-steach air {{SITENAME}} mar \"$1\".</strong>",
        "nosuchuser": "Chan eil cleachdaiche ann air a bheil \"$1\".\nTha ainmean chleachdaichean mothaichail do litrichean mòra 's beaga.\nThoir sùil air an litreachadh no [[Special:UserLogin/signup|cruthaich cunntas ùr]].",
        "nosuchusershort": "Chan eil cleachdaiche ann leis an ainm \"$1\".\nCuir sùil air an litreachadh.",
        "nouserspecified": "Tha agad ri ainm-cleachdaiche a chur ann.",
        "passwordsent": "Chaidh facal-faire ùr a chur dhan phost-d a chaidh a chlàradh airson \"$1\".\nClàraich a-steach a-rithist nuair a gheibh thu e.",
        "blocked-mailpassword": "Chaidh bacadh a chur air an t-seòladh IP agad 's chan eil cead deasachaidh agad agus chan urrainn dhut an gleus a chum aiseag an fhacail-fhaire a chleachdadh gus casg a chur air mì-ghnàthachadh.",
        "eauthentsent": "Chaidh post-d dearbhaidh a chur dhan phost-d a chaidh ainmeachadh.\nMus dèid post-d sam bith eile a chur dhan chunntas, feumaidh tu leantainn ris an stiùireadh sa phost-d mar dhearbhadh gur ann agadsa a tha an cunntas.",
-       "throttled-mailpassword": "Chaidh post-d a chur airson ath-shuidheachadh facail-fhaire mu thràth {{PLURAL:$1|uair|$1 uair|$1 uairean|$1 uair}} a thìde air ais.\nGus casg a chur air mì-ghnàthachadh, cha chuir sinn ach aon chuimhneachan facail-fhaire gach {{PLURAL:$1|uair|$1 uair|$1 uairean|$1 uair}} a thìde.",
+       "throttled-mailpassword": "Chaidh post-d a chur airson ath-shuidheachadh facail-fhaire mu thràth $1 {{PLURAL:$1|uair|uair|uairean|uair}} a thìde air ais.\nGus casg a chur air mì-ghnàthachadh, cha chuir sinn ach aon chuimhneachan facail-fhaire gach $1 {{PLURAL:$1|uair|uair|uairean|uair}} a thìde.",
        "mailerror": "Mearachd a' cur post: $1",
-       "acct_creation_throttle_hit": "Chruthaich na h-aoighean air an Uici seo {{PLURAL:$1|1 chunntas|$1 chunntas|$1 cunntasan|$1 cunntas}} fon IP agad an-dè agus sin an àireamh as motha a tha ceadaichte. Chan urrainn do dh'aoighean eile on IP seo barrachd chunntasan a chruthachadh air sgàth sin.",
+       "acct_creation_throttle_hit": "Chruthaich na h-aoighean air an uicidh seo {{PLURAL:$1|$1 chunntas|$1 chunntas|$1 cunntasan|$1 cunntas}} fon IP agad an-dè agus sin an àireamh as motha a tha ceadaichte. Chan urrainn do dh'aoighean eile on IP seo barrachd chunntasan a chruthachadh air sgàth sin.",
        "emailauthenticated": "Chaidh an seòladh puist-d agad a dhearbhadh $2 aig $3.",
        "emailnotauthenticated": "Cha deach am post-d agad a dhearbhadh fhathast.\nCha dèid post-d a chur airson gin dhe na feartan a leanas.",
        "noemailprefs": "Sònraich post-d sna roghainnean agad gus na feartan seo a chur an comas.",
        "cannotchangeemail": "Cha ghabh na puist-d a tha co-cheangailte ri cunntas atharrachadh air an uicipeid seo.",
        "emaildisabled": "Chan urrainn dhut puist-d a chur air an làrach seo.",
        "accountcreated": "Cunntas cruthaichte",
-       "accountcreatedtext": "Chaidh an cunntas cleachdaiche airson [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) a chruthachadh.",
+       "accountcreatedtext": "Chaidh an cunntas cleachdaiche airson [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|na deasbaireachd]]) a chruthachadh.",
        "createaccount-title": "Cruthachadh cunntais airson {{SITENAME}}",
        "createaccount-text": "Chruthaich cuideigin cunntas airson a' phost-d agad air {{SITENAME}} ($4) air a bheil \"$2\", leis an fhacal-fhaire \"$3\".\nBu chòir dhut clàradh a-steach agus am facal-faire agad atharrachadh gu h-ìosal an-dràsta.\n\n'S urrainn dhut an teachdaireachd seo a leigeil seachad ma chaidh an cunntas a chruthachadh air mhearachd.",
        "login-throttled": "Dh'fheuch thu ri clàradh a-steach ro thric o chionn ghoirid.\nFuirich ort $1 mus feuch thu ris a-rithist.",
        "user-mail-no-body": "Bha bodhaig na teachdaireachd bàn no air leth goirid.",
        "changepassword": "Atharraich facal-faire",
        "resetpass_announce": "Gus an clàradh a-steach a choileanadh, tha agad ri facal-faire ùr a shuidheachadh.",
+       "resetpass_text": "<!-- Cuir teacsa an-seo -->",
        "resetpass_header": "Atharraich facal-faire a' chunntais",
        "oldpassword": "Seann fhacal-faire",
        "newpassword": "Facal-faire ùr",
        "resetpass-validity-soft": "Chan eil am facal-faire seo dligheach: $1\n\nTagh facal-faire ùr an-dràsta no briog air \"{{int:resetpass-submit-cancel}}\" gus ath-shuidheachadh às a dhèidh seo.",
        "passwordreset": "Ath-shuidhich am facal-faire",
        "passwordreset-text-one": "Lìon am foirm seo gus am facal-faire agad ath-shuidheachadh.",
-       "passwordreset-text-many": "{{PLURAL:$1|Lìon aon dhe na raointean gus facal-faire sealach fhaighinn ann am post-d.}}",
+       "passwordreset-text-many": "Lìon {{PLURAL:$1|an raon|aon dhe na raointean}} gus facal-faire sealach fhaighinn air a' phost-d.",
        "passwordreset-legend": "Ath-shuidhich am facal-faire",
-       "passwordreset-disabled": "Chaidh ath-shuidheachadh nam faclan-faire a chur à comas air an uicipeid seo.",
-       "passwordreset-emaildisabled": "Chaidh feartan a' phuist-d a chur à comas san uicipeid seo.",
+       "passwordreset-disabled": "Chaidh ath-shuidheachadh nam faclan-faire a chur à comas air an uicidh seo.",
+       "passwordreset-emaildisabled": "Chaidh feartan a' phuist-d a chur à comas san uicidh seo.",
        "passwordreset-username": "Ainm-cleachdaiche:",
        "passwordreset-domain": "Àrainn-lìn:",
        "passwordreset-capture": "A bheil thu airson coimhead air a' phost-d?",
        "passwordreset-capture-help": "Ma chuireas tu cromag sa bhogsa seo, chì thusa am post-d (leis an fhacal-fhaire sealach) agus gheibh an cleachdaiche e cuideachd.",
        "passwordreset-email": "Seòladh puist-d:",
        "passwordreset-emailtitle": "Dàta a' chunntais air {{SITENAME}}",
-       "passwordreset-emailtext-ip": "Dh'iarr cuideigin (thu fhèin, 's mathaid, on t-seòladh IP $1) am facal-faire airson {{SITENAME}} ($4) ath-shuidheachadh. Tha {{PLURAL:$3|an cunntas|an dà chunntas|na $3 cunntasan|na $3 cunntas}} a leanas co-cheangailte ris a' phost-d seo:\n\n$2\n\nFalbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire|an $3 fhacal-faire|na $3 faclan-faire|na $3 facal-faire}} sealach seo ann an {{PLURAL:$5|latha|$5 latha|$5 làithean|$5 latha}}.\nBu chòir dhut clàradh a-steach agus facal-faire ùr a thaghadh an-dràsta. Ma dh'iarr cuideigin eile seo no ma chuimhnich thu air an fhacal-fhaire agad 's mur eil thu airson atharrachadh tuilleadh, leig seachad an teachdaireachd seo 's lean ort leis an t-seann fhacal-fhaire.",
-       "passwordreset-emailtext-user": "Dh'iarr an cleachdaiche $1 air {{SITENAME}} ath-shuidheachadh an fhacail-fhaire air {{SITENAME}} ($4). Tha {{PLURAL:$3|an cunntas-cleachdaiche|an $3 chunntas-cleachdaiche|na $3 cunntasan-cleachdaiche|na $3 cunntas-cleachdaiche}} a leanas co-cheangailte ris a' phost-d seo:\n\n$2\n\nFalbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire|an $3 fhacal-faire|na $3 faclan-faire|na $3 facal-faire}} sealach seo ann an {{PLURAL:$5|latha|$5 latha|$5 làithean|$5 latha}}.\nBu chòir dhut clàradh a-steach agus facal-faire ùr a thaghadh an-dràsta. Ma dh'iarr cuideigin eile seo no ma chuimhnich thu air an fhacal-fhaire agad 's mur eil thu airson atharrachadh tuilleadh, leig seachad an teachdaireachd seo 's lean ort leis an t-seann fhacal-fhaire.",
+       "passwordreset-emailtext-ip": "Dh'iarr cuideigin (thu fhèin, 's mathaid, on t-seòladh IP $1) am facal-faire airson {{SITENAME}} ($4) ath-shuidheachadh. Tha {{PLURAL:$3|an cunntas|na cunntasan}} a leanas co-cheangailte ris a' phost-d seo:\n\n$2\n\nFalbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire shealach|na faclan-faire sealach}} seo an ceann $5 {{PLURAL:$5|latha|latha|làithean|latha}}.\nBu chòir dhut clàradh a-steach agus facal-faire ùr a thaghadh an-dràsta. Ma dh'iarr cuideigin eile seo no ma chuimhnich thu air an fhacal-fhaire agad 's mur eil thu airson atharrachadh tuilleadh, leig seachad an teachdaireachd seo 's lean ort leis an t-seann fhacal-fhaire.",
+       "passwordreset-emailtext-user": "Dh'iarr an cleachdaiche $1 air {{SITENAME}} ath-shuidheachadh an fhacail-fhaire air {{SITENAME}} ($4). Tha {{PLURAL:$3|an cunntas-cleachdaiche|na cunntasan-cleachdaiche}} a leanas co-cheangailte ris an t-seòladh puist-d seo:\n\n$2\n\nFalbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire shealach|na faclan-faire sealach}} seo an ceann $5 {{PLURAL:$5|latha|latha|làithean|latha}}.\nBu chòir dhut clàradh a-steach agus facal-faire ùr a thaghadh an-dràsta. Ma dh'iarr cuideigin eile seo no ma chuimhnich thu air an fhacal-fhaire agad 's mur eil thu airson atharrachadh tuilleadh, leig seachad an teachdaireachd seo 's lean ort leis an t-seann fhacal-fhaire.",
        "passwordreset-emailelement": "Ainm-cleachdaiche: $1\nFacal-faire sealach: $2",
        "passwordreset-emailsent": "Chaidh post-d airson ath-shuidheachadh an fhacail-fhaire a chur.",
        "passwordreset-emailsent-capture": "Chaidh post-d a chum ath-shuidheachadh an fhacail-fhaire a chur agus chì thu sin gu h-ìosal.",
-       "passwordreset-emailerror-capture": "Chaidh post-d a chum ath-shuidheachadh an fhacail-fhaire a ghintinn agus chì thu sin gu h-ìosal ach cha b' urrainn dhuinn a chur dhan chleachdaiche {{GENDER:$2|user}}: $1",
+       "passwordreset-emailerror-capture": "Chaidh post-d a chum ath-shuidheachadh an fhacail-fhaire a ghintinn agus chì thu sin gu h-ìosal ach cha b' urrainn dhuinn a chur dhan chleachdaiche: $1",
        "changeemail": "Atharraich am post-d",
        "changeemail-header": "Atharraich cunntas a' phuist-d",
        "changeemail-text": "Lìon am foirm seo gus am post-d agad atharrachadh. Feumaidh tu am facal-faire agad a chur a-steach a-rithist gus a dhearbhadh.",
        "headline_sample": "Teacsa ceann-loidhne",
        "headline_tip": "Ceann-loidhne ìre 2",
        "nowiki_sample": "Cuir a-steach teacsa gun fhòrmatadh an-seo",
-       "nowiki_tip": "Leig seachad fòrmatadh uici",
+       "nowiki_tip": "Leig seachad fòrmatadh uicidh",
        "image_sample": "Eisimpleir.jpg",
        "image_tip": "Faidhle air a leabachadh",
        "media_sample": "Eisimpleir.ogg",
        "preview": "Ro-shealladh",
        "showpreview": "Seall an ro-shealladh",
        "showdiff": "Seall na mùthaidhean",
-       "anoneditwarning": "'''Rabhadh:''' Chan eil thu air logadh a-steach.\nThèid an seòladh IP agad a chlàrachadh ann an eachdraidh na duilleige seo.",
-       "anonpreviewwarning": "''Chan eil thu air clàradh a-steach. Ma nì thu sàbhaladh, thèid an seòladh IP agad a chlàradh ann an eachdraidh deasachadh na duilleige seo.''",
-       "missingsummary": "'''Cuimhnich:''' Cha dug thu seachad gearr-chunntas air na dh'atharraich thu.\nMa bhriogas tu air \"{{int:savearticle}}\" a-rithist, thèid na dheasaich thu a shàbhaladh as aonais gearr-chunntais.",
+       "anoneditwarning": "<strong>Rabhadh:</strong> Chan eil thu air logadh a-steach.\nThèid an seòladh IP agad a chlàrachadh ann an eachdraidh na duilleige seo.",
+       "anonpreviewwarning": "<em>Chan eil thu air clàradh a-steach. Ma nì thu sàbhaladh, thèid an seòladh IP agad a chlàradh ann an eachdraidh deasachadh na duilleige seo.</em>",
+       "missingsummary": "<strong>Cuimhnich:</strong> Cha dug thu seachad gearr-chunntas air na dh'atharraich thu.\nMa bhriogas tu air \"{{int:savearticle}}\" a-rithist, thèid na dheasaich thu a shàbhaladh as aonais gearr-chunntais.",
        "missingcommenttext": "Cuir a-steach beachd gu h-ìosal.",
-       "missingcommentheader": "'''Cuimhnich:''' Cha dug thu seachad cuspair/ceann airson a' bheachd seo.\nMa bhriogas tu air \"{{int:savearticle}}\" a-rithist, thèid na dheasaich thu a shàbhaladh as aonais.",
+       "missingcommentheader": "<strong>Cuimhnich:</strong> Cha dug thu seachad cuspair/ceann airson a' bheachd seo.\nMa bhriogas tu air \"{{int:savearticle}}\" a-rithist, thèid na dheasaich thu a shàbhaladh as aonais.",
        "summary-preview": "Ro-shealladh a' ghearr-chunntais:",
        "subject-preview": "Ro-shealladh air a' chuspair/air a' cheann:",
        "blockedtitle": "Tha an cleachdair air a bhacadh",
-       "blockedtext": "''Chaidh an t-ainm-cleachdaiche no an seòladh IP agad a bhacadh.'''\n\n'S e $1 a chur am bacadh seo ort.\nThug iad an cèill gun do rinn iad sinn air sgàth an adhbhair seo: ''$2''.\n\n* Toiseach a' bhacaidh: $8\n* Deireadh a' bhacaidh: $6\n* An neach air a bheil am bacadh: $7\n\n'S urrainn dhut fios a chur gu $1 no [[{{MediaWiki:Grouppage-sysop}}|rianair]] eile gus am bacadh seo a dheasbad.\nChan urrainn dhut am feart \"Cuir post-d dhan chleachdaiche seo\" a chleachdadh ach ma tha seòladh puist-d dligheach ann an [[Special:Preferences|roghainnean a' chunntais agad]] agus mura deach bacadh a chur air a chleachdadh.\n'S e $3 an seòladh IP làithreach agus agus 's e #$5 ID a' bhacaidh.\nThoir iomradh air a' mhion-fhiosrachadh gu h-àrd ma chuireas tu ceist sam bith mu dhèidhinn.",
-       "autoblockedtext": "''Chaidh an seòladh IP agad a bhacadh gu fèin-obrachail a chionn 's gun deach a chleachdadh le cuideigin eile a chaidh a bhacadh le $1.'''\nThug iad an cèill gun do rinn iad sinn air sgàth an adhbhair seo: \n\n:''$2''.\n\n* Toiseach a' bhacaidh: $8\n* Deireadh a' bhacaidh: $6\n* An neach air a bheil am bacadh: $7\n\n'S urrainn dhut fios a chur gu $1 no [[{{MediaWiki:Grouppage-sysop}}|rianair]] eile gus am bacadh seo a dheasbad.\n\nDh'fhaoidte nach urrainn dhut am feart \"Cuir post-d dhan chleachdaiche seo\" a chleachdadh ach ma tha seòladh puist-d dligheach ann an [[Special:Preferences|roghainnean a' chunntais agad]] agus mura deach bacadh a chur air a chleachdadh.\n\n'S e $3 an seòladh IP làithreach agus agus 's e #$5 ID a' bhacaidh.\nThoir iomradh air a' mhion-fhiosrachadh gu h-àrd ma chuireas tu ceist sam bith mu dhèidhinn.",
+       "blockedtext": "<strong>Chaidh an t-ainm-cleachdaiche no an seòladh IP agad a bhacadh.</strong>\n\n'S e $1 a chur am bacadh seo ort.\n{{GENDER:$1|Thug e|Thug i|Thugadh}} an cèill gun do {{GENDER:$1|rinn e|rinn i|rinneadh}} sin air sgàth an adhbhair seo: <em>$2</em>.\n\n* Toiseach a' bhacaidh: $8\n* Deireadh a' bhacaidh: $6\n* An neach air a bheil am bacadh: $7\n\n'S urrainn dhut fios a chur gu $1 no [[{{MediaWiki:Grouppage-sysop}}|rianair]] eile gus am bacadh seo a dheasbad.\nChan urrainn dhut am feart \"Cuir post-d dhan chleachdaiche seo\" a chleachdadh ach ma tha seòladh puist-d dligheach ann an [[Special:Preferences|roghainnean a' chunntais agad]] agus mura deach bacadh a chur air a chleachdadh.\n'S e $3 an seòladh IP làithreach agus agus 's e #$5 ID a' bhacaidh.\nThoir iomradh air a' mhion-fhiosrachadh gu h-àrd ma chuireas tu ceist sam bith mu dhèidhinn.",
+       "autoblockedtext": "Chaidh an seòladh IP agad a bhacadh gu fèin-obrachail a chionn 's gun deach a chleachdadh le cuideigin eile a chaidh a bhacadh le $1.\n{{GENDER:$1|Thug e|Thug i|Thugadh}} an cèill gun do {{GENDER:$1|rinn e|rinn i|rinneadh}} sin air sgàth an adhbhair seo: \n\n:<em>$2</em>.\n\n* Toiseach a' bhacaidh: $8\n* Deireadh a' bhacaidh: $6\n* An neach air a bheil am bacadh: $7\n\n'S urrainn dhut fios a chur gu $1 no [[{{MediaWiki:Grouppage-sysop}}|rianair]] eile gus am bacadh seo a dheasbad.\n\nDh'fhaoidte nach urrainn dhut am feart \"Cuir post-d dhan chleachdaiche seo\" a chleachdadh ach ma tha seòladh puist-d dligheach ann an [[Special:Preferences|roghainnean a' chunntais agad]] agus mura deach bacadh a chur air a chleachdadh.\n\n'S e $3 an seòladh IP làithreach agus agus 's e #$5 ID a' bhacaidh.\nThoir iomradh air a' mhion-fhiosrachadh gu h-àrd ma chuireas tu ceist sam bith mu dhèidhinn.",
        "blockednoreason": "cha deach adhbhar a shònrachadh",
        "whitelistedittext": "Feumaidh tu $1 mus urrainn dhut duilleagan a dheasachadh.",
        "confirmedittext": "Feumaidh tu am post-d agad a dhearbhadh mus urrainn dhut duilleagan a dheasachadh.\nSuidhich is dearbhaich am post-d agad ann an [[Special:Preferences|roghainnean a' chleachdaiche]]",
        "loginreqlink": "log a-steach",
        "loginreqpagetext": "Feumaidh tu $1 mus urrainn dhut coimhead air duilleagan eile.",
        "accmailtitle": "Facal-faire air a chur.",
-       "accmailtext": "Chaidh facal-faire a chruthachadh air thuaiream airson [[User talk:$1|$1]] 's a chur gu $2.\n\nGabhaidh am facal-faire airson a' chunntais ùir seo atharrachadh air an fo ''[[Special:ChangePassword|atharraich facal-faire]]'' as dèidh dhan chleachdaiche clàradh a-steach.",
+       "accmailtext": "Chaidh facal-faire a chruthachadh air thuaiream airson [[User talk:$1|$1]] 's a chur gu $2.\n\nGabhaidh am facal-faire airson a' chunntais ùir seo atharrachadh air an fo <em>[[Special:ChangePassword|atharraich facal-faire]]</em> às dèidh dhan chleachdaiche clàradh a-steach.",
        "newarticle": "(Ùr)",
-       "newarticletext": "Lean thu ri ceangal gu duilleag nach eil ann fhathast.\nCuir teacs sa bhogsa gu h-ìosal gus an duilleag seo a chruthachadh (seall air [$1 duilleag na cobharach] airson barrachd fiosrachaidh).\nMura robh dùil agad ris an duilleag seo a ruigsinn, briog air a' phutan '''air ais''' 'nad bhrabhsair.",
-       "anontalkpagetext": "----''Seo an duilleag deasbaireachd aig cleachdaiche gun urra nach do chruthaich cunntas fhathast no nach eil 'ga chleachdadh.\nFeumaidh sinn an àireamh IP aca a chleachdadh air sgàth sin.\nFaodadh grunn chleachdaichean seòladh IP mar a chleachdadh còmhla.\nMas e cleachdaiche gun urra a tha annad 's ma tha thu dhen bheachd nach eil na beachdan seo a' buntainn riut, nach [[Special:UserLogin/signup|clàraich thu]] no [[Special:UserLogin|clàraich a-steach]] gus bùrach mar seo a sheachnadh san àm ri teachd?''",
+       "newarticletext": "Lean thu ri ceangal gu duilleag nach eil ann fhathast.\nCuir teacs sa bhogsa gu h-ìosal gus an duilleag seo a chruthachadh (seall air [$1 duilleag na cobharach] airson barrachd fiosrachaidh).\nMura robh dùil agad ris an duilleag seo a ruigsinn, briog air a' phutan <strong>air ais</strong> 'nad bhrabhsair.",
+       "anontalkpagetext": "----\n<em>Seo an duilleag deasbaireachd aig cleachdaiche gun urra nach do chruthaich cunntas fhathast no nach eil 'ga chleachdadh.</em>\nFeumaidh sinn an àireamh IP aca a chleachdadh air sgàth sin.\nFaodadh grunn chleachdaichean seòladh IP mar a chleachdadh còmhla.\nMas e cleachdaiche gun urra a tha annad 's ma tha thu dhen bheachd nach eil na beachdan seo a' buntainn riut, nach [[Special:UserLogin/signup|clàraich thu]] no [[Special:UserLogin|clàraich a-steach]] gus bùrach mar seo a sheachnadh san àm ri teachd?",
        "noarticletext": "Chan eil teacsa sam bith anns an duilleag seo an-dràsta.\n'S urrainn dhut [[Special:Search/{{PAGENAME}}|an tiotal seo a lorg]] ann an duilleagan eile,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} na logaichean co-cheangailte a rannsachadh],\nno [{{fullurl:{{FULLPAGENAME}}|action=edit}} an duilleag seo a dheasachadh]</span>.",
        "noarticletext-nopermission": "Chan eil teacsa sam bith san duilleag seo an-dràsta.\n'S urrainn dhut [[Special:Search/{{PAGENAME}}|tiotal na duilleige seo a lorg]] ann an duilleagan eile, no <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} na logaichean co-cheangailte a rannsachadh]</span> ach chan eil cead agad an duilleag seo a chruthachadh.",
        "missing-revision": "Chan eil mùthadh #$1 na duilleige \"{{FULLPAGENAME}}\" ann.\n\nMar is trice, tachraidh seo ma leanas tu ceangal san eachdraidh a tha fìor aosta 's a tha a' dol gu duilleag a chaidh a sguabadh às.\nGheibh thu mion-fhiosrachadh ann an [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} loga nan duilleagan a chaidh a sguabadh às].",
        "userpage-userdoesnotexist": "Chan e cunntas clàraichte a tha ann an \"$1\".\nDèan cinnteach gu bheil thu airson an duilleag seo a chruthachadh/dheasachadh.",
        "userpage-userdoesnotexist-view": "Cha deach an cunntas cleachdaiche \"$1\" a chlàradh.",
        "blocked-notice-logextract": "Tha an cleachdaiche seo air a bhacadh an-dràsta fhèin.\nChì thu loga a' bhacaidh mu dheireadh gu h-ìosal mar fhiosrachadh dhut:",
-       "clearyourcache": "'''An aire:''' As dèidh dhut sàbhaladh, 's mathaid gum bi agad tasgadan a' bhrabhsair agad a chur air gleus mus fhaic thu na dh'atharraich thu.\n* '''Firefox / Safari:''' Cum 'shìos 'Shift'' is briog air ''Ath-luchdaich' no brùth ''Ctrl-F5'' no ''Ctrl-R'' (''⌘-R'' air Mac)\n* '''Google Chrome:''' Brùth ''Ctrl-Shift-R'' (''⌘-Shift-R'' air Mac)\n* '''Internet Explorer:''' Cum shìos ''Ctrl'' is briog air ''Ath-nuadhaich'' no brùth ''Ctrl-F5''\n* '''Opera:''' Falamhaich an tasgadan ann an ''Innealan → Roghainnean''",
-       "usercssyoucanpreview": "'''Gliocas:''' Cleachd am putan \"{{int:showpreview}}\" airson an CSS agad a chur fo dheuchainn mus sàbhail thu e.",
-       "userjsyoucanpreview": "'''Gliocas:''' Cleachd am putan \"{{int:showpreview}}\" gus an JavaScript ùr agad a chur fo dheuchainn mus sàbhail thu e.",
-       "usercsspreview": "'''Cuimhnich nach e seo ach ro-shealladh air a' CSS chleachdaiche agad.'''\n'''Cha deach a shàbhaladh fhathast!''''",
-       "userjspreview": "'''Cuimhnich nach e seo ach ro-shealladh/deuchainn air a' JavaScript agad.'''\n'''Cha deach a shàbhaladh fhathast!''''",
-       "sitecsspreview": "'''Cuimhnich nach e seo ach ro-shealladh air a' CSS agad.'''\n'''Cha deach a shàbhaladh fhathast!''''",
-       "sitejspreview": "'''Cuimhnich nach e seo ach ro-shealladh air còd a' JavaScript agad.'''\n'''Cha deach a shàbhaladh fhathast!''''",
-       "userinvalidcssjstitle": "'''Rabhadh:''' Chan eil an craiceann \"$1\" ann.\nCleachdaidh duilleagan gnàthaichte .css agus .js tiotal ann an litrichean beaga, m.e. {{ns:user}}:Foo/vector.css seach {{ns:user}}:Foo/Vector.css.",
+       "clearyourcache": "<strong>An aire:</strong> As dèidh dhut sàbhaladh, 's mathaid gum bi agad tasgadan a' bhrabhsair agad a chur air gleus mus fhaic thu na dh'atharraich thu.\n* <strong>Firefox / Safari:</strong> Cum shìos <em>Shift</em> is briog air <em>Ath-luchdaich</em> no brùth <em>Ctrl-F5</em> no <em>Ctrl-R</em> (<em>⌘-R</em> air Mac)\n* <strong>Google Chrome:</strong> Brùth <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> air Mac)\n* <strong>Internet Explorer:</strong> Cum shìos <em>Ctrl</em> is briog air <em>Ath-nuadhaich</em> no brùth <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Falamhaich an tasgadan ann an <em>Innealan → Roghainnean</em>",
+       "usercssyoucanpreview": "<strong>Gliocas:</strong> Cleachd am putan \"{{int:showpreview}}\" airson an CSS agad a chur fo dheuchainn mus sàbhail thu e.",
+       "userjsyoucanpreview": "<strong>Gliocas:</strong> Cleachd am putan \"{{int:showpreview}}\" gus an JavaScript ùr agad a chur fo dheuchainn mus sàbhail thu e.",
+       "usercsspreview": "<strong>Cuimhnich nach e seo ach ro-shealladh air a' CSS chleachdaiche agad.\nCha deach a shàbhaladh fhathast!</strong>",
+       "userjspreview": "<strong>Cuimhnich nach e seo ach ro-shealladh/deuchainn air a' JavaScript agad.\nCha deach a shàbhaladh fhathast!</strong>",
+       "sitecsspreview": "<strong>Cuimhnich nach e seo ach ro-shealladh air a' CSS agad.\nCha deach a shàbhaladh fhathast!</strong>",
+       "sitejspreview": "<strong>Cuimhnich nach e seo ach ro-shealladh air còd a' JavaScript agad.\nCha deach a shàbhaladh fhathast!</strong>",
+       "userinvalidcssjstitle": "<strong>Rabhadh:</strong> Chan eil an craiceann \"$1\" ann.\nCleachdaidh duilleagan gnàthaichte .css agus .js tiotal ann an litrichean beaga, m.e. {{ns:user}}:Foo/vector.css seach {{ns:user}}:Foo/Vector.css.",
        "updated": "(Air ùrachadh)",
-       "note": "'''An aire:'''",
-       "previewnote": "'''Cuimhnich nach eil ann ach ro-shealladh.'''\nCha deach na mùthaidhean agad a shàbhaladh fhathast!",
+       "note": "<strong>An aire:</strong>",
+       "previewnote": "<strong>Cuimhnich nach eil ann ach ro-shealladh.</strong>\nCha deach na mùthaidhean agad a shàbhaladh fhathast!",
        "continue-editing": "Rach gun raon deasachaidh",
        "previewconflict": "Tha an ro-shealladh seo a' sealltainn dhut an teacsa san raon teacsa gu h-àrd mar a nochdas e ma shàbhaileas tu an-dràsta.",
-       "session_fail_preview": "'''Duilich! Cha b' urrainn dhuinn na dheasaich thu a làimhseachadh air sgàth call dàta an t-seisein.'''\nNach fheuch thu ris a-rithist?\nMur obraich e fhathast, feuch is [[Special:UserLogout|clàraich a-mach]] is a-steach a-rithist an uairsin.",
-       "session_fail_preview_html": "'''Duilich! Cha b' urrainn dhuinn na dheasaich thu a làimhseachadh air sgàth call dàta an t-seisein.'''\n\n''A chionn 's gun do chuir {{SITENAME}} HTML amh an comas, tha an ro-shealladh falaichte mar dhìon an aghaidh ionnsaighean JavaScript.''\n\n'''Mas e deasachadh dligheach a tha seo, feuch ris a-rithist.'''\nMur obraich e fhathast, feuch is [[Special:UserLogout|clàraich a-mach]] is a-steach a-rithist an uairsin.",
-       "token_suffix_mismatch": "'''Dhiùlt sinn na dheasaich thu a chionn 's gun do chuir an cliant agad na caractaran puingeachaidh tro chèile san tòcan deasachaidh.'''\nDhiùlt sinn na dheasaich thu air eagal 's gun coirbeadh e teacsa na duilleige.\nTachraidh seo uaireannan ma chleachdar seirbheis-lìn progsaidh gun urra a tha làn de mhearachdan.",
-       "edit_form_incomplete": "'''Cha do ràinig cuid dhen fhoirm deasachaidh am frithealaichte; dèan cinnteach gu bheil gach deasachadh agad slàn is feuch ris a-rithist.'''",
+       "session_fail_preview": "<strong>Duilich! Cha b' urrainn dhuinn na dheasaich thu a làimhseachadh air sgàth call dàta an t-seisein.</strong>\nNach fheuch thu ris a-rithist?\nMur obraich e fhathast, feuch is [[Special:UserLogout|clàraich a-mach]] is a-steach a-rithist an uairsin.",
+       "session_fail_preview_html": "<strong>Duilich! Cha b' urrainn dhuinn na dheasaich thu a làimhseachadh air sgàth call dàta an t-seisein.</strong>\n\n<em>A chionn 's gun do chuir {{SITENAME}} còd HTML an comas, tha an ro-shealladh falaichte mar dhìon an aghaidh ionnsaighean JavaScript.</em>\n\n<strong>Mas e deasachadh dligheach a tha seo, feuch ris a-rithist.</strong>\nMur obraich e fhathast, feuch is [[Special:UserLogout|clàraich a-mach]] is a-steach a-rithist an uairsin.",
+       "token_suffix_mismatch": "<strong>Dhiùlt sinn na dheasaich thu a chionn 's gun do chuir an cliant agad na caractaran puingeachaidh tro chèile san tòcan deasachaidh.</strong>\nDhiùlt sinn na dheasaich thu air eagal 's gun coirbeadh e teacsa na duilleige.\nTachraidh seo uaireannan ma chleachdar seirbheis-lìn progsaidh gun urra a tha làn de mhearachdan.",
+       "edit_form_incomplete": "<strong>Cha do ràinig cuid dhen fhoirm deasachaidh am frithealaichte; dèan cinnteach gu bheil gach deasachadh agad slàn is feuch ris a-rithist.</strong>",
        "editing": "A' deasachadh $1",
        "creating": "A' cruthachadh $1",
        "editingsection": "A' deasachadh $1 (earrann)",
        "editingcomment": "A' deasachadh $1 (earrann ùr)",
        "editconflict": "Còmhstri deasachaidh: $1",
-       "explainconflict": "Tha cuideigin eile air an duilleag seo a mhùthadh on a thòisich thu fhèin air a dheasachadh.\nTha am bogsa teacsa gu h-àrd a' nochdadh na duilleige mar a tha i an-dràsta.\nTha na mùthaidhean agadsa sa bhogsa gu h-ìosal.\nBidh agad ris na mùthaidhean agad fhilleadh a-steach san teacsa làithreach.\nCha dèid '''ach an teacsa gu h-àrd''' a shàbhaladh nuair a bhriogas tu air \"{{int:savearticle}}\".",
+       "explainconflict": "Tha cuideigin eile air an duilleag seo a mhùthadh on a thòisich thu fhèin air a dheasachadh.\nTha am bogsa teacsa gu h-àrd a' nochdadh na duilleige mar a tha i an-dràsta.\nTha na mùthaidhean agadsa sa bhogsa gu h-ìosal.\nBidh agad ris na mùthaidhean agad a cho-aonachadh ris an teacsa làithreach.\nCha dèid <strong>ach an teacsa gu h-àrd</strong> a shàbhaladh nuair a bhriogas tu air \"{{int:savearticle}}\".",
        "yourtext": "An teacsa agad",
-       "storedversion": "Lethbhreac taisgte",
-       "nonunicodebrowser": "'''Rabhadh: Chan eil am brabhsair agad co-chòrdail le Unicode.'''\nChuir sinn gleus air dòigh dhut a nì cinnteach gun urrainn dhut duilleagan a shàbhaladh gu tèarainte: Nochdaidh caractaran taobh a-muigh ASCII mar chòd sia-dheicheach sa bhogsa deasachaidh.",
-       "editingold": "'''RABHADH: Tha thu a' deasachadh lethbhreac seann-aimsireil na duilleige seo.\nMa shàbhalas tu seo, thèid gach mùthadh air chall a rinneadh a-mach on mhùthadh seo.'''",
-       "yourdiff": "Caochlaidhean",
-       "copyrightwarning": "Thoir an aire gu bheilear a' tuigsinn gu bheil gach rud a chuireas tu ri {{SITENAME}} air a leigeil mu sgaoil fo $2 (see $1 airson mion-fhiosrachadh).\nMura bi thu toilichte 's daoine eile a' deasachadh gun tròcair na sgrìobh tu 's 'ga sgaoileadh mar a thogras iad, na cuir an-seo e.<br />\nTha thu a' toirt geall cuideachd gun do sgrìobh thu fhèin seo no gun do rinn thu lethbhreac dheth o àrainn phoblach no tùs saor coltach ris.\n'''Na cuir ann rudan fo chòir lethbhric gun chead!'''",
-       "copyrightwarning2": "Ged a thatar gur moladh {{SITENAME}} a chruthachadh, a mheudachadh, is a leasachadh, thèid droch dheasaicheidhean a chur air imrich gu luath.\nMur eil thu ag iarraidh an sgrìobhaidh agad a dheasaichear is a sgaoilear le càch, na cuir e.<br />\nMa dh'fhoilleachas tu rudeigin an seo, bidh tu a' dearbhadh gun do sgrìobh thu fhèin e, no gur ann às an raon phòballach a thàinig e; thoir aire '''nach eil''' sin a' gabhail a-staigh duilleagan-lìn mar as àbhaist (seall $1 airson barrachd fiosrachaidh). <br />\n'''NA CLEACHDAIBH SAOTHAIR FO DHLIGHE-SGRÌOBHAIDH GUN CHEAD!'''",
-       "longpageerror": "Mearachd: Tha an teacsa a chur thu thugainn {{PLURAL:$1 kilobyte|$1 kilobytes}} a dh'fhaid is tha sin nas fhaide na tha ceadaichte ({{PLURAL:$2 kilobyte|$2 kilobytes}}).'''\nCha ghabh a shàbhaladh.",
-       "readonlywarning": "'''Rabhadh: Chaidh an stòr-dàta a ghlasadh a chum obair-ghlèidhidh agus chan urrainn dhut na dheasaich thu a shàbhaladh an-dràsta fhèin.'''\n'S mathaid gum b' fheairrde dhut lethbhreac a dhèanamh dhen teacsa agus a shàbhaladh ann am faidhle ach an urrainn dhut a chleachdadh as a dhèidh seo.\n\nSeo am mìneachadh a thug an rianaire a ghlais e: $1",
-       "protectedpagewarning": "'''Rabhadh: Chaidh an duilleag seo a dhìon 's chan urrainn ach dhan fheadhainn aig a bheil ùghdarras rianaire a dheasachadh.'''\nChì thu an clàr mu dheireadh san loga mar fhiosrachadh dhut gu h-ìosal:",
-       "semiprotectedpagewarning": "'''An aire:''' Chaidh an duilleag seo a dhìon 's chan fhaod ach cleachdaichean clàraichte a dheasachadh.\nSeo an rud mu dheireadh san loga mar fhiosrachadh dhut:",
-       "cascadeprotectedwarning": "'''Rabhadh:''' Chaidh an duilleag seo a dhìon 's chan fhaod ach rianairean a dheasachadh a chionn 's gun robh e am broinn {{PLURAL:$1|na duilleige|nan duilleagan}} a leanas a tha cascade-protected.",
-       "titleprotectedwarning": "'''Rabhadh: Chaidh an duilleag seo a dhìon 's feumar [[Special:ListGroupRights|còraichean sònraichte]] gus a dheasachadh.'''\nSeo an rud mu dheireadh san loga mar fhiosrachadh dhut:",
-       "templatesused": "Tha {{PLURAL:$1|teamplaid|theamplaid|teamplaidean|teamplaid}} 'gan cleachdadh air an duilleag seo:",
-       "templatesusedpreview": "Tha {{PLURAL:$1|1 teamplaid 'ga cleachdadh|$1 theamplaid 'gan cleachdadh|$1 teamplaidean 'gan cleachdadh|$1 teamplaid 'gan cleachdadh}} san ro-shealladh seo:",
-       "templatesusedsection": "Tha {{PLURAL:$1|$1 teamplaid 'ga cleachdadh|$1 theamplaid 'gan cleachdadh|$1 teamplaidean 'gan cleachdadh|$1 teamplaid 'gan cleachdadh}} san earrann seo:",
+       "storedversion": "Mùthadh taisgte",
+       "nonunicodebrowser": "<strong>Rabhadh: Chan eil am brabhsair agad co-chòrdail le Unicode.</strong>\nChuir sinn gleus air dòigh dhut a nì cinnteach gun urrainn dhut duilleagan a shàbhaladh gu tèarainte: Nochdaidh caractaran taobh a-muigh ASCII mar chòd sia-dheicheach sa bhogsa deasachaidh.",
+       "editingold": "<strong>RABHADH: Tha thu a' deasachadh seann-mhùthadh na duilleige seo.</strong>\nMa shàbhaileas tu seo, thèid gach atharrachadh air chall a rinneadh a-mach on mhùthadh seo.",
+       "yourdiff": "Diofaran",
+       "copyrightwarning": "Thoir an aire gu bheilear a' tuigsinn gu bheil gach obair a chuireas tu ri {{SITENAME}} air a leigeil mu sgaoil fo $2 (see $1 airson mion-fhiosrachadh).\nMura bi thu toilichte 's daoine eile a' deasachadh gun tròcair na sgrìobh tu 's 'ga sgaoileadh mar a thogras iad, na cuir an-seo e.<br />\nTha thu a' toirt geall cuideachd gun do sgrìobh thu fhèin seo no gun do rinn thu lethbhreac dheth o àrainn phoblach no tùs saor coltach ris.\n<strong>Na cuir ann rudan fo chòir-lethbhreac gun chead!</strong>",
+       "copyrightwarning2": "Thoir an aire gum faod deasaichean eile gach obair a chuireas tu ri {{SITENAME}} a dheasachadh, atharrachadh no a thoirt air falbh.\nMur eil thu ag iarraidh gun deasaich cuideigin eile na sgrìobh thu gun truas, na cuir a-null e.<br />\nNì thu gealladh dhuinn cuideachd gur e thu fhèin a sgrìobh e no gun do rinn thu lethbhreac dheth o Public Domain no stòras saor dhen leithid (faic $1 airson barrachd fiosrachaidh). <br />\n<strong>Na cuir a-null obair a tha fo chòir-lethbhreac gun chead!</strong>",
+       "longpageerror": "<strong>Mearachd: Tha an teacsa a chur thu thugainn $1 {{PLURAL:$1|chileabaidht|chileabaidht|cileabaidhtichean|cileabaidht}} a dh'fhaid is tha sin nas fhaide na tha ceadaichte ($2 {{PLURAL:$2|chileabaidht|chileabaidht|cileabaidhtichean|cileabaidht}}).</strong>\nCha ghabh a shàbhaladh.",
+       "readonlywarning": "<strong>Rabhadh: Chaidh an stòr-dàta a ghlasadh a chum obair-ghlèidhidh agus chan urrainn dhut na dheasaich thu a shàbhaladh an-dràsta fhèin.</strong>\n'S mathaid gum b' fheairrde dhut lethbhreac a dhèanamh dhen teacsa agus a shàbhaladh ann am faidhle ach an urrainn dhut a chleachdadh as a dhèidh seo.\n\nSeo am mìneachadh a thug an rianaire a ghlais e: $1",
+       "protectedpagewarning": "<strong>Rabhadh: Chaidh an duilleag seo a dhìon 's chan urrainn ach dhan fheadhainn aig a bheil ùghdarras rianaire a dheasachadh.</strong>\nChì thu an clàr mu dheireadh san loga mar fhiosrachadh dhut gu h-ìosal:",
+       "semiprotectedpagewarning": "<strong>An aire:</strong> Chaidh an duilleag seo a dhìon 's chan fhaod ach cleachdaichean clàraichte a dheasachadh.\nSeo an rud mu dheireadh san loga mar fhiosrachadh dhut:",
+       "cascadeprotectedwarning": "<strong>Rabhadh:</strong> Chaidh an duilleag seo a dhìon 's chan fhaod ach rianairean a dheasachadh a chionn 's gun robh e am broinn {{PLURAL:$1|na duilleige|nan duilleagan}} a leanas a tha dìonta o bhith mar eas.",
+       "titleprotectedwarning": "<strong>Rabhadh: Chaidh an duilleag seo a dhìon 's feumar [[Special:ListGroupRights|còraichean sònraichte]] gus a dheasachadh.</strong>\nSeo an rud mu dheireadh san loga mar fhiosrachadh dhut:",
+       "templatesused": "Tha {{PLURAL:$1|teamplaid 'ga cleachdadh|teamplaidean 'gan cleachdadh}} air an duilleag seo:",
+       "templatesusedpreview": "Tha {{PLURAL:$1|teamplaid 'ga cleachdadh|teamplaidean 'gan cleachdadh}} san ro-shealladh seo:",
+       "templatesusedsection": "Tha {{PLURAL:$1|teamplaid 'ga cleachdadh|teamplaidean 'gan cleachdadh}} san earrann seo:",
        "template-protected": "(air a dhìon)",
        "template-semiprotected": "(air a leth-dhìon)",
-       "hiddencategories": "Tha an duilleag seo 'na ball de {{PLURAL:$1|1 roinn-seòrsa fhalaichte|$1 roinn-seòrsa fhalaichte|$1 roinnean-seòrsa falaichte|$1 roinn-seòrsa fhalaichte}}:",
+       "hiddencategories": "Tha an duilleag seo 'na ball de {{PLURAL:$1|$1 roinn-seòrsa fhalaichte|$1 roinn-seòrsa fhalaichte|$1 roinnean-seòrsa falaichte|$1 roinn-seòrsa fhalaichte}}:",
+       "edittools": "<!-- Nochdaidh an teacsa seo fo fhoirmean deasachaidh 's luchdaidh suas. -->",
+       "edittools-upload": "-",
        "nocreatetext": "Chuir {{SITENAME}} bacadh air cruthachadh de dhuilleagan ùra.\n'S urrainn dhut tilleadh is duilleag a tha ann mu thràth a dheasachadh no [[Special:UserLogin|clàradh a-steach no cunntas a chruthachadh]].",
        "nocreate-loggedin": "Chan eil cead agad duilleagan ùra a chruthachadh.",
        "sectioneditnotsupported-title": "Chan eil taic ri deasachadh earrannan",
        "sectioneditnotsupported-text": "Chan eil taic ri deasachadh earrannan air an duilleag seo.",
        "permissionserrors": "Mearachd leis a' chead",
-       "permissionserrorstext": "Chan eil cead agad sin a dhèanamh air sgàth {{PLURAL:$1|an adhbhair|an $1 adhbhar|nan $1 adhbharan|nan $1 adhbhar}} a leanas:",
-       "permissionserrorstext-withaction": "Chan eil cead agad airson \"$2\" air sgàth {{PLURAL:$1|an $1 adhbhair|an $1 adhbhar|nan $1 adhbharan|nan $1 adhbhar}} a leanas:",
-       "recreate-moveddeleted-warn": "'''Rabhadh: Tha thu gu bhith ath-chruthachadh duilleag a chaidh a sguabadh às roimhe.'''\n\nSaoil am bu chòir dhut leantainn air adhart le deasachadh na duilleige?.\nSeo dhut loga an sguabaidh às agus a' ghluasaid mar fhiosrachadh dhut:",
+       "permissionserrorstext": "Chan eil cead agad sin a dhèanamh air sgàth {{PLURAL:$1|an adhbhair|nan adhbharan}} a leanas:",
+       "permissionserrorstext-withaction": "Chan eil cead agad airson \"$2\" air sgàth {{PLURAL:$1|an adhbhair|nan adhbharan}} a leanas:",
+       "recreate-moveddeleted-warn": "<strong>Rabhadh: Tha thu gu bhith ath-chruthachadh duilleag a chaidh a sguabadh às roimhe.</strong>\n\nSaoil am bu chòir dhut leantainn air adhart le deasachadh na duilleige?.\nSeo dhut loga an sguabaidh às agus a' ghluasaid mar fhiosrachadh dhut:",
        "moveddeleted-notice": "Chaidh an duilleag seo a sguabadh às.\nChì thu loga an sguabaidh às agus a' ghluasaid gu h-ìosal mar fhiosrachadh dhut.",
        "log-fulllog": "Seall an loga slàn",
        "edit-hook-aborted": "Sguireadh dhen deasachadh ri linn dubhan.\nCha deach adhbhar a thoirt seachad.",
        "content-model-text": "teacsa lom",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
-       "expensive-parserfunction-warning": "'''Rabhadh:''' Tha cus expensive parser function calls san duilleag seo.\n\nBu chòir nas lugha na $2 {{PLURAL:$2|call|calls}} a bhith ann ach tha {{PLURAL:$1|$1 call|$1 calls}} ann.",
+       "expensive-parserfunction-warning": "<strong>Rabhadh:</strong> Tha cus gairmean a' pharsair cosgail san duilleag seo.\n\nBu chòir nas lugha na $2 {{PLURAL:$2|ghairm|ghairm|gairmean|gairm}} a bhith ann ach tha $1 {{PLURAL:$1|ghairm|ghairm|gairmean|gairm}} ann.",
        "expensive-parserfunction-category": "Duilleagan le cus expensive parser function calls",
-       "post-expand-template-inclusion-warning": "'''Rabhadh:''' Tha meud na teamplaide ro mhòr.\nCha dèid cuid dhith a ghabhail a-steach.",
+       "post-expand-template-inclusion-warning": "<strong>Rabhadh:</strong> Tha meud na teamplaide ro mhòr.\nCha dèid cuid dhith a ghabhail a-steach.",
        "post-expand-template-inclusion-category": "Duilleagan far a bheil meud nan teamplaidean a' dol thairis air na tha ceadaichte",
-       "post-expand-template-argument-warning": "'''Rabhadh:''' Tha aon argamaid teamplaid air a' char as lugha air an duilleag seo aig a bheil meud leudachaidh ro mhòr.\nChaidh na h-argamaidean sinn a leigeil seachad.",
+       "post-expand-template-argument-warning": "<strong>Rabhadh:</strong> Tha aon argamaid teamplaid air a' char as lugha air an duilleag seo aig a bheil meud leudachaidh ro mhòr.\nChaidh na h-argamaidean sinn a leigeil seachad.",
        "post-expand-template-argument-category": "Duilleagan air an deach argamaidean teamplaidean fhàgail às",
        "parser-template-loop-warning": "Mhothaicheadh do lùb teamplaid: [[$1]]",
        "parser-template-recursion-depth-warning": "Chaidh thu thairis air crìoch doimhne nan ath-chùrsaidhean teamplaid ($1)",
        "undo-failure": "Cha b' urrainn dhuinn an deasachadh a neo-dhèanamh air sgàth 's gun robh deasachaidhean eile sa mheadhan.",
        "undo-norev": "Cha b' urrainn dhuinn an deasachadh a neo-dhèanamh a chionn 's nach robh e ann no gun deach a sguabadh às.",
        "undo-nochange": "Tha coltas gun deach am mùthadh seo a neo-dhèanamh mu thràth.",
-       "undo-summary": "Neo-dhèan mùthadh $1 le [[Special:Contributions/$2|$2]] ([[User talk:$2|Deasbaireachd]])",
+       "undo-summary": "Neo-dhèan mùthadh $1 leis [[Special:Contributions/$2|$2]] ([[User talk:$2|an deasbaireachd]])",
        "undo-summary-username-hidden": "Neo-dhèan am mùthadh $1 le cleachdaiche falaichte",
        "cantcreateaccounttitle": "Cha ghabh an cunntas a chruthachadh",
-       "cantcreateaccount-text": "Chuir [[User:$3|$3]] bacadh air cruthachadh chunntasan on t-seòladh IP seo ('''$1''').\n\nDh'innise $3 gun do rinn iad seo air sgàth: ''$2''",
-       "cantcreateaccount-range-text": "Chuir [[User:$3|$3]] casg air daoine a tha airson cunntasan a chruthachadh on sheòlaidhean IP taobh a-staigh na rainse '''$1''' agus tha sin a' gabhail a-steach an t-seòlaidh IP agad-sa ('''$4''').\n\nThuir $3 gun do rinn iad seo air sgàth an adhbhair seo: ''$2''",
+       "cantcreateaccount-text": "Chuir [[User:$3|$3]] bacadh air cruthachadh chunntasan on t-seòladh IP seo (<strong>$1</strong>).\n\nDh'innis $3 gun do rinn {{GENDER:$3|e|i}} seo air sgàth: <em>$2</em>",
+       "cantcreateaccount-range-text": "Chuir [[User:$3|$3]] casg air daoine a tha airson cunntasan a chruthachadh on sheòlaidhean IP taobh a-staigh na rainse '''$1''' agus tha sin a' gabhail a-steach an t-seòlaidh IP agad-sa ('''$4''').\n\nDh'innis $3 gun do {{GENDER:$1|rinn e|rinn i|rinneadh}} seo air sgàth an adhbhair seo: ''$2''",
        "viewpagelogs": "Seall logaichean na duilleige seo",
        "nohistory": "Chan eil eachdraidh deasachaidh aig an duilleag seo.",
-       "currentrev": "Lethbhreac làithreach",
+       "currentrev": "Am mùthadh mu dheireadh",
        "currentrev-asof": "Am mùthadh mu dheireadh on $1",
        "revisionasof": "Mùthadh on $1",
-       "revision-info": "Lèirmheas mar a bha e $1 le $2",
+       "revision-info": "Am mùthadh mar a bha e $1 le $2 $7",
        "previousrevision": "← Mùthadh nas sine",
        "nextrevision": "Mùthadh nas ùire →",
        "currentrevisionlink": "Am mùthadh mu dheireadh",
        "last": "roimhe",
        "page_first": "Toiseach",
        "page_last": "Deireadh",
-       "histlegend": "Taghadh nan diofar: comharraich bogsaichean rèidio nam mùthaidhean gus coimeas a dhèanamh agus put Enter no am putan gu h-ìosal.<br />\nMìneachadh: '''({{int:cur}})''' = an diofar eadar e 's am mùthadh as ùire, '''({{int:last}})''' = an diofar eadar e 's am mùthadh roimhe, '''{{int:minoreditletter}}''' = deasachadh beag.",
+       "histlegend": "Taghadh nan diofar: comharraich bogsaichean rèidio nam mùthaidhean gus coimeas a dhèanamh agus put Enter no am putan gu h-ìosal.<br />\nTreòir: <strong>({{int:cur}})</strong> = an diofar eadar e 's am mùthadh as ùire, <strong>({{int:last}})</strong> = an diofar eadar e 's am mùthadh roimhe, <strong>{{int:minoreditletter}}</strong> = deasachadh beag.",
        "history-fieldset-title": "An eachdraidh brabhsaidh",
        "history-show-deleted": "Na chaidh sguabadh às a-mhàin",
        "histfirst": "as sine",
        "histlast": "as ùire",
-       "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
+       "historysize": "(%1 {{PLURAL:$1|bhaidht|bhaidht|baidhtichean|baidht}})",
        "historyempty": "(falamh)",
        "history-feed-title": "Eachdraidh nam mùthaidhean",
-       "history-feed-description": "Eachdraidh nam mùthaidhean airson na duilleige seo air an uici",
+       "history-feed-description": "Eachdraidh nam mùthaidhean airson na duilleige seo air an uicidh",
        "history-feed-item-nocomment": "$1 $2",
-       "history-feed-empty": "Chan eil an duilleag a dh'iarr thu ann.\nDh'fhaoidte gun deach a sguabadh às an uici no gun deach ainm ùr a chur air.\nFeuch is [[Special:Search|lorg duilleagan ùra iomachaidh air an uici]]",
+       "history-feed-empty": "Chan eil an duilleag a dh'iarr thu ann.\nDh'fhaoidte gun deach a sguabadh às an uicidh no gun deach ainm ùr a chur air.\nFeuch is [[Special:Search|lorg duilleagan ùra iomachaidh air an uicidh]]",
        "rev-deleted-comment": "(chaidh gearr-chunntas an deasachaidh a thoirt air falbh)",
        "rev-deleted-user": "(chaidh an t-ainm-cleachdaiche a thoirt air falbh)",
        "rev-deleted-event": "(chaidh gnìomh an loga a thoirt air falbh)",
-       "rev-deleted-user-contribs": "[chaidh an t-ainm-cleachdaiche no an seòladh IP a thoirt air falbh - chan fhaic na com-pàirtichean an deasachadh]",
-       "rev-deleted-text-permission": "Chaidh mùthadh na duilleige seo '''a sguabadh às'''.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].",
-       "rev-deleted-text-unhide": "Chaidh mùthadh na duilleige seo '''a sguabadh às'''.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].\n'S urrainn dhut [$1 am mùthadh seo fhaicinn fhathast] ma tha thu airson leantainn air adhart.",
-       "rev-suppressed-text-unhide": "Chaidh mùthadh na duilleige seo '''a mhùchadh'''.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a mhùchadh].\n'S urrainn dhut [$1 am mùthadh seo fhaicinn fhathast] ma tha thu airson leantainn air adhart.",
-       "rev-deleted-text-view": "Chaidh mùthadh na duilleige seo '''a sguabadh às'''.\n'S urrainn dhut coimhead air, gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].",
-       "rev-suppressed-text-view": "Chaidh mùthadh na duilleige seo '''a mhùchadh'''.\n'S urrainn dhut coimhead air, gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a mhùchadh].",
-       "rev-deleted-no-diff": "Chan fhaic thu an diff seo a chionn 's gun deach aon dhe na mùthaidhean '''a sguabadh às'''.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].",
-       "rev-suppressed-no-diff": "Chan fhaic thu an diff seo a chionn 's gun deach aon dhe na mùthaidhean '''a sguabadh às'''.",
-       "rev-deleted-unhide-diff": "Chaidh mùthadh dhen diff seo '''a sguabadh às'''.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].\n'S urrainn dhut [$1 coimhead air an diff seo fhathast] ma tha thu airson leantainn air adhart.",
-       "rev-suppressed-unhide-diff": "Chaidh mùthadh an diff seo '''a mhùchadh'''.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a mhùchadh].\n'S urrainn dhut [$1 coimhead air an diff seo fhathast] ma tha thu airson leantainn air adhart.",
-       "rev-deleted-diff-view": "Chaidh mùthadh an diff seo '''a sguabadh às'''.\n'S urrainn dhut coimhead air an diff seo, gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].",
-       "rev-suppressed-diff-view": "Chaidh mùthadh an diff seo '''a mhùchadh'''.\n'S urrainn dhut coimhead air an diff seo, gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a mhùchadh].",
+       "rev-deleted-user-contribs": "[chaidh an t-ainm-cleachdaiche no an seòladh IP a thoirt air falbh - chaidh an deasachadh fhalach o liosta na h-obrach]",
+       "rev-deleted-text-permission": "Chaidh mùthadh na duilleige seo <strong>a sguabadh às</strong>.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].",
+       "rev-deleted-text-unhide": "Chaidh mùthadh na duilleige seo <strong>a sguabadh às</strong>.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].\n'S urrainn dhut [$1 am mùthadh seo fhaicinn fhathast] ma tha thu airson leantainn air adhart.",
+       "rev-suppressed-text-unhide": "Chaidh mùthadh na duilleige seo <strong>a mhùchadh</strong>.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a mhùchadh].\n'S urrainn dhut [$1 am mùthadh seo fhaicinn fhathast] ma tha thu airson leantainn air adhart.",
+       "rev-deleted-text-view": "Chaidh mùthadh na duilleige seo <strong>a sguabadh às</strong>.\n'S urrainn dhut coimhead air, gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].",
+       "rev-suppressed-text-view": "Chaidh mùthadh na duilleige seo <strong>a mhùchadh</strong>.\n'S urrainn dhut coimhead air, gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a mhùchadh].",
+       "rev-deleted-no-diff": "Chan fhaic thu an diofar seo a chionn 's gun deach aon dhe na mùthaidhean <strong>a sguabadh às</strong>.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].",
+       "rev-suppressed-no-diff": "Chan fhaic thu an diofar seo a chionn 's gun deach aon dhe na mùthaidhean <strong>a sguabadh às</strong>.",
+       "rev-deleted-unhide-diff": "Chaidh mùthadh an diofair seo <strong>a sguabadh às</strong>.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].\n'S urrainn dhut [$1 coimhead air an diofar seo fhathast] ma tha thu airson leantainn air adhart.",
+       "rev-suppressed-unhide-diff": "Chaidh mùthadh an diofair seo <strong>a mhùchadh</strong>.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a mhùchadh].\n'S urrainn dhut [$1 coimhead air an diofar seo fhathast] ma tha thu airson leantainn air adhart.",
+       "rev-deleted-diff-view": "Chaidh mùthadh an diofair seo <strong>a sguabadh às</strong>.\n'S urrainn dhut coimhead air an diofar seo, gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].",
+       "rev-suppressed-diff-view": "Chaidh mùthadh an diofair seo <strong>a mhùchadh</strong>.\n'S urrainn dhut coimhead air an diofar seo, gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a mhùchadh].",
        "rev-delundel": "seall/falaich",
        "rev-showdeleted": "seall",
-       "revisiondelete": "Sguab às/neo-dhèan sguabadh às mhùthaidhean",
+       "revisiondelete": "Sguab às/neo-dhèan sguabadh às mùthaidhean",
        "revdelete-nooldid-title": "Tha am mùthadh seo mì-dhligheach",
        "revdelete-nooldid-text": "Cha do shònraich thu mùthadh airson seo a dhèanamh, chan eil e ann no tha thu a' feuchainn ris am mùthadh làithreach a chur am falach.",
        "revdelete-no-file": "Chan eil am faidhle a shònraich thu ann.",
        "revdelete-show-file-confirm": "A bheil thu cinnteach gu bheil thu airson coimhead air mùthadh an fhaidhle \"<nowiki>$1</nowiki>\" a chaidh a sguabadh às $2 aig $3?",
        "revdelete-show-file-submit": "Tha",
-       "revdelete-selected-text": "{{PLURAL:$1|Lèirmheas|Lèirmheas|Lèirmheas|Lèirmheas|Lèirmheasan|Lèirmheas}} de [[:$2]] a thagh thu:",
-       "revdelete-selected-file": "{{PLURAL:$1|Tionndadh an fhaidhle|Tionndadh nam faidhlichean|Tionndadh nam faidhlichean|Tionndadh nam faidhlichean|Tionndadh nam faidhlichean|Tionndadh nam faidhlichean}} a thagh thu à [[:$2]]:",
+       "revdelete-selected-text": "{{PLURAL:$1|Am mùthadh|Na mùthaidhean}} air [[:$2]] a thagh thu:",
+       "revdelete-selected-file": "Tionndadh {{PLURAL:$1|an fhaidhle|nam faidhlichean}} a thagh thu airson [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|An tachartas loga|Na tachartasan loga}} a thagh thu:",
        "revdelete-text-text": "Nochdaidh mùthaidhean a chaidh a sguabadh às ann an eachdraidh na duilleige fhathast ach chan fhaic buill a' phobaill cuid dhen t-susbaint aca.",
        "revdelete-text-file": "Nochdaidh tionndaidhean dhen fhaidhle a chaidh a sguabadh às ann an eachdraidh na duilleige fhathast ach chan fhaic buill a' phobaill cuid dhen t-susbaint aca.",
        "logdelete-text": "Nochdaidh tachartasan san loga a chaidh a sguabadh às ann an eachdraidh na duilleige fhathast ach chan fhaic buill a' phobaill cuid dhen t-susbaint aca.",
        "revdelete-text-others": "Gheibh rianairean eile air {{SITENAME}} cothrom air an t-susbaint fhalaichte fhathast agus is urrainn dhaibh an sguabadh às a neo-dhèanamh san dearbh eadar-aghaidh mur an deach cuingeachaidhean a bharrachd a chur orra.",
        "revdelete-confirm": "Dearbh gu bheil thu airson seo a dhèanamh, gu bheil thu a' tuigsinn na thachras ri linn agus gu bheil thu a' dèanamh seo a-rèir [[{{MediaWiki:Policy-url}}|a' phoileasaidh]].",
-       "revdelete-suppress-text": "Cha bu chòir dhut mùchadh a chleachdadh '''ach''' ann an suidheachaidhean mar seo:\n* Fiosrachadh a dh'fhaodadh a bhith dìteachail\n* Fiosrachadh pearsanta a tha cearr\n*: ''seòladh taige, àireamhan fòn, àireamhan NI is msaa.''",
+       "revdelete-suppress-text": "Cha bu chòir dhut mùchadh a chleachdadh <strong>ach</strong> ann an suidheachaidhean mar seo:\n* Fiosrachadh a dh'fhaodadh a bhith dìteachail\n* Fiosrachadh pearsanta a tha cearr\n*: <em>seòladh taighe, àireamhan fòn, àireamhan NI is msaa.</em>",
        "revdelete-legend": "Suidhich cuingeachaidhean na faicsinneachd",
        "revdelete-hide-text": "Teacsa a' mhùthaidh",
        "revdelete-hide-image": "Falaich susbaint an fhaidhle",
        "revdelete-suppress": "Mùch dàta o rianairean agus càch",
        "revdelete-unsuppress": "Thoir air falbh na bacaidhean air mùthaidhean a chaidh aiseag",
        "revdelete-log": "Adhbhar:",
-       "revdelete-submit": "Cuir air {{PLURAL:$1|an lèirmheas|na lèirmheasan}} a thagh thu",
-       "revdelete-success": "'''Chaidh so-fhaicsinneachd a' mhùthaidh ùrachadh.'''",
-       "revdelete-failure": "'''Cha b' urrainn dhuinn so-fhaicsinneachd a' mhùthaidh ùrachadh:'''\n$1",
-       "logdelete-success": "'''Chaidh faicsinneachd an loga a shuidheachadh.'''",
-       "logdelete-failure": "'''Cha b' urrainn dhuinn faicsinneachd an loga a shuidheachadh:'''\n$1",
+       "revdelete-submit": "Cuir an sàs e air {{PLURAL:$1|am mùthadh|na mùthaidhean}} a thagh thu",
+       "revdelete-success": "<strong>Chaidh so-fhaicsinneachd a' mhùthaidh ùrachadh.</strong>",
+       "revdelete-failure": "<strong>Cha b' urrainn dhuinn so-fhaicsinneachd a' mhùthaidh ùrachadh:</strong>\n$1",
+       "logdelete-success": "<strong>Chaidh faicsinneachd an loga a shuidheachadh.</strong>",
+       "logdelete-failure": "<strong>Cha b' urrainn dhuinn faicsinneachd an loga a shuidheachadh:</strong>\n$1",
        "revdel-restore": "mùth follaiseachd",
        "pagehist": "Eachdraidh na duilleige",
        "deletedhist": "Eachdraidh a chaidh a sguabadh às",
-       "revdelete-hide-current": "Mearachd a' cur am falach an nì dhen $2, $1: Seo an lèirmheas làithreach. Cha ghabh a chur am falach.",
+       "revdelete-hide-current": "Mearachd a' cur am falach an nì dhen $2, $1: Seo am mùthadh làithreach. Cha ghabh a chur am falach.",
        "revdelete-show-no-access": "Mearachd a' sealltainn an nì on $2, $1: Tha comharra ann a dh'innseas gu bheil e \"cuingichte\".\nChan eil cothrom agad air.",
        "revdelete-modify-no-access": "Mearachd ag atharrachadh an nì on $2, $1: Tha comharra ann a dh'innseas gu bheil e \"cuingichte\".\nChan eil cothrom agad air.",
        "revdelete-modify-missing": "Mearachd ag atharrachadh an nì leis an ID $1: Chan eil e san stòr-dàta!",
-       "revdelete-no-change": "'''Rabhadh:''' Bha na roghainnean faicsinneachd a dh'iarr thu aig an nì dhen $2, $1 mu thràth.",
+       "revdelete-no-change": "<strong>Rabhadh:</strong> Bha na roghainnean faicsinneachd a dh'iarr thu aig an nì dhen $2, $1 mu thràth.",
        "revdelete-concurrent-change": "Mearachd ag atharrachadh an nì on $2, $1: Tha coltas gun deach a staid atharrachadh le cuideigin dìreach nuair a dh'fheuch thusa ri atharrachadh.\nThoir sùil air na logaichean.",
        "revdelete-only-restricted": "Mearachd a' cur an nì on $2, $1 am falach: Chan urrainn dhut nithean le rianairean a mhùchadh gun a bhith a' taghadh aon dhe na roghainnean faicsinneachd eile cuideachd.",
        "revdelete-reason-dropdown": "*Adhbharan cumanta airson sguabadh às rudan\n** Briseadh còrach-lethbhreac\n** Beachd no fiosrachadh pearsanta mì-iomchaidh\n** Ainm-cleachdaiche mì-iomchaidh\n** Fiosrachadh a dh'fhaodadh a bhith dìteachail",
        "revdelete-offender": "Ùghdar a' mhùthaidh:",
        "suppressionlog": "Loga nam mùchaidhean",
        "suppressionlogtext": "Chì thu liosta nan rudan a chaidh a sguabadh às agus a bhacadh gu h-ìosal, a' gabhail a-steach stuth a chaidh fhalach o rianairean. Faic [[Special:BlockList|liosta nam bacaidhean]] airson liosta nan toirmeasgan is bacaidhean beò.",
-       "mergehistory": "Co-aonaich eachdraidhean na duilleige",
-       "mergehistory-header": "Leigidh an duilleag seo leat na lèirmheasan aig aon duilleag a cho-aonadh le duilleag nas ùire.\nDèan cinnteach gun glèidh an t-atharrachadh seo leantainneachd eachdraidh na duilleige.",
-       "mergehistory-box": "Co-aonaich na lèirmheasan aig dà dhuilleag:",
+       "mergehistory": "Co-aonaich eachdraidhean nan duilleag",
+       "mergehistory-header": "Leigidh an duilleag seo leat na mùthaidhean aig aon duilleag a cho-aonadh le duilleag nas ùire.\nDèan cinnteach gun glèidh an t-atharrachadh seo leantainneachd eachdraidh na duilleige.",
+       "mergehistory-box": "Co-aonaich na mùthaidhean aig dà dhuilleag:",
        "mergehistory-from": "An duilleag thùsail:",
        "mergehistory-into": "An duilleag targaide:",
        "mergehistory-list": "Eachdraidh nan deasachaidhean a ghabhas a cho-aonadh",
-       "mergehistory-merge": "Gabhaidh na lèirmheasan a leanas aig [[:$1]] a cho-aonadh le [[:$2]].\nCleachd colbh nam putanan-rèidio gus dìreach na lèirmheasan a cho-aonadh a chaidh a chruthachadh aig an àm a chaidh a shònrachadh no roimhe sin.\nThoir an aire gun dèid an colbh seo ath-shuidheachadh ma chleachdas tu ceanglaichean na seòladaireachd.",
+       "mergehistory-merge": "Gabhaidh na mùthaidhean a leanas aig [[:$1]] a cho-aonadh le [[:$2]].\nCleachd colbh nam putanan-rèidio gus dìreach na mùthaidhean a cho-aonadh a chaidh a chruthachadh aig an àm a chaidh a shònrachadh no roimhe sin.\nThoir an aire gun dèid an colbh seo ath-shuidheachadh ma chleachdas tu ceanglaichean na seòladaireachd.",
        "mergehistory-go": "Seall na deasachaidhean a ghabhas a cho-aonadh",
-       "mergehistory-submit": "Co-aonaich na lèirmheasan",
-       "mergehistory-empty": "Chan eil lèirmheas sam bith ann a ghabhas a cho-aonadh.",
-       "mergehistory-success": "Chaidh $3 {{PLURAL:$3|lèirmheas|lèirmheas|lèirmheasan|lèirmheas}} de [[:$1]] a cho-aonadh dha [[:$2]].",
+       "mergehistory-submit": "Co-aonaich na mùthaidhean",
+       "mergehistory-empty": "Chan eil mùthadh sam bith ann a ghabhas a cho-aonadh.",
+       "mergehistory-success": "Chaidh $3 {{PLURAL:$3|mhùthadh|mhùthadh|mùthaidhean|mùthadh}} air [[:$1]] a cho-aonadh dha [[:$2]].",
        "mergehistory-fail": "Cha ghabh an eachdraidh a cho-aonadh, thoir sùil air paramadairean na duilleige 's an ama.",
        "mergehistory-no-source": "Chan eil an tùs-duilleag $1 ann.",
        "mergehistory-no-destination": "Chan eil an an duilleag targaide $1 ann.",
        "mergehistory-comment": "Chaidh [[:$1]] a cho-aonadh dha [[:$2]]: $3",
        "mergehistory-same-destination": "Chan fhaod an tùs-duilleag is an duilleag targaide a bhith co-ionnann",
        "mergehistory-reason": "Adhbhar:",
+       "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
        "mergelog": "Loga a' cho-aonaidh",
-       "pagemerge-logentry": "chaidh [[$1]] a cho-aonadh dha [[$2]] (lèirmheasan suas ri $3)",
-       "revertmerge": "Dì-aontaich",
+       "pagemerge-logentry": "chaidh [[$1]] a cho-aonadh dha [[$2]] (mùthaidhean suas ri $3)",
+       "revertmerge": "Dì-aonaich",
        "mergelogpagetext": "Chì thu liosta nan co-aonaidhean as ùire eadar eachdraidh dhuilleagan gu h-ìosail.",
        "history-title": "Eachdraidh nam mùthaidhean aig \"$1\"",
-       "difference-title": "An diofar eadar na lèirmheasan a rinneadh air \"$1\"",
+       "difference-title": "An diofar eadar na mùthaidhean a rinneadh air \"$1\"",
        "difference-title-multipage": "An diofar eadar an dà dhuilleag \"$1\" agus \"$2\"",
        "difference-multipage": "(An diofar eadar na duilleagan)",
        "lineno": "Loidhne $1:",
        "compareselectedversions": "Dèan coimeas eadar na mùthaidhean a thagh thu",
-       "showhideselectedversions": "Seall/Falaich na lèirmheasan a thagh thu",
+       "showhideselectedversions": "Seall/Falaich na mùthaidhean a thagh thu",
        "editundo": "neo-dhèan",
        "diff-empty": "(Gun diofar eatarra)",
-       "diff-multi-sameuser": "(Rinn an cleachdaiche {{PLURAL:$1|$1 lèirmheas eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach|$1 lèirmheasan eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach}}nach eil 'gan sealltainn)",
-       "diff-multi-otherusers": "({{PLURAL:$1|$1 lèirmheas eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach|$1 lèirmheasan eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach}} le {{PLURAL:$2|$2 chleachdaiche|$2 chleachdaiche|$2 chleachdaiche|$2 chleachdaiche|$2 cleachdaichean|$2 cleachdaiche}} eile nach eil 'gan sealltainn)",
-       "diff-multi-manyusers": "({{PLURAL:$1|Aon lèirmheas eadar-mheadhanach||$1 lèirmheasan eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach}} le {{PLURAL:$2|aon chleachdaiche|$2 chleachdaiche|$2 cleachdaichean|$2 cleachdaiche}} gun sealltainn)",
-       "difference-missing-revision": "Cha deach {{PLURAL:$2|$2 lèirmheas|$2 lèirmheas|$2 lèirmheas|$2 lèirmheas|$2 lèirmheasan|$2 lèirmheas}} dhen diofar seo ($1) a lorg.\n\nMar is trice, tachraidh seo ma leanas tu ceangal gu diff air duilleag a chaidh a sguabadh às.\nGheibh thu mion-fhiosrachadh ann an [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} loga nan duilleagan a chaidh a sguabadh às].",
+       "diff-multi-sameuser": "(Rinn an cleachdaiche {{PLURAL:$1|$1 mhùthadh|$1 mhùthadh|$1 mùthaidhean|$1 mùthadh}} eadar-mheadhanach nach eil {{PLURAL:$1|'ga shealltainn|$1 'gan sealltainn}})",
+       "diff-multi-otherusers": "({{PLURAL:$1|$1 mhùthadh|$1 mhùthadh|$1 mùthaidhean|$1 mùthadh}} eadar-mheadhanach le {{PLURAL:$2|$2 chleachdaiche|$2 chleachdaiche|$2 cleachdaichean|$2 cleachdaiche}} eile nach eil {{PLURAL:$1|'ga shealltainn|$1 'gan sealltainn}})",
+       "diff-multi-manyusers": "({{PLURAL:$1|$1 mhùthadh|$1 mhùthadh|$1 mùthaidhean|$1 mùthadh}} eadar-mheadhanach le barrachd air {{PLURAL:$2|$2 chleachdaiche|$2 chleachdaiche|$2 cleachdaichean|$2 cleachdaiche}} nach eil {{PLURAL:$1|'ga shealltainn|$1 'gan sealltainn}})",
+       "difference-missing-revision": "Tha {{PLURAL:$2|$2 mhùthadh|$2 mhùthadh|$2 mùthaidhean|$2 mùthadh}} san diofar seo ($1) nach deach a lorg.\n\nMar is trice, tachraidh seo ma leanas tu air ceangal gu diofar air duilleag a chaidh a sguabadh às.\nGheibh thu mion-fhiosrachadh ann an [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} loga nan duilleagan a chaidh a sguabadh às].",
        "searchresults": "Toraidhean rannsachaidh",
        "searchresults-title": "Lorg \"$1\" am broinn nan toraidhean",
-       "toomanymatches": "Fhuaras cus thoraidhean, feuch ceist eile",
        "titlematches": "Tiotalan dhuilleagan a tha a' maidseadh",
        "textmatches": "Teacsa sna duilleagan a tha co-ionnann",
        "notextmatches": "Chan eil tiotal de dhuilleag sam bith a' freagairt ris",
        "prevn": "an {{PLURAL:$1|$1}} roimhe",
        "nextn": "an ath {{PLURAL:$1|$1}}",
-       "prevn-title": "$1 {{PLURAL:$1|toradh|thoradh|toraidhean|toradh}} roimhe",
+       "prevn-title": "{{PLURAL:$1|an $1 toradh|an $1 thoradh|na $1 toraidhean|am $1 toradh}} roimhe",
        "nextn-title": "An ath $1 {{PLURAL:$1|toradh|thoradh|toraidhean|toradh}}",
        "shown-title": "Seall $1 {{PLURAL:$1|toradh|thoradh|toraidhean|toradh}} air gach duilleag",
        "viewprevnext": "Seall ($1 {{int:pipe-separator}} $2) ($3).",
-       "searchmenu-exists": "'''Tha duilleag air a bheil \"[[:$1]]\" air an uicipeid seo.'''",
-       "searchmenu-new": "<strong>Cruthaich an duilleag \"[[:$1]]\" air an uicipeid seo!</strong> {{PLURAL:$2|0=|Seall an duilleag a chaidh a lorg ri linn na lorg thu.|Seall na duilleagan a chaidh a lorg ri linn na lorg thu.|Seall na duilleagan a chaidh a lorg ri linn na lorg thu.|Seall na duilleagan a chaidh a lorg ri linn na lorg thu.|Seall na duilleagan a chaidh a lorg ri linn na lorg thu.|Seall na duilleagan a chaidh a lorg ri linn na lorg thu.}}'",
+       "searchmenu-exists": "<strong>Tha duilleag air a bheil \"[[:$1]]\" air an uicidh seo.</strong> {{PLURAL:$2|0=|Seall na toraidhean luirg eile cuideachd.}}",
+       "searchmenu-new": "<strong>Cruthaich an duilleag \"[[:$1]]\" air an uicidh seo!</strong> {{PLURAL:$2|0=|Faic an duilleag a chaidh a lorg ri linn na lorg thu cuideachd.|Faic na toraidhean luirg cuideachd.}}",
        "searchprofile-articles": "Duilleagan susbainte",
        "searchprofile-images": "Ioma-mheadhanan",
        "searchprofile-everything": "Gach rud",
        "searchprofile-images-tooltip": "Lorg faidhlichean",
        "searchprofile-everything-tooltip": "Lorg am broinn susbaint sam bith (a' gabhail a-steach nan duilleagan deasbaireachd)",
        "searchprofile-advanced-tooltip": "Lorg am broinn ainm-spàsan gnàthaichte",
-       "search-result-size": "$1 ({{PLURAL:$2 fhacal|$2 fhacal|$2 faclan|$2 facal}})",
-       "search-result-category-size": "{{PLURAL:$1|1 bhall|$1 bhall|$1 bhuill|$1 ball}} ({{PLURAL:$2|1 fho-roinn|$2 fho-roinn|$2 fo-roinnean|$2 fo-roinn}}, {{PLURAL:$3|1 fhaidhle|$3 fhaidhle|$3 faidhlichean|$3 faidhle}})",
+       "search-result-size": "$1 ({{PLURAL:$2|$2 fhacal|$2 fhacal|$2 faclan|$2 facal}})",
+       "search-result-category-size": "{{PLURAL:$1|$1 bhall|$1 bhall|$1 bhuill|$1 ball}} ({{PLURAL:$2|$2 fho-roinn-seòrsa|$2 fho-roinn-seòrsa|$2 fo-roinnean-seòrsa|$2 fo-roinn-seòrsa}}, {{PLURAL:$3|$3 fhaidhle|$3 fhaidhle|$3 faidhlichean|$3 faidhle}})",
        "search-result-score": "Buntainneas: $1%",
        "search-redirect": "(ag ath-sheòladh $1)",
        "search-section": "(earrann $1)",
        "search-interwiki-default": "Toraidhean o $1:",
        "search-interwiki-more": "(barrachd)",
        "search-relatedarticle": "Co-cheangailte",
-       "searcheverything-enable": "Seall anns na namespaces air fad",
        "searchrelated": "co-cheangailte",
        "searchall": "a h-uile",
-       "showingresults": "A' nochdadh suas gu $1 {{PLURAL:$1|$1 toradh|$1 thoradh|$1 toraidhean|$1 toradh}} gu h-ìosal a' tòiseachadh le #'''$2'''.",
-       "showingresultsinrange": "A' sealltainn suas ri {{PLURAL:$1|<strong>$1</strong> toradh|<strong>$1</strong> toradh|<strong>$1</strong> toradh|<strong>$1</strong> toradh|<strong>$1</strong> toraidhean|<strong>$1</strong> toradh}} san rainse eadar #<strong>$2</strong> is #<strong>$3</strong>.",
-       "showingresultsnum": "A' nochdadh '''$3''' {{PLURAL:$3|$3 toradh|$3 thoradh|$3 toraidhean|$3 toradh}} gu h-ìosal a' tòiseachadh le #'''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Toradh '''$1''' à '''$3'''|Toraidhean '''$1 - $2''' of '''$3'''}} airson '''$4'''",
+       "showingresults": "A' sealltainn suas ri <strong>$1</strong> {{PLURAL:$1|toradh|thoradh|toraidhean|toradh}} gu h-ìosal a' tòiseachadh le àireamh <strong>$2</strong>.",
+       "showingresultsinrange": "A' sealltainn suas ri <strong>$1</strong> {{PLURAL:$1|toradh|thoradh|toraidhean|toradh}} san rainse eadar àireamh <strong>$2</strong> is <strong>$3</strong>.",
+       "showingresultsnum": "A' sealltainn <strong>$3</strong> {{PLURAL:$3|toradh|thoradh|toraidhean|toradh}} gu h-ìosal a' tòiseachadh le àireamh <strong>$2</strong>.",
+       "showingresultsheader": "{{PLURAL:$5|Toradh <strong>$1</strong> à <strong>$3</strong>|Toraidhean <strong>$1 - $2</strong> à <strong>$3</strong>}} airson <strong>$4</strong>",
        "search-nonefound": "Cha do fhreagair toradh sam bith ri d' iarrtas.",
        "powersearch-legend": "Rannsachadh adhartach",
-       "powersearch-ns": "Lorg ann an namespaces:",
+       "powersearch-ns": "Lorg ann an ainm-spàsan:",
        "powersearch-togglelabel": "Sgrùd:",
        "powersearch-toggleall": "Na h-uile",
        "powersearch-togglenone": "Chan eil gin",
+       "powersearch-remember": "Cuir na thagh thu sa chuimhne airson lorg ri teachd",
        "search-external": "Lorg air an taobh a-muigh",
        "searchdisabled": "Tha lorg air {{SITENAME}} à comas.\n'S urrainn dhut lorg a dhèanamh air Google san eadar-àm.\nFaodaidh gum bi inneacsan susbaint {{SITENAME}} tuilleadh 's sean ge-tà.",
        "search-error": "Thachair mearachd fhad 's a bha sinn a' lorg an-seo: $1",
        "prefs-rc": "Mùthaidhean ùra",
        "prefs-watchlist": "An clàr-faire",
        "prefs-watchlist-days": "Co mheud latha a sheallar air a' chlàr-fhaire:",
-       "prefs-watchlist-days-max": "{{PLURAL:$1|latha|latha|làithean|latha}} air a' char as motha",
+       "prefs-watchlist-days-max": "$1 {{PLURAL:$1|latha|latha|làithean|latha}} air a' char as motha",
        "prefs-watchlist-edits": "An àireamh as motha de mhùthaidhean a thèid a shealltainn air a' chlàr-fhaire leudaichte:",
        "prefs-watchlist-edits-max": "Àireamh as motha: 1000",
        "prefs-watchlist-token": "Tòcan a' chlàir-fhaire:",
        "stub-threshold": "An stairsneach airson fòrmatadh <a href=\"#\" class=\"stub\">cheanglaichean nam bun</a> (bytes):",
        "stub-threshold-disabled": "À comas",
        "recentchangesdays": "Co mheud latha a thèid a shealltainn sna mùthaidhean ùra:",
-       "recentchangesdays-max": "{{PLURAL:$1|latha|latha|làithean|latha}} air a' char as motha",
+       "recentchangesdays-max": "$1 {{PLURAL:$1|latha|latha|làithean|latha}} air a' char as motha",
        "recentchangescount": "Uiread a dheasachaidhean a thèid a shealltainn a ghnàth:",
        "prefs-help-recentchangescount": "Tha seo a' gabhail a-steach mùthaidhean ùra, eachdraidhean nan duilleagan is logaichean.",
+       "prefs-help-watchlist-token2": "Seo an iuchair dhìomhair airson inbhir-lìn a' chlàir-fhaire agad.\n'S urrainn do dhuine sam bith a bhios eòlach air an clàr-faire agad a leughadh, mar sin na co-roinn e.\n'S urrainn dhut [[Special:ResetTokens|ath-shuidheachadh]] ma bhios feum agad air seo.",
        "savedprefs": "Tha na roghainnean agad air an sàbhaladh.",
        "timezonelegend": "Roinn-tìde:",
        "localtime": "An t-àm ionadail:",
-       "timezoneuseserverdefault": "Cleachd bun-roghainn na h-Uicipeid ($1)",
-       "servertime": "Àm an fhrithealaichte:",
+       "timezoneuseserverdefault": "Cleachd bun-roghainn na h-uicidh ($1)",
+       "timezoneuseoffset": "Eile (sònraich an fhrith-àireamh)",
+       "servertime": "Àm an fhrithealaiche:",
        "guesstimezone": "Lìon on bhrabhsair",
        "timezoneregion-africa": "Afraga",
        "timezoneregion-america": "Aimeireaga",
        "timezoneregion-pacific": "An Cuan Sèimh",
        "allowemail": "Ceadaich post-d o chleachdaichean eile",
        "prefs-searchoptions": "Lorg",
-       "prefs-namespaces": "Namespaces",
+       "prefs-namespaces": "Ainm-spàsan",
        "default": "an roghainn bhunaiteach",
        "prefs-files": "Faidhlichean",
        "prefs-custom-css": "CSS gnàthaichte",
        "prefs-emailconfirm-label": "Dearbhadh puist-d:",
        "youremail": "Post-dealain:",
        "username": "{{GENDER:$1|Ainm-cleachdaiche}}:",
-       "prefs-memberingroups": "{{GENDER:$2|Ball}} ann an {{PLURAL:$1|bhuidheann|bhuidheann|buidhnean|buidheann}}:",
+       "prefs-memberingroups": "{{GENDER:$2|'Na bhall|'Na ball}} {{PLURAL:$1|sa bhuidheann|sna buidhnean}}:",
+       "prefs-memberingroups-type": "$1",
        "prefs-registration": "Àm clàraidh:",
+       "prefs-registration-date-time": "$1",
        "yourrealname": "An dearbh ainm a th' ort:",
        "yourlanguage": "Cànan:",
        "yourvariant": "Eug-samhail cànan na susbaint:",
        "badsiglength": "Tha an t-earr-sgrìobhadh agad ro fhada.\nChan fhaod e a bhith nas fhaide na $1 {{PLURAL:$1|charactar|charactar|caractaran|caractar}}.",
        "yourgender": "Dè a' ghnè a tha annad:",
        "gender-unknown": "B' fhearr leam gun a bhith 'ga leigeil ris",
-       "gender-male": "Deasaichidh e duilleagan na h-Uicipeid",
+       "gender-male": "Deasaichidh e duilleagan na h-uicidh",
        "gender-female": "Deasaichidh i duilleagan na h-Uicipeid",
+       "prefs-help-gender": "Cha leig thu leas an roghainn seo a shuidheachadh.\nCleachdaidh am bathar-bog an luach aice gus bruidhinn riut le d' ainm 's iomradh a thoirt ort gu càch leis a' ghnè ghramataigeach iomchaidh.\nBidh am fiosrachadh seo poblach.",
        "email": "Post-d:",
+       "prefs-help-realname": "Cha leig thu leas innse dè am fìor-ainm a tha ort.\nMa bheir thu seachad e, thèid seo a chleachdadh gus urram a thoirt dhut airson do chuid obrach.",
        "prefs-help-email": "Chan leig thu leas post-dealain a chur ann ach bidh feum air ma dhìochuimhnicheas tu am facal-faire agad 's ma dh'iarras tu fear ùr.",
-       "prefs-help-email-others": "'S urrainn dhut leigeil le daoine eile post-dealain a chur thugad tro cheangal air an duilleag agad.\nChan fhaicear an seòladh fhèin nuair a chuireas cuideigin post-dealain thugad.",
+       "prefs-help-email-others": "'S urrainn dhut leigeil le daoine eile post-dealain a chur thugad tro cheangal air duilleag a' chleachdaiche no deasbaireachd agad.\nChan fhaicear an seòladh fhèin nuair a chuireas cuideigin post-dealain thugad.",
        "prefs-help-email-required": "Tha feum air seòladh puist-d.",
        "prefs-info": "Fiosrachadh bunasach",
        "prefs-i18n": "Cànan",
        "prefs-displayrc": "Roghainnean taisbeanaidh",
        "prefs-displaywatchlist": "Roghainnean taisbeanaidh",
        "prefs-tokenwatchlist": "Tòcan",
-       "prefs-diffs": "Diffs",
+       "prefs-diffs": "Diofaran",
+       "prefs-help-prefershttps": "Thèid an roghainn seo a chur an sàs an ath thuras a nì thu logadh a-steach.",
+       "prefs-tabs-navigation-hint": "Gliocas: 'S urrainn dhut na h-iuchraichean saighde chlì 's dheas a chleachdadh gus leum a ghearradh o thaba gu taba air liosta nan taba.",
        "email-address-validity-valid": "Tha coltas gu bheil am post-d dligheach",
        "email-address-validity-invalid": "Cuir a-steach post-d dligheach",
        "userrights": "Stiùireadh ceadan a' chleachdaiche",
        "userrights-lookup-user": "Stiùirich na buidhnean chleachdaichean",
        "userrights-user-editname": "Cuir a-steach ainm-cleachdaiche:",
        "editusergroup": "Deasaich na buidhnean chleachdaichean",
-       "editinguser": "Ag atharrachadh ceadan a' chleachdaiche '''[[User:$1|$1]]''' $2",
+       "editinguser": "Ag atharrachadh ceadan a' chleachdaiche <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Deasaich na buidhnean chleachdaichean",
        "saveusergroups": "Sàbhail na buidhnean chleachdaichean",
        "userrights-groupsmember": "Ball de:",
        "userrights-groupsmember-auto": "Ball fèin-obrachail de:",
+       "userrights-groupsmember-type": "$1",
+       "userrights-groups-help": "'S urrainn dhut na buidhnean sa bheil an cleachdaiche seo 'na bhall atharrachadh:\n* Is ciall dha chromag sa bhogsa gu bheil an cleachdaiche seo 'na bhall sa buidheann.\n* Is ciall dha bhogsa gun chromag ris nach eil an cleachdaiche seo 'na bhall sa buidheann.\n* Innsidh * dhut nach urrainn dhut am buidheann a thoirt air falbh nuair a bhios tu air a chur ris no an caochladh.",
        "userrights-reason": "Adhbhar:",
-       "userrights-no-interwiki": "Chan eil cead agad ceadan chleachdaichean a dheasachadh air uicipeidean eile.",
+       "userrights-no-interwiki": "Chan eil cead agad ceadan chleachdaichean a dheasachadh air uicidhean eile.",
        "userrights-nodatabase": "Chan eil an stòr-dàta $1 ann no chan e fear ionadail a tha ann.",
+       "userrights-nologin": "Feumaidh tu [[Special:UserLogin|logadh a-steach]] le cunntas rianaire ach an toir thu ceadan nam ball seachad.",
+       "userrights-notallowed": "Chan eil cead agad gus ceadan nam ball a chur ris no a thoirt air falbh.",
        "userrights-changeable-col": "Buidhnean as urrainn dhut atharrachadh",
+       "userrights-unchangeable-col": "Buidhnean nach urrainn dhut atharrachadh",
+       "userrights-irreversible-marker": "$1*",
+       "userrights-conflict": "Tha còmhstri le atharraichean air ceadan nam ball! Thoir sùil air a-rithist 's dearbhaich na h-atharraichean agad.",
+       "userrights-removed-self": "Tha thu air na ceadan agad fhèin a thoirt air falbh. Mar sin, chan eil cead agad tuilleadh gus an duilleag seo inntrigeadh.",
        "group": "Buidheann:",
        "group-user": "Cleachdaichean",
+       "group-autoconfirmed": "Cleachdaichean fèin-dearbhte",
        "group-bot": "Bots",
        "group-sysop": "Rianadairean",
        "group-bureaucrat": "Biurocratan",
+       "group-suppress": "Marasgalan",
        "group-all": "(na h-uile)",
-       "group-user-member": "{{GENDER:$1|cleachdaiche}}",
-       "group-bot-member": "{{GENDER:$1|bot}}",
-       "group-sysop-member": "{{GENDER:$1|rianaire}}",
-       "group-bureaucrat-member": "{{GENDER:$1|biùrocrat}}",
+       "group-user-member": "cleachdaiche",
+       "group-autoconfirmed-member": "cleachdaiche fèin-dearbhte",
+       "group-bot-member": "bot",
+       "group-sysop-member": "rianaire",
+       "group-bureaucrat-member": "biùrocrat",
+       "group-suppress-member": "marasgal",
        "grouppage-user": "{{ns:project}}:Cleachdaichean",
        "grouppage-autoconfirmed": "{{ns:project}}:Cleachdaichean fèin-dearbhte",
        "grouppage-bot": "{{ns:project}}:Bots",
        "grouppage-sysop": "{{ns:project}}:Rianadairean",
        "grouppage-bureaucrat": "{{ns:project}}:Biurocratan",
+       "grouppage-suppress": "{{ns:project}}:Marasgal",
        "right-read": "Cead-leughaidh",
        "right-edit": "Cead-deasachaidh",
        "right-createpage": "Cead-cruthachaidh (de dhuilleagan nach eil 'nan duilleagan deasbaireachd)",
        "right-createtalk": "Cead duilleagan deasbaireachd a chruthachadh",
        "right-createaccount": "Cead cunntasan ùra a chruthachadh",
+       "right-minoredit": "Cead comharra a chur nach e ach deasachadh beag a th' ann",
        "right-move": "Cead duilleagan a ghluasad",
        "right-move-subpages": "Cead duilleagan a ghluasad leis na fo-dhuilleagan aca",
        "right-move-rootuserpages": "Cead duilleagan chleachdaichean root a ghluasad",
+       "right-move-categorypages": "Cead duilleagan roinn-seòrsa a ghluasad",
        "right-movefile": "Cead faidhlichean a ghluasad",
+       "right-suppressredirect": "Cead gun a bhith a' cruthachadh ath-stiùiridhean o na duilleagan tùsail nuair a ghluaisear duilleag",
        "right-upload": "Cead faidhlichean a luchdadh suas",
        "right-reupload": "Cead sgrìobhadh thairis air duilleagan a tha ann",
-       "right-upload_by_url": "Faidhlichean a luchdadh suas o URL",
-       "newuserlogpage": "Loga cruthachaidh de chleachdaichean",
+       "right-reupload-own": "Cead sgrìobhadh thairis air faidhlichean a tha ann ma a chaidh an luchdadh suas leis an dearbh neach",
+       "right-reupload-shared": "Cead faidhlichean a thar-àithneadh gu h-ionadail a tha san ionad-tasgaidh nam meadhanan co-roinnte",
+       "right-upload_by_url": "Cead faidhlichean a luchdadh suas o URL",
+       "right-purge": "Cead tasgadan an làraich airson duilleag a ghlanadh gun dearbhadh",
+       "right-autoconfirmed": "Gun chuingeachadh air tricead nan gnìomhan a-rèir IP",
+       "right-bot": "Ceadan pròiseis fèin-obrachail aige",
+       "right-nominornewtalk": "Cead deasachaidhean beaga a dhèanamh air duilleagan deasbaid gun bhrodadh airson teachdaireachdan ùra a chruthachadh",
+       "right-apihighlimits": "Cead crìochan as àirde le ceistean API a chleachdadh",
+       "right-writeapi": "Cead API sgrìobhaidh a chleachdadh",
+       "right-delete": "Cead duilleagan a sguabadh às",
+       "right-bigdelete": "Cead duilleagan aig a bheil eachdraidh mòr a sguabadh às",
+       "right-deletelogentry": "Cead nithean sònraichte an loga a sguabadh às 's aiseag",
+       "right-deleterevision": "Cead mùthaidhean sònraichte aig duilleagan a sguabadh às 's aiseag",
+       "right-deletedhistory": "Cead nithean an eachdraidh a chaidh a sguabadh às a shealltainn gun an teacsa ceangailte riutha",
+       "right-deletedtext": "Cead teacsa 's atharraichean eadar mùthaidhean air an sguabadh às a shealltainn",
+       "right-browsearchive": "Cead lorg sna duilleagan air an sguabadh às",
+       "right-undelete": "Cead duilleagan air an sguabadh às aiseag",
+       "right-suppressrevision": "Cead sùil a thoirt air mùthaidhean a chaidh a sguabadh às 's am falach o na rianairean 's an aiseag",
+       "right-suppressionlog": "Cead logaichean prìobhaideach a shealltainn",
+       "right-block": "Cead càch a bhacadh o dheasachadh",
+       "right-blockemail": "Cead cleachdaiche a bhacadh o chur phost-d",
+       "right-hideuser": "Cead ainm-chleachdaiche a bhacadh 's fhalach on t-sealladh phoblach",
+       "right-ipblock-exempt": "Cead bacaidhean IP, bacaidhean fèin-obrachail 's bacaidhean rainse a leigeil seachad",
+       "right-proxyunbannable": "Cead bacadh fèin-obrachail phrogsaidhean a leigeil seachad",
+       "right-unblockself": "Cead bacadh a thoirt uaithe fhèin",
+       "right-protect": "Cead leibheilean an dìona atharrachadh 's duilleagan le dìon o bhith mar eas a dheasachadh",
+       "right-editprotected": "Cead gus duilleagan le dìon \"{{int:protect-level-sysop}}\" a dheasachadh",
+       "right-editsemiprotected": "Cead gus duilleagan le dìon \"{{int:protect-level-autoconfirmed}}\" a dheasachadh",
+       "right-editinterface": "Cead gus eadar-aghaidh nan cleachdaichean a dheasachadh",
+       "right-editusercssjs": "Cead gus faidhlichean CSS 's JavaScript càich a dheasachadh",
+       "right-editusercss": "Cead gus faidhlichean CSS càich a dheasachadh",
+       "right-edituserjs": "Cead gus faidhlichean JavaScript càich a dheasachadh",
+       "right-editmyusercss": "Cead gus faidhlichean CSS agad fhèin a dheasachadh",
+       "right-editmyuserjs": "Cead gus faidhlichean JavaScript agad fhèin a dheasachadh",
+       "right-viewmywatchlist": "Cead an clàr-faire agad fhèin a shealltainn",
+       "right-editmywatchlist": "Cead an clàr-faire agad fhèin a dheasachadh. Thoir an aire gun cuir cuid a gnìomhan duilleagan ris fiù 's mur eil an cead seo agad.",
+       "right-viewmyprivateinfo": "Cead an dàta prìobhaideach agad fhèin (m.e. seòladh puist-d, fìor-ainm) a shealltainn",
+       "right-editmyprivateinfo": "Cead an dàta prìobhaideach agad fhèin (m.e. seòladh puist-d, fìor-ainm) a dheasachadh",
+       "right-editmyoptions": "Cead na roghainnean agad fhèin a dheasachadh",
+       "right-rollback": "Cead gus na h-atharraichean leis a' chleachdaiche mu dheireadh air duilleag sònraichte a roladh air ais gu luath",
+       "right-markbotedits": "Cead dèiligeadh ri deasachaidhean rolaidh air ais 'nan deasachaidhean bota",
+       "right-noratelimit": "Gun chuingeachadh air tricead nan gnìomhan",
+       "right-import": "Cead duilleagan ion-phortadh o uicidhean eile",
+       "right-importupload": "Cead duilleagan ion-phortadh o luchdadh suas faidhle",
+       "right-patrol": "Cead comharra freiceadain a chur ri deasachaidhean càich",
+       "right-autopatrol": "Cead gun dèid comharra freiceadain a chur ris na deasachaidhean agad fhèin gu fèin-obrachail",
+       "right-patrolmarks": "Cead gus na comharran freiceadain o chionn goirid a shealltainn",
+       "right-unwatchedpages": "Cead duilleagan air an toirt far a' chlàir-fhaire a shealltainn",
+       "right-mergehistory": "Cead eachdraidh nan duilleagan a cho-aonachadh",
+       "right-userrights": "Cead gus gach cead cleachdaiche a dheasachadh",
+       "right-userrights-interwiki": "Cead gus ceadan nan chleachdaichean aig uicidhean eile a dheasachadh",
+       "right-siteadmin": "Cead gus an stòr-dàta a glasadh 's a' ghlas a thoirt fo bharr",
+       "right-override-export-depth": "Cead gus duilleagan às-phortadh, a' gabhail a-seach duilleagan ceangailte suas ri doimhneachd de 5",
+       "right-sendemail": "Cead gus puist-d a chur gu cleachdaichean eile",
+       "right-passwordreset": "Cead gus puist-d ath-shuidheachadh nam facal-faire a shealltainn",
+       "newuserlogpage": "Loga cruthachadh nan cleachdaichean",
+       "newuserlogpagetext": "Seo loga nan cleachdaichean a chaidh a chruthachadh.",
        "rightslog": "Loga còraichean a' chleachdaiche",
+       "rightslogtext": "Seo loga nan atharraichean air ceadan nan cleachdaichean.",
+       "action-read": "leugh an duilleag seo",
        "action-edit": "deasaich an duilleag seo",
+       "action-createpage": "cruthaich duilleagan",
+       "action-createtalk": "cruthaich duilleagan deasbaireachd",
+       "action-createaccount": "cruthaich an cunntas cleachdaiche seo",
+       "action-history": "seall eachdraidh na duilleige seo",
+       "action-minoredit": "cuir comharra nach e ach deasachadh beag a th' ann",
        "action-move": "gluais an duilleag seo",
-       "nchanges": "{{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}",
+       "action-move-subpages": "gluais an duilleag seo 's a fo-dhuilleagan",
+       "action-move-rootuserpages": "gluais duilleagan chleachdaichean root",
+       "action-move-categorypages": "gluais duilleagan roinn-seòrsa",
+       "action-movefile": "gluais am faidhle seo",
+       "action-upload": "luchdaich suas am faidhle seo",
+       "action-reupload": "sgrìobh thairis air an fhaidhle seo a tha ann",
+       "action-reupload-shared": "tar-àithn am faidhle seo ann an ionad-tasgaidh co-roinnte",
+       "action-upload_by_url": "luchdaich suas am faidhle seo o URL",
+       "action-writeapi": "cleachd API sgrìobhaidh",
+       "action-delete": "sguab às an duilleag seo",
+       "action-deleterevision": "sguab às am mùthadh seo",
+       "action-deletedhistory": "seall eachdraidh an sguabaidh às aig an duilleag seo",
+       "action-browsearchive": "lorg sna duilleagan air an sguabadh às",
+       "action-undelete": "neo-dhèan sguabadh às na duilleige seo",
+       "action-suppressrevision": "thoir sùil air a' mhùthadh fhalaichte seo 's aisig e",
+       "action-suppressionlog": "seall an loga prìobhaideach seo",
+       "action-block": "bac an cleachdaiche seo o dheasachadh",
+       "action-protect": "atharraich leibheil dìon na duilleige seo",
+       "action-rollback": "roilig na h-atharraichean leis a' chleachdaiche mu dheireadh air duilleag sònraichte a  air ais gu luath",
+       "action-import": "ion-phortaich duilleagan o uicidh eile",
+       "action-importupload": "ion-phortaich duilleagan o luchdadh suas faidhle",
+       "action-patrol": "cuir comharra freiceadain ri deasachaidhean càich",
+       "action-autopatrol": "faigh comharra freiceadain fèin-obrachail air na dheasaich thu",
+       "action-unwatchedpages": "seall na duilleagan air an toirt far a' chlàir-fhaire",
+       "action-mergehistory": "co-aonaich eachdraidh nan duilleagan",
+       "action-userrights": "deasaich gach cead cleachdaiche",
+       "action-userrights-interwiki": "deasaich ceadan nan chleachdaichean aig uici eile",
+       "action-siteadmin": "glais an stòr-dàta no thoir a' ghlas fo bharr",
+       "action-sendemail": "cuir puist-d",
+       "action-editmywatchlist": "deasaich an clàr-faire agad",
+       "action-viewmywatchlist": "seall an clàr-faire agad",
+       "action-viewmyprivateinfo": "seall am fiosrachadh prìobhaideach agad",
+       "action-editmyprivateinfo": "deasaich am fiosrachadh prìobhaideach agad",
+       "nchanges": "$1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}",
+       "enhancedrc-since-last-visit": "$1 on tadhal mu dheireadh",
+       "enhancedrc-history": "eachdraidh",
        "recentchanges": "Mùthaidhean ùra",
        "recentchanges-legend": "Roghainnean nam mùthaidhean ùra",
-       "recentchanges-summary": "Cum sùil air na mùthaidhean as ùire a nithear air an uici air an duilleag seo.",
-       "recentchanges-feed-description": "Cum sùil air na mùthaidhean as ùire a nithear air an uici seo san inbhir seo.",
+       "recentchanges-summary": "Cum sùil air na mùthaidhean as ùire a nithear air an uicidh air an duilleag seo.",
+       "recentchanges-noresult": "Cha fhreagair atharrachadh sam bith san ùine seo ris na cuspairean-deuchainn seo.",
+       "recentchanges-feed-description": "Cum sùil air na mùthaidhean as ùire a nithear air an uicidh seo san inbhir seo.",
        "recentchanges-label-newpage": "Chruthaich thu duilleag ùr leis a sin",
        "recentchanges-label-minor": "Seo mùthadh beag",
        "recentchanges-label-bot": "'S e bot a rinn an deasachadh seo",
-       "recentchanges-label-unpatrolled": "Cha deach freiceadan tron deasachadh seo fhathast",
+       "recentchanges-label-unpatrolled": "Cha do chuir freiceadan comharra ris an deasachadh seo fhathast",
        "recentchanges-label-plusminus": "Seo meud atharrachadh na duilleige ann am byte",
-       "recentchanges-legend-newpage": "(faic [[Special:NewPages|liosta nan duilleagan ùra]] cuideachd)",
+       "recentchanges-legend-heading": "'''Treòir:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (faic [[Special:NewPages|liosta nan duilleagan ùra]] cuideachd)",
+       "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "rcnotefrom": "Gheibhear na mùthaidhean a-mach o <strong>$2</strong> (gu ruige <strong>$1</strong>) gu h-ìosal.",
        "rclistfrom": "Seall na mùthaidhean ùra a-mach o $3 $2",
        "rcshowhideminor": "$1 mùthaidhean beaga",
+       "rcshowhideminor-show": "Seall",
+       "rcshowhideminor-hide": "Falaich",
        "rcshowhidebots": "$1 botaichean",
-       "rcshowhideliu": "$1 neach-cleachdaidh clàraichte",
-       "rcshowhideanons": "$1 luchd-cleachdaidh gun ainm",
+       "rcshowhidebots-show": "Seall",
+       "rcshowhidebots-hide": "Falaich",
+       "rcshowhideliu": "$1 na cleachdaichean clàraichte",
+       "rcshowhideliu-show": "Seall",
+       "rcshowhideliu-hide": "Falaich",
+       "rcshowhideanons": "$1 na cleachdaichean gun ainm",
+       "rcshowhideanons-show": "Seall",
+       "rcshowhideanons-hide": "Falaich",
        "rcshowhidepatr": "$1 na deasachaidhean fo aire freiceadain",
+       "rcshowhidepatr-show": "Seall",
+       "rcshowhidepatr-hide": "Falaich",
        "rcshowhidemine": "$1 na mùthaidhean agam",
-       "rclinks": "Seall na $1 mùthaidhean mu dheireadh thairis air na $2 làithean mu dheireadh<br />$3",
-       "diff": "diof",
+       "rcshowhidemine-show": "Seall",
+       "rcshowhidemine-hide": "Falaich",
+       "rclinks": "Seall {{PLURAL:$1|an $1 mhùthadh|an $1 mhùthadh|na $1 mùthaidhean|am $1 mùthadh}} mu dheireadh thairis air {{PLURAL:$2|an $2 latha|an $2 latha|na $2 làithean|am $2 latha}} mu dheireadh<br />$3",
+       "diff": "diofar",
        "hist": "eachd",
        "hide": "Falaich",
        "show": "Seall",
        "minoreditletter": "b",
        "newpageletter": "Ù",
        "boteditletter": "bt",
+       "unpatrolledletter": "!",
+       "number_of_watching_users_pageview": "[Tha $1 {{PLURAL:$1|chleachdaiche|chleachdaiche|cleachdaichean|cleachdaiche}} a' cumail sùil air]",
+       "rc_categories": "Cuingich gu roinnean-seòrsa (sgaraich le \"|\")",
+       "rc_categories_any": "Roinn-seòrsa sam bith",
+       "rc-change-size": "$1",
+       "rc-change-size-new": "$1 {{PLURAL:$1|bhaidht|bhaidht|baidhtichean|baidht}} às dèidh an atharrachaidh",
+       "newsectionsummary": "Earrann ùr /* $1 */",
        "rc-enhanced-expand": "Seall am mion-fhiosrachadh",
        "rc-enhanced-hide": "Cuir am mion-fhiosrachadh am falach",
+       "rc-old-title": "Chaidh a chruthachadh mar \"$1\" o thùs",
        "recentchangeslinked": "Mùthaidhean co-cheangailte",
        "recentchangeslinked-feed": "Mùthaidhean buntainneach",
        "recentchangeslinked-toolbox": "Mùthaidhean buntainneach",
        "recentchangeslinked-title": "Mùthaidhean co-cheangailte ri \"$1\"",
-       "recentchangeslinked-summary": "Seo liosta nam mùthaidhean a chaidh a chur air duilleagan a tha a' ceangal o dhuilleag shònraichte (no ri buill de roinn shònraichte).\nTha duilleagan air [[Special:Watchlist|do chlàr-faire]] ann an litrichean '''troma'''.",
+       "recentchangeslinked-summary": "Seo liosta nam mùthaidhean a chaidh a chur air duilleagan a tha a' ceangal o dhuilleag shònraichte (no ri buill ann an roinn-seòrsa sònraichte).\nTha duilleagan air [[Special:Watchlist|do chlàr-faire]] ann an litrichean <strong>troma</strong>.",
        "recentchangeslinked-page": "Ainm na duilleige:",
        "recentchangeslinked-to": "Seall mùthaidhean nan duilleagan a tha a' ceangal ris an duilleag sin 'na àite",
        "upload": "Luchdaich suas faidhle",
        "uploadbtn": "Luchdaich suas faidhle",
+       "reuploaddesc": "Sgur dhen luchdadh suas 's till dhan fhoirm luchdaidh suas",
+       "upload-tryagain": "Cuir tuairisgeul atharraichte an fhaidhle a-null",
+       "uploadnologin": "Chan eil thu air logadh a-steach",
+       "uploadnologintext": "$1 gus faidhlichean a luchdadh suas.",
+       "upload_directory_missing": "Tha pasgan an luchdaidh suas ($1) a dhìth 's cha b' urrainn dhan fhrithealaiche-lìn fear a chruthachadh.",
+       "upload_directory_read_only": "Chan urrainn dhan fhrithealaiche-lìn sgrìobhadh sa phasgan luchdaidh suas ($1).",
+       "uploaderror": "Mearachd leis an luchdadh suas",
+       "upload-recreate-warning": "<strong>Rabhadh: Chaidh faidhle air a bheil an t-ainm seo a sguabadh às no a ghluasad.</strong>\n\nSeo dhut loga an sguabaidh às 's nan gluasad airson na duilleige seo:",
+       "uploadtext": "Cleachd am foirm gu h-ìosal gus faidhlichean a luchdadh suas.\nGus na faidhlichean a chaidh a luchdadh suas roimhe a shealltainn no a lorg annta, rach gu [[Special:FileList|liosta nam faidhlichean air an luchdadh suas]], thèid (ath-)luchdaidhean suas a chur ri [[Special:Log/upload|loga nan luchdaidhean suas]] cuideachd 's na chaidh a sguabadh às ri [[Special:Log/delete|loga nan sguabaidhean às]].\n\nCleachd ceangal ann an aon dhe na cruthan seo gus faidhle a chur am broinn duilleige:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> gus an tionndadh slàn dhen fhaidhle a chleachdadh\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|teacsa alt]]</nowiki></code></strong> cus dreach a tha 200 piogsail a leud a chleachdadh a nochdas ann am bogsa air a' mharghan chlì le \"teacsa alt\" mar thuairisgeul\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> gus ceangal a dhèanamh ris an fhaidhle gu dìreach gun a bhith a' sealltainn an fhaidhle",
+       "upload-permitted": "Seòrsaichean faidhle a tha ceadaichte: $1.",
+       "upload-preferred": "Seòrsaichean faidhle as docha leinn: $1.",
+       "upload-prohibited": "Seòrsaichean faidhle nach eil ceadaichte: $1.",
        "uploadlogpage": "Loga an luchdaidh suas",
+       "uploadlogpagetext": "Chì thu na faidhlichean a chaidh a luchdadh suas o chionn goirid gu h-ìosal.\nSeall [[Special:NewFiles|gailearaidh nam faidhlichean ùra]] airson foir-shealladh nas lèirsinniche.",
        "filename": "Ainm-faidhle",
        "filedesc": "Gearr-chunntas",
        "fileuploadsummary": "Gearr-chunntas:",
-       "filestatus": "Cor dlighe-sgrìobhaidh:",
+       "filereuploadsummary": "Atharraichean air an fhaidhle:",
+       "filestatus": "Staid còrach-lethbhreac:",
+       "filesource": "Tùs:",
        "ignorewarning": "Leig seachad an rabhadh agus sàbhail am faidhle co-dhiù",
+       "ignorewarnings": "Leig seachad rabhadh sam bith",
+       "minlength1": "Feumaidh co-dhiù aon litir a bhith ann an ainm faidhle.",
+       "illegalfilename": "Tha caractaran san ainm faidhle \"$1\" nach eil ceadaichte ann an tiotal duilleige.\nthoir ainm ùr air an fhaidhle 's feuch ris an luchdadh suas a-rithist.",
+       "filename-toolong": "Chan fhaod barrachd air 240 baidht a bhith ann an ainm faidhle.",
        "badfilename": "Ainm ìomhaigh air atharrachadh ri \"$1\".",
-       "fileexists": "Tha faidhle ann mu thràth air a bheil an t-ainm seo, cuir sùil air <strong>[[:$1]]</strong> mur eil thu buileach cinntach a bheil thu airson atharrachadh.\n[[$1|thumb]]",
+       "filetype-mime-mismatch": "Chan fhreagair leudachan \".$1\" an fhaidhle ris an seòrsa MIME a mhothaich sinn airson an fhaidhle ($2).",
+       "filetype-badmime": "Chan fhaod thu faidhlichean dhen t-seòrsa MIME \"$1\" a luchdadh suas.",
+       "filetype-bad-ie-mime": "Chan fhaod thu am faidhle seo a luchdadh suas on a mhothaicheadh Internet Explorer dha mar \"$1\" nach eil 'na sheòrsa faidhle ceadaichte 's a dh'fhaodadh a bhith cunnartach.",
+       "filetype-unwanted-type": "Cha ghabh sinn ris an seòrsa faidhle <strong>\".$1\"</strong>.\nIs docha leinn {{PLURAL:$3|an seòrsa faidhle|na seòrsaichean faidhle}} $2.",
+       "filetype-banned-type": "Chan eil <strong>\".$1\"</strong> {{PLURAL:$4|'na seòrsa faidhle|'nan seòrsaichean faidhle}} ceadaichte.\nIs $2 {{PLURAL:$3|an seòrsa faidhle|na seòrsaichean faidhle}} ceadaichte.",
+       "filetype-missing": "Chan eil leudachan aig an fhaidhle (can \".jpg\").",
+       "empty-file": "Cha am faidhle a chuir thu a-null falamh.",
+       "file-too-large": "Cha am faidhle a chuir thu a-null ro mhòr.",
+       "filename-tooshort": "Tha ainm an fhaidhle a chuir thu a-null ro ghoirid.",
+       "filetype-banned": "Tha an seòrsa faidhle seo toirmisgte.",
+       "verification-error": "Dh'fhàillig am faidhle seo an dearbhadh.",
+       "hookaborted": "Chaidh sgur dhen atharrachadh a dh'fheuch thu ri dèanamh le leudachan.",
+       "illegal-filename": "Chan eil ainm an fhaidhle ceadaichte.",
+       "overwrite": "Chan fhaod thu sgrìobhadh thairis air faidhle a tha ann mar-thà.",
+       "unknown-error": "Thachair mearachd neo-aithnichte.",
+       "tmp-create-error": "Cha deach leinn faidhle sealach a chruthachadh.",
+       "tmp-write-error": "Mearachd le sgrìobhadh an fhaidhle shealaich.",
+       "large-file": "Mholamaid nach bi faidhlichean nas motha na $1;\ntha am faidhle seo $2 a mheud.",
+       "largefileserver": "Tha am faidhle seo nas motha na tha ceadaichte a-rèir rèiteachadh an fhrithealaiche.",
+       "emptyfile": "Tha am faidhle a luchdaich thu suas falamh a-rèir coltais.\n'S dòcha gu bheil mearachd sgrìobhaidh ann an ainm an fhaidhle.\nDearbhaich an e seo am faidhle a tha thu airson luchdadh suas.",
+       "windows-nonascii-filename": "Cha chuir an uicidh seo taic ri ainm faidhle sa bheil caractaran sònraichte.",
+       "fileexists": "Tha faidhle ann mu thràth air a bheil an t-ainm seo, thoir sùil air <strong>[[:$1]]</strong> mur eil thu buileach cinnteach a bheil thu airson atharrachadh.\n[[$1|thumb]]",
+       "filepageexists": "Chaidh duilleag an tuairisgeil airson na duilleige seo a chruthachadh air <strong>[[:$1]]</strong> mar-thà ach chan eil faidhle air a bheil an t-ainm seo ann an-dràsta.\nCha nochd an gearr-chunntas a chuireas tu a-steach air duilleag an tuairisgeil.\nFeumaidh tu a dheasachadh a làimh ach an nochd an gearr-chunntas agad an-siud.\n[[$1|thumb]]",
+       "fileexists-extension": "Tha faidhle ann air a bheil ainm a tha coltach ris: [[$2|thumb]]\n* Ainm an fhaidhle 'ga luchdadh suas: <strong>[[:$1]]</strong>\n* Ainm an fhaidhle a tha ann: <strong>[[:$2]]</strong>\nFeuch an tagh thu ainm eile.",
+       "fileexists-thumbnail-yes": "Tha coltas an deilbh le meud lùghdaichte <em>(dealbhag)</em> air an fhaidhle seo.\n[[$1|thumb]]\nThoir sùil air an fhaidhle <strong>[[:$1]]</strong>.\nMas e an aon dealbh a tha san fhaidhle sin ach air meud tùsail, cha leig thu leas dealbhag a bharrachd a luchdadh suas.",
+       "file-thumbnail-no": "Tha ainm an fhaidhle a' tòiseachadh le <strong>$1</strong>.\nTha coltas an deilbh le meud lùghdaichte <em>(dealbhag)</em> air.\nMa tha an dealbh agad le dùmhlachd-bhreacaidh shlàn, feuch an luchdaich thu am fear ud suas 's mur eil, feuch an atharraich thu ainm an fhaidhle.",
+       "fileexists-forbidden": "Tha faidhle air a bheil an t-ainm seo ann mar-thà 's cha ghabh sgrìobhadh thairis air.\nMa tha thu airson am faidhle agad a luchdadh suas fhathast, rach air ais 's cleachd ainm ùr.\n[[File:$1|thumb|center|$1]]",
+       "fileexists-shared-forbidden": "Tha faidhle air a bheil an t-ainm seo ann mar-thà ann an ionad-tasgaidh nam faidhlichean co-roinnte.\nMa tha thu airson am faidhle agad a luchdadh suas fhathast, rach air ais 's cleachd ainm ùr.\n[[File:$1|thumb|center|$1]]",
+       "file-exists-duplicate": "Is dùblachadh {{PLURAL:$1| dhen fhaidhle| dhe na faidhlichean}} a leanas a tha san fhaidhle seo:",
+       "file-deleted-duplicate": "Chaidh faidhle a tha co.ionnann ris an fhear seo ([[:$1]]) a sguabadh às roimhe.\nThoir sùil air eachdraidh sguabaidh às an fhaidhle ud mus luchdaich thu suas a-rithist e.",
+       "file-deleted-duplicate-notitle": "Chaidh faidhle a tha co-ionnann ris an fhear seo a sguabadh às roimhe 's chaidh an tiotal a th' air a mhùchadh.\nBu coir dhut faighneachd air cuideigin a chì dàta faidhle mùchte ach an toir e sùil air an t-suidheachadh mus luchdaich thu suas a-rithist e.",
+       "uploadwarning": "Rabhadh luchdaidh suas",
+       "uploadwarning-text": "Atharraich tuairisgeul an fhaidhle gu h-ìosal 's feuch ris a-rithist.",
        "savefile": "Sàbhail faidhle",
        "uploadedimage": "a luchdaich suas \"[[$1]]\"",
+       "overwroteimage": "luchdaich suas tionndadh ùr de \"[[$1]]\"",
+       "uploaddisabled": "Tha an luchdadh suas à comas.",
+       "copyuploaddisabled": "Tha an luchdadh suas o URL à comas.",
+       "uploaddisabledtext": "Tha luchdadh suas fhaidhlichean à comas.",
+       "php-uploaddisabledtext": "Tha luchdadh suas fhaidhlichean à comas ann am PHP.\nThoir sùil air an roghainn file_uploads.",
+       "uploadscripted": "Tha còd HTML no sgriobt san fhaidhle seo a b' urrainn do bhrabhsair-lìn a ruith le mearachd.",
+       "uploadscriptednamespace": "Tha ainm-spàs \"$1\" mì-dhligheach san fhaidhle SVG seo.",
+       "uploadinvalidxml": "Cha b' urrainn dhuinn an XML san fhaidhle air a luchdadh suas a pharsadh.",
+       "uploadvirus": "Tha bhìoras san fhaidhle!\nFiosrachadh: $1",
+       "uploadjava": "Tha am faidhle seo 'na fhaidhle ZIP sa bheil faidhle .class Java.\nChan fhaod thu faidhlichean Java a luchdadh suas on a b' urrainn dhaibh cuingeachaidhean na tèarainteachd a leigeil seachad.",
+       "upload-source": "Am faidhle tùsail:",
+       "sourcefilename": "Ainm an fhaidhle thùsail:",
+       "sourceurl": "An URL tùsail:",
+       "destfilename": "Ainm an fhaidhle-uidhe:",
+       "upload-maxfilesize": "Meud as motha an fhaidhle: $1",
+       "upload-description": "Tuairisgeul an fhaidhle",
+       "upload-options": "Roghainnean an luchdaidh duas",
+       "watchthisupload": "Cum sùil air an fhaidhle seo",
+       "filewasdeleted": "Chaidh faidhle air a bheil an t-ainm seo a luchdadh suas roimhe 's a sguabadh às an uairsin.\nBu chòir dhut sùil a thoirt air $1 mur luchdaich thu suas e a-rithist.",
+       "filename-bad-prefix": "Tha ainm an fhaidhle a tha thu a' luchdadh suas a' tòiseachadh le <strong>\"$1\"</strong> na tha 'na ainm fhaidhle gun mhìneachadh a chruthaicheas camara digiteach gu fèin-obrachail mar as trice.\nFeuch an tagh thu ainm eile airson an fhaidhle agad a mhìnicheas dè th' ann.",
+       "filename-prefix-blacklist": " #<!-- fàg an loidhne seo dìreach mar a tha i --> <pre>\n# Seo an co-chàradh:\n#   * 'Se facal-mìneachaidh a th' anns gach rud on charactar \"#\" gu deireadh na loidhne\n#   * Tha gach loidhne nach eil bàn 'na ro-leasachan airson ainm faidhle àbhaisteach a thèid a thoirt seachad le camara digiteach gu fèin-obrachail\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # cuid a dh'fhònaichean-làimhe\nIMG # coitcheann\nJD # Jenoptik\nMGP # Pentax\nPICT # measgaichte\n #</pre> <!-- fàg an loidhne seo dìreach mar a tha i -->",
+       "upload-success-subj": "Shoirbhich leis an luchdadh suas",
+       "upload-success-msg": "Shoirbhich leis an luchdadh suas agad o [$2]. Seo far a bheil e ri làimh: [[:{{ns:file}}:$1]]",
+       "upload-failure-subj": "Duilgheadas leis an luchdadh suas",
+       "upload-failure-msg": "Thachair duilgheadas leis an luchdadh suas agad o [$2]:\n\n$1",
+       "upload-warning-subj": "Rabhadh luchdaidh suas",
+       "upload-warning-msg": "Thachair duilgheadas leis an luchdadh suas agad o [$2]. 'S urrainn dhut tilleadh gu [[Special:Upload/stash/$1|foirm an luchdaidh suas]] gus an duilgheadas seo a chàradh.",
+       "upload-proto-error": "Pròtacal nach eil mar bu chòir",
+       "upload-proto-error-text": "Iarraidh an luchdadh suas cèin URLan a thòisicheas le <code>http://</code> no <code>ftp://</code>.",
+       "upload-file-error": "Mearachd inntearnail",
+       "upload-file-error-text": "Thachair mearachd inntearnail fhad 's a bha sinn a' feuchainn ri faidhle sealach a chruthachadh air an fhrithealaiche.\nAn cuir thu fios gu [[Special:ListUsers/sysop|rianaire]]?",
+       "upload-misc-error": "Mearachd neo-aithnichte leis an luchdadh suas",
+       "upload-misc-error-text": "Thachair mearachd neo-aithnichte rè an luchdaidh suas\nDearbhaich gu bheil an URL dligheach 's gun gabh a ruigsinn 's feuch ris a-rithist.\nMa mhaireas an duilgheadas, cuir fios gu [[Special:ListUsers/sysop|rianaire]].",
+       "upload-too-many-redirects": "Bha cus ath-stiùiridhean am broinn an URL",
+       "upload-http-error": "Thachair mearachd HTTP: $1",
+       "upload-copy-upload-invalid-domain": "Chan eil luchdaidhean suas le lethbhreac ri làimh on àrainn seo.",
+       "backend-fail-stream": "Cha b' urrainn dhuinn am faidhle \"$1\" a shruthadh.",
+       "backend-fail-backup": "Cha b' urrainn dhuinn lethbhreac-glèidhidh a dhèanamh dhen fhaidhle \"$1\".",
+       "backend-fail-notexists": "Chan eil am faidhle $1 ann.",
+       "backend-fail-hashes": "Cha b' urrainn dhuinn hais nam faidhlichean fhaighinn gus an coimeas.",
+       "backend-fail-notsame": "Cha faidhle air \"$1\" ann mar-thà nach eil co-ionnann.",
+       "backend-fail-invalidpath": "Chan e \"$1\" 'na slighe stòraidh dligheach.",
+       "backend-fail-delete": "Cha b' urrainn dhuinn am faidhle \"$1\" a sguabadh às.",
+       "backend-fail-describe": "cha b' urrainn dhuinn am meata-dàta atharrachadh airson an fhaidhle \"$1\".",
+       "backend-fail-alreadyexists": "Tha am faidhle \"$1\" ann mar-thà.",
+       "backend-fail-store": "Cha b' urrainn dhuinn am faidhle \"$1\" a stòradh air \"$2\".",
+       "backend-fail-copy": "Cha b' urrainn dhuinn lethbhreac dhen fhaidhle \"$1\" a chur gu \"$2\".",
+       "backend-fail-move": "Cha b' urrainn dhuinn am faidhle \"$1\" a ghluasad gu \"$2\".",
+       "backend-fail-opentemp": "Cha deach leinn faidhle sealach a fhosgladh.",
+       "backend-fail-writetemp": "Cha deach leinn sgrìobhadh san fhaidhle sealach.",
+       "backend-fail-closetemp": "Cha deach leinn am faidhle sealach a dhùnadh.",
+       "backend-fail-read": "Cha b' urrainn dhuinn am faidhle \"$1\" a leughadh.",
+       "backend-fail-create": "Cha b' urrainn dhuinn sgrìobhadh san fhaidhle \"$1\".",
+       "backend-fail-maxsize": "Cha b' urrainn dhuinn am faidhle \"$1\" a sgrìobhadh on a tha e nas motha na $2 {{PLURAL:$2|bhaidht|bhaidht|baidhtichean|baidht}}.",
+       "backend-fail-readonly": "Chan eil backend an stòraidh \"$1\" ach ri leughadh a-mhàin an-dràsta. Seo as adhbhar: \"<em>$2</em>\"",
+       "backend-fail-synced": "Cha am faidhle \"$1\" ann an staid mì-chòrdail a thaobh nam backends stòraidh inntearnail.",
+       "backend-fail-connect": "Cha deach leinn ceangal ri backend an stòraidh \"$1\".",
+       "backend-fail-internal": "Chathair mearachd neo-aithnichte le backend an stòraidh \"$1\".",
+       "backend-fail-contenttype": "Cha deach leinn faighinn a-mach dè an seòrsa susbaint a tha san fhaidhle ri stòradh air \"$1\".",
+       "backend-fail-batchsize": "Chaidh batch de $1 {{PLURAL:$1|obrachadh|obrachadh|obrachaidhean|obrachadh}} faidhle a thoirt gu backend an stòraidh; chan eil ach $2 {{PLURAL:$2|obrachadh|obrachadh|obrachaidhean|obrachadh}} ceadaiche air a char as motha.",
+       "backend-fail-usable": "Cha deach leinn am faidhle \"$1\" a leughadh no a sgrìobhadh ann on a bheil cead no pasgan/soitheach a dhìth.",
+       "filejournal-fail-dbconnect": "Cha deach leinn ceangal ris an stòr-dàta leabhair-latha airson backend an stòrais \"$1\".",
+       "filejournal-fail-dbquery": "Cha deach leinn an stòr-dàta leabhair-latha airson backend an stòrais \"$1\" ùrachadh.",
+       "lockmanager-notlocked": "Cha deach leinn a' ghlas a thoirt far \"$1\" o nach eil e glaiste.",
+       "lockmanager-fail-closelock": "Cha deach leinn am faidhle glasaidh airson \"$1\" a dhùnadh.",
+       "lockmanager-fail-deletelock": "Cha deach leinn am faidhle glasaidh airson \"$1\" a sguabadh às.",
+       "lockmanager-fail-acquirelock": "Cha deach leinn a' ghlas fhaighinn airson \"$1\".",
+       "lockmanager-fail-openlock": "Cha deach leinn am faidhle glasaidh airson \"$1\" fhosgladh.",
+       "lockmanager-fail-releaselock": "Cha deach leinn a' ghlas fhosgladh airson \"$1\".",
+       "lockmanager-fail-db-bucket": "Cha deach leinn conaltradh ris na dh'fhoghnadh de stòran-dàta glasaidh sa bhucaid $1.",
+       "lockmanager-fail-db-release": "Cha deach leinn na glasan fhosgladh air an stòr-dàta $1.",
+       "lockmanager-fail-svr-acquire": "Cha deach leinn na glasan fhaighinn air an fhrithealaiche \"$1\".",
+       "lockmanager-fail-svr-release": "Cha deach leinn na glasan fhosgladh air an fhrithealaiche \"$1\".",
+       "zip-file-open-error": "Thachair mearachd le fosgladh an fhaidhle airson dearbhadh ZIP.",
+       "zip-wrong-format": "Chan eil am faidhle sònraichte 'na fhaidhle ZIP.",
+       "zip-bad": "Tha am faidhle ZIP coirbte no cha ghabh a leughadh air adhbhar eile air choireigin.\nChan urrainn dhuinn dearbhadh mar bu chòir a bheil e tèarainte gus nach eil.",
+       "zip-unsupported": "Tha am faidhle ZIP seo a' chleachdadh feartan ZIP ris nach cuir MediaWiki taic.\nChan urrainn dhuinn dearbhadh mar bu chòir a bheil e tèarainte gus nach eil.",
+       "uploadstash": "Tasgadan an luchdaidh suas",
+       "uploadstash-clear": "Glan na faidhlichean ann an tasgadan an luchdaidh suas",
+       "uploadstash-nofiles": "Chan eil faidhle agad ann an tasgadan an luchdaidh suas.",
        "license": "Ceadachadh:",
        "license-header": "Ceadachadh",
        "nolicense": "Cha deach gin a thaghadh",
+       "license-nopreview": "(Chan eil ro-shealladh ri làimh)",
+       "upload_source_url": "(URL dligheach a ghabhas inntrigeadh gu poblach)",
+       "upload_source_file": "(faidhle air a' choimpiutair agad)",
+       "listfiles-summary": "Seallaidh an duilleag shònraichte seo gach faidhle a chaidh a luchdadh suas.",
+       "listfiles_search_for": "Lorg airson ainm a' mheadhain:",
+       "imgfile": "faidhle",
        "listfiles": "Liosta nan ìomhaigh",
-       "file-anchor-link": "Ìomhaigh",
+       "listfiles_thumb": "Dealbhag",
+       "listfiles_date": "Ceann-là",
+       "listfiles_name": "Ainm",
+       "listfiles_user": "Cleachdaiche",
+       "listfiles_size": "Meud",
+       "listfiles_description": "Tuairisgeul",
+       "listfiles_count": "Tionndaidhean",
+       "listfiles-show-all": "Gabh a-steach seann-tionndaidhean de dhealbhan",
+       "listfiles-latestversion": "An tionndadh làithreach",
+       "listfiles-latestversion-yes": "Tha",
+       "listfiles-latestversion-no": "Chan eil",
+       "file-anchor-link": "Faidhle",
        "filehist": "Eachdraidh an fhaidhle",
-       "filehist-help": "Briog air ceann-là/àm gus am faidhle fhaicinn mar a nochd e aig an àm sin.",
+       "filehist-help": "Briog air ceann-là/àm gus am faidhle a shealltainn mar a nochd e aig an àm sin.",
+       "filehist-deleteall": "sguab às na h-uile",
+       "filehist-deleteone": "sguab às",
        "filehist-revert": "till",
        "filehist-current": "làithreach",
        "filehist-datetime": "Ceann-là/Àm",
-       "filehist-thumb": "Meanbh-dhealbh",
-       "filehist-thumbtext": "Meanbh-dhealbh airson an tionndaidh on $1",
-       "filehist-user": "Neach-cleachdaidh",
+       "filehist-thumb": "Dealbhag",
+       "filehist-thumbtext": "Dealbhag airson an tionndaidh on $1",
+       "filehist-nothumb": "Gun dealbhag",
+       "filehist-user": "Cleachdaiche",
        "filehist-dimensions": "Meud",
        "filehist-comment": "Beachd",
        "imagelinks": "Cleachdadh an fhaidhle",
-       "linkstoimage": "Tha {{PLURAL:$1|an duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas a' ceangal ris an fhaidhle seo:",
+       "linkstoimage": "Tha ceangal ris an fhaidhle seo {{PLURAL:$1|san duilleag|sna duilleagan}} a leanas:",
+       "linkstoimage-more": "Tha ceangal ris an fhaidhle seo ann am barrachd air $1 {{PLURAL:$1|duilleag|dhuilleag|duilleagan|duilleag}}.\nCha sheall an liosta a leanas ach a' chiad $1 {{PLURAL:$1|duilleag|dhuilleag|duilleagan|duilleag}} sa bheil ceangal ris an fhaidhle seo.\nTha [[Special:WhatLinksHere/$2|liosta shlàn]] ri fhaighinn.",
        "nolinkstoimage": "Chan eil duilleag sam bith a' ceangal an-seo.",
+       "morelinkstoimage": "Seall [[Special:WhatLinksHere/$1|barrachd cheanglaichean]] gun fhaidhle seo.",
+       "linkstoimage-redirect": "$1 (ath-stiùireadh faidhle) $2",
+       "duplicatesoffile": "Tha {{PLURAL:$1|an $1 faidhle a leanas 'na dhùblachadh|an $1 fhaidhle a leanas 'nan dùblachadh|na $1 faidhlichean a leanas 'nan dùblachadh|am $1 faidhle a leanas 'nan dùblachadh}} dhen fhaidhle seo ([[Special:FileDuplicateSearch/$2|barrachd fiosrachaidh]]):",
        "sharedupload": "Tha am faidhle seo o $1 agus faodaidh pròiseactan eile a chleachdadh.",
-       "sharedupload-desc-here": "'S ann à $1 a tha am faidhle seo agus faodaidh gu bheil pròiseactan eile 'ga chleachdadh.\nChithear an tuairisgeul a tha aice air [duilleag tuairisgeul an fhaidhle $2] gu h-ìosal.",
+       "sharedupload-desc-there": "'S ann à $1 a tha am faidhle seo agus faodaidh gu bheil pròiseactan eile 'ga chleachdadh.\nFaic [duilleag tuairisgeul an fhaidhle $2] airson barrachd fiosrachaidh.",
+       "sharedupload-desc-here": "'S ann à $1 a tha am faidhle seo agus faodaidh gu bheil pròiseactan eile 'ga chleachdadh.\nChì thu an tuairisgeul a tha aice air [duilleag tuairisgeul an fhaidhle $2] gu h-ìosal.",
+       "sharedupload-desc-edit": "'S ann à $1 a tha am faidhle seo agus faodaidh gu bheil pròiseactan eile 'ga chleachdadh.\n'S dòcha gu bheil thu airson an tuairisgeul a tha aice a dheasachadh air [duilleag tuairisgeul an fhaidhle $2].",
+       "sharedupload-desc-create": "'S ann à $1 a tha am faidhle seo agus faodaidh gu bheil pròiseactan eile 'ga chleachdadh.\n'S dòcha gu bheil thu airson an tuairisgeul a tha aice a dheasachadh air [duilleag tuairisgeul an fhaidhle $2].",
+       "filepage-nofile": "Chan eil faidhle air a bheil an t-ainm seo ann.",
+       "filepage-nofile-link": "Chan eil faidhle air a bheil an t-ainm seo ann ach 's urrainn dhut [$1 fear a luchdadh suas].",
        "uploadnewversion-linktext": "Luchdaich suas tionndadh ùr dhen fhaidhle seo",
+       "shared-repo-from": "o $1",
+       "shared-repo": "ionad-tasgaidh co-roinnte",
+       "shared-repo-name-wikimediacommons": "Wikimedia Commons",
+       "filepage.css": "/* Thèid an CSS a chuireas tu an-seo a ghabhail a-steach air duilleag tuairisgeul an fhaidhle 's air uicidhean aig cliantan cèine */",
+       "upload-disallowed-here": "Chan urrainn dhut sgrìobhadh thairis air an fhaidhle seo.",
+       "filerevert": "Till $1",
+       "filerevert-legend": "Till am faidhle",
+       "filerevert-intro": "Tha thu an impis am faidhle <strong>[[Media:$1|$1]]</strong> a thilleadh dhan [$4 tionndadh on $2 $3].",
+       "filerevert-comment": "Adhbhar:",
+       "filerevert-defaultcomment": "Air a thilleadh gun tionndadh on $1 $2",
+       "filerevert-submit": "Till",
+       "filerevert-success": "Chaidh <strong>[[Media:$1|$1]]</strong> a thilleadh gun [$4 tionndadh on $2 $3].",
+       "filerevert-badversion": "Chan eil tionndadh ionadail an fhaidhle ann air a bheil an stampa-tìde a chaidh a thoirt seachad.",
+       "filedelete": "Sguab às $1",
+       "filedelete-legend": "Sguab às am faidhle",
+       "filedelete-intro": "Tha thu an impis am faidhle <strong>[[Media:$1|$1]]</strong> a sguabadh às cho math ris an eachdraidh shlàn aige.",
+       "filedelete-intro-old": "Tha thu a' sguabadh às an tionndadh de <strong>[[Media:$1|$1]]</strong> on [$4 $2 $3].",
+       "filedelete-comment": "Adhbhar:",
+       "filedelete-submit": "Sguab às",
+       "filedelete-success": "Chaidh <strong>$1</strong> a sguabadh às.",
+       "filedelete-success-old": "Chaidh an tionndadh de <strong>[[Media:$1|$1]]</strong> on $2 $3 a sguabadh às.",
+       "filedelete-nofile": "Chan eil <strong>$1</strong> ann.",
+       "filedelete-nofile-old": "Chan eil tionndadh de <strong>$1</strong> san tasglann air a bheil na buadhan sònraichte.",
+       "filedelete-otherreason": "Adhbhar eile/a bharrachd:",
+       "filedelete-reason-otherlist": "Adhbhar eile",
        "filedelete-reason-dropdown": "*Adhbharan cumanta airson sguabadh às\n** Tha e a' briseadh na còrach-lethbhreac\n** Faidhle air a dhùblachadh",
-       "randompage": "Duilleag thuairmeach",
-       "statistics": "Staitistearachd",
+       "filedelete-edit-reasonlist": "Deasaich adhbharan an sguabaidh às",
+       "filedelete-maintenance": "Chaidh sguabadh às 's aiseag nam faidhlichean a chur à comas rè obair-glèidhidh gu sealach.",
+       "filedelete-maintenance-title": "Cha ghabh am faidhle a sguabadh às",
+       "mimesearch": "Lorg MIME",
+       "mimesearch-summary": "Leigidh an duilleag seo leat faidhlichean a chriathradh a-rèir an t-seòrsa MIME a th' orra.\nIon-chur: seòrsa-na-susbainte/fo-sheòrsa, m.e. <code>image/jpeg</code>.",
+       "mimetype": "Seòrsa MIME:",
+       "download": "luchdaich a-nuas",
+       "unwatchedpages": "Duilleagan air an toirt far a' chlàir-fhaire",
+       "listredirects": "Liosta nan ath-stiùiridhean",
+       "listduplicatedfiles": "Liosta nam faidhlichean aig a bheil dùblachadh",
+       "listduplicatedfiles-summary": "Seo liosta nam faidhlichean 's an tionndadh as ùire dhiubh 'na dhùblachadh aig an tionndadh as ùire de dh'fhaidhle air choireigin eile. Chan fhaic thu ach faidhlichean ionadail.",
+       "listduplicatedfiles-entry": "Tha $2 [[$3|{{PLURAL:$2|dùblachadh|dhùblachadh|dùblachaidhean|dùblachadh}}]] aig [[:File:$1|$1]].",
+       "unusedtemplates": "Teamplaidean gun chleachdadh",
+       "unusedtemplatestext": "Seallaidh an duilleag seo a h-uile duilleag dhut a tha san ainm-spàs {{ns:template}} 's nach deach a ghabhail a-steach ann an duilleag eile.\nThoir an aire gum b' fheairrde thu sùil a thoirt airson ceanglaichean eile dha na teamplaidean mus sguab thu às dhaibh.",
+       "unusedtemplateswlh": "ceanglaichean eile",
+       "randompage": "Duilleag air thuaiream",
+       "randompage-nopages": "Chan eil duilleag {{PLURAL:$2|san ainm-spàs|sna h-ainm-spàsan}} a leanas: $1.",
+       "randomincategory": "Duilleag air thuaiream san roinn-seòrsa",
+       "randomincategory-invalidcategory": "Chan e \"$1\" 'na ainm roinn-seòrsa dligheach.",
+       "randomincategory-nopages": "Chan eil duilleag san roinn-seòrsa [[:Category:$1|$1]].",
+       "randomincategory-selectcategory": "Faigh duilleag air thuaiream a tha san roinn-seòrsa: $1 $2.",
+       "randomincategory-selectcategory-submit": "Siuthad",
+       "randomredirect": "Ath-stiùireadh air thuaiream",
+       "randomredirect-nopages": "Chan eil ath-stiùireadh san ainm-spàs \"$1\".",
+       "statistics": "Stadastaireachd",
+       "statistics-header-pages": "Stadastaireachd nan duilleagan",
+       "statistics-header-edits": "Deasaich an stadastaireachd",
+       "statistics-header-views": "Seall an stadastaireachd",
+       "statistics-header-users": "Stadastaireachd a' chleachdaiche",
+       "statistics-header-hooks": "Stadastaireachd eile",
+       "statistics-articles": "Duilleagan susbainte",
+       "statistics-pages": "Duilleagan",
+       "statistics-pages-desc": "A h-uile duilleag san uicidh, a' gabhail a-steach nan duilleagan deasbaireachd, ath-stiùiridhean agus msaa.",
+       "statistics-files": "Faidhlichean a chaidh a luchdadh suas",
+       "statistics-edits": "Deasachaidhean air duilleagan on a chaidh {{SITENAME}} a stèidheachadh",
+       "statistics-edits-average": "Deasachaidhean cuibheasach air duilleag",
+       "statistics-views-total": "Seallaidhean iomlan",
+       "statistics-views-total-desc": "Chan fhaic thu na seallaidhean air duilleagan nach eil ann no air duilleag shònraichte",
+       "statistics-views-peredit": "Seallaidhean air gach deasachadh",
+       "statistics-users": "[[Special:ListUsers|Cleachdaichean]] clàraichte",
+       "statistics-users-active": "Cleachdaichean gnìomhach",
+       "statistics-users-active-desc": "Cleachdaichean a rinn gnìomh rè {{PLURAL:$1|an $1 latha|an $1 latha|nan $1 làithean|an $1 latha}} mu dheireadh",
+       "statistics-mostpopular": "Na duilleagan air an deach sealltainn as trice",
+       "pageswithprop": "Duilleagan le buadh duilleige",
+       "pageswithprop-legend": "Duilleagan le buadh duilleige",
+       "pageswithprop-text": "Seallaidh an duilleag seo duilleagan dhut air a bheil buadh duilleige shònraichte.",
+       "pageswithprop-prop": "Ainm na buaidhe:",
+       "pageswithprop-submit": "Siuthad",
+       "pageswithprop-prophidden-long": "chaidh luach fada aig buadh teacsa fhalach ($1)",
+       "pageswithprop-prophidden-binary": "chaidh luach bìnearaidh fhalach ($1)",
        "doubleredirects": "Ath-seòlaidhean dùbailte",
-       "brokenredirects": "Ath-stiùireidhean briste",
-       "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
+       "double-redirect-fixed-move": "Chaidh [[$1]] a ghluasad.\nChaidh ùrachadh gu fèin-obrachail 's nì e ath-stiùireadh gu [[$2]] a-nis.",
+       "double-redirect-fixed-maintenance": "A' càradh ath-stiùireadh dùblaichte o [[$1]] gu [[$2]] gu fèin-obrachail le obair-càraidh.",
+       "double-redirect-fixer": "Càraichear nan ath-stiùiridhean",
+       "brokenredirects": "Ath-stiùiridhean briste",
+       "brokenredirectstext": "Nì na h-ath-stiùiridhean seo ceangal gu duilleag nach eil ann:",
+       "brokenredirects-edit": "deasaich",
+       "brokenredirects-delete": "sguab às",
+       "withoutinterwiki": "Duilleagan gun cheangal cànain",
+       "withoutinterwiki-summary": "Cha dèan na duilleagan seo ceangal gun tionndadh aig cànan eile:",
+       "withoutinterwiki-legend": "Ro-leasachan",
+       "withoutinterwiki-submit": "Seall",
+       "fewestrevisions": "Duilleagan air a bheil an àireamh as lugha de mhùthaidhean",
+       "nbytes": "$1 {{PLURAL:$1|bhaidht|bhaidht|baidhtichean|baidht}}",
+       "ncategories": "$1 {{PLURAL:$1|roinn-seòrsa|roinn-seòrsa|roinnean-seòrsa|roinn-seòrsa}}",
+       "ninterwikis": "$1 {{PLURAL:$1|eadar-uicidh|eadar-uicidhean}}",
+       "nlinks": "$1 {{PLURAL:$1|cheangal|cheangal|ceanglaichean|ceangal}}",
        "nmembers": "$1 {{PLURAL:$1|bhall|bhall|buill|ball}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|bhall|bhall|buill|ball}}",
+       "nrevisions": "$1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}",
        "nviews": "$1 {{PLURAL:$1|sealladh|shealladh|seallaidhean|sealladh}}",
+       "nimagelinks": "'Ga chleachdadh air $1 {{PLURAL:$1|duilleag|dhuilleag|duilleagan|duilleag}}",
+       "ntransclusions": "'ga chleachdadh air $1 {{PLURAL:$1|duilleag|dhuilleag|duilleagan|duilleag}}",
+       "specialpage-empty": "Chan eil toradh ann airson na h-aithris seo.",
+       "lonelypages": "Duilleagan 'nan dìlleachdan",
+       "lonelypagestext": "Chan eil ceangal gu na duilleagan seo o dhuilleag eile no an gabhail a-steach 'nan iomradh ann an duilleag eile air {{SITENAME}}.",
        "uncategorizedpages": "Duilleagan gun roinn-seòrsa",
        "uncategorizedcategories": "Roinnean-seòrsa gun roinn-seòrsa",
+       "uncategorizedimages": "Faidhlichean gun roinn-seòrsa",
+       "uncategorizedtemplates": "Teamplaidean gun roinn-seòrsa",
+       "unusedcategories": "Roinnean-seòrsa gun chleachdadh",
        "unusedimages": "Faidhlichean gun chleachdadh",
+       "popularpages": "Duilleagan air a bheil fèill mhòr",
+       "wantedcategories": "Roinnean-seòrsa a thathar 'gan iarraidh",
+       "wantedpages": "Duilleagan a thathar 'gan iarraidh",
+       "wantedpages-badtitle": "Tha tiotal mì-dhligheach am measg nan toraidhean: $1",
+       "wantedfiles": "Faidhlichean a thathar 'gan iarraidh",
+       "wantedtemplates": "Teamplaidean a thathar 'gan iarraidh",
+       "mostlinked": "Na duilleagan ris a bheil an àireamh as motha de cheanglaichean",
+       "mostlinkedcategories": "Na roinnean-seòrsa ris a bheil an àireamh as motha de cheanglaichean",
+       "mostlinkedtemplates": "Na duilleagan a chaidh a ghabhal a-steach 'nan iomradh an àireamh as motha",
+       "mostcategories": "Na duilleagan aig a bheil an àireamh as motha de roinnean-seòrsa",
+       "mostimages": "Na faidhlichean ris a bheil an àireamh as motha de cheanglaichean",
+       "mostinterwikis": "Na duilleagan aig a bheil an àireamh as motha de eadar-uicidhean",
+       "mostrevisions": "Duilleagan air a bheil an àireamh as motha de mhùthaidhean",
        "prefixindex": "A h-uile duilleag le ro-leasachan",
+       "prefixindex-namespace": "A h-uile duilleag le ro-leasachan (ainm-spàs $1)",
+       "prefixindex-strip": "Ro-leasachan sreinge air an liosta",
        "shortpages": "Duilleagan goirid",
        "longpages": "Duilleagan fada",
+       "deadendpages": "Duilleagan cùile-dùinte",
+       "deadendpagestext": "Cha dèan na duilleagan seo ceangal gu duilleag sam bith eile air {{SITENAME}}.",
+       "protectedpages": "Duilleagan fo dhìon",
+       "protectedpages-indef": "Dìonan buana a-mhàin",
+       "protectedpages-cascade": "Dìonan o bhith mar eas a-mhàin",
        "listusers": "Liosta nan cleachdaichean",
-       "usercreated": "Air a chruthachadh le {{GENDER:$3|}} $1 aig $2",
+       "usereditcount": "$1 {{PLURAL:$1|deasachadh|dheasachadh|deasachaidhean|deasachadh}}",
+       "usercreated": "Air a chruthachadh $1 $2",
        "newpages": "Duilleagan ùra",
+       "newpages-username": "Ainm-cleachdaiche:",
        "ancientpages": "Duilleagan as sìne",
        "move": "Gluais",
        "movethispage": "Gluais an duilleag seo",
-       "pager-newer-n": "{{PLURAL:$1|1 nas ùire|$1 nas ùire}}",
-       "pager-older-n": "{{PLURAL:$1|1 nas sine|$1 nas sine}}",
+       "unusedcategoriestext": "Tha na duilleagan roinn-seòrsa seo ann ged nach cleachd duilleag no roinn-seòrsa sam bith eile iad.",
+       "pager-newer-n": "{{PLURAL:$1|an $1 nas ùire|na $1 nas ùire}}",
+       "pager-older-n": "{{PLURAL:$1|an $1 nas sine|na $1 nas sine}}",
+       "suppress": "Marasgal",
        "booksources": "Tùsan a tha 'nan leabhraichean",
        "booksources-search-legend": "Lorg tùsan a tha 'nan leabhraichean",
        "booksources-go": "Siuthad",
        "allpagesfrom": "Seall duilleagan a tha a' tòiseachadh aig:",
        "allpagesto": "Seall duilleagan a tha a' crìochnachadh aig:",
        "allarticles": "A h-uile duilleag",
+       "allinnamespace": "A h-uile duilleag (ainm-spàs $1)",
        "allpagessubmit": "Rach",
+       "allpages-bad-ns": "Chan eil an t-ainm-spàs \"$1\" aig {{SITENAME}}.",
        "categories": "Roinnean-seòrsa",
-       "categoriespagetext": "Tha duilleagan no meadhan {{PLURAL:$1|san roinn-seòrsa|sna roinntean-seòrsa|}} a leanas.\nChan fhaicear [[Special:UnusedCategories|roinntean-seòrsa gun chleachdadh an-seo]].\nThoir sùil air na [[Special:WantedCategories|roinntean-seòrsa a thathar 'gan iarraidh cuideachd]].",
-       "deletedcontributions": "Obair a' chleachdaiche a chaidh a sguabadh às",
+       "categoriespagetext": "Tha duilleagan no meadhan {{PLURAL:$1|san roinn-seòrsa|sna roinnean-seòrsa|}} a leanas.\nChan fhaicear [[Special:UnusedCategories|roinnean-seòrsa gun chleachdadh an-seo]].\nThoir sùil air na [[Special:WantedCategories|roinnean-seòrsa a thathar 'gan iarraidh cuideachd]].",
+       "categoriesfrom": "Seall roinnean-seòrsa a tha a' tòiseachadh aig:",
+       "deletedcontributions": "Obair air a sguabadh às",
+       "deletedcontributions-title": "Obair air a sguabadh às",
+       "sp-deletedcontributions-contribs": "obair",
        "linksearch": "Lorg sna ceanglaichean dhan taobh a-muigh",
-       "linksearch-ns": "Namespace:",
+       "linksearch-ns": "Ainm-spàs:",
        "linksearch-line": "Tha $1 a' ceangal an-seo o $2",
+       "listgrouprights-key": "Treòir:\n* <span class=\"listgrouprights-granted\">Cead a fhuair iad</span>\n* <span class=\"listgrouprights-revoked\">Cead air a thoirt uapa</span>",
        "listgrouprights-members": "(liosta de bhuill)",
+       "listgrouprights-namespaceprotection-header": "Cuingeachaidhean air ainm-spàs",
+       "listgrouprights-namespaceprotection-namespace": "Ainm-spàs",
+       "trackingcategories": "Roinnean-seòrsa tracaidh",
+       "trackingcategories-summary": "Chì thu na roinnean-seòrsa tracaidh air an duilleag seo a thèid a chur riutha gu fèin-obrachail leis a' bhathar-bhog MediaWiki. 'S urrainn dhut na h-ainmean a tha orra atharrachadh 's tu ag atharrachadh teachdaireachdan an t-siostaim iomchaidh san ainm-spàs {{ns:8}}.",
+       "trackingcategories-msg": "Roinn-seòrsa tracaidh",
+       "trackingcategories-desc": "Cuspairean-deuchainn gus roinnean-seòrsa a chur ris",
+       "noindex-category-desc": "Cha dèid an duilleag seo a chur ris an inneacs luirg le botaichean on a tha am facal draoidheach <code><nowiki>__NOINDEX__</nowiki></code> air 's a tha i ann an ainm-spàs far a bheil a' bhratach seo ceadaichte.",
+       "index-category-desc": "Tha <code><nowiki>__INDEX__</nowiki></code> air an duilleag seo ('s tha i ann an ainm-spàs far a bheil a' bhratach seo ceadaichte) 's mar sin thèid a chur ri inneacsan luirg le botaichean ged nach tachradh seo gu h-àbhaisteach.",
+       "broken-file-category-desc": "Thèid an roinn-seòrsa seo a chur ris nuair a bhios ceangal gu faidhle briste am broinn na duilleige (ceangal gus faidhle a leabachadh mur eil am faidhle ann).",
+       "hidden-category-category-desc": "Seo ronn-seòrsa le <code><nowiki>__HIDDENCAT__</nowiki></code> oirre ach nach nochd i ann am bogsa nan ceanglaichean gu roinnean-seòrsa air na duilleagan o thùs.",
+       "trackingcategories-nodesc": "Chan eil tuairisgeul ri làimh.",
+       "trackingcategories-disabled": "Tha an roinn-seòrsa à comas",
        "emailuser": "Cuir post-dealain dhan chleachdaiche seo",
+       "emailuser-title-target": "Cuir post-d dhan chleachdaiche seo",
        "emailusername": "Ainm-cleachdaiche:",
        "emailusernamesubmit": "Air adhart",
        "emailfrom": "O:",
        "mywatchlist": "An clàr-faire",
        "watchlistfor2": "aig $1 $2",
        "nowatchlist": "Chan eil rud sam bith air a' chlàr-fhaire agad.",
+       "watchlistanontext": "$1 gus nithean air a' chlàr-fhaire agad a shealltainn no a dheasachadh.",
        "addwatch": "Cuir air a' chlàr-fhaire",
        "addedwatchtext": "Chaidh an duilleag \"[[:$1]]\" a chur ri [[Special:Watchlist|do chlàr-faire]].\nNochdaidh mùthaidhean a nithear air an duilleag seo 's air an duilleag deasbaireachd a tha co-cheangailte ris an-seo san àm ri teachd.",
+       "addedwatchtext-short": "Chaidh an duilleag \"$1\" a chur ris a' chlàr-fhaire agad.",
        "removewatch": "Thoir air falbh on chlàr-fhaire",
        "removedwatchtext": "Chaidh an duilleag \"[[:$1]]\" a thoirt air falbh o [[Special:Watchlist|do chlàr-faire]].",
+       "removedwatchtext-short": "Chaidh an duilleag \"$1\" a thoirt ait falbh on chlàr-fhaire agad.",
        "watch": "Cum sùil air",
        "watchthispage": "Cum sùil air an duilleag seo",
-       "unwatch": "Na cum sùil tuilleadh",
+       "unwatch": "Thoir far a' chlàir-fhaire",
        "unwatchthispage": "Na cum sùil tuilleadh",
        "notanarticle": "Chan e duilleag susbaint a tha ann",
+       "notvisiblerev": "Chaidh am mùthadh mu dheireadh le cleachdaiche eile a sguabadh às",
        "watchlist-details": "Tha {{PLURAL:$1|$1 duilleag|$1 dhuilleag|$1 duilleagan|$1 duilleag}} air a' chlàr-fhaire agad, gun luaidh air na duilleagan deasbaireachd.",
-       "wlheader-showupdated": "Tha clò '''trom''' air duilleagan a chaidh atharrachadh on turas mu dheireadh a thadhail thu orra.",
-       "wlnote2": "Chì thu na h-atharraichean {{PLURAL:$1|san uair|san <strong>$1</strong> uair|san <strong>$1</strong> uair|san <strong>$1</strong> uair|sna <strong>$1</strong> uairean|sna <strong>$1</strong> uair}} a thìde seo chaidh aig $3 air $2.",
+       "wlheader-enotif": "Tha brathan-naidheachd air a' phost-d an comas.",
+       "wlheader-showupdated": "Tha clò <strong>trom</strong> air duilleagan a chaidh atharrachadh on turas mu dheireadh a thadhail thu orra.",
+       "wlnote2": "Chì thu na h-atharraichean {{PLURAL:$1|san <strong>$1</strong> uair|san <strong>$1</strong> uair|sna <strong>$1</strong> uairean|san <strong>$1</strong> uair}} a thìde seo chaidh aig $3 air $2.",
        "wlshowlast": "Seall na $1 uairean a thìde mu dheireadh $2 làithean mu dheireadh $3",
        "watchlist-options": "Roghainnean mo chlàir-faire",
        "watching": "'Ga chur air a' chlàr-fhaire...",
        "unwatching": "A' toirt far a' chlàir-fhaire...",
+       "watcherrortext": "Thachair mearachd le atharrachadh nan roghainnean airson \"$1\" airson a' chlàr-fhaire agad.",
        "enotif_reset": "Comharraich gun do thadhladh air gach duilleag",
+       "enotif_impersonal_salutation": "Cleachdaiche {{SITENAME}}",
+       "enotif_subject_deleted": "Chaidh duilleag $1 air {{SITENAME}} a sguabadh às le $2",
+       "enotif_subject_created": "Chaidh duilleag $1 air {{SITENAME}} a chruthachadh le $2",
+       "enotif_subject_moved": "Chaidh duilleag $1 air {{SITENAME}} a ghluasad le $2",
+       "enotif_subject_restored": "Chaidh an duilleag $1 air {{SITENAME}} aiseag le $2",
+       "enotif_subject_changed": "Chaidh duilleag $1 air {{SITENAME}} atharrachadh le $2",
+       "enotif_body_intro_deleted": "Chaidh duilleag $1 air {{SITENAME}} a sguabadh às le $2 $PAGEEDITDATE, faic $3.",
+       "enotif_body_intro_created": "Chaidh duilleag $1 air {{SITENAME}} a chruthachadh le $2 $PAGEEDITDATE, faic $3 airson a' mhùthaidh làithrich.",
+       "enotif_body_intro_moved": "Chaidh duilleag $1 air {{SITENAME}} a ghluasad le $2 $PAGEEDITDATE, faic $3 airson a' mhùthaidh làithrich.",
+       "enotif_body_intro_restored": "Chaidh duilleag $1 air {{SITENAME}} aiseag le $2 $PAGEEDITDATE, faic $3 airson a' mhùthaidh làithrich.",
+       "enotif_body_intro_changed": "Chaidh duilleag $1 air {{SITENAME}} atharrachadh le $2 $PAGEEDITDATE, faic $3 airson a' mhùthaidh làithrich.",
+       "enotif_body": "$WATCHINGUSERNAME, a charaid,\n\n$PAGEINTRO $NEWPAGE\n\nGearr-chunntas an deasaiche: $PAGESUMMARY $PAGEMINOREDIT\n\nCuir fios gun deasaiche:\npost-d: $PAGEEDITOR_EMAIL\nuicidh: $PAGEEDITOR_WIKI\n\nChan fhaigh thu brath-naidheachd eile air gnìomhan ach ma thadhaileas tu air an duilleag 's tu air logadh a-steach. 'S urrainn dhut cuideachd brataich nam brathan-naidheachd aiseag airson nan duilleagan uile a tha air a' chlàr-fhaire agad.\n\nSiostam càirdeil nam brath aig {{SITENAME}}\n\n--\nGus roghainnean nam brathan a gheibh thu air a' phost-d atharrachadh, tadhail air\n{{canonicalurl:{{#special:Preferences}}}}\n\nGus roghainnean a' chlàir-fhaire agad atharrachadh, tadhail air\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nGus duilleagan a thoirt far a' chlàir-fhaire agad, tadhail air\n$UNWATCHURL\n\nBeachdan thugainn 's barrachd taice:\n$HELPPAGE",
        "deletepage": "Sguab às duilleag",
        "confirm": "Daingnich",
        "excontent": "stuth a bh' ann: '$1'",
+       "excontentauthor": "b' e: \"$1\" an t-susbaint (is \"[[Special:Contributions/$2|$2]]\" an aon deasaiche)",
        "delete-confirm": "Sguab às \"$1\"",
        "delete-legend": "Sguab às",
+       "historywarning": "<strong>Rabhadh:</strong> Tha eachdraidh air an duilleag a tha thu airson sguabadh às sa bheil mu $1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}:",
        "confirmdeletetext": "Tha thu an impis duilleag a sguabadh às agus a h-eachdraidh uile gu lèir.\nDearbhaich gu bheil thu airson seo a dhèanamh 's gun tuig thu a' bhuaidh a bhios ann agus gu bheil thu a' dèanamh seo a-rèir [[{{MediaWiki:Policy-url}}|a' phoileasaidh]].",
        "actioncomplete": "Gnìomh deiseil",
        "actionfailed": "Dh'fhàillig ort",
        "deletedtext": "Chaidh \"$1\" a sguabadh às.\nSeall air $2 airson clàr de dhuilleagan a chaidh a sguabadh às o chionn ghoirid.",
        "dellogpage": "Loga an sguabaidh às",
-       "reverted": "Air aiseag gu tionndadh nas sine",
+       "reverted": "Air aiseag gu mùthadh nas sine",
        "deletecomment": "Adhbhar:",
        "deleteotherreason": "Adhbhar eile/a bharrachd:",
        "deletereasonotherlist": "Adhbhar eile",
        "deletereason-dropdown": "*Adhbharan cumanta airson sguabadh às\n** Spama\n** Milleadh\n** Tha e a' briseadh na còrach-lethbhreac\n** Dh'iarr an t-ùghdar e\n** Ath-threòrachadh briste",
        "delete-edit-reasonlist": "Deasaich adhbharan sguabadh às",
+       "delete-toobig": "Tha eachdraidh deasachaidh mòr aig an duilleag seo sa bheil barrachd air $1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}.\nChaidh sguabadh às nan duilleagan dhen leithid a chuingeachadh ach na dèid cron a dhèanamh air {{SITENAME}} le mearachd.",
+       "delete-warning-toobig": "Tha eachdraidh deasachaidh mòr aig an duilleag seo sa bheil barrachd air $1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}.\nMa sguabas tu às dhi, dh'fhaoidte gun dèan thu cron air na gnìomhan stòr-dàta aig {{SITENAME}}; mar sin, thoir an aire.",
+       "rollback": "Roilig atharraichean air ais",
+       "rollback_short": "Roladh air ais",
        "rollbacklink": "roilig air ais",
+       "rollbacklinkcount": "roilig $1 {{PLURAL:$1|deasachadh|dheasachadh|deasachaidhean|deasachadh}} air ais",
+       "rollbacklinkcount-morethan": "roilig barrachd air $1 {{PLURAL:$1|deasachadh|dheasachadh|deasachaidhean|deasachadh}} air ais",
+       "rollbackfailed": "Dh'fhàillig leis an roladh air ais",
+       "cantrollback": "Cha ghabh na chaidh a dheasachadh a thilleadh;\nis an deasaiche mu dheireadh an aon ùghdar aig an duilleag seo.",
+       "alreadyrolled": "Cha ghabh an deasachadh mu dheireadh air [[:$1]] leis [[User:$2|$2]] ([[User talk:$2|an deasbaireachd]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) a roladh air ais on a rinn cuideigin eile deasachadh no roladh air ais air an duilleag mar-thà.\n\nChaidh an duilleag a dheasachadh an turas mu dheireadh leis [[User:$3|$3]] ([[User talk:$3|an deasbaireachd]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Seo gearr-chunntas an deasachaidh: \"''$1''\".",
-       "revertpage": "Deasachaidhean a chaidh a thilleadh le [[Special:Contributions/$2|$2]] ([[User talk:$2|deasbaireachd]]) dhan mhùthadh mu dheireadh le [[User:$1|$1]]",
+       "revertpage": "Deasachaidhean a chaidh a thilleadh leis [[Special:Contributions/$2|$2]] ([[User talk:$2|an deasbaireachd]]) dhan mhùthadh mu dheireadh le [[User:$1|$1]]",
+       "revertpage-nouser": "Deasachaidhean a chaidh a thilleadh le cleachdaiche falaichte dhan mhùthadh mu dheireadh le [[User:$1|$1]]",
+       "rollback-success": "Na deasachaidhean a chaidh a thilleadh le $1;\nchaidh an tilleadh gun mhùthadh mu dheireadh le $2.",
        "protectlogpage": "Loga an dìon",
        "protectlogtext": "Tha liosta na chaidh a dhìon gu h-ìosal.\nCuir sùil air [[Special:ProtectedPages|liosta nan duilleagan fo dhìon]] airson liosta na fheadhainn a tha fo dhìon an-dràsta fhèin.",
        "protectedarticle": "\"[[$1]]\" air a dhìon",
        "unprotectedarticle": "a neo-dhìon \"[[$1]]\"",
        "protect-title": "A' dìonadh \"$1\"",
        "prot_1movedto2": "[[$1]] gluaiste ri [[$2]]",
+       "protect-badnamespace-title": "Cha ghabh an t-ainm-spàs seo a dhìon",
+       "protect-badnamespace-text": "Cha ghabh duilleagan san ainm-spàs seo a dhìon.",
        "protect-norestrictiontypes-title": "Cha ghabh an duilleag seo a dhìon",
        "protect-legend": "Daingnich dìonadh",
        "protectcomment": "Adhbhar:",
        "protectexpiry": "Falbhaidh an ùine air:",
        "protect_expiry_invalid": "Tha an t-àm-crìochnachaidh mì-dhligheach.",
        "protect_expiry_old": "Tha an t-àm crìochnachaidh seachad mu thràth.",
-       "protect-text": "Chì thu an ìre dìon dhen duilleag '''$1''' an-seo agus is urrainn dhut atharrachadh an-seo.",
-       "protect-locked-access": "Chan eil cead aig a' chunntas agad an ìre dìon de dhuilleag atharrachadh.\nSeo roghainnean làithreach na duilleige '''$1''':",
-       "protect-cascadeon": "Tha an duilleag seo fo dhìon an-dràsta a chionn 's gu bheil e air a ghabhail a-steach {{PLURAL:$1|$1  duilleag|$1 dhuilleag|$1 duilleagan|$1 duilleag}} a leanas aig a bheil dìon easach air.\n'S urrainn dhut ìre dìon na duilleige seo atharrachadh ach cha bhi buaidh air an dìon easach.",
+       "protect-text": "Chì thu an ìre dìon dhen duilleag <strong>$1</strong> an-seo agus is urrainn dhut atharrachadh an-seo.",
+       "protect-locked-access": "Chan eil cead aig a' chunntas agad an ìre dìon de dhuilleag atharrachadh.\nSeo roghainnean làithreach na duilleige <strong>$1</strong>:",
+       "protect-cascadeon": "Tha an duilleag seo fo dhìon an-dràsta a chionn 's gu bheil e air a ghabhail a-steach {{PLURAL:$1|$1 duilleag|$1 dhuilleag|$1 duilleagan|$1 duilleag}} a leanas aig a bheil dìon o bhith mar eas air.\n'S urrainn dhut ìre dìon na duilleige seo atharrachadh ach cha bhi buaidh air an dìon o bhith mar eas.",
        "protect-default": "Ceadaich a h-uile cleachdaiche",
        "protect-fallback": "Na ceadaich ach do chleachdaichean aig a bheil cead \"$1\"",
        "protect-level-autoconfirmed": "Na ceadaich ach cleachdaichean a chaidh an dearbhadh gu fèin-obrachail",
        "protect-level-sysop": "Na ceadaich ach rianadairean",
+       "protect-summary-desc": "[$1=$2] ($3)",
        "protect-summary-cascade": "mar eas",
        "protect-expiring": "falbhaidh an ùine air $1 (UTC)",
        "protect-expiring-local": "falbhaidh an ùine air $1",
        "protect-expiry-indefinite": "buan",
-       "protect-cascade": "Dìon duilleagan a tha 'gan gabhail a-steach san duilleag seo (dìon mar eas)",
+       "protect-cascade": "Dìon duilleagan a tha 'gan gabhail a-steach san duilleag seo (dìon o bhith mar eas)",
        "protect-cantedit": "Chan urrainn dhut ìre dìon na duilleige seo atharrachadh a chionn 's nach eil cead deasachaidh agad air.",
        "protect-othertime": "Àm eile:",
        "protect-othertime-op": "àm eile",
+       "protect-existing-expiry": "Falbhaidh an ùine air mar-thà: $2 $3",
+       "protect-otherreason": "Adhbhar eile/a bharrachd:",
+       "protect-otherreason-op": "Adhbhar eile",
+       "protect-dropdown": "*Na h-adhbharan dìona as cumanta\n** Cus bhandalachd\n** Cus spama\n** Còmhstrithean deasachaidh nach eil torrach\n** Duilleag air a bheil trafaig mhòr",
+       "protect-edit-reasonlist": "Deasaich adhbharan dìona o dheasachadh",
+       "protect-expiry-options": "1 uair a thìde:1 hour, 1 latha:1 day, 1 seachdain:1 week, 2 sheachdain:2 weeks, 1 mhìos:1 month, 3 mìosan:3 months, 6 mìosan:6 months, 1 bhliadhna:1 year,buan:infinite",
        "restriction-type": "Cead:",
        "restriction-level": "Ìre bacaidh:",
-       "undeleterevisions": "Chaidh {{PLURAL:$1|$1 leth-bhreac|$1 leth-bhreac|$1 leth-bhreacan|$1 leth-bhreac}} a chur san tasg-lann",
+       "minimum-size": "Meud as lugha",
+       "maximum-size": "Meud as motha:",
+       "pagesize": "(baidhtichean)",
+       "restriction-edit": "Deasaich",
+       "restriction-move": "Gluais",
+       "restriction-create": "Cruthaich",
+       "restriction-upload": "Luchdaich suas",
+       "restriction-level-sysop": "le dìon slàn air",
+       "restriction-level-autoconfirmed": "le leth-dhìon air",
+       "restriction-level-all": "ìre sam bith",
+       "undelete": "Seal na duilleagan air an sguabadh às",
+       "undeletepage": "Seall 's aisig duilleagan air an sguabadh às",
+       "undeletepagetitle": "<strong>Chan e ach mùthaidhean de [[:$1|$1]] a chaidh a sguabadh às a tha sna leanas</strong>.",
+       "undelete-fieldset-title": "Aisig mùthaidhean",
+       "undeleterevisions": "Chaidh {{PLURAL:$1|$1 mhùthadh|$1 mhùthadh|$1 mùthaidhean|$1 mùthadh}} a chur san tasg-lann",
+       "undeletehistorynoadmin": "Chaidh an duilleag seo a sguabadh às.\nChì thu adhbhar an sguabaidh às sa ghearr-chunntas gu h-ìosal cho math ri fiosrachadh mu na chleachdaichean a dheasaich an duilleag seo mus deach a sguabadh às.\nChan fhaic ach rianairean an teacsa fhèin aig na mùthaidhean air an sguabadh às.",
        "undeletelink": "seall/aisig",
        "undeleteviewlink": "seall",
-       "namespace": "Namespace:",
+       "namespace": "Ainm-spàs:",
        "invert": "Cuir na thagh mi bun os cionn",
-       "namespace_association": "Namespace co-cheangailte ris",
+       "tooltip-invert": "Cuir cromag sa bhogsa seo gus atharraichean air an duilleag seo fhalach am broinn an ainm-spàs a thagh thu ('s an ainm-spàs co-cheangailte riutha ma tha cromag ris)",
+       "namespace_association": "An t-ainm-spàs co-cheangailte ris",
+       "tooltip-namespace_association": "Cuir cromag sa bhogsa ach an dèid ainm-spàs na deasbaireachd no nan cuspairean a tha ceangailte ris an ainm-spàs a thagh thu a ghabhail a-steach",
        "blanknamespace": "(Prìomh)",
-       "contributions": "Mùthaidhean a' {{GENDER:$1|chleachdaiche}}",
-       "contributions-title": "Mùthaidhean a rinn $1",
-       "mycontris": "Mùthaidhean",
-       "contribsub2": "Airson {{GENDER:$3|$1}} ($2)",
+       "contributions": "Obair a' chleachdaiche",
+       "contributions-title": "Obair a rinn $1",
+       "mycontris": "M' obair",
+       "contribsub2": "Airson $1 ($2)",
        "uctop": "(làithreach)",
        "month": "On mhìos (agus na bu tràithe):",
        "year": "On bhliadhna (agus na bu tràithe):",
-       "sp-contributions-newbies": "Seall mùthaidhean le cunntasan ùra a-mhàin",
+       "sp-contributions-newbies": "Seall obair le cunntasan ùra a-mhàin",
+       "sp-contributions-newbies-title": "Obair le cunntasan ùra",
        "sp-contributions-blocklog": "an loga bacaidh",
+       "sp-contributions-suppresslog": "obair a chaidh a mhùchadh",
+       "sp-contributions-deleted": "obair air a sguabadh às",
        "sp-contributions-uploads": "a' luchdadh suas",
        "sp-contributions-logs": "logaichean",
        "sp-contributions-talk": "deasbaireachd",
-       "sp-contributions-search": "Lorg mùthaidhean leis",
+       "sp-contributions-userrights": "stiùireadh ceadan a' chleachdaiche",
+       "sp-contributions-search": "Lorg airson obair a rinneadh",
        "sp-contributions-username": "Seòladh IP no ainm-cleachdaiche:",
-       "sp-contributions-toponly": "Na seall deasachaidhean ach na lèirmheasan as ùire",
+       "sp-contributions-toponly": "Na seall deasachaidhean ach na mùthaidhean as ùire",
        "sp-contributions-submit": "Lorg",
        "whatlinkshere": "Na tha a' ceangal a-nall an-seo",
        "whatlinkshere-title": "Duilleagan a tha a' ceangal ri \"$1\"",
        "whatlinkshere-page": "Duilleag:",
-       "linkshere": "Tha na duilleagan a leanas a' ceangal ri '''[[:$1]]''':",
-       "nolinkshere": "Chan eil ceangal air duilleag sam bith a tha a' dol gu '''[[:$1]]'''.",
+       "linkshere": "Tha na duilleagan a leanas a' ceangal ri <strong>[[:$1]]</strong>:",
+       "nolinkshere": "Chan eil ceangal air duilleag sam bith a tha a' dol gu <strong>[[:$1]]</strong>.",
+       "nolinkshere-ns": "Chan eil ceangal gu <strong>[[:$1]]</strong> ann an duilleag sam bith san ainm-spàs a thagh thu.",
        "isredirect": "duilleag ath-sheòlaidh",
        "istemplate": "transclusion",
        "isimage": "ceangal faidhle",
-       "whatlinkshere-prev": "{{PLURAL:$1|roimhe|$1 roimhe}}",
-       "whatlinkshere-next": "{{PLURAL:$1|an ath|an ath $1|na ath $1|an ath $1}}",
+       "whatlinkshere-prev": "{{PLURAL:$1|an $1 roimhe|an $1 roimhe|na $1 roimhe|am $1 roimhe}}",
+       "whatlinkshere-next": "{{PLURAL:$1|an ath $1|an ath $1|na ath $1|an ath $1}}",
        "whatlinkshere-links": "← ceanglaichean",
        "whatlinkshere-hideredirs": "$1 ath-sheòlaidhean",
        "whatlinkshere-hidetrans": "$1 transclusions",
        "whatlinkshere-hidelinks": "$1 ceanglaichean",
        "whatlinkshere-hideimages": "$1 ceanglaichean nam faidhlichean",
        "whatlinkshere-filters": "Criathairean",
-       "blockip": "Bac cleachdaiche",
+       "block": "Bac an cleachdaiche",
+       "unblock": "Neo-bhac an cleachdaiche",
+       "blockip": "Bac an cleachdaiche",
        "ipbreason": "Adhbhar:",
        "ipbsubmit": "Bac an cleachdaiche seo",
-       "ipboptions": "2 uair a thìde:2 hours, 1 latha:1 day, 3 làithean:3 days, 1 seachdain:1 week, 2 sheachdain:2 weeks, 1 mhìos:1 month, 3 mìosan:3 months, 6 mìosan:6 months, 1 bhliadhna:1 year,neo-chrìochnach:infinite",
+       "ipboptions": "2 uair a thìde:2 hours, 1 latha:1 day, 3 làithean:3 days, 1 seachdain:1 week, 2 sheachdain:2 weeks, 1 mhìos:1 month, 3 mìosan:3 months, 6 mìosan:6 months, 1 bhliadhna:1 year,buan:infinite",
+       "ipbwatchuser": "Cum sùil air duilleagan a' chleachdaiche 's deasbaireachd aig a' chleachdaiche seo",
+       "ipb-disableusertalk": "Chan fhaod an cleachdaiche seo an duilleag deasbaireachd aige fhèin a dheasachadh fhad 's a bhios e bacte",
        "badipaddress": "Chan eil an seòladh IP aig a' cleachdair seo iomchaidh",
        "blockipsuccesssub": "Shoirbhich leat leis a' bhacadh",
        "blockipsuccesstext": "Chaidh [[Special:Contributions/$1|$1]] a bhacadh.\n<br />Faic [[Special:BlockList|liosta nan IP bacte]] gus sùile a thoirt air na bacaidhean.",
+       "ipb-confirmhideuser": "Cha thu an impis cleachdaiche a bhacadh le \"falaich cleachdaiche\" an comas. Mùchaidh seo ainm a' chleachdaiche anns gach uile liosta 's nì loga. A bheil thu cinnteach gu bheil thu airson seo a dhèanamh?",
+       "ipb-blocklist-contribs": "Obair a rinn $1",
        "unblockip": "Neo-bhac an cleachdaiche",
        "ipusubmit": "Thoir air falbh am bacadh seo",
        "ipblocklist": "Cleachdaichean a chaidh a bhacadh",
+       "blocklist-nousertalk": "chan fhaod e an duilleag deasbaireachd aige fhèin a dheasachadh",
        "blocklink": "bac",
        "unblocklink": "neo-bhac",
        "change-blocklink": "mùth bacadh",
        "contribslink": "mùthaidhean",
        "blocklogpage": "Loga nam bacadh",
+       "blocklog-showsuppresslog": "Chaidh an cleachdaiche seo a bhacadh 's a mhùchadh roimhe.\nSeo dhut loga a' mhùchaidh:",
        "blocklogentry": "Chaidh bacadh a chrìochnaicheas ann an $2 a chur air [[$1]] $3",
        "unblocklogentry": "\"$1\" air a neo-bhacadh",
        "block-log-flags-nocreate": "cruthachadh de chunntasan ùra à comas",
+       "block-log-flags-nousertalk": "chan fhaod e an duilleag deasbaireachd aige fhèin a dheasachadh",
        "ipb_expiry_invalid": "Tha an t-àm-crìochnachaidh mì-dhligheach.",
+       "ipb_hide_invalid": "Cha ghabh an cunntas seo a mhùchadh on a tha barrachd air $1 {{PLURAL:$1|deasachadh|dheasachadh|deasachaidhean|deasachadh}} aige.",
        "ip_range_invalid": "Raon IP neo-iomchaidh.",
        "lockdb": "Glais an stòr-dàta",
        "lockconfirm": "Seadh, is ann a tha mi ag iarraidh an stòr-dàta a ghlasadh.",
        "lockbtn": "Glais an stòr-dàta",
        "lockdbsuccesssub": "Shoirbhich leat le glasadh an stòir-dhàta",
+       "lockedbyandtime": "(le $1 $2 $3)",
        "move-page-legend": "Gluais duilleag",
-       "movepagetext": "Ma chleachdas tu am foirm gu h-ìosal, cuiridh tu ainm ùr air 's gluaisidh tu a h-eachdraidh gu lèir dhan ainm ùr.\nBidh an seann tiotal 'na ath-sheòladh dhan tiotal ùr an uairsin.\n'S urrainn dhut ath-sheòladh sam bith a tha a' dol dhan tiotal tùsail ùrachadh leis fhèin.\nMura dèan thu sin, dèan cinnteach gun cuir thu sùil air eagal 's gum bi [[Special:DoubleRedirects|ath-sheòlaidhean dùbailte]] no [[Special:BrokenRedirects|briste]] ann.\n'S ann ort-sa a tha an t-uallach airson dèanamh cinntach gu bheil na ceanglaichean a' dol dha na h-àitichean ceart.\n\nThoir an aire '''nach dèid''' an duilleag a ghluasad ma tha duilleag air an tiotal ùr mu thràth ach ma bhios e falamh no 'na ath-sheòladh 's mur eil eachdraidh deasachaidh ann.\n'S ciall dha seo gun urrainn dhut ainm duilleige a thilleadh dhan ainm a bha air roimhe ma rinn thu mearachd agus nach urrainn dhut sgrìobhadh thairis air duilleag a tha ann.\n\n'''Rabhadh!'''\nFaodaidh seo a bhith 'na atharrachadh mòr ris nach bi dùil air duilleag air a bheil fèill mhòr;\ndèan cinnteach gu bheil thu a' tuigsinn dè a' bhuaidh a bhios agad mus dèid thu air adhart.",
-       "movepagetalktext": "Thèid an duilleag deasbaireachd a tha co-cheangailte ris a ghluasad 'na cois '''ach:'''\n*Ma tha duilleag deasbaireachd nach eil falamh aig an ainm ùr mu thràth, no\n*Ma bheir thu air falbh a' chromag on bhogsa gu h-ìosal\n\nMa thachras seo, feumaidh to an duilleag a ghluasad no cho-aontachadh a làimh, ma tha sin fa-near dhut.",
+       "movepagetext": "Ma chleachdas tu am foirm gu h-ìosal, cuiridh tu ainm ùr air 's gluaisidh tu a h-eachdraidh gu lèir dhan ainm ùr.\nBidh an seann tiotal 'na ath-sheòladh dhan tiotal ùr an uairsin.\n'S urrainn dhut ath-sheòladh sam bith a tha a' dol dhan tiotal tùsail ùrachadh leis fhèin.\nMura dèan thu sin, dèan cinnteach gun cuir thu sùil air eagal 's gum bi [[Special:DoubleRedirects|ath-sheòlaidhean dùbailte]] no [[Special:BrokenRedirects|briste]] ann.\n'S ann ort-sa a tha an t-uallach airson dèanamh cinntach gu bheil na ceanglaichean a' dol dha na h-àitichean ceart.\n\nThoir an aire <strong>nach dèid</strong> an duilleag a ghluasad ma tha duilleag air an tiotal ùr mu thràth ach ma bhios e falamh no 'na ath-sheòladh 's mur eil eachdraidh deasachaidh ann.\n'S ciall dha seo gun urrainn dhut ainm duilleige a thilleadh dhan ainm a bha air roimhe ma rinn thu mearachd agus nach urrainn dhut sgrìobhadh thairis air duilleag a tha ann.\n\n<strong>Rabhadh!</strong>\nFaodaidh seo a bhith 'na atharrachadh mòr ris nach bi dùil air duilleag air a bheil fèill mhòr;\ndèan cinnteach gu bheil thu a' tuigsinn dè a' bhuaidh a bhios agad mus dèid thu air adhart.",
+       "movepagetalktext": "Thèid an duilleag deasbaireachd a tha co-cheangailte ris a ghluasad 'na cois <strong>ach:</strong>\n*Ma tha duilleag deasbaireachd nach eil falamh aig an ainm ùr mu thràth, no\n*Ma bheir thu air falbh a' chromag on bhogsa gu h-ìosal\n\nMa thachras seo, feumaidh to an duilleag a ghluasad no cho-aonachadh a làimh, ma tha sin fa-near dhut.",
        "movearticle": "Gluais duilleag:",
+       "movecategorypage-warning": "<strong>Rachadh:</strong> Tha thu airson duilleag roinn-seòrsa a ghluasad. Thoir an aire nach dèid ach an duilleag a ghluasad 's <em>gur ann nach dèid</em> gach duilleag a tha san t-seann roinn-seòrsa a chur ris an roinn-seòrsa ùr.",
+       "cant-move-category-page": "Chan eil cead agad duilleagan roinn-seòrsa a ghluasad.",
+       "cant-move-to-category-page": "Chan eil cead agad duilleag a ghluasad gu duilleag roinn-seòrsa.",
        "newtitle": "Dhan tiotal ùr:",
        "move-watch": "Cum sùil air an duilleag thùsail agus an duilleag thairgaideach",
        "movepagebtn": "Gluais duilleag",
        "pagemovedsub": "Shoirbhich leat leis a' ghluasad",
-       "movepage-moved": "'''Chaidh \"$1\" a ghluasad a \"$2\"'''",
+       "movepage-moved": "<strong>Chaidh \"$1\" a ghluasad a \"$2\"</strong>",
+       "movepage-moved-noredirect": "Chaidh cruthachadh an ath-stiùiridh seo a mhùchadh.",
        "articleexists": "Tha duilleag ann mu thràth air a bheil an t-ainm seo no chan eil an t-ainm a thagh thu dligheachd.\nNach tagh thu ainm eile?",
        "movetalk": "Gluais an duilleag deasbaireachd a tha co-cheangailte ris",
+       "move-talk-subpages": "Gluais na fo-dhuilleagan aig duilleag deasbaireachd (suas ri $1)",
        "movelogpage": "Loga nan gluasadan",
+       "movesubpage": "{{PLURAL:$1|Fo-dhuilleag|Fo-dhuilleagan}}",
        "movereason": "Adhbhar:",
        "revertmove": "till",
        "delete_and_move": "Sguab às agus gluais",
        "delete_and_move_confirm": "Siuthad, sguab às an duilleag",
+       "immobile-source-namespace": "Cha ghabh duilleagan a ghluasad san ainm-spàs \"$1\"",
+       "immobile-target-namespace": "Cha ghabh duilleagan a ghluasad dhan ainm-spàs \"$1\"",
+       "imagenocrossnamespace": "Cha ghabh faidhle a ghluasad gu ainm-spàs nach eil 'na fhaidhle",
+       "nonfile-cannot-move-to-file": "Cha ghabh rud nach eil 'na fhaidhle a ghluasad gu ainm-spàs a bheil 'na fhaidhle",
+       "move-over-sharedrepo": "== Tha am faidhle ann ==\nTha [[:$1]] ann an ionad-tasgaidh co-roinnte. Thèid tar-àithneadh air an fhaidhle cho-roinnte ma ghluaiseas tu faidhle gun tiotal seo.",
+       "file-exists-sharedrepo": "Tha ainm an fhaidhle a thagh thu 'ga chleachdadh ann an ionad-tasgaidh co-roinnte mar-thà.\nFeuch an tagh thu ainm eile.",
        "export": "Às-phortaich duilleagan",
+       "exportlistauthors": "Cuir liosta shlàn dhe na deasaichean ris gach duilleag",
+       "export-addcattext": "Cuir duilleagan ris o roinn-seòrsa:",
+       "export-addnstext": "A h-uile duilleag on ainm-spàs:",
        "allmessages": "Teachdaireachdan an t-siostaim",
        "allmessagesname": "Ainm",
        "allmessagesdefault": "Teacsa bunaiteach na teachdaireachd",
-       "allmessagestext": "Seo liosta de theachdaireachdan an t-siostaim a tha ri làimh ann an namespace MediaWiki.\nTadhail air [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Ionadaileadh MediaWiki] is [//translatewiki.net translatewiki.net] ma tha thu airson pàirt a ghabhail ann an ionadaileadh MediaWiki.",
+       "allmessagestext": "Seo liosta de theachdaireachdan an t-siostaim a tha ri làimh ann an ainm-spàs MediaWiki.\nTadhail air [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Ionadaileadh MediaWiki] is [//translatewiki.net translatewiki.net] ma tha thu airson pàirt a ghabhail ann an ionadaileadh MediaWiki.",
        "thumbnail-more": "Meudaich",
        "filemissing": "Faidhle a dhìth",
-       "thumbnail_error": "Mearachd le cruthachadh na h-ìomhaigheige: $1",
+       "thumbnail_error": "Mearachd le cruthachadh na dealbhaige: $1",
+       "thumbnail-temp-create": "Cha deach leinn faidhle sealach na dealbhaige a chruthachadh",
+       "thumbnail-dest-create": "Cha deach leinn an dealbhag a shàbhaladh gun cheann-uidhe",
+       "thumbnail_invalid_params": "Paramadairean na dealbhaige mì-dhligheach",
+       "thumbnail_image-failure-limit": "Chaidh feuchainn cus tursan ($1 no a bharrachd) o chionn goirid gus an dealbhag seo a reandaradh. Feuch ris a-rithist uaireigin eile.",
+       "import-interwiki-namespace": "Ainm-spàs-uidhe:",
+       "import-revision-count": "$1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mhùthadh}}",
+       "import-error-special": "Cha deach an duilleag \"$1\" ion-phortadh on a bhuineas i ri ainm-spàs sònraichte nach ceadaich duilleagan.",
+       "import-rootpage-nosubpage": "Cha cheadaich an t-ainm-spàs \"$1\" aig an duilleag freumha fo-duilleagan.",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|mhùthadh|mùthadh|mùthaidhean|mùthadh}}",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}} o $2",
        "tooltip-pt-userpage": "An duilleag phearsanta agad",
-       "tooltip-pt-mytalk": "Duilleag do chonaltraidh",
+       "tooltip-pt-mytalk": "Duilleag do dheasbaireachd",
        "tooltip-pt-preferences": "Do roghainnean",
        "tooltip-pt-watchlist": "Seo liosta nan duilleagan a tha thu a' cumail sùil orra a thaobh mhùthaidhean a nithear orra",
-       "tooltip-pt-mycontris": "Liosta do mhùthaidhean",
+       "tooltip-pt-mycontris": "Liosta na h-obrach a rinn thu",
        "tooltip-pt-login": "Mholamaidh dhut logadh a-steach; ge-tà, cha leig thu leas seo a dhèanamh",
        "tooltip-pt-logout": "Log a-mach",
        "tooltip-ca-talk": "Deasbad mu dhuilleag na susbainte",
        "tooltip-n-mainpage-description": "Tadhail air an duilleag mhòr",
        "tooltip-n-portal": "Mun phròiseact, nas urrainn dhut dèanamh is far an lorg thu nithean",
        "tooltip-n-currentevents": "Lorg fiosrachadh a bharrachd mu thachartasan an latha",
-       "tooltip-n-recentchanges": "Liosta nam mùthaidhean ùra aig an uici.",
+       "tooltip-n-recentchanges": "Liosta nam mùthaidhean ùra aig an uicidh.",
        "tooltip-n-randompage": "Luchdaich duilleag air thuaiream",
        "tooltip-n-help": "Far am faigh thu fiosrachadh",
-       "tooltip-t-whatlinkshere": "Liosta de gach duilleag uici a tha a' ceangal ris an duilleag seo",
+       "tooltip-t-whatlinkshere": "Liosta de gach duilleag uicidh a tha a' ceangal ris an duilleag seo",
        "tooltip-t-recentchangeslinked": "Mùthaidhean a rinneadh o chionn ghoirid air duilleagan a tha ceangal ann thuca on duilleag seo",
        "tooltip-feed-rss": "Inbhir RSS airson na duilleige seo",
        "tooltip-feed-atom": "Inbhir Atom airson na duilleige seo",
-       "tooltip-t-contributions": "Seall liosta nam mùthaidhean a rinn a' chleachdaiche seo",
+       "tooltip-t-contributions": "Seall liosta na h-obrach a rinn an cleachdaiche seo",
        "tooltip-t-emailuser": "Cuir post-dealain dhan chleachdaiche seo",
        "tooltip-t-upload": "Luchdaich suas faidhle",
        "tooltip-t-specialpages": "Liosta de gach duilleag shònraichte",
        "tooltip-ca-nstab-project": "Seall duilleag a' phròiseict",
        "tooltip-ca-nstab-image": "Seall duilleag an fhaidhle",
        "tooltip-ca-nstab-template": "Seall an teamplaid",
-       "tooltip-ca-nstab-category": "Seall duilleag na roinne",
+       "tooltip-ca-nstab-category": "Seall duilleag na roinn-seòrsa",
        "tooltip-minoredit": "Comharraich seo mar dheasachadh beag",
        "tooltip-save": "Sàbhail na mùthaidhean agad",
        "tooltip-preview": "Ro-sheall na mùthaidhean agad; saoil an cleachd thu seo mus sàbhail thu iad?",
        "tooltip-diff": "Seall na mùthaidhean a chuir mi air an teacs",
        "tooltip-compareselectedversions": "Seall an diofar eadar an dà mhùthadh dhen duilleag seo a thagh thu",
        "tooltip-watch": "Cuir an duilleag seo air do chlàr-faire",
+       "tooltip-watchlistedit-raw-submit": "Ùraich an clàr-faire",
        "tooltip-rollback": "Ma chleachdas tu \"Roilig air ais\", tillidh thu gach mùthadh a rinn deasaiche àraid le aon bhriogadh",
        "tooltip-undo": "Tillidh \"Neo-dhèan\" am mùthadh seo 's fosglaidh e am foirm mùthaidh ann am modh an ro-sheallaidh. 'S urrainn dhut adhbhar a chur an cèill sa ghearr-chunntas air an dòigh seo.",
        "tooltip-summary": "Cuir a-steach gearr-chunntas",
-       "anonymous": "{{PLURAL:$1|cleachdaiche|cleachdaichean}} gun ainm o {{SITENAME}}",
+       "anonymous": "{{PLURAL:$1|Cleachdaiche|Cleachdaichean}} gun ainm o {{SITENAME}}",
        "siteuser": "cleachdaiche {{SITENAME}} $1",
        "othercontribs": "Stèidhichte air obair le $1.",
        "others": "eile",
-       "siteusers": "{{PLURAL:$2|cleachdaiche|cleachdaichean}} {{SITENAME}} $1",
+       "siteusers": "{{PLURAL:$2|Cleachdaiche|Cleachdaichean}} {{SITENAME}} $1",
+       "pageinfo-hidden-categories": "{{PLURAL:$1|Roinn-seòrsa fhalaichte|Roinnean-seòrsa falaichte}} ($1)",
        "pageinfo-toolboxlink": "Fiosrachadh mun duilleag",
+       "pageinfo-protect-cascading": "'Ga dhìon o bhith mar eas on a sheo",
+       "pageinfo-protect-cascading-from": "'Ga dhìon o bhith mar eas uaithe",
+       "pageinfo-category-info": "Fiosrachadh mun roinn-seòrsa",
+       "pageinfo-category-subcats": "Àireamh de fho-roinnean-seòrsa",
+       "markaspatrolleddiff": "Cuir comharra freiceadain ris",
+       "markaspatrolledtext": "Cuir comharra freiceadain ris an duilleag seo",
+       "markedaspatrolled": "Comharra freiceadain ris",
+       "markedaspatrolledtext": "Chaidh comharra freiceadain a chur ris a' mhùthadh de [[:$1]] a thagh thu.",
+       "rcpatroldisabled": "Chaidh feart nam freiceadan airson atharraichean o chionn goirid a chur à comas",
+       "rcpatroldisabledtext": "Tha feart nam freiceadan airson atharraichean o chionn goirid à comas an-dràsta.",
+       "markedaspatrollederror": "Cha ghabh comharra freiceadain a chur ris",
+       "markedaspatrollederrortext": "Feumaidh tu mùthadh a shònrachadh gus comharra freiceadain a chur ris.",
+       "markedaspatrollederror-noautopatrol": "Chan fhaod thu comharra freiceadain a chur ris na h-atharraichean agad fhèin.",
+       "markedaspatrollednotify": "Chaidh comharra freiceadain a cur ris an atharrachadh seo air $1.",
+       "markedaspatrollederrornotify": "Cha b' urrainn dhuinn comharra freiceadain a chur ris.",
+       "patrol-log-page": "Loga nam freiceadan",
+       "patrol-log-header": "Seo loga nam mùthaidhean le comharra freiceadain riutha.",
+       "log-show-hide-patrol": "$1 loga nam freiceadan",
        "previousdiff": "← Mùthadh nas sine",
        "nextdiff": "Deasachadh nas ùire →",
+       "imagemaxsize": "Crìochan air meud an deilbh:<br /><em>(airson duilleagan tuairisgeul an fhaidhle)</em>",
+       "thumbsize": "Meud na dealbhaige:",
        "file-info-size": "$1 × $2 pixel, meud an fhaidhle: $3, seòrsa MIME: $4",
        "file-nohires": "Chan eil dùmhlachd-bhreacaidh nas fhearr ri fhaighinn.",
        "svg-long-desc": "Faidhle SVG, a-rèir ainm $1 × $2 pixel, meud faidhle: $3",
        "show-big-image": "Am faidhle tùsail",
+       "file-no-thumb-animation": "<strong>An aire: Cha bhi beòthachadh air dealbhagan an fhaidhle seo ri linn cuingeachaidhean teicnigeach.</strong>",
+       "file-no-thumb-animation-gif": "<strong>An aire: Cha bhi beòthachadh air dealbhagan airson dealbhan GIF le dùmhlachd-bhreacaidh àrd mar an tè seo ri linn cuingeachaidhean teicnigeach.</strong>",
        "ilsubmit": "Rannsaich",
        "bydate": "air ceann-latha",
        "bad_image_list": "Seo mar a tha am fòrmat:\n\nCha bheachdaichear ach air buill liosta (loidhniche a tha * air am beulaibh).\nFeumaidh a' chiad cheangal air loidhne a bhith 'na cheangal ri droch fhaidhle.\nThathar a' coimhead air ceangal sam bith eile san loidhne sin mar eisgeachdan, 's e sin duilleagan far am faod am faidhle a bhith sa loidhne.",
        "metadata-expand": "Seall am fiosrachadh a bharrachd",
        "metadata-collapse": "Cuir am fiosrachadh a bharrachd am falach",
        "metadata-fields": "Thèid raointean meata-dhàta nan dealbhan a tha ainmichte san teachdaireachd seo a ghabhail a-steach air duilleag an deilbh nuair a bhios clàr a' mheata-dàta air a dhùmhlachadh.\nBidh an fheadhainn eile falaichte a ghnàth.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "exif-copyright": "Seilbheadair na còrach-lethbhreac",
+       "exif-devicesettingdescription": "Tuairisgeul aig roghainnean an uidheim",
+       "exif-iimcategory": "Roinn-seòrsa",
+       "exif-iimsupplementalcategory": "Roinnean-seòrsa foirlionach",
+       "exif-copyrighted": "Staid na còrach-lethbhreac",
+       "exif-copyrightowner": "Seilbheadair na còrach-lethbhreac",
+       "exif-webstatement": "Aithris na còrach-lethbhreac air loidhne",
+       "exif-licenseurl": "URL airson ceadachas na còrach-lethbhreac",
+       "exif-contact-value": "$1\n\n$2\n<div class=\"adr\">\n$3\n\n$4, $5, $6 $7\n</div>\n$8",
+       "exif-subjectnewscode-value": "$2 ($1)",
+       "exif-compression-1": "Gun dùmhlachadh",
+       "exif-compression-5": "LZW",
+       "exif-compression-6": "JPEG (sean)",
+       "exif-compression-7": "JPEG",
+       "exif-compression-8": "Deflate (Adobe)",
+       "exif-compression-32773": "PackBits (Macintosh RLE)",
+       "exif-compression-32946": "Deflate (PKZIP)",
+       "exif-compression-34712": "JPEG2000",
+       "exif-copyrighted-true": "Fo chòir-lethbhreac",
+       "exif-copyrighted-false": "Cha deach staid na còrach-lethbhreac a shuidheachadh",
+       "exif-photometricinterpretation-2": "RGB",
+       "exif-photometricinterpretation-6": "YCbCr",
+       "exif-unknowndate": "Gun fhios air a' cheann-là",
+       "exif-orientation-1": "Àbhaisteach",
+       "exif-orientation-2": "Air a fhlipeadh air a' chòmhnard",
+       "exif-orientation-3": "Cuairtichte le 180°",
+       "exif-orientation-4": "Air a fhlipeadh gu h-inghearach",
+       "exif-orientation-5": "Cuairtichte le 90° gu tuathail 's air a fhlipeadh gu h-inghearach",
+       "exif-orientation-6": "Cuairtichte le 90° gu tuathail",
+       "exif-orientation-7": "Cuairtichte le 90° gu deiseil 's air a fhlipeadh gu h-inghearach",
+       "exif-orientation-8": "Cuairtichte le 90° gu deiseil",
+       "exif-xyresolution-i": "$1 dpi",
+       "exif-xyresolution-c": "$1 dpc",
+       "exif-colorspace-1": "sRGB",
+       "exif-colorspace-65535": "Gun chailbhreachadh",
+       "exif-componentsconfiguration-0": "chan eil e ann",
+       "exif-componentsconfiguration-1": "Y",
+       "exif-componentsconfiguration-2": "Cb",
+       "exif-componentsconfiguration-3": "Cr",
+       "exif-componentsconfiguration-4": "R",
+       "exif-componentsconfiguration-5": "G",
+       "exif-componentsconfiguration-6": "B",
+       "exif-exposureprogram-0": "Gun mhìneachadh",
+       "exif-exposureprogram-1": "A làimh",
+       "exif-exposureprogram-2": "Prògram àbhaisteach",
+       "exif-subjectdistance-value": "$1 {{PLURAL:$1|mheatair|mheatair|meatairean|meatair}}",
+       "exif-meteringmode-0": "Chan eil fhios",
+       "exif-meteringmode-1": "Cuibheasach",
+       "exif-meteringmode-255": "Eile",
+       "exif-lightsource-0": "Chan eil fhios",
+       "exif-lightsource-20": "D55",
+       "exif-lightsource-21": "D65",
+       "exif-lightsource-22": "D75",
+       "exif-lightsource-23": "D50",
+       "exif-flash-mode-2": "bacadh riatanach air an t-solas-boillsgidh",
+       "exif-flash-mode-3": "modh fèin-obrachail",
+       "exif-focalplaneresolutionunit-2": "òirleach",
+       "exif-sensingmethod-1": "Gun mhìneachadh",
+       "exif-gaincontrol-0": "Chan eil gin",
+       "exif-gpsspeed-k": "Cilemeatair san uair",
+       "exif-gpsspeed-m": "Mìle gach uair",
+       "exif-gpsspeed-n": "Mìle-mara san uair",
+       "exif-gpsdestdistance-k": "Cilemeatair",
+       "exif-gpsdestdistance-m": "Mìle",
+       "exif-gpsdestdistance-n": "Mìle-mara",
+       "exif-dc-contributor": "Deasaichean",
+       "exif-dc-date": "Ceann-là",
+       "exif-dc-publisher": "Foillsichear",
+       "exif-dc-relation": "Meadhanan co-cheangailte",
+       "exif-dc-rights": "Còirichean",
+       "exif-dc-source": "Meadhan tùsail",
+       "exif-dc-type": "Seòrsa a' mheadhain",
+       "exif-rating-rejected": "Air a dhiùltadh",
+       "exif-isospeedratings-overflow": "Nas motha na 65535",
+       "exif-maxaperturevalue-value": "$1 APEX (f/$2)",
        "watchlistall2": "a h-uile",
        "namespacesall": "uile",
        "monthsall": "uile",
+       "confirmrecreate": "Sguab [[User:$1|$1]] ([[User talk:$1|an deasbaireachd]]) an duilleag seo às às dèidh do thòiseachadh air an deasachadh air an adhbhar seo:\n: <em>$2</em>\nDearbhaich gu bheil thu airson an duilleag seo ath-chruthachadh dha-rìribh.",
+       "confirmrecreate-noreason": "Sguab [[User:$1|$1]] ([[User talk:$1|an deasbaireachd]]) an duilleag seo às às dèidh do thòiseachadh air an deasachadh.\nDearbhaich gu bheil thu airson an duilleag seo ath-chruthachadh dha-rìribh.",
+       "confirm-watch-top": "A bheil thu airson an duilleag seo a chur ris a' chlàr-fhaire agad?",
+       "confirm-unwatch-top": "A bheil thu airson an duilleag seo a thoirt air falbh on chlàr-fhaire agad?",
        "watchlistedit-normal-title": "Deasaich an clàr-faire",
+       "watchlistedit-normal-legend": "Thoir tiotalan air falbh on chlàr-fhaire",
+       "watchlistedit-normal-explain": "Chì thu na tiotalan a tha air a' chlàr-fhaire agad gu h-ìosal.\nGus tiotal a thoirt air falbh, cuir cromag sa bhogsa ri thaobh 's briog air \"{{int:Watchlistedit-normal-submit}}\".\n'S urrainn dhut [[Special:EditWatchlist/raw|còd an liosta a dheasachadh]] cuideachd.",
+       "watchlistedit-normal-submit": "Thoir tiotalan air falbh",
+       "watchlistedit-normal-done": "Chaidh {{PLURAL:$1|$1 tiotal|$1 thiotal|$1 tiotalan|$1 tiotal}} a thoirt far a' chlàir-fhaire agad:",
+       "watchlistedit-raw-title": "Deasaich còd a' chlàir-fhaire",
+       "watchlistedit-raw-legend": "Deasaich còd a' chlàir-fhaire",
        "watchlistedit-raw-submit": "Ùraich an clàr-faire",
        "watchlisttools-view": "Seall na mùthaidhean iomchaidh",
        "watchlisttools-edit": "Seall is deasaich mo chlàr-faire",
        "watchlisttools-raw": "Deasaich còd a' chlàir-fhaire",
-       "duplicate-defaultsort": "'''Rabhadh:''' Tha an iuchair seòrsachaidh bhunaiteach \"$2\" a' dol thairis air seann iuchair eile, \"$1\".",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|an deasbaireachd]])",
+       "duplicate-defaultsort": "<strong>Rabhadh:</strong> Tha an iuchair seòrsachaidh bhunaiteach \"$2\" a' dol thairis air seann iuchair eile, \"$1\".",
        "version": "Tionndadh",
+       "version-ext-colheader-description": "Tuairisgeul",
+       "version-poweredby-credits": "Tha an uicidh seo 'ga toirt dhut le cumhachd <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, còir-lethbhreac © 2001-$1 $2.",
+       "version-credits-summary": "Bu toigh leinn urram a thoirt air na daoine a leanas air sgàth 's an cuid obrach airson [[Special:Version|MediaWiki]].",
        "specialpages": "Duilleagan sònraichte",
+       "specialpages-note-top": "Treòir",
        "external_image_whitelist": " #Fàg an loidhne seo dìreach mar a tha e<pre>\n#Cuir mìrean nan regular expressions (dìreach a' phàirt eadar //) gu hìosal\n#Thèid seisean URL a lorg dhaibh am measg nan dealbhan air an taobh a-muigh (hotlinks)\n#Chithear an fheadhainn a tha a' freagairt ri seise a shealltainn air neo chithear ceangal dhan dealbh a-mhàin\n#Chan eil ann an loidhnichean a tha a' tòiseachadh le # ach beachdan\n#Chan eil aire do litrichean mòra no beaga\n\n#Cuir gach mì regex os cionn na loidhne seo. Fàg an loidhne seo dìreach mar a tha e</pre>",
        "tag-filter": "Criathrag [[Special:Tags|thagaichean]]:",
+       "tags-description-header": "Tuairisgeul slàn a' chèill",
+       "logentry-delete-delete": "Sguab $1 às duilleag $3",
+       "logentry-delete-restore": "Dh'aisig $1 duilleag $3",
+       "logentry-delete-event": "Dh'atharraich $1 an fhaicsinneachd aig $5 {{PLURAL:$5|tachartas|thachartas|tachartasan|tachartas}} an loga air $3: $4",
+       "logentry-delete-revision": "Dh'atharraich $1 an fhaicsinneachd aig $5 {{PLURAL:$5|mhùthadh|mhùthadh|mùthaidhean|mùthadh}} air $3: $4",
+       "logentry-delete-event-legacy": "Dh'atharraich $1 an fhaicsinneachd aig tachartasan an loga air $3",
+       "logentry-delete-revision-legacy": "Dh'atharraich $1 an fhaicsinneachd aig mùthaidhean air $3",
+       "logentry-suppress-delete": "Mhùch $1 duilleag $3",
+       "logentry-suppress-event": "Dh'atharraich $1 an fhaicsinneachd aig $5 {{PLURAL:$5|tachartas|thachartas|tachartasan|tachartas}} an loga air $3 gu dìomhair: $4",
+       "logentry-suppress-revision": "Dh'atharraich $1 an fhaicsinneachd aig $5 {{PLURAL:$5|mhùthadh|mhùthadh|mùthaidhean|mùthadh}} air $3 gu dìomhair: $4",
+       "logentry-suppress-event-legacy": "Dh'atharraich $1 an fhaicsinneachd aig tachartasan an loga air $3 gu dìomhair",
+       "logentry-suppress-revision-legacy": "Dh'atharraich $1 an fhaicsinneachd aig mùthaidhean air $3 gu dìomhair",
+       "revdelete-summary-hid": "chaidh gearr-chunntas an deasachaidh fhalach",
+       "revdelete-summary-unhid": "chaidh gearr-chunntas an deasachaidh a nochdadh",
+       "logentry-move-move": "Ghluais $1 duilleag $3 gu $4",
+       "logentry-move-move-noredirect": "Ghluais $1 duilleag $3 gu $4 's cha do {{GENDER:$2|dh'fhàg e|dh'fhàg i|dh'fhàgadh}} ath-stiùireadh ann",
+       "logentry-move-move_redir": "Ghluais $1 duilleag $3 gu $4 slighe ath-stiùiridh",
+       "logentry-move-move_redir-noredirect": "Ghluais $1 duilleag $3 gu $4 slighe ath-stiùiridh ach cha do {{GENDER:$2|dh'fhàg e|dh'fhàg i|dh'fhàgadh}} ath-stiùireadh ann",
+       "logentry-patrol-patrol": "Chuir $1 comharra freiceadain ris a' mhùthadh $4 aig an duilleag $3",
+       "logentry-patrol-patrol-auto": "Chuir $1 comharra freiceadain ris a' mhùthadh $4 aig an duilleag $3 gu fèin-obrachail",
+       "logentry-newusers-newusers": "Chaidh cunntas a' chleachdaiche $1 a chruthachadh",
+       "logentry-newusers-create": "Chaidh cunntas a' chleachdaiche $1 a chruthachadh",
+       "logentry-newusers-create2": "Chaidh cunntas a' chleachdaiche $3 a chruthachadh le $1",
+       "logentry-newusers-byemail": "Chaidh cunntas a' chleachdaiche $3 a chruthachadh le $1 's chaidh am facal-faire a chur air a' phost-d",
+       "logentry-newusers-autocreate": "Chaidh cunntas a' chleachdaiche $1 a chruthachadh gu fèin-obrachail",
+       "logentry-rights-rights": "Dh'atharraich $1 {{GENDER:$2|a bhallrachd|a ballrachd}} ann am buidheann airson $3 o $4 gu $5",
+       "logentry-rights-rights-legacy": "Dh'atharraich $1 {{GENDER:$2|a bhallrachd|a ballrachd}} ann am buidheann airson $3",
+       "logentry-rights-autopromote": "Chaidh $1 àrdachadh o $4 gu $5 gu fèin-obrachail",
        "rightsnone": "(chan eil gin)",
-       "searchsuggest-containing": "anns a bheil..."
+       "searchsuggest-containing": "anns a bheil...",
+       "api-error-fileexists-shared-forbidden": "Tha faidhle air a bheil \"$1\" san ionad-tasgaich cho-roinnte mar-thà 's cha ghabh sgrìobhadh thairis air.",
+       "api-error-stasherror": "Thachair mearachd le luchdadh suas an fhaidhle dhan tasgadan.",
+       "expand_templates_remove_nowiki": "Mùch tagaichean <nowiki> san toradh"
 }
index 3072722..324bf23 100644 (file)
        "qbmyoptions": "As miñas páxinas",
        "faq": "Preguntas máis frecuentes",
        "faqpage": "Project:FAQ",
-       "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-view-create": "Crear",
-       "vector-view-edit": "Editar",
-       "vector-view-history": "Ver o historial",
-       "vector-view-view": "Ler",
-       "vector-view-viewsource": "Ver o código fonte",
        "actions": "Accións",
        "namespaces": "Espazos de nomes",
        "variants": "Variantes",
        "laggedslavemode": "'''Aviso:''' A páxina pode non conter as actualizacións recentes.",
        "readonly": "Base de datos pechada",
        "enterlockreason": "Dea unha razón para o peche, incluíndo unha estimación de até cando se manterá",
-       "readonlytext": "Nestes intres a base de datos está pechada a novas entradas e outras modificacións, probabelmente debido a rutinas de mantemento, tras as que volverá á normalidade.\n\nO administrador que a pechou deu esta explicación: $1",
+       "readonlytext": "Nestes intres a base de datos está pechada a novas entradas e outras modificacións, probablemente debido a procesos de mantemento, tras os que volverá á normalidade.\n\nO administrador que a pechou deu esta explicación: $1",
        "missing-article": "A base de datos non atopou o texto da páxina chamada \"$1\" $2, que debera ter atopado.\n\nNormalmente, isto está causado por seguir unha ligazón cara a unha diferenza vella ou a unha páxina que foi borrada.\n\nSe este non é o caso, poida que atopase un erro no software.\nPor favor, comuníquello a un [[Special:ListUsers/sysop|administrador]] tomando nota do enderezo URL.",
        "missingarticle-rev": "(nº de revisión: $1)",
        "missingarticle-diff": "(dif: $1, $2)",
        "userlogin-joinproject": "Únase a {{SITENAME}}",
        "nologin": "Non está rexistrado? $1.",
        "nologinlink": "Cree unha conta",
-       "createaccount": "Crear unha conta nova",
+       "createaccount": "Crear unha conta",
        "gotaccount": "Xa ten unha conta? $1.",
        "gotaccountlink": "Acceda ao sistema",
        "userlogin-resetlink": "Esqueceu os seus datos de rexistro?",
        "hiddencategories": "Esta páxina forma parte {{PLURAL:$1|dunha categoría oculta|de $1 categorías ocultas}}:",
        "edittools": "<!-- O texto que apareza aquí mostrarase por debaixo dos formularios de edición e envío. -->",
        "nocreatetext": "{{SITENAME}} ten restrinxida a posibilidade de crear páxinas novas.\nPode volver e editar unha páxina que xa existe ou, se non, [[Special:UserLogin|rexistrarse ou crear unha conta]].",
-       "nocreate-loggedin": "Non dispón dos permisos necesarios para crear páxinas novas.",
+       "nocreate-loggedin": "Non ten os permisos necesarios para crear páxinas novas.",
        "sectioneditnotsupported-title": "A edición de seccións non está soportada",
        "sectioneditnotsupported-text": "A edición de seccións non está soportada nesta páxina.",
        "permissionserrors": "Erro de permisos",
        "edit-gone-missing": "Non se pode actualizar a páxina.\nSemella que foi borrada.",
        "edit-conflict": "Conflito de edición.",
        "edit-no-change": "A súa edición foi ignorada dado que non fixo ningún cambio no texto.",
+       "postedit-confirmation-created": "Creouse a páxina.",
+       "postedit-confirmation-restored": "Restaurouse a páxina.",
        "postedit-confirmation-saved": "Gardouse a súa edición.",
        "edit-already-exists": "Non se pode crear a nova páxina.\nEsta xa existe.",
        "defaultmessagetext": "Texto predeterminado",
        "parser-template-recursion-depth-warning": "Excedeuse o límite de profundidade de recursión do modelo ($1)",
        "language-converter-depth-warning": "Excedeuse o límite de profundidade do convertedor de lingua ($1)",
        "node-count-exceeded-category": "Páxinas nas que se supera o número de nodos",
-       "node-count-exceeded-warning": "Páxina que supera o número de nodos",
+       "node-count-exceeded-category-desc": "Unha categoría para as páxinas que superan o número de nodos.",
+       "node-count-exceeded-warning": "A páxina supera o número de nodos",
        "expansion-depth-exceeded-category": "Páxinas nas que se supera a profundidade de expansión",
-       "expansion-depth-exceeded-warning": "Páxina que supera a profundidade de expansión",
+       "expansion-depth-exceeded-category-desc": "Esta é unha categoría para as páxinas que superan a profundidade de expansión.",
+       "expansion-depth-exceeded-warning": "A páxina supera a profundidade de expansión",
        "parser-unstrip-loop-warning": "Detectouse un bucle inamovible",
        "parser-unstrip-recursion-limit": "Excedeuse o límite de recursión inamovible ($1)",
        "converter-manual-rule-error": "Detectouse un erro na regra manual de conversión da lingua",
        "currentrev": "Revisión actual",
        "currentrev-asof": "Revisión actual feita o $2 ás $3",
        "revisionasof": "Revisión como estaba o $2 ás $3",
-       "revision-info": "Revisión feita o $4 ás $5 por $2",
+       "revision-info": "Revisión feita o $4 ás $5 por {{GENDER:$6|$2}}$7",
        "previousrevision": "← Revisión máis antiga",
        "nextrevision": "Revisión máis nova →",
        "currentrevisionlink": "Revisión actual",
        "difference-missing-revision": "Non se {{PLURAL:$2|atopou revisión ningunha|atoparon $2 revisións}} desta diferenza ($1).\n\nA miúdo, isto está provocado por seguir unha ligazón de diferenzas obsoleta cara a unha páxina que foi borrada.\nO [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rexistro de borrados] contén máis detalles.",
        "searchresults": "Resultados da procura",
        "searchresults-title": "Resultados da procura de \"$1\"",
-       "toomanymatches": "Devolvéronse demasiadas coincidencias; inténteo cunha consulta diferente",
        "titlematches": "O título da páxina coincide",
        "textmatches": "O texto da páxina coincide",
        "notextmatches": "Non se atopou o texto en ningunha páxina",
        "searchmenu-exists": "<strong>Xa existe unha páxina chamada \"[[:$1]]\" neste wiki.</strong> {{PLURAL:$2|0=|Bótelle unha ollada tamén aos outros resultados atopados.}}",
        "searchmenu-new": "<strong>Crear a páxina \"[[:$1]]\" neste wiki!</strong> {{PLURAL:$2|0=|Bótelle unha ollada tamén á páxina atopada na súa procura.|Bótelle unha ollada tamén aos resultados atopados.}}",
        "searchprofile-articles": "Páxinas de contido",
-       "searchprofile-project": "Páxinas do proxecto e de axuda",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Todo",
        "searchprofile-advanced": "Avanzado",
        "searchprofile-articles-tooltip": "Procurar en $1",
-       "searchprofile-project-tooltip": "Procurar en $1",
        "searchprofile-images-tooltip": "Procurar ficheiros",
        "searchprofile-everything-tooltip": "Procurar en todo o contido (incluíndo páxinas de conversa)",
        "searchprofile-advanced-tooltip": "Procurar nos espazos de nomes elixidos",
        "search-interwiki-default": "Resultados de $1:",
        "search-interwiki-more": "(máis)",
        "search-relatedarticle": "Relacionado",
-       "searcheverything-enable": "Procurar en todos os espazos de nomes",
        "searchrelated": "relacionado",
        "searchall": "todo",
        "showingresults": "{{PLURAL:$1|Móstrase '''1''' resultado|Móstranse '''$1''' resultados}}, comezando polo número '''$2'''.",
        "powersearch-togglelabel": "Seleccionar:",
        "powersearch-toggleall": "Todos",
        "powersearch-togglenone": "Ningún",
+       "powersearch-remember": "Lembrar a selección en futuras pescudas",
        "search-external": "Procura externa",
        "searchdisabled": "As procuras en {{SITENAME}} están deshabilitadas por cuestións de rendemento.\nMentres tanto pode procurar usando o Google.\nNote que os seus índices do contido de {{SITENAME}} poden estar desactualizados.",
        "search-error": "Produciuse un erro durante a procura: $1",
        "allowemail": "Admitir mensaxes de correo electrónico doutros usuarios",
        "prefs-searchoptions": "Procura",
        "prefs-namespaces": "Espazos de nomes",
-       "defaultns": "Se non, procurar nestes espazos de nomes:",
        "default": "predeterminado",
        "prefs-files": "Ficheiros",
        "prefs-custom-css": "CSS personalizado",
        "prefs-emailconfirm-label": "Confirmación do correo:",
        "youremail": "Correo electrónico:",
        "username": "Nome de {{GENDER:$1|usuario|usuaria}}:",
-       "uid": "ID de {{GENDER:$1|usuario|usuaria}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membro}} {{PLURAL:$1|do grupo|dos grupos}}:",
        "prefs-registration": "Data e hora de rexistro:",
        "yourrealname": "Nome real:",
        "right-move": "Mover páxinas",
        "right-move-subpages": "Mover páxinas coas súas subpáxinas",
        "right-move-rootuserpages": "Mover páxinas de usuario raíz",
+       "right-move-categorypages": "Mover páxinas de categoría",
        "right-movefile": "Mover ficheiros",
        "right-suppressredirect": "Non crear unha redirección dende o nome vello ao mover unha páxina",
        "right-upload": "Subir ficheiros",
        "action-createpage": "crear páxinas",
        "action-createtalk": "crear páxinas de conversa",
        "action-createaccount": "crear esta conta de usuario",
+       "action-history": "ver o historial desta páxina",
        "action-minoredit": "marcar esta edición como pequena",
        "action-move": "mover esta páxina",
        "action-move-subpages": "mover esta páxina e as súas subpáxinas",
        "action-move-rootuserpages": "mover páxinas de usuario raíz",
+       "action-move-categorypages": "mover páxinas de categoría",
        "action-movefile": "mover este ficheiro",
        "action-upload": "cargar este ficheiro",
        "action-reupload": "sobrescribir este ficheiro existente",
        "recentchanges-label-unpatrolled": "Esta edición aínda non foi comprobada",
        "recentchanges-label-plusminus": "O tamaño da páxina variou este número de bytes",
        "recentchanges-legend-heading": "'''Lenda:'''",
-       "recentchanges-legend-newpage": "(véxase tamén a [[Special:NewPages|lista de páxinas novas]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (véxase tamén a [[Special:NewPages|lista de páxinas novas]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "A continuación móstranse os cambios feitos desde o <strong>$3</strong> ás <strong>$4</strong> (móstranse <strong>$1</strong> como máximo).",
        "rclistfrom": "Mostrar os cambios novos desde o $3 ás $2",
        "log-title-wildcard": "Procurar os títulos que comecen con este texto",
        "showhideselectedlogentries": "Mostrar/agochar as entradas do rexistro seleccionadas",
        "allpages": "Todas as páxinas",
-       "alphaindexline": "$1 a $2",
        "nextpage": "Páxina seguinte ($1)",
        "prevpage": "Páxina anterior ($1)",
        "allpagesfrom": "Mostrar as páxinas que comecen por:",
        "watchnologin": "Non accedeu ao sistema",
        "addwatch": "Engadir á lista vixilancia",
        "addedwatchtext": "A páxina \"[[:$1]]\" foi engadida á súa [[Special:Watchlist|lista de vixilancia]].\nOs cambios futuros nesta páxina e na súa páxina de conversa asociada serán listados alí.",
+       "addedwatchtext-short": "A páxina \"$1\" foi engadida á súa lista de vixilancia.",
        "removewatch": "Eliminar da lista de vixilancia",
        "removedwatchtext": "A páxina \"[[:$1]]\" foi eliminada [[Special:Watchlist|da súa lista de vixilancia]].",
+       "removedwatchtext-short": "A páxina \"$1\" foi eliminada da súa lista de vixilancia.",
        "watch": "Vixiar",
        "watchthispage": "Vixiar esta páxina",
        "unwatch": "Deixar de vixiar",
        "movepagetalktext": "A páxina de conversa asociada, se existe, será automaticamente movida con esta '''agás que''':\n*Estea a mover a páxina empregando espazos de nomes,\n*Xa exista unha páxina de conversa con ese nome, ou\n*Desactive a opción de abaixo.\n\nNestes casos, terá que mover ou mesturar a páxina manualmente se o desexa.",
        "movearticle": "Mover esta páxina:",
        "moveuserpage-warning": "'''Aviso:''' Está a piques de mover unha páxina de usuario. Por favor, teña en conta que só se trasladará a páxina e que o usuario '''non''' será renomeado.",
+       "movecategorypage-warning": "'''Aviso:''' Está a piques de mover unha páxina de categoría. Por favor, teña en conta que só se trasladará a páxina e que as páxinas presentes na categoría vella '''non''' serán recategorizadas na categoría nova.",
        "movenologintext": "Debe ser un usuario rexistrado e [[Special:UserLogin|acceder ao sistema]] para mover unha páxina.",
        "movenotallowed": "Non ten os permisos necesarios para mover páxinas.",
        "movenotallowedfile": "Non ten os permisos necesarios para mover ficheiros.",
        "cant-move-user-page": "Non ten os permisos necesarios para mover páxinas de usuario (agás subpáxinas).",
        "cant-move-to-user-page": "Non ten os permisos necesarios para mover unha páxina a unha páxina de usuario (agás a unha subpáxina).",
+       "cant-move-category-page": "Non ten os permisos necesarios para mover páxinas de categoría.",
+       "cant-move-to-category-page": "Non ten os permisos necesarios para mover unha páxina a unha páxina de categoría.",
        "newtitle": "Ao novo título:",
        "move-watch": "Vixiar esta páxina",
        "movepagebtn": "Mover a páxina",
        "tooltip-summary": "Escriba un breve resumo",
        "interlanguage-link-title": "$1 – $2",
        "common.css": "/** O CSS que se coloque aquí será aplicado a todas as aparencias */",
-       "cologneblue.css": "/* O CSS que se coloque aquí afectará a quen use a aparencia Azul colonial */",
-       "monobook.css": "/* O CSS que se coloque aquí afectará a quen use a aparencia Monobook */",
-       "modern.css": "/* O CSS que se coloque aquí afectará a quen use a aparencia Moderna */",
-       "vector.css": "/* O CSS que se coloque aquí afectará a quen use a aparencia Vector */",
        "print.css": "/* O CSS que se coloque aquí afectará ás impresións */",
        "noscript.css": "/* O CSS que se coloque aquí afectará aos usuarios co JavaScript desactivado */",
        "group-autoconfirmed.css": "/* O CSS que se coloque aquí afectará soamente aos usuarios autoconfirmados */",
        "group-sysop.css": "/* O CSS que se coloque aquí afectará soamente aos administradores */",
        "group-bureaucrat.css": "/* O CSS que se coloque aquí afectará soamente aos burócratas */",
        "common.js": "/* Calquera JavaScript que haxa aquí será cargado para todos os usuarios en cada páxina que vexan. */",
-       "cologneblue.js": "/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Azul colonial */",
-       "monobook.js": "/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia MonoBook */",
-       "modern.js": "/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Moderna */",
-       "vector.js": "/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Vector */",
        "group-autoconfirmed.js": "/* Calquera JavaScript que haxa aquí será cargado soamente para os usuarios autoconfirmados */",
        "group-bot.js": "/* Calquera JavaScript que haxa aquí será cargado soamente para os bots */",
        "group-sysop.js": "/* Calquera JavaScript que haxa aquí será cargado soamente para os administradores */",
        "pageinfo-category-pages": "Número de páxinas",
        "pageinfo-category-subcats": "Número de subcategorías",
        "pageinfo-category-files": "Número de ficheiros",
-       "skinname-cologneblue": "Azul colonial",
-       "skinname-monobook": "MonoBook",
-       "skinname-modern": "Moderna",
        "markaspatrolleddiff": "Marcar como revisada",
        "markaspatrolledtext": "Marcar esta páxina como revisada",
        "markedaspatrolled": "Marcar como revisado",
        "newimages-summary": "Esta páxina especial mostra os últimos ficheiros cargados.",
        "newimages-legend": "Filtro",
        "newimages-label": "Nome do ficheiro (ou parte del):",
+       "newimages-showbots": "Mostrar as cargas feitas por bots",
        "noimages": "Non hai imaxes para ver.",
        "ilsubmit": "Procurar",
        "bydate": "por data",
        "watchlistedit-raw-done": "Actualizouse a súa lista de vixilancia.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Engadiuse un título|Engadíronse $1 títulos}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Eliminouse un título|Elimináronse $1 títulos}}:",
+       "watchlistedit-clear-title": "Limpar a lista de vixilancia",
+       "watchlistedit-clear-legend": "Limpar a lista de vixilancia",
+       "watchlistedit-clear-explain": "Eliminaranse todos os títulos da súa lista de vixilancia",
+       "watchlistedit-clear-titles": "Títulos:",
+       "watchlistedit-clear-submit": "Limpar a lista de vixilancia (isto é permanente!)",
+       "watchlistedit-clear-done": "Limpouse a súa lista de vixilancia.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Eliminouse un título|Elimináronse $1 títulos}}:",
+       "watchlistedit-too-many": "Hai demasiadas páxinas para mostrar.",
+       "watchlisttools-clear": "Limpar a lista de vixilancia",
        "watchlisttools-view": "Ver as modificacións relevantes",
        "watchlisttools-edit": "Ver e editar a lista de vixilancia",
        "watchlisttools-raw": "Editar a lista de vixilancia simple",
        "htmlform-no": "Non",
        "htmlform-yes": "Si",
        "htmlform-chosen-placeholder": "Seleccione unha opción",
+       "htmlform-cloner-create": "Engadir máis",
+       "htmlform-cloner-delete": "Eliminar",
+       "htmlform-cloner-required": "Necesítase, polo menos, un valor.",
        "sqlite-has-fts": "$1 con soporte para procuras de texto completo",
        "sqlite-no-fts": "$1 sen soporte para procuras de texto completo",
        "logentry-delete-delete": "$1 {{GENDER:$2|borrou}} a páxina \"$3\"",
index a3ec3ba..ecc51da 100644 (file)
        "qbmyoptions": "Ystellige",
        "faq": "Froge, wo vilmol gstellt wäre",
        "faqpage": "Project:FAQ",
-       "vector-action-addsection": "Abschnitt zuefiege",
-       "vector-action-delete": "Lesche",
-       "vector-action-move": "Verschiebe",
-       "vector-action-protect": "Schitze",
-       "vector-action-undelete": "Widerhärstelle",
-       "vector-action-unprotect": "Syteschutz ändere",
-       "vector-view-create": "Aalege",
-       "vector-view-edit": "Bearbeite",
-       "vector-view-history": "Versionsgschicht",
-       "vector-view-view": "Läse",
-       "vector-view-viewsource": "Quälltext aaluege",
        "actions": "Aktione",
        "namespaces": "Namensryym",
        "variants": "Variante",
        "difference-missing-revision": "{{PLURAL:$2|Ei Version|$2 Versione}} vui däre Unterschidsaazeig ($1) {{PLURAL:$2|isch|sin}} nit gfunde wore.\n\nDää Fähler chunnt normalerwyys dur e veraltete Link zue dr Versionsgschicht vun ere Syte, wu in dr Zwischezyt glescht woren isch.\nEinzelheite chasch im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lesch-Logbuech] bschaue.",
        "searchresults": "Suech-Ergäbnis",
        "searchresults-title": "Suechergebniss fir „$1“",
-       "toomanymatches": "D Aazahl vu dr Suechergebniss isch z gross, bitte versuech e anderi Abfrog.",
        "titlematches": "Iberyystimmige mit Sytentitel",
        "textmatches": "Iberyystimmige mit Inhalte",
        "notextmatches": "Kei Iberyystimmige mit Inhalte",
        "searchmenu-exists": "* Syte '''[[$1]]'''",
        "searchmenu-new": "'''[[:$1|Leg d Syte ''$1'' in dem Wiki aa!]]'''",
        "searchprofile-articles": "Inhaltssyte",
-       "searchprofile-project": "Hilf- un Projäktsyte",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Alles",
        "searchprofile-advanced": "Erwyteret",
        "searchprofile-articles-tooltip": "Sueche in $1",
-       "searchprofile-project-tooltip": "Sueche in $1",
        "searchprofile-images-tooltip": "Noch Bilder sueche",
        "searchprofile-everything-tooltip": "Gsamte Inhalt dursueche (au d Diskussionssyte)",
        "searchprofile-advanced-tooltip": "Suech in wytere Namensryym",
        "search-interwiki-default": "$1 Ergebniss:",
        "search-interwiki-more": "(meh)",
        "search-relatedarticle": "Verwandti",
-       "searcheverything-enable": "In alle Namensryym sueche",
        "searchrelated": "verwandt",
        "searchall": "alli",
        "showingresults": "Do {{PLURAL:$1|isch '''1''' Ergebnis|sin '''$1''' Ergebniss}}, s fangt aa mit dr Nummerer '''$2.'''",
        "allowemail": "andere Benutzer erlaube, dass si Ihne E-Mails chenne schicke",
        "prefs-searchoptions": "Suechoptione",
        "prefs-namespaces": "Namensryym",
-       "defaultns": "Sunscht in däne Namensryym sueche:",
        "default": "Voryystellig",
        "prefs-files": "Bilder",
        "prefs-custom-css": "Benutzerdefinierti CSS",
        "prefs-emailconfirm-label": "E-Mail-Bstätigung:",
        "youremail": "E-Mail-Adräss:",
        "username": "{{GENDER:$1|Benutzername}}:",
-       "uid": "{{GENDER:$1|Benutzernummere}}:",
        "prefs-memberingroups": "{{GENDER:$2|Mitglid}} vu dr {{PLURAL:$1|Benutzergruppe}}:",
        "prefs-registration": "Aamäldzyt:",
        "yourrealname": "Echte Name:",
        "recentchanges-label-bot": "Die Bearbeitig isch dur e Bott uusgfiert wore",
        "recentchanges-label-unpatrolled": "Die Bearbeitig isch nonig vun eme Fäldhieter aagluegt wore",
        "recentchanges-label-plusminus": "Di gänderet Sytegreßi (Aazahl in Byte)",
-       "recentchanges-legend-newpage": "(lueg au d [[Special:NewPages|Lischt vu neie Syte]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (lueg au d [[Special:NewPages|Lischt vu neie Syte]])",
        "rcnotefrom": "Des sin d Ändrige syter <b>$2</b> (bis zem <b>$1</b> zeigt).",
        "rclistfrom": "Nume Änderige syt $3, $2 Uhr zeige.",
        "rcshowhideminor": "Chlynigkeite $1",
        "log-title-wildcard": "Titel fangt aa mit",
        "showhideselectedlogentries": "Uusgwehlti Logbuechyytreg aazeige/verstecke",
        "allpages": "alli Sytene",
-       "alphaindexline": "vo $1 bis $2",
        "nextpage": "Nächscht Syte ($1)",
        "prevpage": "Vorderi Syte ($1)",
        "allpagesfrom": "Syte aazeige vo:",
index bc124ce..90c3184 100644 (file)
        "qbmyoptions": "મારાં પાનાં",
        "faq": "FAQ\nવારંવાર પુછાતા પ્રશ્નો",
        "faqpage": "Project:વારંવાર પુછાતા પ્રશ્નો",
-       "vector-action-addsection": "નવી ચર્ચા",
-       "vector-action-delete": "રદ કરો",
-       "vector-action-move": "ખસેડો",
-       "vector-action-protect": "સુરક્ષિત કરો",
-       "vector-action-undelete": "રદ કરેલું પાછું વાળો",
-       "vector-action-unprotect": "સુરક્ષા બદલો",
-       "vector-view-create": "બનાવો",
-       "vector-view-edit": "ફેરફાર કરો",
-       "vector-view-history": "ઇતિહાસ જુઓ",
-       "vector-view-view": "વાંચો",
-       "vector-view-viewsource": "સ્રોત જુઓ",
        "actions": "ક્રિયાઓ",
        "namespaces": "નામાવકાશો",
        "variants": "ભિન્ન રૂપો",
        "diff-multi-manyusers": "{{PLURAL:$2|એક સભ્યએ કરેલું|$2 સભ્યોએ કરેલા}} ({{PLURAL:$1|વચગાળાનું એક પુનરાવર્તન દર્શાવ્યં|વચગાળાનાં $1 પુનરાવર્તનો દર્શાવ્યાં}} નથી.)",
        "searchresults": "પરિણામોમાં શોધો",
        "searchresults-title": "પરિણામોમાં \"$1\" શોધો",
-       "toomanymatches": "શોધમાં ઘણાં બધાં પરિણામો મળ્યાં, કૃપા કરી નવો શબ્દ મૂકી શોધો.",
        "titlematches": "પાનાનું શીર્ષક મળતું આવે છે",
        "textmatches": "પાનાના શબ્દો મળતાં આવે છે",
        "notextmatches": "આ શબ્દ કોઈ પાનામાં મળ્યો નથી",
        "searchmenu-exists": "''' આ વિકિ પર  \"[[:$1]]\" નામે પાનું પહેલેથી અસ્તિત્વમાં છે.'''",
        "searchmenu-new": "<strong>આ વિકિ પર \"[[:$1]]\" પાનું બનાવો!</strong> {{PLURAL:$2|0=|તમારી શોધમાં મળેલ પાનું પણ જુઓ.|તમારી શોધમાં મળેલ પરિણામો પણ જુઓ.}}",
        "searchprofile-articles": "લેખનું પાનું",
-       "searchprofile-project": "મદદ અને યોજના પાનું",
        "searchprofile-images": "દ્રશ્ય શ્રાવ્ય માધ્યમ",
        "searchprofile-everything": "દરેકમાં શોધો",
        "searchprofile-advanced": "ઉચ્ચ",
        "searchprofile-articles-tooltip": "$1 માં શોધો",
-       "searchprofile-project-tooltip": "$1માં શોધો",
        "searchprofile-images-tooltip": "ફાઇલ શોધો",
        "searchprofile-everything-tooltip": "બધે જ શોધો (ચર્ચાનાં પાના સહિત)",
        "searchprofile-advanced-tooltip": "સ્થાનીય નામસ્થળોમાં શોધો:",
        "search-interwiki-default": "$1 માંથી પરીણામો:",
        "search-interwiki-more": "(વધુ)",
        "search-relatedarticle": "શોધ સંબંધિત",
-       "searcheverything-enable": "નામસ્થળોમાં શોધો:",
        "searchrelated": "શોધ સંબંધિત",
        "searchall": "બધા",
        "showingresults": " {{PLURAL:$1|'''1''' પરિણામ|'''$1''' પરિણામો}} સુધી #'''$2''' થી શરૂ  કરી",
        "allowemail": "અન્ય સભ્યો તરફથી આવતા ઇ-મેલને પરવાનગી આપો",
        "prefs-searchoptions": "શોધો",
        "prefs-namespaces": "નામ અવકાશો",
-       "defaultns": "અન્યથા આ નામ અવકાશ માં શોધો",
        "default": "મૂળ વિકલ્પ",
        "prefs-files": "ફાઇલ",
        "prefs-custom-css": "ખાસ  CSS",
        "prefs-emailconfirm-label": "ઇ-મેલ પુષ્ટી",
        "youremail": "ઇ-મેઇલ:",
        "username": "{{GENDER:$1|સભ્યનામ}}:",
-       "uid": "{{GENDER:$1|સભ્ય}} ઓળખ:",
        "prefs-memberingroups": "{{PLURAL:$1|સમુહ|સમુહો}}ના {{GENDER:$2|સભ્ય}}:",
        "prefs-registration": "નોંધણી સમય",
        "yourrealname": "સાચું નામ:",
        "recentchanges-label-unpatrolled": "આ ફેરફાર હજી ચકાસાયો નથી",
        "recentchanges-label-plusminus": "પાનાનું કદ આપેલા અંકો જેટલાં બાઈટ્સ જેટલું બદલ્યુ છે.",
        "recentchanges-legend-heading": "'''કળ:'''",
-       "recentchanges-legend-newpage": "([[Special:NewPages|નવા પાનાઓની યાદી]] પણ જુઓ)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|નવા પાનાઓની યાદી]] પણ જુઓ)",
        "rcnotefrom": "નીચે <strong>$2</strong> થી ફેરફારો દર્શાવેલ છે (<strong>$1</strong> સુધી દર્શાવલે છે).",
        "rclistfrom": "$3 $2 બાદ થયેલા નવા ફેરફારો બતાવો",
        "rcshowhideminor": "નાના ફેરફારો $1",
        "log-title-wildcard": "આ શબ્દો દ્વારા શરૂ થનાર શીર્ષકો શોધો",
        "showhideselectedlogentries": "પસંદગીની લોગ નોંધણીઓ બતાવો/છૂપાવો",
        "allpages": "બધા પાના",
-       "alphaindexline": "$1 થી $2",
        "nextpage": "આગળનું પાનું ($1)",
        "prevpage": "પાછળનું પાનું ($1)",
        "allpagesfrom": "આનાથી શરૂ થતા પાના દર્શાવો:",
index 63e467b..718610d 100644 (file)
@@ -9,7 +9,8 @@
                        "Mnemonic kek",
                        "Urhixidur",
                        "Xiaomingyan",
-                       "아라"
+                       "아라",
+                       "Mywood"
                ]
        },
        "tog-underline": "鏈接加底線:",
        "qbmyoptions": "𠊎嘅頁面",
        "faq": "常見問題解答",
        "faqpage": "Project:常見問題解答",
-       "vector-action-addsection": "加入話題",
-       "vector-action-delete": "刪除",
-       "vector-action-move": "移動",
-       "vector-action-protect": "保護",
-       "vector-action-undelete": "恢復",
-       "vector-action-unprotect": "更改保護",
-       "vector-view-create": "建立",
-       "vector-view-edit": "編寫",
-       "vector-view-history": "查看歷史",
-       "vector-view-view": "閱讀",
-       "vector-view-viewsource": "查看源碼",
        "actions": "動作",
        "namespaces": "名字空間",
        "variants": "變換",
        "history_short": "歷史",
        "updatedmarker": "亻厓上擺訪問以來嘅更新",
        "printableversion": "做得印刷嘅版本",
-       "permalink": "永久鏈接",
+       "permalink": "固定連結",
        "print": "印刷",
        "view": "查看",
        "edit": "編寫",
        "last": "上一隻",
        "page_first": "最早",
        "page_last": "最尾",
-       "histlegend": "差別選擇:標記愛比較修訂版本嘅單選按鈕並點擊底部嘅按鈕進行比較。<br />\n說明:'''({{int:cur}})''' 指撈最新修訂版本比較,'''({{int:last}})''' 指撈上隻修訂版本比較,'''{{int:minoreditletter}}''' = 細微修改。",
+       "histlegend": "差別選擇:標記愛比較版本嘅單選按鈕並點擊底部嘅按鈕進行比較。<br />\n說明:'''({{int:cur}})''' 指撈最新版本比較,'''({{int:last}})''' 指撈上隻版本比較,'''{{int:minoreditletter}}''' = 細微修改。",
        "history-fieldset-title": "瀏覽歷史",
        "history-show-deleted": "單淨係已刪除嘅",
        "histfirst": "最早",
        "searchmenu-exists": "'''在邇隻wiki上已經有一頁喊做“[[:$1]]”。'''",
        "searchmenu-new": "'''在本wiki上建立邇隻頁面“[[:$1]]”!'''",
        "searchprofile-articles": "內容頁面",
-       "searchprofile-project": "幫助撈計劃頁面",
        "searchprofile-images": "多媒體",
        "searchprofile-everything": "全部",
        "searchprofile-advanced": "高級",
        "searchprofile-articles-tooltip": "在$1肚搜尋",
-       "searchprofile-project-tooltip": "在$1肚搜尋",
        "searchprofile-images-tooltip": "搜尋文件",
        "searchprofile-everything-tooltip": "搜索全部(包括討論頁面)",
        "searchprofile-advanced-tooltip": "在用戶安名空間肚搜尋",
        "servertime": "Fu̍k-vu hi-khí sṳ̀-kiên",
        "guesstimezone": "從瀏覽器填寫",
        "allowemail": "接受來自其他用戶嘅郵件",
-       "defaultns": "Yi-sat sêu-sok ke miàng-sṳ khûng-kiên:",
        "default": "默認",
        "prefs-files": "文件",
        "youremail": "電子郵件:",
        "username": "Yung-fu miàng-chhṳ̂n:",
-       "uid": "Yung-fu ID:",
        "yourrealname": "真名:",
        "yourlanguage": "語言:",
        "yourvariant": "Sṳ-thí pien-von:",
        "logempty": "在日誌肚無匹配項。",
        "log-title-wildcard": "搜尋以邇隻文字開頭嘅標題",
        "allpages": "全部頁面",
-       "alphaindexline": "$1到$2",
        "nextpage": "下一頁($1)",
        "prevpage": "上一頁($1)",
        "allpagesfrom": "顯示從邇處開始嘅頁面:",
        "tooltip-t-upload": "上傳文件",
        "tooltip-t-specialpages": "全部特殊文章嘅列表",
        "tooltip-t-print": "本頁面做得打印嘅版本",
-       "tooltip-t-permalink": "邇隻頁面修訂版本嘅永久鏈接",
+       "tooltip-t-permalink": "邇隻頁面版本嘅固定連結",
        "tooltip-ca-nstab-main": "查看內容頁",
        "tooltip-ca-nstab-user": "查看用戶頁面",
        "tooltip-ca-nstab-media": "Chhà-khon hìn-thí-chông",
        "tooltip-save": "保存汝嘅修改",
        "tooltip-preview": "預覽汝嘅編寫,請先使用本功能後再保存!",
        "tooltip-diff": "展示汝對頁面嘅貢獻",
-       "tooltip-compareselectedversions": "查看本頁分點選嘅兩個修訂版本間嘅差別",
+       "tooltip-compareselectedversions": "查看本頁分點選嘅兩個版本間嘅差別",
        "tooltip-watch": "加邇頁入監視列表",
        "tooltip-recreate": "Chhùng-kien ke-vùn-chông, mò-lun he-feu pûn chhù-chhîn",
        "tooltip-rollback": "撳“打轉頭”恢復上一位貢獻人對本頁面嘅編寫",
        "tooltip-undo": "“撤銷”做得在編寫模式上開啟編輯寫表格來方便復原。其允許在摘要肚加入原因。",
        "tooltip-summary": "輸入一條簡短嘅摘要",
        "common.css": "/* Chhṳ́-chhu ke CSS chiông-chhiu yin-yung chhai só-yû ke mien-pán */",
-       "monobook.css": "/* Chhṳ́-chhu ke CSS chiông-voi yáng-hióng sṳ́-yung Monobook mien-pán ke yung-fu */",
        "common.js": "/* Chhṳ́-chhu ke JavaScript chiông chai-ngi̍p yî só-yû ying-fu mî yit-ke vùn-chông. */",
-       "monobook.js": "/* Yí-kîn put-chai sṳ́-yung; chhiáng-yung [[MediaWiki:common.js]] */",
        "anonymous": "{{SITENAME}} ke ngia̍k-miàng yung-fu",
        "siteuser": "{{SITENAME}} Yung-fu-chá $1",
        "lastmodifiedatby": "Chhṳ́-chông yù $3 yî $1 $2 ke chui-heu kiên-kói.",
index ebf5c18..f33218c 100644 (file)
        "qbmyoptions": "האפשרויות שלי",
        "faq": "שאלות ותשובות",
        "faqpage": "Project:שאלות ותשובות",
-       "vector-action-addsection": "הוספת נושא",
-       "vector-action-delete": "מחיקה",
-       "vector-action-move": "העברה",
-       "vector-action-protect": "הגנה",
-       "vector-action-undelete": "ביטול מחיקה",
-       "vector-action-unprotect": "שינוי הגנה",
-       "vector-view-create": "יצירה",
-       "vector-view-edit": "עריכה",
-       "vector-view-history": "הצגת היסטוריה",
-       "vector-view-view": "קריאה",
-       "vector-view-viewsource": "הצגת מקור",
        "actions": "פעולות",
        "namespaces": "מרחבי שם",
        "variants": "גרסאות שפה",
        "viewpagelogs": "הצגת יומנים עבור דף זה",
        "nohistory": "אין היסטוריית שינויים עבור דף זה.",
        "currentrev": "גרסה אחרונה",
-       "currentrev-asof": "גרסה אחרונה מתאריך $1",
-       "revisionasof": "גרסה מתאריך $1",
-       "revision-info": "גרסה מתאריך $1 מאת $2",
+       "currentrev-asof": "גרסה אחרונה מ־$1",
+       "revisionasof": "גרסה מ־$1",
+       "revision-info": "גרסה מ־$1 מאת {{GENDER:$6|$2}}$7",
        "previousrevision": "→ הגרסה הקודמת",
        "nextrevision": "הגרסה הבאה ←",
        "currentrevisionlink": "הגרסה האחרונה",
        "mergehistory-empty": "אין גרסאות למיזוג.",
        "mergehistory-success": "{{PLURAL:$3|גרסה אחת|$3 גרסאות}} של [[:$1]] מוזגו בהצלחה לתוך [[:$2]].",
        "mergehistory-fail": "לא ניתן לבצע את מיזוג הגרסאות, אנא בדקו שנית את הגדרות הדף והזמן.",
+       "mergehistory-fail-toobig": "לא ניתן לבצע את מיזוג הגרסאות כיוון שצריך להעביר יותר גרסאות מהמגבלה, שהיא {{PLURAL:$1|גרסה אחת|‏‏֫$1 גרסאות}}.",
        "mergehistory-no-source": "דף המקור $1 אינו קיים.",
        "mergehistory-no-destination": "דף היעד $1 אינו קיים.",
        "mergehistory-invalid-source": "דף המקור חייב להיות בעל כותרת תקינה.",
        "difference-missing-revision": "{{PLURAL:$2|גרסה אחת|$2 גרסאות}} של ההבדל הזה בין שתי גרסאות ($1) {{PLURAL:$2|לא נמצאה|לא נמצאו}}.\n\nזה נגרם בדרך כלל על־ידי לחיצה על קישור ישן להבדל בין גרסאות של דף שנמחק.\nאפשר למצוא פרטים ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
        "searchresults": "תוצאות החיפוש",
        "searchresults-title": "תוצאות החיפוש \"$1\"",
-       "toomanymatches": "יותר מדי תוצאות נמצאו, נא לנסות מילות חיפוש אחרות",
        "titlematches": "כותרות דפים תואמות",
        "textmatches": "דפים עם תוכן תואם",
        "notextmatches": "אין דפים עם תוכן תואם",
        "search-interwiki-default": "תוצאות מ{{GRAMMAR:תחילית|$1}}:",
        "search-interwiki-more": "(עוד)",
        "search-relatedarticle": "קשור",
-       "searcheverything-enable": "חיפוש בכל מרחבי השם",
        "searchrelated": "קשור",
        "searchall": "הכול",
        "showingresults": "{{PLURAL:$1|מוצגת תוצאה <strong>אחת</strong>|מוצגות עד <strong>$1</strong> תוצאות}} החל ממספר <strong>$2</strong>:",
        "powersearch-togglelabel": "בחירה:",
        "powersearch-toggleall": "הכול",
        "powersearch-togglenone": "אף אחד",
+       "powersearch-remember": "שמירת הבחירה עבור חיפושים עתידיים",
        "search-external": "חיפוש חיצוני",
        "searchdisabled": "חיפוש ב{{grammar:תחילית|{{SITENAME}}}} אינו מופעל כעת.\nבינתיים אפשר לחפש באמצעות גוגל.\nשימו לב שייתכן שהמידע של {{SITENAME}} שם אינו מעודכן.",
        "search-error": "אירעה שגיאה במהלך החיפוש: $1",
        "allowemail": "קבלת דוא\"ל ממשתמשים אחרים",
        "prefs-searchoptions": "חיפוש",
        "prefs-namespaces": "מרחבי שם",
-       "defaultns": "אחרת, החיפוש יתבצע במרחבי השם הבאים:",
        "default": "ברירת מחדל",
        "prefs-files": "קבצים",
        "prefs-custom-css": "קובץ CSS מותאם אישית",
        "recentchanges-label-unpatrolled": "עריכה זו טרם נבדקה",
        "recentchanges-label-plusminus": "גודל הדף השתנה במספר זה של בתים",
        "recentchanges-legend-heading": "'''מקרא:'''",
-       "recentchanges-legend-newpage": "(ראו גם [[Special:NewPages|רשימת דפים חדשים]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ראו גם [[Special:NewPages|רשימת דפים חדשים]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "להלן השינויים שבוצעו החל מ‏‏֫־<b>$2</b> (עד <b>$1</b> מוצגים).",
        "rclistfrom": "הצגת שינויים חדשים החל מ־$2, $3",
        "largefileserver": "גודל הקובץ חורג ממגבלת השרת.",
        "emptyfile": "נראה שהקובץ שהעליתם ריק. ייתכן שהסיבה לכך היא שגיאת הקלדה בשם הקובץ. אנא ודאו שזהו הקובץ שברצונכם להעלות.",
        "windows-nonascii-filename": "אתר ויקי זה אינו תומך בשמות קבצים עם תווים מיוחדים או תווים שאינם באנגלית.",
-       "fileexists": "קובץ בשם זה כבר קיים, אנא בדקו את <strong>[[:$1]]</strong> אם אינכם בטוחים שברצונכם להחליף אותו.\n[[$1|thumb]]",
+       "fileexists": "ק×\95×\91×¥ ×\91ש×\9d ×\94×\96×\94 ×\9b×\91ר ×§×\99×\99×\9d, ×\90× ×\90 ×\91×\93ק×\95 ×\90ת <strong>[[:$1]]</strong> ×\90×\9d ×\90×\99× ×\9b×\9d ×\91×\98×\95×\97×\99×\9d ×©×\91רצ×\95× ×\9b×\9d ×\9c×\94×\97×\9c×\99×£ ×\90×\95ת×\95.\n[[$1|thumb]]",
        "filepageexists": "דף תיאור הקובץ עבור קובץ זה כבר נוצר ב<strong>[[:$1]]</strong>, אך לא קיים קובץ בשם זה.\nתיאור הקובץ שתכתבו לא יופיע בדף תיאור הקובץ.\nכדי לגרום לו להופיע שם, יהיה עליכם לערוך אותו ידנית. [[$1|thumb]]",
-       "fileexists-extension": "ק×\95×\91×¥ ×¢×\9d ×©×\9d ×\93×\95×\9e×\94 ×\9b×\91ר ×§×\99×\99×\9d: [[$2|thumb]]\n* ×©×\9d ×\94ק×\95×\91×¥ ×\94×\9e×\95×¢×\9c×\94: <strong>[[:$1]]</strong>\n* ×©×\9d ×\94ק×\95×\91×¥ ×\94ק×\99×\99×\9d: <strong>[[:$2]]</strong>\n×\90× ×\90 ×\91×\97ר×\95 ×©×\9d ×\90×\97ר.",
+       "fileexists-extension": "ק×\95×\91×¥ ×¢×\9d ×©×\9d ×\93×\95×\9e×\94 ×\9b×\91ר ×§×\99×\99×\9d: [[$2|thumb]]\n* ×©×\9d ×\94ק×\95×\91×¥ ×\94×\9e×\95×¢×\9c×\94: <strong>[[:$1]]</strong>\n* ×©×\9d ×\94ק×\95×\91×¥ ×\94ק×\99×\99×\9d: <strong>[[:$2]]</strong>\n×\90×\95×\9c×\99 ×\9b×\93×\90×\99 ×\9cתת ×\9cק×\95×\91×¥ ×©×\9d ×¡×¤×¦×\99פ×\99 ×\99×\95תר?",
        "fileexists-thumbnail-yes": "הקובץ הוא כנראה תמונה מוקטנת (ממוזערת). [[$1|thumb]]\nאנא בדקו את הקובץ <strong>[[:$1]]</strong>.\nאם הקובץ שבדקתם הוא אותה התמונה בגודל מקורי, אין זה הכרחי להעלות גם תמונה ממוזערת.",
        "file-thumbnail-no": "שם הקובץ מתחיל עם <strong>$1</strong>. נראה שזוהי תמונה מוקטנת (ממוזערת).\nאם התמונה בגודל מלא מצויה ברשותכם, אנא העלו אותה ולא את התמונה הממוזערת; אחרת, אנא שנו את שם הקובץ.",
        "fileexists-forbidden": "קובץ בשם זה כבר קיים, ואינכם יכולים להחליף אותו.\nאם אתם עדיין מעוניינים להעלות קובץ זה, אנא חזרו לדף הקודם והעלו את הקובץ תחת שם חדש.\n[[File:$1|thumb|center|$1]]",
        "filehist-current": "נוכחית",
        "filehist-datetime": "תאריך/שעה",
        "filehist-thumb": "תמונה ממוזערת",
-       "filehist-thumbtext": "תמונה ממוזערת לגרסה מתאריך $1",
+       "filehist-thumbtext": "תמונה ממוזערת לגרסה מ־$1",
        "filehist-nothumb": "אין תמונה ממוזערת",
        "filehist-user": "משתמש",
        "filehist-dimensions": "ממדים",
        "filedelete-maintenance": "אפשרות המחיקה והשחזור של קבצים מבוטלת זמנית עקב פעולת תחזוקה.",
        "filedelete-maintenance-title": "לא ניתן למחוק את הקובץ",
        "mimesearch": "חיפוש MIME",
-       "mimesearch-summary": "×\93×£ ×\96×\94 ×\9e×\90פשר ×\90ת ×¡×\99× ×\95×\9f ×\94ק×\91צ×\99×\9d ×\9cפ×\99 ×¡×\95×\92 ×\94Ö¾MIME ×©×\9c×\94×\9d.\nס×\95×\92 ×\94Ö¾MIME ×\91× ×\95×\99 ×\91צ×\95ר×\94 \"ס×\95×\92 ×ª×\95×\9b×\9f/ס×\95×\92 ×\9eשנ×\99\", ×\9c×\93×\95×\92×\9e×\94 <code>image/jpeg</code>.",
+       "mimesearch-summary": "×\93×£ ×\96×\94 ×\9e×\90פשר ×\9cסנ×\9f ×§×\91צ×\99×\9d ×\9cפ×\99 ×¡×\95×\92 ×\94Ö¾MIME ×©×\9c×\94×\9d.\nק×\9c×\98: contenttype/subtype ×\90×\95 <span dir=\"ltr\">contenttype/*</span>, ×\9c×\9eש×\9c <code>image/jpeg</code>.",
        "mimetype": "סוג MIME:",
        "download": "הורדה",
        "unwatchedpages": "דפים שאינם במעקב",
        "wantedtemplates": "תבניות מבוקשות",
        "mostlinked": "הדפים המקושרים ביותר",
        "mostlinkedcategories": "הקטגוריות המקושרות ביותר",
-       "mostlinkedtemplates": "×\94ת×\91× ×\99×\95ת ×\94×\9eק×\95שר×\95ת ביותר",
+       "mostlinkedtemplates": "×\94×\93פ×\99×\9d ×\94×\9e×\95×\9b×\9c×\9c×\99×\9d ביותר",
        "mostcategories": "הדפים עם המספר הרב ביותר של קטגוריות",
        "mostimages": "הקבצים המקושרים ביותר",
        "mostinterwikis": "הדפים עם המספר הרב ביותר של קישורי בינוויקי",
        "tooltip-preferences-save": "שמירת ההעדפות",
        "tooltip-summary": "להכנסת תקציר קצר",
        "common.css": "/* הסגנונות הנכתבים כאן ישפיעו על כל העיצובים */",
-       "monobook.css": "/* הסגנונות הנכתבים כאן ישפיעו על העיצוב MonoBook בלבד */",
-       "vector.css": "/* הסגנונות הנכתבים כאן ישפיעו על העיצוב Vector בלבד */",
        "print.css": "/* הסגנונות הנכתבים כאן ישפיעו על הפלט בהדפסה בלבד */",
        "noscript.css": "/* הסגנונות הנכתבים כאן ישפיעו על משתמשים עם JavaScript מבוטל */",
        "group-autoconfirmed.css": "/* הסגנונות הנכתבים כאן ישפיעו על משתמשים ותיקים בלבד */",
        "group-sysop.css": "/* הסגנונות הנכתבים כאן ישפיעו על מפעילי מערכת בלבד */",
        "group-bureaucrat.css": "/* הסגנונות הנכתבים כאן ישפיעו על ביורוקרטים בלבד */",
        "common.js": "/* כל סקריפט JavaScript שנכתב כאן ירוץ עבור כל המשתמשים בכל טעינת עמוד */",
-       "monobook.js": "/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב Monobook */",
-       "vector.js": "/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב Vector */",
        "group-autoconfirmed.js": "/* כל סקריפט JavaScript שנכתב כאן ירוץ עבור משתמשים ותיקים בלבד */",
        "group-user.js": "/* כל סקריפט JavaScript שנכתב כאן ירוץ עבור משתמשים רשומים בלבד */",
        "group-bot.js": "/* כל סקריפט JavaScript שנכתב כאן ירוץ עבור בוטים בלבד */",
        "pageinfo-category-pages": "מספר הדפים",
        "pageinfo-category-subcats": "מספר קטגוריות המשנה",
        "pageinfo-category-files": "מספר הקבצים",
-       "skinname-monobook": "מונובוק",
-       "skinname-vector": "וקטור",
        "markaspatrolleddiff": "סימון השינוי כבדוק",
        "markaspatrolledtext": "סימון דף זה כבדוק",
        "markedaspatrolled": "השינוי סומן כבדוק",
        "version-hook-name": "שם ה־Hook",
        "version-hook-subscribedby": "הפונקציה הרושמת",
        "version-version": "($1)",
+       "version-no-ext-name": "[ללא שם]",
        "version-license": "רישיון עבור מדיה־ויקי",
        "version-ext-license": "רישיון",
        "version-ext-colheader-name": "הרחבה",
index 5aea0f6..2b9ef85 100644 (file)
        "qbmyoptions": "मेरे पृष्ठ",
        "faq": "बहुधा पूछे प्रश्न",
        "faqpage": "Project:अक्सर पूछे जाने वाले सवाल",
-       "vector-action-addsection": "विषय जोड़ें",
-       "vector-action-delete": "हटाएँ",
-       "vector-action-move": "स्थानांतरण करें",
-       "vector-action-protect": "सुरक्षित करें",
-       "vector-action-undelete": "हटाना वापस लें",
-       "vector-action-unprotect": "सुरक्षा बदलें",
-       "vector-view-create": "बनाएँ",
-       "vector-view-edit": "सम्पादन",
-       "vector-view-history": "इतिहास देखें",
-       "vector-view-view": "पढ़ें",
-       "vector-view-viewsource": "स्रोत देखें",
        "actions": "क्रियाएँ",
        "namespaces": "नामस्थान",
        "variants": "संस्करण",
        "difference-missing-revision": "इस अंतर {{PLURAL:$2|का एक अवतरण|के $2 अवतरण}} ($1) नहीं {{PLURAL:$2|पाया गया|पाए गए}}।\n\nयह आम तौर पर एक हटाए गए पृष्ठ के अवतरणों में अंतर ढूँढने पर होता है। अधिक जानकारी [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} हटाने के लॉग] में पायी जा सकती है।",
        "searchresults": "खोज परिणाम",
        "searchresults-title": "\"$1\" के लिए खोज परिणाम",
-       "toomanymatches": "अत्यधिक जवाब मिले हैं, कृपया खोजशब्द बदलें",
        "titlematches": "पृष्ठ शीर्षक मिलान",
        "textmatches": "पृष्ठ पाठ मिलान",
        "notextmatches": "किसी भी पृष्ठ में यह सामग्री नहीं मिली",
        "searchmenu-exists": "'''इस विकि पर \"[[:$1]]\" नाम का एक पृष्ठ है'''",
        "searchmenu-new": "<strong>इस विकि पर \"[[:$1]]\" नाम का पृष्ठ बनाएँ!</strong>{{PLURAL:$2|0=|आपकी खोज से मिला पृष्ठ भी देखें।|खोज परिणाम भी देखें।}}",
        "searchprofile-articles": "सामग्री पृष्ठ",
-       "searchprofile-project": "सहायता और परियोजना पृष्ठ",
        "searchprofile-images": "मल्टीमीडिया",
        "searchprofile-everything": "सब कुछ",
        "searchprofile-advanced": "उन्नत",
        "searchprofile-articles-tooltip": "$1 में खोजें",
-       "searchprofile-project-tooltip": "$1 में खोजें",
        "searchprofile-images-tooltip": "फ़ाइलें खोजें",
        "searchprofile-everything-tooltip": "(वार्ता पृष्ठों सहित) सारी सामग्री में खोजें",
        "searchprofile-advanced-tooltip": "विशेष नामस्थानों में खोजें",
        "search-interwiki-default": "$1 से परिणाम:",
        "search-interwiki-more": "(और)",
        "search-relatedarticle": "सम्बंधित",
-       "searcheverything-enable": "सभी नामस्थानों में खोजें",
        "searchrelated": "सम्बंधित",
        "searchall": "सभी",
        "showingresults": "नीचे क्रमांक '''$2''' से प्रारंभ कर के अधिकतम '''$1''' परिणाम {{PLURAL:$1|दिखाया गया है|दिखाए गए हैं}}।",
        "allowemail": "अन्य सदस्यों से ई-मेल सक्षम करें",
        "prefs-searchoptions": "खोज",
        "prefs-namespaces": "नामस्थान",
-       "defaultns": "अन्यथा इन नामस्थानों में खोजें:",
        "default": "डिफ़ॉल्ट",
        "prefs-files": "फ़ाइलें",
        "prefs-custom-css": "खासमखास सी॰एस॰एस",
        "prefs-emailconfirm-label": "ई-मेल पुष्टिकरण:",
        "youremail": "आपका ई-मेल पता:",
        "username": "{{GENDER:$1|सदस्यनाम}}:",
-       "uid": "{{GENDER:$1|सदस्य}} क्रमांक:",
        "prefs-memberingroups": "निम्नलिखित {{PLURAL:$1|समूह|समूहों}} के {{GENDER:$2|सदस्य}}:",
        "prefs-registration": "पंजीकरण समय:",
        "yourrealname": "वास्तविक नाम:",
        "recentchanges-label-unpatrolled": "यह संपादन अभी जाँचा नहीं गया है",
        "recentchanges-label-plusminus": "पृष्ठ आकार इस बाइट संख्या से बदला",
        "recentchanges-legend-heading": "'''कुंजी:'''",
-       "recentchanges-legend-newpage": "([[Special:NewPages|नए पन्नों की सूची]] को भी देखें)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नए पन्नों की सूची]] को भी देखें)",
        "rcnotefrom": "नीचे <strong>$2</strong> के बाद से (<strong>$1</strong> तक) हुए बदलाव दर्शाए गये हैं।",
        "rclistfrom": "$3 $2 से नये बदलाव दिखाएँ",
        "rcshowhideminor": "छोटे बदलाव $1",
        "log-title-wildcard": "इस पाठ से शुरू होने वाले शीर्षक खोजें",
        "showhideselectedlogentries": "चयनित लॉग प्रविष्टियाँ दिखाएँ/छुपाएँ",
        "allpages": "सभी पृष्ठ",
-       "alphaindexline": "$1 से $2",
        "nextpage": "अगला पृष्ठ ($1)",
        "prevpage": "पिछला पृष्ठ ($1)",
        "allpagesfrom": "इस अक्षर से आरंभ होने वाले पृष्ठ दर्शाएँ:",
        "tooltip-preferences-save": "वरीयताएं सहेजें",
        "tooltip-summary": "एक संक्षिप्त सारांश दर्ज करें",
        "common.css": "/* यहां रखी css सभी त्वचाओंपर असर करेगी */",
-       "monobook.css": "/* यहां रखी गई css मोनोबुक त्वचा का इस्तेमाल करने वाले सभी सदस्योंपर असर करेगी */",
        "common.js": "/* यहां लिखी गई जावास्क्रीप्ट सभी सदस्योंके लिये इस्तेमाल में लाई जायेगी। */",
-       "monobook.js": "/* यहाँ पर दी गई जावास्क्रिप्ट मोनोबुक त्वचा का प्रयोग कर रहे सदस्यों के लिए लोड होगी */",
        "anonymous": "{{SITENAME}} के {{PLURAL:$1||}} बेनामी सदस्य",
        "siteuser": "विकिपीडिया सदस्य  $1",
        "anonuser": "{{SITENAME}} अज्ञात उपयोगकर्ता $1",
index caa8d29..fda5f14 100644 (file)
@@ -9,7 +9,8 @@
                        "Kaganer",
                        "Malafaya",
                        "Thakurji",
-                       "아라"
+                       "아라",
+                       "Soul Train"
                ]
        },
        "tog-underline": "Jorr ke niche line khicho:",
        "searchmenu-exists": "'''Ii wiki me \"[[$1]]\" naam ke panna hai'''",
        "searchmenu-new": "'''Ii wiki me \"[[:$1]]\" panna ke banao!'''",
        "searchprofile-articles": "Content panna",
-       "searchprofile-project": "Madat aur Project panna",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Sab chij",
        "searchprofile-advanced": "Anbhawi",
        "searchprofile-articles-tooltip": "$1 me khojo",
-       "searchprofile-project-tooltip": "$1 me khojo",
        "searchprofile-images-tooltip": "File ke khojo",
        "searchprofile-everything-tooltip": "Sab content me khojo (baat waala panna bhi)",
        "searchprofile-advanced-tooltip": "Custom namespaces me khojo",
        "search-interwiki-default": "$1 ke result:",
        "search-interwiki-more": "(aur)",
        "search-relatedarticle": "sambandh rakkhe hai",
-       "searcheverything-enable": "Sab namespaces me khojo",
        "searchrelated": "sambhand rakkhe hai",
        "searchall": "sab",
        "showingresults": "Niche dekhae hai {{PLURAL:$1|'''1''' result|'''$1''' results}} #'''$2''' se suruu hoe ke.",
        "allowemail": "Aur sadasya se e-mail enable karo",
        "prefs-searchoptions": "Khojo",
        "prefs-namespaces": "Naam:",
-       "defaultns": "Default se ii namespaces me khojo:",
        "default": "baaki",
        "prefs-files": "File ke naam",
        "prefs-custom-css": "CSS ke aapan khatir badlo",
        "prefs-emailconfirm-label": "E-mail ke confirm karaa jaawe hai:",
        "youremail": "E-mail:",
        "username": "{{GENDER:$1|Sadasya ke naam}}:",
-       "uid": "{{GENDER:$1|Sadasya}} ID:",
        "prefs-memberingroups": "{{PLURAL:$1|group|groups}} ke {{GENDER:$2|Member}}:",
        "prefs-registration": "Registration kare ke time:",
        "yourrealname": "Asli naam:",
        "grouppage-user": "{{ns:project}}:Sadasya",
        "grouppage-autoconfirmed": "{{ns:project}}:Autoconfirmed sadasya",
        "grouppage-bot": "{{ns:project}}:Bots",
-       "grouppage-sysop": "{{ns:project}}:Administrators",
+       "grouppage-sysop": "{{ns:project}}:Администраторар",
        "grouppage-bureaucrat": "{{ns:project}}:Bureaucrats",
        "grouppage-suppress": "{{ns:project}}:Oversight",
        "right-read": "Panna ke parrho",
        "log-title-wildcard": "Ii text se suruu hoe waala titles ke khojo",
        "showhideselectedlogentries": "Dekhao/lukao chuna gais log entries",
        "allpages": "Sab panna",
-       "alphaindexline": "$1 se $2",
        "nextpage": "Aglaa panna ($1)",
        "prevpage": "Pichhla panna ($1)",
        "allpagesfrom": "Panna dekhae ke suruu karo hian se:",
index d0e5a97..568b852 100644 (file)
        "qbmyoptions": "Moje stranice",
        "faq": "Najčešća pitanja",
        "faqpage": "Project:FAQ",
-       "vector-action-addsection": "Dodaj temu",
-       "vector-action-delete": "Izbriši",
-       "vector-action-move": "Premjesti",
-       "vector-action-protect": "Zaštiti",
-       "vector-action-undelete": "Vrati",
-       "vector-action-unprotect": "Promijeni zaštitu",
-       "vector-view-create": "Započni",
-       "vector-view-edit": "Uredi",
-       "vector-view-history": "Vidi stare izmjene",
-       "vector-view-view": "Čitaj",
-       "vector-view-viewsource": "Vidi izvor",
        "actions": "Radnje",
        "namespaces": "Imenski prostori",
        "variants": "Inačice",
        "nstab-media": "Mediji",
        "nstab-special": "Posebna stranica",
        "nstab-project": "Stranica o projektu",
-       "nstab-image": "Slika",
+       "nstab-image": "Datoteka",
        "nstab-mediawiki": "Poruka",
        "nstab-template": "Predložak",
        "nstab-help": "Pomoć",
        "user-mail-no-addy": "Pokušaj slanja e-maila bez e-mail adrese.",
        "user-mail-no-body": "Pokušali ste poslati e-mail bez sadržaja ili s prekratkim sadržajem.",
        "changepassword": "Promjena lozinke",
-       "resetpass_announce": "Prijavljeni ste s privremenom lozinkom. Da završite proces mijenjanja lozinke, upišite ovdje novu lozinku:",
+       "resetpass_announce": "Da biste završili proces mijenjanja lozinke, upišite \nnovu lozinku.",
        "resetpass_header": "Promijeni lozinku računa",
        "oldpassword": "Stara lozinka",
        "newpassword": "Nova lozinka",
        "resetpass-abort-generic": "Poništena je promjena zaporke.",
        "passwordreset": "Ponovno postavi lozinku",
        "passwordreset-text-one": "Ispunite ovaj obrazac ako želite ponovno postaviti Vašu zaporku.",
-       "passwordreset-text-many": "{{PLURAL:$1|Ispunite jedno od polja za ponovno postavljanje Vaše zaporke.}}",
+       "passwordreset-text-many": "{{PLURAL:$1|Ispunite jedno od polja da biste dobili privremenu zaporku e-poštom.}}",
        "passwordreset-legend": "Poništi lozinku",
        "passwordreset-disabled": "Poništavanje lozinke je onemogućeno na ovom wikiju.",
        "passwordreset-emaildisabled": "Funkcija e-pošte je onemogućena na ovom wikiju.",
        "passwordreset-emailelement": "Suradničko ime: $1\nPrivremena lozinka: $2",
        "passwordreset-emailsent": "E-mail podsjetnik zaporke je poslan.",
        "passwordreset-emailsent-capture": "Poslan Vam je podsjetnik kao e-pošta (tekst je prikazan dolje).",
-       "passwordreset-emailerror-capture": "Napravljen je podsjetnik za slanje e-pošte (prikazan dolje), ali njegovo slanje nije uspjelo: $1",
+       "passwordreset-emailerror-capture": "Napravljena je e-poruka za ponovno postavljanje zaporke (prikazana ispod), ali njeno slanje suradniku nije uspjelo: $1",
        "changeemail": "Promijeni e-mail adresu",
        "changeemail-header": "Promijeni e-mail adresu računa",
        "changeemail-text": "Za promjenu e-mail adrese popunite ovaj obrazac. Morat ćete unijeti svoju lozinku da potvrdite ovu promjenu.",
        "edit-gone-missing": "Stranica nije spremljena.\nČini se kako je obrisana.",
        "edit-conflict": "Sukob uređivanja.",
        "edit-no-change": "Vaše uređivanje je zanemareno, jer nikakva promjena sadržaja nije napravljena.",
+       "postedit-confirmation-created": "Stranica je stvorena.",
        "postedit-confirmation-saved": "Vaše je uređivanje sačuvano.",
        "edit-already-exists": "Neuspješno stvaranje nove stranice.\nStranica već postoji.",
        "defaultmessagetext": "Prvotni tekst poruke",
        "revdelete-no-file": "Navedena datoteka ne postoji.",
        "revdelete-show-file-confirm": "Jeste li sigurni da želite pregledati izbrisanu inačicu datoteke \"<nowiki>$1</nowiki>\" od $2 u $3?",
        "revdelete-show-file-submit": "Da",
+       "revdelete-selected-text": "{{PLURAL:$1|Označena izmjena|Označene izmjene}} stranice [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Označena inačica|Označene inačice}} datoteke [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Odabrani zapis u evidenciji|Odabrani zapisi u evidenciji}}:",
+       "revdelete-text-text": "Izbrisane izmjene će i dalje biti vidljive u povijesti stranice, ali dijelovi sadržaja neće biti vidljivi javno.",
+       "revdelete-text-others": "Ostali administratori na projektu {{SITENAME}} će moći vidjeti i vratiti izbrisani sadržaj na isti način, osim ako nisu postavljena dodatna ograničenja.",
        "revdelete-confirm": "Molimo potvrdite da namjeravate ovo učiniti, da razumijete posljedice i da to činite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].",
        "revdelete-suppress-text": "Sklanjanje uređivanja treba raditi '''iznimno''' u slijedećih par slučajeva:\n* Privatne informacije neprilične javnom mediju tipa\n*: ''kućna adresa i broj telefona, JMBG ili OIB, itd.''",
        "revdelete-legend": "Postavi ograničenja na izmjenu:",
        "difference-missing-revision": "{{PLURAL:$2|Uređivanje|$2 uređivanja}} sljedeće šifre ($1) ne {{PLURAL:$2|postoji|postoje}}.\n\nOvo je obično uzrokovano kada kliknete na zastarjelu poveznicu na stranice koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} evidenciji brisanja].",
        "searchresults": "Rezultati pretrage",
        "searchresults-title": "Rezultati traženja za \"$1\"",
-       "toomanymatches": "Preveliki broj rezultata, molimo probajte drukčiji upit",
        "titlematches": "Pronađene stranice prema naslovu",
        "textmatches": "Pronađene stranice prema tekstu članka",
        "notextmatches": "Nema pronađenih stranica prema tekstu članka",
        "search-interwiki-default": "$1 rezultati:",
        "search-interwiki-more": "(više)",
        "search-relatedarticle": "Povezano",
-       "searcheverything-enable": "Traži u svim imenskim prostorima",
        "searchrelated": "povezano",
        "searchall": "sve",
        "showingresults": "Dolje {{PLURAL:$1|je prikazan '''$1''' rezultat|su prikazana '''$1''' rezultata|je prikazano '''$1''' rezultata}}, počevši od '''$2'''.",
        "allowemail": "Omogući primanje e-maila od drugih suradnika",
        "prefs-searchoptions": "Način traženja",
        "prefs-namespaces": "Imenski prostori",
-       "defaultns": "Ako nije navedeno drugačije, traži u ovim prostorima:",
        "default": "prvotno",
        "prefs-files": "Datoteke",
        "prefs-custom-css": "Prilagođen CSS",
        "right-bot": "Izmjene su tretirane kao automatski proces (bot)",
        "right-nominornewtalk": "Bez manjih izmjena na novim stranicama za razgovor",
        "right-apihighlimits": "Korištenje viših granica kod API upita",
-       "right-writeapi": "Mogućnost pisanja API",
+       "right-writeapi": "Mogućnost pisanja API-ja",
        "right-delete": "Brisanje stranica",
        "right-bigdelete": "Brisanje stranica koje imaju veliku povijest",
        "right-deletelogentry": "Brisanje i vraćanje određenih zapisa u evidenciji",
        "right-block": "Blokiranje suradnika u uređivanju",
        "right-blockemail": "Blokiranje suradnika u slanju elektroničke pošte",
        "right-hideuser": "Blokiranje suradničkog imena, skrivajući ga od javnosti",
-       "right-ipblock-exempt": "Imunitet na IP blokiranje, auto-blok i blokiranje opsega",
-       "right-proxyunbannable": "Imunitet na automatska blokiranja posrednika (proxya)",
+       "right-ipblock-exempt": "Iznimka od blokiranja IP adresa, auto-bloka i blokiranja opsega",
+       "right-proxyunbannable": "Iznimka od automatskih blokiranja posrednika (proxya)",
        "right-unblockself": "Odblokirati se",
        "right-protect": "Mijenjanje razina zaštićivanja i uređivanje zaštićenih stranica",
        "right-editprotected": "Uređivanje zaštićenih stranica (bez prenosive zaštite)",
+       "right-editsemiprotected": "Uređivanje zaštićenih stranica kao \"{{int: zaštititi-nivo-autoconfirmed}}\"",
        "right-editinterface": "Uređivanje suradničkog sučelja",
        "right-editusercssjs": "Uređivanje CSS i JS stranica drugih suradnika",
        "right-editusercss": "Uređivanje CSS stranica drugih suradnika",
        "right-edituserjs": "Uređivanje JS stranica drugih suradnika",
+       "right-editmyusercss": "Uređivanje vlastitih CSS stranica",
+       "right-editmyuserjs": "Uređivanje vlastitih JavaScript stranica",
        "right-viewmywatchlist": "Pregled svojeg popisa praćenih stranica",
+       "right-editmywatchlist": "Uređivanje vlastitog popisa praćenja. Određenim djelovanjima moguće je dodavati stranice i bez ovoga dopuštenja.",
        "right-viewmyprivateinfo": "Vidite svoje privatne podatke (npr. adresu e-pošte, stvarno ime)",
        "right-editmyprivateinfo": "Uredite svoje privatne podatke (npr. adresa e-pošte, stvarno ime)",
        "right-editmyoptions": "Uredite svoje postavke",
        "uploadwarning": "Upozorenje kod postavljanja",
        "uploadwarning-text": "Molimo izmijenite opis datoteke ispod i pokušajte kasnije.",
        "savefile": "Sačuvaj datoteku",
-       "uploadedimage": "postavljeno \"$1\"",
+       "uploadedimage": "je postavio \"$1\"",
        "overwroteimage": "postavljena nova inačica od \"[[$1]]\"",
        "uploaddisabled": "Postavljanje je onemogućeno",
        "copyuploaddisabled": "Postavljanje URL-om onemogućeno.",
        "listgrouprights-removegroup-self": "Ukloni {{PLURAL:$2|skupinu|skupine}} iz vlastitog računa: $1",
        "listgrouprights-addgroup-self-all": "Dodaj sve skupine vlastitom računu",
        "listgrouprights-removegroup-self-all": "Uklonite sve skupine iz vlastitog računa",
+       "trackingcategories-nodesc": "Opis nije dostupan.",
        "mailnologin": "Nema adrese pošiljaoca",
        "mailnologintext": "Morate biti [[Special:UserLogin|prijavljeni]]\ni imati valjanu adresu e-pošte u svojim [[Special:Preferences|postavkama]]\nda bi mogli slati poštu drugim suradnicima.",
        "emailuser": "Pošalji mu e-poruku",
        "delete_and_move": "Izbriši i premjesti",
        "delete_and_move_text": "==Nužno brisanje==\n\nOdredišni članak \"[[:$1]]\" već postoji. Želite li ga obrisati da biste napravili mjesto za premještaj?",
        "delete_and_move_confirm": "Da, izbriši stranicu",
-       "delete_and_move_reason": "Obrisano kako bi se napravilo mjesta za premještaj, stari naziv \"[[$1]]\"",
+       "delete_and_move_reason": "obrisano kako bi se napravilo mjesto za premještaj, stari naziv \"[[$1]]\"",
        "selfmove": "Izvorni i odredišni naslov su isti; ne mogu premjestiti stranicu na nju samu.",
        "immobile-source-namespace": "Ne mogu premjestiti stranice u imenski prostor \"$1\"",
        "immobile-target-namespace": "Ne mogu premjestiti stranice u imenski prostor \"$1\"",
        "tooltip-preferences-save": "Spremi postavke",
        "tooltip-summary": "Unesite kratki sažetak",
        "common.css": "/** Uređivanje ove CSS datoteke će se odraziti na sve skinove */",
-       "monobook.css": "/** Ovdje idu izmjene monobook stylesheeta */",
        "common.js": "/* JavaScript kod na ovoj stranici će biti izvršen kod svakog suradnika pri svakom učitavanju svake stranice wikija. */",
-       "monobook.js": "/* Ne rabi se više; molimo rabite [[MediaWiki:common.js]] */",
        "anonymous": "Neprijavljeni {{PLURAL:$1|suradnik|suradnici}} projekta {{SITENAME}}",
        "siteuser": "Suradnik $1 na projektu {{SITENAME}}",
        "anonuser": "{{SITENAME}} anonimni suradnik $1",
        "pageinfo-category-pages": "Broj stranica",
        "pageinfo-category-subcats": "Broj podkategorija",
        "pageinfo-category-files": "Broj datoteka",
-       "skinname-monobook": "MonoBook",
        "markaspatrolleddiff": "Označi za pregledano",
        "markaspatrolledtext": "Označi ovaj članak pregledanim",
        "markedaspatrolled": "Pregledano",
        "svg-long-desc": "SVG datoteka, nominalno $1 × $2 piksela, veličina datoteke: $3",
        "svg-long-desc-animated": "Animirana SVG datoteka, veličine $1 × $2 piksela, veličina datoteke: $3",
        "svg-long-error": "Nevaljana SVG datoteka: $1",
-       "show-big-image": "Vidi sliku u punoj veličini (rezoluciji)",
+       "show-big-image": "Vidi sliku u punoj veličini",
        "show-big-image-preview": "Veličina ovog prikaza: $1.",
        "show-big-image-other": "{{PLURAL:$2|Druga rezolucija|Ostale rezolucije}}: $1.",
        "show-big-image-size": "$1 × $2 piksela",
        "newimages-summary": "Ova posebna stranica pokazuje posljednje nedavno postavljene datoteke.",
        "newimages-legend": "Filtar",
        "newimages-label": "Naziv datoteke (ili njen dio):",
+       "newimages-showbots": "Prikaži datoteke koje su postavili botovi",
        "noimages": "Nema slika.",
        "ilsubmit": "Traži",
        "bydate": "po datumu",
        "api-error-mustbeloggedin": "Morate biti prijavljeni da bi mogli postavljati datoteke.",
        "api-error-mustbeposted": "Postoji pogreška u ovom softveru; ne rabi ispravnu HTTP metodu.",
        "api-error-noimageinfo": "Postavljanje je uspjelo, ali poslužitelj nije vratio nikakvu informaciju o datoteci.",
-       "api-error-nomodule": "Interna pogrješka: Nije postavljen modul za postavljanje.",
-       "api-error-ok-but-empty": "Interna pogrješka: Nema odgovora od poslužitelja.",
+       "api-error-nomodule": "Interna pogrješka: nije postavljen modul za postavljanje.",
+       "api-error-ok-but-empty": "Interna pogrješka: nema odgovora od poslužitelja.",
        "api-error-overwrite": "Postavljanje preko postojeće datoteke nije dopušteno.",
        "api-error-stashfailed": "Interna pogrješka: Poslužitelj nije uspio spremiti privremenu datoteku.",
-       "api-error-publishfailed": "Interna pogrješka: Poslužitelj nije uspio objaviti privremenu datoteku.",
+       "api-error-publishfailed": "Interna pogrješka: poslužitelj nije uspio objaviti privremenu datoteku.",
        "api-error-timeout": "Poslužitelj nije odgovorio unutar očekivanog vrjemena.",
        "api-error-unclassified": "Dogodila se nepoznata pogrješka.",
        "api-error-unknown-code": "Nepoznata pogrješka: \"$1\"",
-       "api-error-unknown-error": "Interna pogrješka: Dogodila se pogrješka pri pokušaju postavljanja vaše datoteke.",
+       "api-error-unknown-error": "Interna pogrješka: dogodila se pogrješka pri pokušaju postavljanja vaše datoteke.",
        "api-error-unknown-warning": "Nepoznato upozorenje: $1",
        "api-error-unknownerror": "Nepoznata pogrješka: \"$1\"",
        "api-error-uploaddisabled": "Postavljanje datoteka je onemogućeno na ovom wikiprojektu.",
index b9bec71..15cbb43 100644 (file)
        "qbmyoptions": "Meine Seite",
        "faq": "Häifich gestellte Froche",
        "faqpage": "Project:FAQ",
-       "vector-action-addsection": "Abschnitt hinzufüche",
-       "vector-action-delete": "Lösche",
-       "vector-action-move": "Verschiebe",
-       "vector-action-protect": "Schütz",
-       "vector-action-undelete": "Wiederherstelle",
-       "vector-action-unprotect": "Seiteschutz ännre",
-       "vector-view-create": "Erstell",
-       "vector-view-edit": "Beoorbeite",
-       "vector-view-history": "Versionsgeschicht",
-       "vector-view-view": "Lese",
-       "vector-view-viewsource": "Quelltext oonzeiche",
        "actions": "Aktione",
        "namespaces": "Noomeräume",
        "variants": "Variante",
        "difference-missing-revision": "{{PLURAL:$2|Ein Version|$2 Versione}} der Unnerschiedsoonzeich ($1) {{PLURAL:$2|woard|worre}} net gefund.\n\nDer Fehler weard normalerweis von en veraltete Link zur Versionsgeschicht von en Seit verursacht, wo zwischichzeitlich abgewischt woard.\nEinzelheite sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Abwasch-Logbuch] voarhand.",
        "searchresults": "Suchergebnisse",
        "searchresults-title": "Suchergebnisse für „$1“",
-       "toomanymatches": "Die Oonzoohl von der Suchergebnisse ist zu gross, bittschön versuch en annre Abfroch.",
        "titlematches": "Üwereinstimmunge mit Seitetitle",
        "textmatches": "Üwereinstimmunge mit Inhalte",
        "notextmatches": "Ken Üwereinstimmunge mit Inhalte",
        "searchmenu-exists": "'''Es gebt en Seit, wo den Noome \"[[:$1]]\" hot.''' \n{{PLURAL:$2|0=|Sieh ooch die annre Suchresultate wo gefund woore.}}",
        "searchmenu-new": "<strong>Erstell die Seit \"[[:$1]]\" in dem Wiki.</strong> {{PLURAL:$2|0=|Sieh ooch die üwer dein Such gefundne Seit.|Sieh ooch die gefundne Suchergebnisse.}}",
        "searchprofile-articles": "Inhaltsseite",
-       "searchprofile-project": "Helleft - und Projektseite",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Alles",
        "searchprofile-advanced": "Erweitert",
        "searchprofile-articles-tooltip": "Suche in $1",
-       "searchprofile-project-tooltip": "Such in $1",
        "searchprofile-images-tooltip": "Noh Dateie suche",
        "searchprofile-everything-tooltip": "Gesamte Inhalt doorrichsuche (inklusive Diskussionsseite)",
        "searchprofile-advanced-tooltip": "Such in weitre Noomeräume",
        "search-interwiki-default": "Ergebnisse von $1:",
        "search-interwiki-more": "(weitre)",
        "search-relatedarticle": "Verwandte",
-       "searcheverything-enable": "In alle Noomeräume suche",
        "searchrelated": "verwandt",
        "searchall": "alle",
        "showingresults": "Hier {{PLURAL:$1|ist '''1''' Ergebnis|sind '''$1''' Ergebnisse}}, beginnend mit Nummer '''$2.'''",
        "allowemail": "E-Mail-Empfang von annre Benutzer ermöchliche",
        "prefs-searchoptions": "Such",
        "prefs-namespaces": "Noomeräume",
-       "defaultns": "Annrenfalls in den Noomeräume suche:",
        "default": "Voareinstellung",
        "prefs-files": "Dateie",
        "prefs-custom-css": "Benutzerdefinierte CSS",
        "recentchanges-label-unpatrolled": "Nicht-kontrollierte Ännrung",
        "recentchanges-label-plusminus": "Die Ännrung von der Seitengröss in Bytes",
        "recentchanges-legend-heading": "'''Legende:'''",
-       "recentchanges-legend-newpage": "(sieh ooch die [[Special:NewPages|List von neier Seite]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sieh ooch die [[Special:NewPages|List von neier Seite]])",
        "rcnotefrom": "Oongezeicht sin die Ännrunge seit <strong>$2</strong> (max. <strong>$1</strong> Einträch).",
        "rclistfrom": "Nuar Ännrunge seit $3, $2 Uhr zeiche.",
        "rcshowhideminor": "Klene Ändrunge $1",
index 336c9c1..ce9a52c 100644 (file)
        "qbmyoptions": "Moje strony",
        "faq": "Husto stajene prašenja (FAQ)",
        "faqpage": "Project:Husto stajene prašenja (FAQ)",
-       "vector-action-addsection": "Temu přidać",
-       "vector-action-delete": "wušmórnyć",
-       "vector-action-move": "přesunyć",
-       "vector-action-protect": "škitać",
-       "vector-action-undelete": "Wobnowić",
-       "vector-action-unprotect": "Škit wotstronić",
-       "vector-view-create": "Wutworić",
-       "vector-view-edit": "Wobdźěłać",
-       "vector-view-history": "Stawizny",
-       "vector-view-view": "Čitać",
-       "vector-view-viewsource": "Žórło sej wobhladać",
        "actions": "Akcije",
        "namespaces": "Mjenowe rumy",
        "variants": "Warianty",
        "parser-template-recursion-depth-warning": "Limit za rekursijnu hłubokosć předłohi překročeny ($1)",
        "language-converter-depth-warning": "Limit hłubokosće rěčneho konwertera překročena ($1)",
        "node-count-exceeded-category": "Strony, hdźež ličba sukow je překročena",
+       "node-count-exceeded-category-desc": "Kategorija za strony, hdźež ličba sukow je překročena.",
        "node-count-exceeded-warning": "Strona je ličbu sukow překročiła",
        "expansion-depth-exceeded-category": "Strony, hdźež ekspansiska hłubokosć je překročena",
+       "expansion-depth-exceeded-category-desc": "To je kategorija za strony, hdźež ekspansiska hłubokosć je překročena.",
        "expansion-depth-exceeded-warning": "Strona je ekspansisku hłubokosć překročił",
        "parser-unstrip-loop-warning": "Njeskónčna sekla namakana",
        "parser-unstrip-recursion-limit": "Rekursiska hranica překročena ($1)",
        "currentrev": "Aktualna wersija",
        "currentrev-asof": "Aktualna wersija wot $1",
        "revisionasof": "Wersija wot $1",
-       "revision-info": "Wersija wot $1 wužiwarja $2",
+       "revision-info": "Wersija wot $1 wužiwarja {{GENDER:$6|$2}}$7",
        "previousrevision": "← Starša wersija",
        "nextrevision": "Nowša wersija →",
        "currentrevisionlink": "Aktualna wersija",
        "difference-missing-revision": "{{PLURAL:$2|Jedna wersija|$2 wersiji|$2 wersije|$2 wersijow}} tutoho rozdźěla ($1) {{PLURAL:$2|njeje so namakała|njejstej so namakałoj|njejsu namakali|njeje so namakało}}.\n\nPřičina je zwjetša zestarjeny diferencny wotkaz k stronje, kotraž je so zhašała.\nPodrobnosće móžeš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protokolu wušmórnjenjow] namakać.",
        "searchresults": "Pytanske wuslědki",
        "searchresults-title": "Pytanske wuslědki za \"$1\"",
-       "toomanymatches": "Přewjele pytanskich wuslědkow, prošu spytaj druhe wotprašenje.",
        "titlematches": "Strony z wotpowědowacym titulom",
        "textmatches": "Strony z wotpowědowacym tekstom",
        "notextmatches": "Žane strony z wotpowědowacym tekstom",
        "searchmenu-exists": "'''Je strona z mjenom \"[[$1]]\" na tutym wikiju'''",
        "searchmenu-new": "<strong>Wutwor stronu \"[[:$1]]\" na tutym wikiju!</strong> {{PLURAL:$2|0=|Hlej tež stronu namakanu z twojim pytanjom.|Hlej tež namakane pytanske wuslědki.}}",
        "searchprofile-articles": "Wobsahowe strony",
-       "searchprofile-project": "Pomoc a projektowe strony",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Wšitko",
        "searchprofile-advanced": "Rozšěrjeny",
        "searchprofile-articles-tooltip": "W $1 pytać",
-       "searchprofile-project-tooltip": "W $1 pytać",
        "searchprofile-images-tooltip": "Za datajemi pytać",
        "searchprofile-everything-tooltip": "Cyły wobsah přepytać (inkluziwnje diskusijne strony)",
        "searchprofile-advanced-tooltip": "W swójskich mjenowych rumach pytać",
        "search-interwiki-default": "Wuslědki z $1:",
        "search-interwiki-more": "(dalše)",
        "search-relatedarticle": "Přiwuzne",
-       "searcheverything-enable": "We wšěch mjenowych rumach pytać",
        "searchrelated": "přiwuzny",
        "searchall": "wšě",
        "showingresults": "Deleka so hač {{PLURAL:$1|'''1''' wuslědk pokazuje|'''$1''' wuslědkaj pokazujetej|'''$1''' wuslědki pokazuja|'''$1''' wuslědkow pokazuje}}, započinajo z #'''$2'''.",
        "powersearch-togglelabel": "Kontrolować:",
        "powersearch-toggleall": "Wšě",
        "powersearch-togglenone": "Žadyn",
+       "powersearch-remember": "Wuběr za přichodne pytanja sej spomjatkować",
        "search-external": "Eksterne pytanje",
        "searchdisabled": "Pytanje w {{GRAMMAR:lokatiw|{{SITENAME}}}} tuchwilu móžne njeje. Móžeš mjeztym z Google pytać. Wobkedźbuj, zo móža wuslědki z wobsaha {{GRAMMAR:genitiw|{{SITENAME}}}} zestarjene być.",
        "search-error": "Při pytanju je so zmylk wustupił: $1",
        "allowemail": "Mejlki wot druhich wužiwarjow přijimować",
        "prefs-searchoptions": "Pytać",
        "prefs-namespaces": "Mjenowe rumy",
-       "defaultns": "Hewak w tutych mjenowych rumach pytać:",
        "default": "standard",
        "prefs-files": "Dataje",
        "prefs-custom-css": "Swójski CSS",
        "right-move": "Strony přesunyć",
        "right-move-subpages": "Strony z jich podstronami přesunyć",
        "right-move-rootuserpages": "Hłowne wužiwarske strony přesunyć",
+       "right-move-categorypages": "Kategorijowe strony přesunyć",
        "right-movefile": "Dataje přesunyć",
        "right-suppressredirect": "Při přesunjenju strony ze stareho mjena žane daleposrědkowanje wutworić",
        "right-upload": "Dataje nahrać",
        "action-move": "tutu stronu přesunyć",
        "action-move-subpages": "tutu stronu a jeje podstrony přesunyć",
        "action-move-rootuserpages": "hłowne wužiwarske strony přesunyć",
+       "action-move-categorypages": "kategorijowe strony přesunyć",
        "action-movefile": "Tutu dataju přesunyć",
        "action-upload": "tutu dataju nahrać",
        "action-reupload": "eksistowacu dataju přepisać",
        "recentchanges-label-unpatrolled": "Tuta změnu hišće njebu přepruwowana",
        "recentchanges-label-plusminus": "Změnjena wulkosć strony (w bajtach)",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "(hlej tež [[Special:NewPages|lisćinu nowych stronow]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (hlej tež [[Special:NewPages|lisćinu nowych stronow]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Deleka so změny wot <strong>$2</strong> pokazuja (hač k <strong>$1</strong>).",
        "rclistfrom": "Nowe změny pokazać, započinajo z $3 $2",
        "largefileserver": "Dataja je wjetša hač serwer dowoluje.",
        "emptyfile": "Dataja, kotruž sy nahrał, zda so prózdna być. Z přičinu móhł pisanski zmylk w mjenje dataje być. Prošu pruwuj hač chceš ju woprawdźe nahrać.",
        "windows-nonascii-filename": "Tutón wiki datajowe mjena ze specialnymi znamješkami njepodpěruje.",
-       "fileexists": "Dataja z tutym mjenom hižo eksistuje.\nJeli kliknješ na „Składować”, so wona přepisuje.\nProšu pruwuj <strong>[[:$1]]</strong> jeli njejsy wěsty hač chceš ju změnić.\n[[$1|thumb]]",
+       "fileexists": "Dataja z tutym mjenom hižo eksistuje, prošu pruwuj <strong>[[:$1]]</strong>, jeli {{GENDER:|njejsy}} wěsty, hač chceš ju změnić.\n[[$1|thumb]]",
        "filepageexists": "Wopisanska strona za tutu dataju bu hižo pola <strong>[[:$1]]</strong> wutworjena,\nale tuchwilu dataja z tutym mjenom njeeksistuje.\nZjeće, kotrež zapodaš, njebudźe so na wopisanskej stronje jewić.\nZo by so twoje zjeće tam jewiło, dyrbiš ju manuelnje wobdźěłać.\n[[$1|thumb]]",
-       "fileexists-extension": "Dataja z podobnym mjenom hižo eksistuje: [[$2|thumb]]\n* Mjeno dataje, kotruž chceš nahrać: <strong>[[:$1]]</strong>\n* Mjeno eksistowaceje dataje: <strong>[[:$2]]</strong>\nProšu wubjer druhe mjeno.",
+       "fileexists-extension": "Dataja z podobnym mjenom hižo eksistuje: [[$2|thumb]]\n* Mjeno dataje, kotruž chceš nahrać: <strong>[[:$1]]</strong>\n* Mjeno eksistowaceje dataje: <strong>[[:$2]]</strong>\nChceš snano mjeno wužiwać, kotrež so wjace rozeznawa?",
        "fileexists-thumbnail-yes": "Dataja zda so minaturka ''(thumbnail)'' być. [[$1|thumb]]\nProšu přepruwuj dataju <strong>[[:$1]]</strong>.\nJeli je to wobraz w originalnej wulkosći, njetrjebaš minaturku nahrać.",
        "file-thumbnail-no": "Mjeno dataje započina so z <strong>$1</strong>. Zda so, zo to je wobraz z redukowanej wulkosću ''(thumbnail)'' pokazać.\nJeli maš tutón wobraz z połnym rozeznaćom, nahraj tutón, hewak změń prošu datajowe mjeno.",
        "fileexists-forbidden": "Dataja z tutym mjenom hižo eksistuje a njeda so přepisać. Jeli hišće chceš swoju dataju nahrać, dźi  prošu wróćo a wuž nowe mjeno. [[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Wušmórnjenje a wobnowjenje datajow stej wothladowanja dla nachilu znjemóžnjenej.",
        "filedelete-maintenance-title": "Dataja njeda so zhašeć",
        "mimesearch": "Pytanje za typom MIME",
-       "mimesearch-summary": "Na tutej specialnej stronje hodźa so dataje po typje MIME filtrować. Dyrbiš přeco typ MIME a podtyp zapodać: <code>image/jpeg</code> (hlej stronu z wopisanjom wobraza).",
+       "mimesearch-summary": "Na tutej specialnej stronje hodźa so dataje po typje MIME filtrować.\nZapodaće: contenttype/subtype abo contenttype/*, na př. <code>image/jpeg</code>.",
        "mimetype": "Typ MIME:",
        "download": "Sćahnyć",
        "unwatchedpages": "Njewobkedźbowane strony",
        "wantedtemplates": "Falowace předłohi",
        "mostlinked": "Z najwjace stronami zwjazane strony",
        "mostlinkedcategories": "Z najwjace stronami zwjazane kategorije",
-       "mostlinkedtemplates": "Najhusćišo wužiwane předłohi",
+       "mostlinkedtemplates": "Najhusćišo zapřijate strony",
        "mostcategories": "Strony z najwjace kategorijemi",
        "mostimages": "Z najwjace stronami zwjazane dataje",
        "mostinterwikis": "Strony z najwjace mjezyrěčnymi wotkazami",
        "watchnologin": "Njejsy přizjewjeny.",
        "addwatch": "K wobkedźbowankam přidać",
        "addedwatchtext": "Strona [[:$1]] bu k twojim [[Special:Watchlist|wobkedźbowankam]] přidata.\nPřichodne změny tuteje strony a přisłušneje diskusijneje strony budu so tam nalistować.",
+       "addedwatchtext-short": "Strona \"$1\" je so wobkedźbowankam přidała.",
        "removewatch": "Z wobkedźbowankow wotstronić",
        "removedwatchtext": "Strona \"[[:$1]]\" bu z [[Special:Watchlist|twojich wobkedźbowankow]] wotstronjena.",
+       "removedwatchtext-short": "Strona \"$1\" je so z twojich wobkedźbowankow wotstroniła.",
        "watch": "wobkedźbować",
        "watchthispage": "stronu wobkedźbować",
        "unwatch": "njewobkedźbować",
        "movepagetalktext": "Přisłušna diskusijna strona přesunje so awtomatisce hromadźe z njej, <b>chibazo:</b>\n*Njeprózdna diskusijna strona pod nowym mjenom hižo eksistuje abo\n*wotstronješ hóčku z kašćika deleka.\n\nW tutych padach dyrbiš stronu manuelnje přesunyć abo zaměšeć, jeli sej to přeješ.",
        "movearticle": "Stronu přesunyć",
        "moveuserpage-warning": "'''Warnowanje:''' Sy při tym wužiwarsku stronu přesunyć. Prošu dźiwaj na to, zo so jenož strona posunje a wužiwar so ''nje''budźe přemjenować.",
+       "movecategorypage-warning": "<strong>Warnowanje:</strong> Chceš runje kategorijowu stronu přesunyć. Prošu dźiwaj na to, zo so jenož strona přesunje a strony w starej kategoriji <em>nje</em>budu so nowo kategorizować.",
        "movenologintext": "Dyrbiš zregistrowany wužiwar a [[Special:UserLogin|přizjewjeny]] być, zo by stronu přesunył.",
        "movenotallowed": "Nimaš prawo, zo by strony přesunył.",
        "movenotallowedfile": "Nimaš prawo dataje přesunyć.",
        "cant-move-user-page": "Nimaš prawo wužiwarske strony přesunyć (wothladajo wot podstronow)",
        "cant-move-to-user-page": "Nimaš prawo stronu do wužiwarskeje strony přesunyć (z wuwzaćom do wužiwarskeje podstrony).",
+       "cant-move-category-page": "Nimaš prawo, zo by kategorijowe strony přesunył.",
+       "cant-move-to-category-page": "Nimaš prawo, stronu do kategorijoweje strony přesunyć.",
        "newtitle": "pod nowe hesło",
        "move-watch": "Stronu wobkedźbować",
        "movepagebtn": "Stronu přesunyć",
        "tooltip-summary": "Zapodaj krótke zjeće",
        "interlanguage-link-title": "$1 – $2",
        "common.css": "/* CSS w tutej dataji budźe so na wšěch stronow wuskutkować. */",
-       "monobook.css": "/* CSS wobdźěłać, zo by so skin „monobook” za wšěčh wužiwarjow tutoho skina priměrił */",
        "common.js": "/* Kóždy JavaScript tu so za wšěch wužiwarjow při kóždym zwobraznjenju někajkeje strony začita. */",
-       "monobook.js": "/* Slědowacy JavaScript začita so za wužiwarjow, kotřiž šat MonoBook wužiwaja */",
        "anonymous": "{{PLURAL:$1|Anonymny wužiwar|Anonymnaj wužiwarjej|Anonymni wužiwarjo|Anonymni wužiwarjo}} we {{GRAMMAR:lokatiw|{{SITENAME}}}}",
        "siteuser": "wužiwarja $1 na {{GRAMMAR:lokatiw|{{SITENAME}}}}",
        "anonuser": "anonymny wužiwar $1 na {{GRAMMAR:lokatiw|{{SITENAME}}}}",
        "pageinfo-category-pages": "Ličba rěkow",
        "pageinfo-category-subcats": "Ličba podkategorijow",
        "pageinfo-category-files": "Ličba datajow",
-       "skinname-cologneblue": "Kölnjanska módrina",
-       "skinname-monobook": "MonoBook",
-       "skinname-modern": "Moderny",
        "markaspatrolleddiff": "Změnu jako přepruwowanu woznamjenić",
        "markaspatrolledtext": "Tutu změnu nastawka jako přepruwowanu woznamjenić",
        "markedaspatrolled": "Změna bu jako přepruwowana woznamjenjena.",
        "newimages-summary": "Tuta specialna strona naliči aktualnje nahrate wobrazy a druhe dataje.",
        "newimages-legend": "Filter",
        "newimages-label": "Datajowe mjeno (abo dźěl z njeho):",
+       "newimages-showbots": "Nahraća boćikow pokazać",
        "noimages": "Žane dataje.",
        "ilsubmit": "Pytać",
        "bydate": "datumje",
        "watchlistedit-raw-done": "Twoje wobkedźbowanki buchu składowane.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 zapisk bu dodaty|$1 zapiskaj buštej dodatej|$1 zapiski buchu dodate|$1 zapiskow buchu dodate}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 zapisk bu wotstronjeny|$1 zapiskaj buštej wotstronjenej|$1 zapiski buchu wotstronjene|$1 zapiskow buchu wotstronjene}}:",
+       "watchlistedit-clear-title": "Wotstronjene wobkedźbowanki",
+       "watchlistedit-clear-legend": "Wobkedźbowanki wotstronić",
+       "watchlistedit-clear-explain": "Wšě titule budu so z twojich wobkedźbowankow wotstronjeć",
+       "watchlistedit-clear-titles": "Titule:",
+       "watchlistedit-clear-submit": "Wobkedźbowanki wotstronić (To je na přeco!)",
+       "watchlistedit-clear-done": "Waše wobkedźbowanki su so wotstronili.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 titul bu wotstronjeny|$1 titulej buštej wotstronjenej|$1 titule buchu wotstronjene|$1 titulow bu wotstronjene}}:",
+       "watchlistedit-too-many": "Je tu přewjele stronow za zwobraznjenje.",
+       "watchlisttools-clear": "Wobkedźbowanki wotstronić",
        "watchlisttools-view": "Wobkedźbowanki: Změny",
        "watchlisttools-edit": "normalnje wobdźěłać",
        "watchlisttools-raw": "Lisćinowy format wobdźěłać (import/eksport)",
index 3267546..92fe241 100644 (file)
@@ -33,7 +33,8 @@
                        "Terik",
                        "Tgr",
                        "Xbspiro",
-                       "아라"
+                       "아라",
+                       "Csega"
                ]
        },
        "tog-underline": "Hivatkozások aláhúzása:",
        "qbmyoptions": "Lapjaim",
        "faq": "GyIK",
        "faqpage": "Project:GyIK",
-       "vector-action-addsection": "Új téma nyitása",
-       "vector-action-delete": "Törlés",
-       "vector-action-move": "Átnevezés",
-       "vector-action-protect": "Lapvédelem",
-       "vector-action-undelete": "Visszaállítás",
-       "vector-action-unprotect": "Védelem módosítása",
-       "vector-view-create": "Létrehozás",
-       "vector-view-edit": "Szerkesztés",
-       "vector-view-history": "Laptörténet",
-       "vector-view-view": "Olvasás",
-       "vector-view-viewsource": "A lap forrása",
        "actions": "Műveletek",
        "namespaces": "Névterek",
        "variants": "Változatok",
        "print": "Nyomtatás",
        "view": "Olvasás",
        "edit": "Szerkesztés",
+       "edit-local": "Helyi leírás szerkesztése",
        "create": "Létrehozás",
+       "create-local": "Helyi leírás hozzáadása",
        "editthispage": "Lap szerkesztése",
        "create-this-page": "Oldal létrehozása",
        "delete": "Törlés",
        "edit-gone-missing": "Nem lehet frissíteni a lapot.\nÚgy tűnik, hogy törölve lett.",
        "edit-conflict": "Szerkesztési ütközés.",
        "edit-no-change": "A szerkesztésed figyelmen kívül lett hagyva, mivel nem változtattál a lap szövegén.",
+       "postedit-confirmation-created": "Az oldal létrehozva.",
+       "postedit-confirmation-restored": "Az oldal helyre lett állítva.",
        "postedit-confirmation-saved": "A szerkesztésedet elmentettük.",
        "edit-already-exists": "Az új lap nem készíthető el.\nMár létezik.",
        "defaultmessagetext": "Alapértelmezett szöveg",
        "content-not-allowed-here": "\"$1\" tartalom nem engedélyezett a [[$2]] oldalon",
        "editwarning-warning": "A lap elhagyásával az összes itt végzett változtatás elveszhet.\nHa be vagy jelentkezve letilthatod ezt a figyelmeztetést a beállításaid „{{int:prefs-editing}}” szakaszában.",
        "editpage-notsupportedcontentformat-title": "Nem támogatott tartalom formátum",
+       "editpage-notsupportedcontentformat-text": "$2 tartalommodell nem támogatja $1 tartalomformátumot.",
        "content-model-wikitext": "wikiszöveg",
        "content-model-text": "egyszerű szöveg",
        "content-model-javascript": "JavaScript",
        "currentrev": "Aktuális változat",
        "currentrev-asof": "A lap jelenlegi, $1-kori változata",
        "revisionasof": "A lap $1-kori változata",
-       "revision-info": "A lap korábbi változatát látod, amilyen $2 $1-kor történt szerkesztése után volt.",
+       "revision-info": "A lap korábbi változatát látod, amilyen {{GENDER:$6|$2}} $1-kor történt szerkesztése$7 után volt.",
        "previousrevision": "←Régebbi változat",
        "nextrevision": "Újabb változat→",
        "currentrevisionlink": "Aktuális változat",
        "difference-missing-revision": "A(z) \"{{PAGENAME}}\" nevű oldal #$1 $2 változata nem létezik.\n\nEzt általában egy elavult, törölt oldalra mutató laptörténeti hivatkozás használata okozza. Részletek a [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} törlési naplóban] találhatóak.",
        "searchresults": "A keresés eredménye",
        "searchresults-title": "Keresési eredmények: „$1”",
-       "toomanymatches": "Túl sok találat van, próbálkozz egy másik lekérdezéssel",
        "titlematches": "Címbeli egyezések",
        "textmatches": "Szövegbeli egyezések",
        "notextmatches": "Nincsenek szövegbeli egyezések",
        "shown-title": "{{PLURAL:$1|Egy|$1}} találat laponként",
        "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''A wikin már van „[[:$1]]” nevű lap'''",
-       "searchmenu-new": "'''Hozd létre a(z) „[[:$1]]” nevű lapot ezen a wikin!'''",
+       "searchmenu-new": "<strong>Hozd létre a(z) „[[:$1]]” nevű lapot ezen a wikin!</strong>\n{{PLURAL:$2|0=|Lásd még a keresés során talált lapot.|Lásd még a keresés eredményét.}}",
        "searchprofile-articles": "Tartalmi oldalak",
-       "searchprofile-project": "Segítség- és projektlapok",
        "searchprofile-images": "Médiafájlok",
        "searchprofile-everything": "Minden lap",
        "searchprofile-advanced": "Részletes",
        "searchprofile-articles-tooltip": "A következőkben keres: $1",
-       "searchprofile-project-tooltip": "A következőkben keres: $1",
        "searchprofile-images-tooltip": "Fájlok keresése",
        "searchprofile-everything-tooltip": "Minden névtérben keres (a vitalapokat is beleértve)",
        "searchprofile-advanced-tooltip": "Keresés adott névterekben",
        "search-interwiki-default": "$1 találatok:",
        "search-interwiki-more": "(több)",
        "search-relatedarticle": "Kapcsolódó",
-       "searcheverything-enable": "Keresés az összes névtérben",
        "searchrelated": "kapcsolódó",
        "searchall": "mind",
        "showingresults": "Lent '''{{PLURAL:$1|egy|$1}}''' találat látható, az eleje '''$2'''.",
        "powersearch-togglelabel": "Megjelölés:",
        "powersearch-toggleall": "Mind",
        "powersearch-togglenone": "Egyik sem",
+       "powersearch-remember": "Kiválasztások megjegyzése a későbbi keresésekhez",
        "search-external": "Külső kereső",
        "searchdisabled": "Elnézésed kérjük, de a teljes szöveges keresés terhelési okok miatt átmenetileg nem használható. Ezidő alatt használhatod a lenti Google keresést, mely viszont lehetséges, hogy nem teljesen friss adatokkal dolgozik.",
        "search-error": "A keresés közben hiba történt: $1",
        "allowemail": "E-mail engedélyezése más szerkesztőktől",
        "prefs-searchoptions": "Keresés",
        "prefs-namespaces": "Névterek",
-       "defaultns": "Egyébként a következő névterekben keressen:",
        "default": "alapértelmezett",
        "prefs-files": "Fájlok",
        "prefs-custom-css": "saját CSS",
        "right-edituserjs": "más felhasználók JS fájljainak szerkesztése",
        "right-editmyusercss": "A saját szerkesztői CSS-fájlok szerkesztése",
        "right-editmyuserjs": "Saját szerkesztői JavaScript-fájlok szerkesztése",
+       "right-viewmywatchlist": "Saját figyelőlista megtekintése",
+       "right-editmyoptions": "Saját beállítások szerkesztése",
        "right-rollback": "a lap utolsó szerkesztésének gyors visszaállítása",
        "right-markbotedits": "visszaállított szerkesztések botként való jelölése",
        "right-noratelimit": "sebességkorlát figyelmen kívül hagyása",
        "action-userrights-interwiki": "más wikik szerkesztői jogainak módosítása",
        "action-siteadmin": "adatbázis lezárása vagy felnyitása",
        "action-sendemail": "e-mailek küldése",
+       "action-editmywatchlist": "saját figyelőlista szerkesztése",
        "nchanges": "{{PLURAL:$1|egy|$1}} változtatás",
        "enhancedrc-since-last-visit": "$1 az utolsó látogatás óta",
        "enhancedrc-history": "történet",
        "recentchanges-label-unpatrolled": "Ezt a szerkesztést még nem ellenőrizték",
        "recentchanges-label-plusminus": "Az oldal mérete ennyi bájttal módosult",
        "recentchanges-legend-heading": "Jelmagyarázat:",
-       "recentchanges-legend-newpage": "(lásd még: [[Special:NewPages|Új lapok]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (lásd még: [[Special:NewPages|új lapok listája]])",
        "rcnotefrom": "Alább a <b>$2</b> óta történt változtatások láthatóak (legfeljebb <b>$1</b> db).",
        "rclistfrom": "$3 $2 után történt változtatások megtekintése",
        "rcshowhideminor": "apró szerkesztések $1",
        "filedelete-maintenance": "A fájlok törlése és helyreállítása ideiglenesen le van tiltva karbantartás miatt.",
        "filedelete-maintenance-title": "Nem lehet törölni a fájlt",
        "mimesearch": "Keresés MIME-típus alapján",
-       "mimesearch-summary": "Ez az oldal engedélyezi a fájlok MIME-típus alapján történő szűrését. Bevitel: tartalomtípus/altípus, pl. <code>image/jpeg</code>.",
+       "mimesearch-summary": "Ez az oldal engedélyezi a fájlok MIME-típus alapján történő szűrését. Bevitel: tartalomtípus/altípus vagy tartalomtípus/*, pl. <code>image/jpeg</code>.",
        "mimetype": "MIME-típus:",
        "download": "letöltés",
        "unwatchedpages": "Nem figyelt lapok",
        "doubleredirects": "Dupla átirányítások",
        "doubleredirectstext": "Ez a lap azokat a lapokat listázza, melyek átirányító lapokra irányítanak át.\nMinden sor tartalmaz egy hivatkozást az első, valamint a második átirányításra, valamint a második átirányítás céljára, ami általában a valódi céllap, erre kellene az első átirányításnak mutatnia.\nAz <del>áthúzott</del> sorok a lista elkészülése óta javítva lettek.",
        "double-redirect-fixed-move": "[[$1]] átnevezve, a továbbiakban átirányításként működik a(z) [[$2]] lapra",
-       "double-redirect-fixed-maintenance": "[[$1]] dupla átirányítás javítása a következőre: [[$2]]",
+       "double-redirect-fixed-maintenance": "[[$1]] dupla átirányítás automatikus javítása karbantartás során a következőre: [[$2]]",
        "double-redirect-fixer": "Átirányításjavító",
        "brokenredirects": "Nem létező lapra mutató átirányítások",
        "brokenredirectstext": "A következő átirányítások nem létező lapokra hivatkoznak:",
        "protect-existing-expiry": "Jelenleg érvényben lévő lejárati idő: $2, $3",
        "protect-otherreason": "További okok:",
        "protect-otherreason-op": "Más/további ok:",
-       "protect-dropdown": "*Általános védelmi okok\n** Gyakori vandalizmus\n** Gyakori spamelés\n** Nagyforgalmú lap",
+       "protect-dropdown": "*Általános védelmi okok\n** Gyakori vandalizmus\n** Gyakori spammelés\n** Destruktív szerkesztési háború\n** Nagy forgalmú lap",
        "protect-edit-reasonlist": "Lapvédelem oka",
        "protect-expiry-options": "1 óra:1 hour,1 nap:1 day,1 hét:1 week,2 hét:2 weeks,1 hónap:1 month,3 hónap:3 months,6 hónap:6 months,1 év:1 year,végtelen:infinite",
        "restriction-type": "Engedély:",
        "undeleteextrahelp": "A lap teljes helyreállításához ne jelölj be egy jelölőnégyzetet sem, csak kattints a '''''{{int:undeletebtn}}''''' gombra.\nA lap részleges helyreállításához jelöld be a kívánt változatok melletti jelölőnégyzeteket, és kattints a '''''{{int:undeletebtn}}''''' gombra.",
        "undeleterevisions": "{{PLURAL:$1|egy|$1}} változat archiválva",
        "undeletehistory": "Ha helyreállítasz egy lapot, azzal visszahozod laptörténet összes változatát.\nHa lap törlése óta azonos néven már létrehoztak egy újabb lapot, a helyreállított\nváltozatok a laptörténet végére kerülnek be, a jelenlegi lapváltozat módosítása nélkül.",
-       "undeleterevdel": "A visszavonás nem hajtható végre, ha a legfrissebb lapváltozat részben\ntörlését eredmémyezi. Ilyen esetekben törölnöd kell a legújabb törölt változatok kijelölését, vagy megszüntetni az elrejtésüket. Azon fájlváltozatok,\nmelyek megtekintése a számodra nem engedélyezett, nem kerülnek visszaállításra.",
+       "undeleterevdel": "A törlés visszavonása nem hajtható végre, ha a legfrissebb lapváltozat részleges törlését eredményezi.\nIlyen esetekben vissza kell vonnod a legújabb törölt változatok kijelölését vagy azok elrejtését.",
        "undeletehistorynoadmin": "Ezt a szócikket törölték. A törlés okát alább az összegzésben\nláthatod, az oldalt a törlés előtt szerkesztő felhasználók részleteivel együtt. Ezeknek\na törölt változatoknak a tényleges szövege csak az adminisztrátorok számára hozzáférhető.",
        "undelete-revision": "$1 $4, $5-kori törölt változata (szerző: $3).",
        "undeleterevision-missing": "Érvénytelen vagy hiányzó változat. Lehet, hogy rossz hivatkozásod van, ill. a\nváltozatot visszaállították vagy eltávolították az archívumból.",
        "tooltip-undo": "„Visszavonás”: visszavonja ezt a szerkesztést, valamint megnyitja a szerkesztőt előnézet módban. A szerkesztési összefoglalóban meg lehet adni a visszavonás okát.",
        "tooltip-preferences-save": "Beállítások mentése",
        "tooltip-summary": "Adj meg egy rövid összefoglalót",
+       "interlanguage-link-title-nonlang": "$1 – $2",
        "common.css": "/* Közös CSS az összes felületnek */",
-       "cologneblue.css": "/* Az ide elhelyezett CSS hatással lesz a Kölni kék felület használóira */",
-       "monobook.css": "/* Az ide elhelyezett CSS hatással lesz a Monobook felület használóira */",
-       "modern.css": "/* Az ide elhelyezett CSS hatással lesz a Modern felület használóira */",
-       "vector.css": "/* Az ide elhelyezett CSS hatással lesz a Vector felület használóira */",
        "print.css": "/* Az ide elhelyezett CSS hatással lesz a nyomtatás kimenetelére */",
        "noscript.css": "/* Az ide elhelyezett CSS azon felhasználókra lesz hatással, ahol a JavaScript le van tiltva */",
        "group-autoconfirmed.css": "/* Az ide elhelyezett CSS az automatikusan megerősített felhasználókra lesz hatással */",
        "group-sysop.css": "/* Az ide elhelyezett CSS csak adminisztrátorokra lesz hatással */",
        "group-bureaucrat.css": "/* Az ide elhelyezett CSS csak bürokratákra lesz hatással */",
        "common.js": "/* Az ide elhelyezett JavaScript kód minden felhasználó számára lefut az oldalak betöltésekor. */",
-       "cologneblue.js": "/* A Kölni kék felületet használó szerkesztők számára betöltendő JavaScriptek */",
-       "monobook.js": "/* A Monobook felületet használó szerkesztők számára betöltendő JavaScriptek */",
-       "modern.js": "/* A Modern felületet használó szerkesztők számára betöltendő JavaScriptek */",
-       "vector.js": "/* A Vector felületet használó szerkesztők számára betöltendő JavaScriptek */",
        "group-autoconfirmed.js": "/* Az ide elhelyezett JavaScript csak automatikusan megerősített felhasználóknak töltődik be */",
        "group-bot.js": "/* Az ide elhelyezett JavaScript csak botoknak töltődik be */",
        "group-sysop.js": "/* Az ide elhelyezett JavaScript csak adminisztrátoroknak töltődik be */",
        "pageinfo-category-pages": "Lapok száma",
        "pageinfo-category-subcats": "Alkategóriák száma",
        "pageinfo-category-files": "Fájlok száma",
-       "skinname-cologneblue": "Kölni kék",
-       "skinname-monobook": "MonoBook",
-       "skinname-modern": "Modern",
        "markaspatrolleddiff": "Ellenőrzöttnek jelölöd",
        "markaspatrolledtext": "Ellenőriztem",
        "markedaspatrolled": "Ellenőrzöttnek jelölve",
index ce10d7e..3428570 100644 (file)
        "qbmyoptions": "Իմ էջերը",
        "faq": "ՀՏՀ",
        "faqpage": "Project:ՀՏՀ",
-       "vector-action-addsection": "Ավելացնել քննարկում",
-       "vector-action-delete": "Ջնջել",
-       "vector-action-move": "Տեղափոխել այս էջը",
-       "vector-action-protect": "Պաշտպանել",
-       "vector-action-undelete": "Վերականգնել",
-       "vector-action-unprotect": "Փոխել պաշտպանումը",
-       "vector-view-create": "Ստեղծել",
-       "vector-view-edit": "Խմբագրել",
-       "vector-view-history": "Դիտել պատմությունը",
-       "vector-view-view": "Կարդալ",
-       "vector-view-viewsource": "Դիտել ելատեքստը",
        "actions": "Գործողություններ",
        "namespaces": "Անվանատարածքներ",
        "variants": "Տարբերակներ",
        "searchmenu-exists": "'''Այս վիքիում, գոյություն ունի \"[[:$1]]\" անվանումով էջը։'''",
        "searchmenu-new": "'''Ստեղծե՛լ \"[[:$1]]\" էջը այս վիքիում'''",
        "searchprofile-articles": "Հիմնական էջեր",
-       "searchprofile-project": "Օգնության և նախագծերի էջեր",
        "searchprofile-images": "Մուլտիմեդիա",
        "searchprofile-everything": "Ամենուրեք",
        "searchprofile-advanced": "Ընդլայնված",
        "searchprofile-articles-tooltip": "Որոնել $1ում",
-       "searchprofile-project-tooltip": "Որոնել $1ում",
        "searchprofile-images-tooltip": "Նիշքերի որոնում",
        "searchprofile-everything-tooltip": "Որոնել բոլոր էջերում (այդ թվում քննարկման)",
        "searchprofile-advanced-tooltip": "Որոնել նշված անվանատարածքներում",
        "search-interwiki-default": "$1 արդյունք.",
        "search-interwiki-more": "(էլի)",
        "search-relatedarticle": "Հարակից",
-       "searcheverything-enable": "Որոնել բոլոր անվանատարածքներում",
        "searchrelated": "հարակից",
        "searchall": "բոլոր",
        "showingresults": "Ստորև բերված է մինչև {{PLURAL:$1|'''1''' արդյունք|'''$1''' արդյունք}}՝ սկսած №&nbsp;<strong>$2</strong>-ից։",
        "allowemail": "Թույլատրել էլ-նամակներ մյուս մասնակիցներից",
        "prefs-searchoptions": "Որոնում",
        "prefs-namespaces": "Անվանատարածք",
-       "defaultns": "Հակառակ դեպքում, որոնել այս անվանատարծքներում․",
        "default": "լռությամբ",
        "prefs-files": "Նիշքեր",
        "prefs-custom-css": "Անհատական CSS",
        "prefs-emailconfirm-label": "Էլ-փոստի վավերացում․",
        "youremail": "Էլեկտրոնային փոստ.",
        "username": "{{GENDER:$1|Մասնակցի անուն}}՝",
-       "uid": "Մասնակցի իդենտիֆիկատոր.",
        "prefs-memberingroups": "Անդամակցության {{PLURAL:$1|խումբ|խմբեր}}.",
        "prefs-registration": "Գրանցման ամսաթիվը․",
        "yourrealname": "Ձեր իրական անունը.",
        "recentchanges-label-bot": "Այս խմբագրումը կատարվել է բոտի կողմից",
        "recentchanges-label-unpatrolled": "Այս խմբագրումը դեռ չի պարեկվել",
        "recentchanges-label-plusminus": "Էջի չափսն փոխոխվեց այսքան բայթով։",
-       "recentchanges-legend-newpage": "(տես նաև՝  [[Special:NewPages|նոր էջերի ցանկ]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (տես նաև՝  [[Special:NewPages|նոր էջերի ցանկ]])",
        "rcnotefrom": "Ստորև բերված են փոփոխությունները սկսած՝ '''$2''' (մինչև՝ '''$1''')։",
        "rclistfrom": "Ցույց տալ նոր փոփոխությունները սկսած $3 $2",
        "rcshowhideminor": "$1 չնչին խմբագրումները",
        "logempty": "Տեղեկամատյանում չկան համընկնող տարրեր։",
        "log-title-wildcard": "Որոնել այս տեքստով սկսվող անվանումներ",
        "allpages": "Բոլոր էջերը",
-       "alphaindexline": "$1 -ից՝ $2",
        "nextpage": "Հաջորդ էջը ($1)",
        "prevpage": "Նախորդ էջը ($1)",
        "allpagesfrom": "Ցույց տալ էջերը, որոնք սկսվում են՝",
        "tooltip-rollback": "Մեկ սեղմումով հետ շրջել վերջին մասնակցի կատարած բոլոր խմբագրումները",
        "tooltip-undo": "Հետ շրջել կատարված փոփոխությունը և բացել խմբագրման ձևը նախադիտման ռեժիմով՝ թույլ տալով ավելացնել հետ շրջման պատճառը։",
        "common.css": "/** Այստեղ տեղադրված CSS կոդը կկիրառվի բոլոր տեսքերի վրա */",
-       "monobook.css": "/* Այստեղ տեղադրված CSS կոդը կկիրառվի Monobook տեսքի վրա*/",
        "common.js": "/* Այստեղ տեղադրված JavaScript կոդը կբեռնվի բոլոր մասնակիցների համար էջերի բոլոր դիմումների ժամանակ */",
-       "monobook.js": "/* Հնացած է. օգտագործեք [[MediaWiki:common.js]] */",
        "anonymous": "{{SITENAME}}ի անանուն {{PLURAL:$1|մասնակից|մասնակիցներ}}",
        "siteuser": "{{grammar:genitive|{{SITENAME}}}} մասնակից $1",
        "lastmodifiedatby": "Այս էջը վերջին անգամ փոփոխվել է ժամը $2-ին, $1 թվին՝ $3 մասնակցի կողմից։",
        "pageinfo-contentpage": "Հաշվառված որպես բովանդակային էջ",
        "pageinfo-contentpage-yes": "Այո",
        "pageinfo-protect-cascading-yes": "Այո",
-       "skinname-cologneblue": "Քյոլնի թախիծ",
-       "skinname-monobook": "ՄիաԳիրք",
-       "skinname-modern": "Մոդերն",
-       "skinname-vector": "Սովորական",
        "markaspatrolleddiff": "Նշել որպես ստուգված",
        "markaspatrolledtext": "Նշել այս էջը որպես ստուգված",
        "markedaspatrolled": "Նշված է որպես ստուգված",
index bd1d41e..c294d59 100644 (file)
        "qbmyoptions": "Mi paginas",
        "faq": "FAQ",
        "faqpage": "Project:FAQ",
-       "vector-action-addsection": "Adder topico",
-       "vector-action-delete": "Deler",
-       "vector-action-move": "Renominar",
-       "vector-action-protect": "Proteger",
-       "vector-action-undelete": "Restaurar",
-       "vector-action-unprotect": "Cambiar protection",
-       "vector-view-create": "Crear",
-       "vector-view-edit": "Modificar",
-       "vector-view-history": "Vider historia",
-       "vector-view-view": "Leger",
-       "vector-view-viewsource": "Vider texto fonte",
        "actions": "Actiones",
        "namespaces": "Spatios de nomines",
        "variants": "Variantes",
        "permalink": "Ligamine permanente",
        "print": "Imprimer",
        "view": "Leger",
+       "view-foreign": "Vider in $1",
        "edit": "Modificar",
+       "edit-local": "Modificar description local",
        "create": "Crear",
+       "create-local": "Adder description local",
        "editthispage": "Modificar iste pagina",
        "create-this-page": "Crear iste pagina",
        "delete": "Deler",
        "jumptonavigation": "navigation",
        "jumptosearch": "cercar",
        "view-pool-error": "Pardono, le servitores es supercargate in iste momento.\nTroppo de usatores tenta vider iste pagina.\nPer favor attende un momento ante que tu essaya acceder novemente a iste pagina.\n\n$1",
+       "generic-pool-error": "Regrettabilemente, le servitores es supercargate in iste momento.\nTroppo de usatores tenta consultar iste ressource.\nPer favor attende un momento ante que tu essaya acceder novemente a iste ressource.",
        "pool-timeout": "Tempore limite excedite durante le serratura",
        "pool-queuefull": "Le cauda commun de processos es plen",
        "pool-errorunknown": "Error incognite",
+       "pool-servererror": "Le servicio de banco de ressources commun non es disponibile ($1).",
        "aboutsite": "A proposito de {{SITENAME}}",
        "aboutpage": "Project:A proposito",
        "copyright": "Le contento es disponibile sub $1 si non alteremente specificate.",
        "edit-gone-missing": "Impossibile actualisar le pagina.\nPare que illo ha essite delite.",
        "edit-conflict": "Conflicto inter modificationes.",
        "edit-no-change": "Tu modification ha essite ignorate, proque nulle cambio esseva facite in le texto.",
+       "postedit-confirmation-created": "Le pagina ha essite create.",
+       "postedit-confirmation-restored": "Le pagina ha essite restaurate.",
        "postedit-confirmation-saved": "Tu modification ha essite salveguardate.",
        "edit-already-exists": "Non poteva crear un nove pagina.\nIllo existe ja.",
        "defaultmessagetext": "Texto predefinite del message",
        "parser-template-recursion-depth-warning": "Limite de recursion del patrono excedite ($1)",
        "language-converter-depth-warning": "Limite de profunditate del conversor de lingua excedite ($1)",
        "node-count-exceeded-category": "Paginas in que le numero de nodos excede le limite",
+       "node-count-exceeded-category-desc": "Un categoria pro paginas ubi le numero de nodos ha essite excedite.",
        "node-count-exceeded-warning": "Le numero de nodos in iste pagina excede le limite",
        "expansion-depth-exceeded-category": "Paginas in que le profunditate de expansion excede le limite",
+       "expansion-depth-exceeded-category-desc": "Isto es un categoria pro paginas in le quales le profunditate de expansion ha essite excedite.",
        "expansion-depth-exceeded-warning": "Le profunditate de expansion in iste pagina excede le limite",
        "parser-unstrip-loop-warning": "Bucla de \"unstrip\" detegite",
        "parser-unstrip-recursion-limit": "Limite de recursion de \"unstrip\" excedite ($1)",
        "currentrev": "Version actual",
        "currentrev-asof": "Version actual del $1",
        "revisionasof": "Version del $1",
-       "revision-info": "Version del $1 per $2",
+       "revision-info": "Version del $1 per {{GENDER:$6|$2}}$7",
        "previousrevision": "← Version precedente",
        "nextrevision": "Version sequente →",
        "currentrevisionlink": "Version actual",
        "revdelete-no-file": "Le file specificate non existe.",
        "revdelete-show-file-confirm": "Es tu secur de voler vider un version delite del file  \"<nowiki>$1</nowiki>\" del $2 a $3?",
        "revdelete-show-file-submit": "Si",
+       "revdelete-selected-text": "{{PLURAL:$1|Version|Versiones}} seligite de [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Version|Versiones}} de file seligite de [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Evento|Eventos}} de registro seligite:",
        "revdelete-text-text": "Versiones delite continua a apparer in le historia del pagina, ma parte de lor contento essera inaccessibile pro le publico.",
        "revdelete-text-file": "Versiones delite de un file continua a apparer in le historia del file, ma parte de lor contento essera inaccessibile pro le publico.",
        "mergehistory-empty": "Nulle versiones pote esser fusionate.",
        "mergehistory-success": "$3 {{PLURAL:$3|version|versiones}} de [[:$1]] fusionate in [[:$2]] con successo.",
        "mergehistory-fail": "Impossibile executar le fusion del historia. Per favor reverifica le parametros del pagina e del tempore.",
+       "mergehistory-fail-toobig": "Le historias de versiones non pote esser fusionate con plus de $1 {{PLURAL:$1|version|versiones}} a displaciar.",
        "mergehistory-no-source": "Le pagina de origine $1 non existe.",
        "mergehistory-no-destination": "Le pagina de destination $1 non existe.",
        "mergehistory-invalid-source": "Le pagina de origine debe esser un titulo valide.",
        "difference-missing-revision": "{{PLURAL:$2|Un version|$2 versiones}} de iste differentia ($1) non ha essite trovate.\n\nIsto es generalmente causate per sequer un ligamine de diff obsolete a un pagina que ha essite delite.\nDetalios se trova in le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de deletiones].",
        "searchresults": "Resultatos del recerca",
        "searchresults-title": "Resultatos del recerca de \"$1\"",
-       "toomanymatches": "Se retornava troppo de resultatos. Per favor prova un altere consulta.",
        "titlematches": "Correspondentias in le titulos de paginas",
        "textmatches": "Resultatos in le texto de paginas",
        "notextmatches": "Nulle resultato in le texto de paginas",
        "searchmenu-exists": "'''Existe un pagina nominate \"[[$1]]\" in iste wiki'''",
        "searchmenu-new": "<strong>Crea le pagina \"[[:$1]]\" in iste wiki!</strong> {{PLURAL:$2|0=|Vide etiam le pagina trovate con le recerca.|Vide etiam le resultatos del recerca.}}",
        "searchprofile-articles": "Paginas de contento",
-       "searchprofile-project": "Paginas de adjuta e del projecto",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Toto",
        "searchprofile-advanced": "Avantiate",
        "searchprofile-articles-tooltip": "Cercar in $1",
-       "searchprofile-project-tooltip": "Cercar in $1",
        "searchprofile-images-tooltip": "Cercar files",
        "searchprofile-everything-tooltip": "Cercar in tote le contento (includente le paginas de discussion)",
        "searchprofile-advanced-tooltip": "Cercar in spatios de nomines personalisate",
        "search-interwiki-default": "Resultatos de $1:",
        "search-interwiki-more": "(plus)",
        "search-relatedarticle": "Connexe",
-       "searcheverything-enable": "Cercar in tote le spatios de nomines",
        "searchrelated": "connexe",
        "searchall": "totes",
        "showingresults": "Infra se monstra non plus de {{PLURAL:$1|'''1''' resultato|'''$1''' resultatos}} a partir del numero '''$2'''.",
        "powersearch-togglelabel": "Seliger:",
        "powersearch-toggleall": "Totes",
        "powersearch-togglenone": "Nihil",
+       "powersearch-remember": "Memorar selection pro recercas futur",
        "search-external": "Recerca externe",
        "searchdisabled": "Le recerca in {{SITENAME}} es disactivate.\nTu pote cercar via Google in le interim.\nNota que lor indices del contento de {{SITENAME}} pote esser obsolete.",
        "search-error": "Un error ha occurrite durante le recerca: $1",
        "allowemail": "Activar reception de e-mail de altere usatores",
        "prefs-searchoptions": "Recerca",
        "prefs-namespaces": "Spatios de nomines",
-       "defaultns": "Alteremente cercar in iste spatios de nomines:",
        "default": "predefinite",
        "prefs-files": "Files",
        "prefs-custom-css": "CSS personalisate",
        "prefs-emailconfirm-label": "Confirmation del e-mail:",
        "youremail": "E-mail:",
        "username": "{{GENDER:$1|Nomine de usator}}:",
-       "uid": "ID del {{GENDER:$1|usator}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membro}} de {{PLURAL:$1|gruppo|gruppos}}:",
        "prefs-registration": "Data de registration:",
        "yourrealname": "Nomine real:",
        "right-move": "Renominar paginas",
        "right-move-subpages": "Renominar paginas con lor subpaginas",
        "right-move-rootuserpages": "Renominar le paginas radice de usator",
+       "right-move-categorypages": "Renominar paginas de categoria",
        "right-movefile": "Renominar files",
        "right-suppressredirect": "Non rediriger le ancian nomine verso le nove quando se renomina un pagina",
        "right-upload": "Incargar files",
        "action-createpage": "crear paginas",
        "action-createtalk": "crear paginas de discussion",
        "action-createaccount": "crear iste conto de usator",
+       "action-history": "vider le historia de iste pagina",
        "action-minoredit": "marcar iste modification como minor",
        "action-move": "renominar iste pagina",
        "action-move-subpages": "renominar iste pagina e su subpaginas",
        "action-move-rootuserpages": "renominar le paginas radice de usator",
+       "action-move-categorypages": "renominar paginas de categoria",
        "action-movefile": "renominar iste file",
        "action-upload": "incargar iste file",
        "action-reupload": "superscriber iste file existente",
        "recentchanges-label-unpatrolled": "Iste modification non ha ancora essite patruliate",
        "recentchanges-label-plusminus": "Le dimension del pagina ha cambiate de iste numero de bytes",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "(vide etiam le [[Special:NewPages|lista de nove paginas]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vide etiam le [[Special:NewPages|lista de nove paginas]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Ecce le modificationes a partir del <strong>$3 a $4</strong> (usque a <strong>$1</strong> entratas).",
        "rclistfrom": "Monstrar nove modificationes a partir de $3 $2",
        "largefileserver": "Le grandor de iste file excede le limite configurate in le servitor.",
        "emptyfile": "Le file que tu incargava pare esser vacue.\nIsto pote esser debite a un error in le nomine del file.\nPer favor verifica que tu realmente vole incargar iste file.",
        "windows-nonascii-filename": "Iste wiki non supporta nomines de file con characteres special.",
-       "fileexists": "Un file con iste nomine existe ja.\nPer favor verifica <strong>[[:$1]]</strong> si tu non es secur de voler cambiar lo.\n[[$1|thumb]]",
+       "fileexists": "Un file con iste nomine existe jam.\nPer favor verifica <strong>[[:$1]]</strong> si {{GENDER:|tu}} non es secur de voler cambiar lo.\n[[$1|thumb]]",
        "filepageexists": "Le pagina de description correspondente a iste file ha ja essite create a <strong>[[:$1]]</strong>, ma nulle file con iste nomine existe al momento.\nLe summario que tu entra non apparera in le pagina de description.\nSi tu vole que illo appare, tu debe inserer lo manualmente.\n[[$1|thumb]]",
-       "fileexists-extension": "Un file con un nomine similar existe ja: [[$2|thumb]]\n* Nomine del file a incargar: <strong>[[:$1]]</strong>\n* Nomine del file existente: <strong>[[:$2]]</strong>\nPer favor selige un altere nomine.",
+       "fileexists-extension": "Un file con un nomine similar existe ja: [[$2|thumb]]\n* Nomine del file a incargar: <strong>[[:$1]]</strong>\n* Nomine del file existente: <strong>[[:$2]]</strong>\nConsidera usar un nomine plus distincte.",
        "fileexists-thumbnail-yes": "Iste file pare esser un imagine a grandor reducite ''(miniatura)''. [[$1|thumb]]\nPer favor verifica le file <strong>[[:$1]]</strong>.\nSi le file verificate es le mesme imagine a grandor original, non es necessari incargar un miniatura additional.",
        "file-thumbnail-no": "Le nomine del file comencia con <strong>$1</strong>.\nIllo pare esser un imagine a grandor reducite ''(miniatura)''.\nSi tu possede iste imagine in plen resolution, incarga lo, alteremente cambia le nomine del file per favor.",
        "fileexists-forbidden": "Un file con iste nomine existe ja, e non pote esser superscribite.\nSi tu vole ancora incargar iste file, per favor retorna e usa un nove nomine. [[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Deletion e restauration de files temporarimente disactivate durante mantenentia.",
        "filedelete-maintenance-title": "Non pote deler file",
        "mimesearch": "Recerca de typo MIME",
-       "mimesearch-summary": "Iste pagina permitte filtrar le files a base de lor typos MIME.\nSyntaxe: typo/subtypo, p.ex. <code>image/jpeg</code>.",
+       "mimesearch-summary": "Iste pagina permitte filtrar le files a base de lor typos MIME.\nSyntaxe: typodecontento/subtypo o typodecontento/*, p.ex. <code>image/jpeg</code>.",
        "mimetype": "Typo MIME:",
        "download": "discargar",
        "unwatchedpages": "Paginas non observate",
        "wantedtemplates": "Patronos desirate",
        "mostlinked": "Paginas le plus ligate",
        "mostlinkedcategories": "Categorias le plus ligate",
-       "mostlinkedtemplates": "Patronos le plus utilisate",
+       "mostlinkedtemplates": "Paginas le plus transcludite",
        "mostcategories": "Paginas con le plus categorias",
        "mostimages": "Files le plus utilisate",
        "mostinterwikis": "Paginas con le plus interwikis",
        "log-title-wildcard": "Cercar titulos que comencia con iste texto",
        "showhideselectedlogentries": "Monstrar/celar le entratas de registro seligite",
        "allpages": "Tote le paginas",
-       "alphaindexline": "$1 a $2",
        "nextpage": "Sequente pagina ($1)",
        "prevpage": "Precedente pagina ($1)",
        "allpagesfrom": "Monstrar le paginas a partir de:",
        "listgrouprights-removegroup-self": "Pote remover {{PLURAL:$2|gruppo|gruppos}} del proprie conto: $1",
        "listgrouprights-addgroup-self-all": "Pote adder tote le gruppos al proprie conto",
        "listgrouprights-removegroup-self-all": "Pote remover tote le gruppos del proprie conto",
+       "listgrouprights-namespaceprotection-header": "Restrictiones de spatio de nomines",
+       "listgrouprights-namespaceprotection-namespace": "Spatio de nomines",
+       "listgrouprights-namespaceprotection-restrictedto": "Derecto(s) que permitte al usator de modificar",
+       "trackingcategories": "Categorias de sequimento",
+       "trackingcategories-summary": "Iste pagina lista le categorias de sequimento que es automaticamente plenate per le software MediaWiki. Lor nomines pote esser cambiate alterante le correspondente messages de systema in le spatio de nomines \"{{ns:8}}\".",
+       "trackingcategories-msg": "Categoria de sequimento",
+       "trackingcategories-name": "Nomine del message",
+       "trackingcategories-desc": "Criterios pro inclusion in categoria",
+       "noindex-category-desc": "Iste pagina es excludite del indice perque illo contine le marca <code><nowiki>__NOINDEX__</nowiki></code> e es in un spatio de nomines ubi le uso de iste marca es permittite.",
+       "index-category-desc": "Iste pagina contine le marca <code><nowiki>__INDEX__</nowiki></code> (e es in un spatio de nomines ubi le uso de iste marca es permittite), e dunque es includite in le indice mesmo si illo normalmente non lo esserea.",
+       "post-expand-template-inclusion-category-desc": "Le expansion de tote le patronos facerea le dimension del pagina exceder le limite de <code>$wgMaxArticleSize</code>, dunque alcun patronos non ha essite expandite.",
+       "post-expand-template-argument-category-desc": "Post le expansion de un parametro de patrono (qualcosa inter accolladas triple, como <code>{{{Exemplo}}}</code>), le dimension del pagina excede le limite de <code>$wgMaxArticleSize</code>.",
+       "expensive-parserfunction-category-desc": "Troppo de functiones costose de analysator syntactic (como <code>#ifexist</code>) ha essite includite in un pagina. Vide [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Iste categoria es addite si le pagina contine un ligamine de file rupte (un ligamine pro incorporar un file quando le file non existe).",
+       "hidden-category-category-desc": "Iste categoria contine le marca <code><nowiki>__HIDDENCAT__</nowiki></code>, impediente lo de apparer in le quadro de ligamines de categoria in paginas, si non configurate alteremente.",
+       "trackingcategories-nodesc": "Nulle description disponibile.",
+       "trackingcategories-disabled": "Le categoria es disactivate",
        "mailnologin": "Necun adresse de invio",
        "mailnologintext": "Tu debe [[Special:UserLogin|aperir un session]]\ne haber un adresse de e-mail valide in tu [[Special:Preferences|preferentias]]\npro inviar e-mail a altere usatores.",
        "emailuser": "Inviar e-mail a iste usator",
        "watchnologin": "Tu non ha aperite un session",
        "addwatch": "Adder al observatorio",
        "addedwatchtext": "Le pagina \"[[:$1]]\" ha essite addite a tu [[Special:Watchlist|observatorio]].\nLe modificationes futur in iste pagina e in le pagina de discussion associate essera listate in illo.",
+       "addedwatchtext-short": "Le pagina \"$1\" ha essite addite a tu observatorio.",
        "removewatch": "Remover del observatorio",
        "removedwatchtext": "Le pagina \"[[:$1]]\" ha essite removite de [[Special:Watchlist|tu observatorio]].",
+       "removedwatchtext-short": "Le pagina \"$1\" ha essite removite de tu observatorio.",
        "watch": "Observar",
        "watchthispage": "Observar iste pagina",
        "unwatch": "Disobservar",
        "unwatchthispage": "Disobservar",
        "notanarticle": "Non es un articulo",
        "notvisiblerev": "Le version ha essite delite",
-       "watchlist-details": "{{PLURAL:$1|$1 pagina|$1 paginas}} es in tu observatorio, sin contar le paginas de discussion.",
+       "watchlist-details": "{{PLURAL:$1|$1 pagina|$1 paginas}} in tu observatorio. Le paginas de discussion non es contate separatemente.",
        "wlheader-enotif": "Le notification via e-mail es active.",
        "wlheader-showupdated": "Le paginas que ha essite modificate post tu ultime visita se monstra in litteras '''grasse'''.",
        "wlnote2": "Ecce le cambiamentos in le ultime {{PLURAL:$1|hora|<strong>$1</strong> horas}}, a partir del $2 a $3.",
        "contributions-title": "Contributiones del usator $1",
        "mycontris": "Contributiones",
        "contribsub2": "Pro {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Le conto de usator \"$1\" non es registrate.",
        "nocontribs": "Necun modification ha essite trovate secundo iste criterios.",
        "uctop": "(ultime)",
        "month": "A partir del mense (e anterior):",
        "movepagetalktext": "Le pagina de discussion associate essera automaticamente renominate conjunctemente con illo '''a minus que''':\n*Un pagina de discussion non vacue ja existe sub le nove nomine, o\n*Tu dismarca le quadrato infra.\n\nIl tal casos, tu debera renominar o fusionar le pagina manualmente si desirate.",
        "movearticle": "Renominar pagina:",
        "moveuserpage-warning": "'''Attention:''' Tu es super le puncto de renominar un pagina de usator. Nota ben que solmente le pagina, e ''non'' le usator, essera renominate.",
+       "movecategorypage-warning": "<strong>Attention:</strong> Tu es sur le puncto de renominar un pagina de categoria. Nota ben que solmente le pagina essera renominate e tote le paginas in le ancian categoria <em>non</em> essera recategorisate in le nove.",
        "movenologintext": "Tu debe esser un usator registrate e [[Special:UserLogin|aperir un session]] pro poter renominar un pagina.",
        "movenotallowed": "Tu non ha le permission de renominar paginas.",
        "movenotallowedfile": "Tu non ha le permission de renominar files.",
        "cant-move-user-page": "Tu non ha le permission de renominar paginas principal de usatores.",
        "cant-move-to-user-page": "Tu non ha le permission de renominar un pagina verso un pagina de usator (excepte un subpagina de usator).",
+       "cant-move-category-page": "Tu non ha le permission de renominar paginas de categoria.",
+       "cant-move-to-category-page": "Tu non ha le permission de renominar un pagina in un pagina de categoria.",
        "newtitle": "Al nove titulo:",
        "move-watch": "Observar le paginas de origine e de destination",
        "movepagebtn": "Renominar pagina",
        "tooltip-summary": "Entra un curte summario",
        "interlanguage-link-title": "$1 (in $2)",
        "common.css": "/* Le CSS placiate hic se applicara a tote le stilos */",
-       "cologneblue.css": "/* Le CSS placiate hic afficera le usatores del apparentia Colonia Blau */",
-       "monobook.css": "/* Le CSS placiate hic afficera le usatores del apparentia MonoBook */",
-       "modern.css": "/* Le CSS placiate hic afficera le usatores del apparentia Moderne */",
-       "vector.css": "/* Le CSS placiate hic afficera le usatores del apparentia Vector */",
        "print.css": "/* Le CSS placiate hic influentiara le apparentia del paginas imprimite */",
        "common.js": "/* Omne JavaScript hic se executara pro tote le usatores a cata cargamento de pagina. */",
-       "cologneblue.js": "/* Omne JavaScript hic se executara pro le usatores del apparentia Colonia Blau */",
-       "monobook.js": "/* Omne JavaScript hic se executara pro le usatores del apparentia MonoBook */",
-       "modern.js": "/* Omne JavaScript hic se executara pro le usatores del apparentia Moderne */",
-       "vector.js": "/* Omne JavaScript hic se executara pro le usatores del apparentia Vector */",
        "anonymous": "{{PLURAL:$1|Usator|Usatores}} anonyme de {{SITENAME}}",
        "siteuser": "Usator $1 de {{SITENAME}}",
        "anonuser": "le usator anonyme $1 de {{SITENAME}}",
        "pageinfo-category-pages": "Numero de paginas",
        "pageinfo-category-subcats": "Numero de subcategorias",
        "pageinfo-category-files": "Numero de files",
-       "skinname-cologneblue": "Colonia Blau",
-       "skinname-monobook": "MonoBook",
-       "skinname-modern": "Moderne",
        "markaspatrolleddiff": "Marcar como patruliate",
        "markaspatrolledtext": "Marcar iste pagina como patruliate",
        "markedaspatrolled": "Marcate como patruliate",
        "newimages-summary": "Iste pagina special detalia le recente files incargate.",
        "newimages-legend": "Filtro",
        "newimages-label": "Nomine del file (o un parte de illo):",
+       "newimages-showbots": "Monstrar files incargate per robots",
        "noimages": "Nihil a vider.",
        "ilsubmit": "Cercar",
        "bydate": "per data",
        "watchlistedit-raw-done": "Tu observatorio ha essite actualisate.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 titulo|$1 titulos}} ha essite addite:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 titulo|$1 titulos}} ha essite removite:",
+       "watchlistedit-clear-title": "Observatorio radite",
+       "watchlistedit-clear-legend": "Rader observatorio",
+       "watchlistedit-clear-explain": "Tote le titulos essera removite de tu observatorio",
+       "watchlistedit-clear-titles": "Titulos:",
+       "watchlistedit-clear-submit": "Rader le observatorio (isto es permanente!)",
+       "watchlistedit-clear-done": "Tu observatorio ha essite radite.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 titulo|$1 titulos}} ha essite removite:",
+       "watchlistedit-too-many": "Il ha troppo de paginas pro monstrar los hic.",
+       "watchlisttools-clear": "Rader le observatorio",
        "watchlisttools-view": "Vider modificationes pertinente",
        "watchlisttools-edit": "Vider e modificar le observatorio",
        "watchlisttools-raw": "Modificar observatorio crude",
        "version-hook-name": "Nomine del uncino",
        "version-hook-subscribedby": "Subscribite per",
        "version-version": "(Version $1)",
+       "version-no-ext-name": "[sin nomine]",
        "version-license": "Licentia pro MediaWiki",
        "version-ext-license": "Licentia",
        "version-ext-colheader-name": "Extension",
        "htmlform-no": "No",
        "htmlform-yes": "Si",
        "htmlform-chosen-placeholder": "Selige un option",
+       "htmlform-cloner-create": "Adder plus",
+       "htmlform-cloner-delete": "Remover",
+       "htmlform-cloner-required": "Al minus un valor es requirite.",
        "sqlite-has-fts": "$1 con supporto de recerca de texto integre",
        "sqlite-no-fts": "$1 sin supporto de recerca de texto integre",
        "logentry-delete-delete": "$1 {{GENDER:$2|deleva}} le pagina $3",
index db936b1..c8b84de 100644 (file)
@@ -33,7 +33,9 @@
                        "William Surya Permana",
                        "לערי ריינהארט",
                        "아라",
-                       "C5st4wr6ch"
+                       "C5st4wr6ch",
+                       "Raynasution",
+                       "Arifin.wijaya"
                ]
        },
        "tog-underline": "Garis bawahi pranala:",
@@ -46,7 +48,7 @@
        "tog-showtoolbar": "Tampilkan bilah alat penyuntingan",
        "tog-editondblclick": "Sunting halaman dengan klik ganda",
        "tog-editsectiononrightclick": "Fungsikan penyuntingan bagian dengan mengeklik kanan pada judul bagian",
-       "tog-watchcreations": "Tambahkan halaman yang saya buat ke daftar pantauan",
+       "tog-watchcreations": "Tambahkan halaman yang saya buat dan berkas yang saya unggah ke daftar pantauan",
        "tog-watchdefault": "Tambahkan halaman yang saya sunting ke daftar pantauan",
        "tog-watchmoves": "Tambahkan halaman yang saya pindahkan ke daftar pantauan",
        "tog-watchdeletion": "Tambahkan halaman yang saya hapus ke daftar pantauan",
        "qbmyoptions": "Halaman saya",
        "faq": "FAQ",
        "faqpage": "Project:FAQ",
-       "vector-action-addsection": "Bagian baru",
-       "vector-action-delete": "Hapus",
-       "vector-action-move": "Pindahkan",
-       "vector-action-protect": "Lindungi",
-       "vector-action-undelete": "Pembatalan penghapusan",
-       "vector-action-unprotect": "Ubah perlindungan",
-       "vector-view-create": "Buat",
-       "vector-view-edit": "Sunting",
-       "vector-view-history": "Versi terdahulu",
-       "vector-view-view": "Baca",
-       "vector-view-viewsource": "Lihat sumber",
        "actions": "Tindakan",
        "namespaces": "Ruang nama",
        "variants": "Varian",
        "pool-timeout": "Lewat waktu menunggu kunci",
        "pool-queuefull": "Kumpulan antrean penuh",
        "pool-errorunknown": "Kesalahan yang tidak diketahui",
+       "pool-servererror": "Layanan penghitung pool ini tidak tersedia ($1).",
        "aboutsite": "Tentang {{SITENAME}}",
        "aboutpage": "Project:Perihal",
        "copyright": "Konten tersedia sesuai di bawah $1.",
        "eauthentsent": "Sebuah surel untuk konfirmasi telah dikirim ke alamat surel. Sebelum surel lainnya dikirim ke akun tersebut, Anda harus mengikuti instruksi di dalam surel tersebut, untuk melakukan konfirmasi bahwa alamat tersebut adalah benar kepunyaan Anda.",
        "throttled-mailpassword": "Suatu pengingat kata sandi telah dikirimkan dalam {{PLURAL:$1|$1 jam}} terakhir.\nUntuk menghindari penyalahgunaan, hanya satu kata sandi yang akan dikirimkan setiap {{PLURAL:$1|$1 jam}}.",
        "mailerror": "Kesalahan dalam mengirimkan surel: $1",
-       "acct_creation_throttle_hit": "Pengunjung wiki ini dengan alamat IP yang sama dengan Anda telah membuat {{PLURAL:$1|1 akun|$1 akun}} dalam satu hari terakhir, hingga jumlah maksimum yang diijinkan.\nKarenanya, pengunjung dengan alamat IP ini tidak dapat lagi membuat akun lain untuk sementara.",
+       "acct_creation_throttle_hit": "Pengunjung wiki ini dengan alamat IP yang sama dengan Anda telah membuat {{PLURAL:$1|1 akun|$1 akun}} dalam satu hari terakhir, hingga jumlah maksimum yang diizinkan.\nKarenanya, pengunjung dengan alamat IP ini tidak dapat lagi membuat akun lain untuk sementara.",
        "emailauthenticated": "Alamat surel Anda telah dikonfirmasi pada $3, $2.",
        "emailnotauthenticated": "Alamat surel Anda belum dikonfirmasi.\nSebelum dikonfirmasi Anda tidak akan menerima surel dari fitur berikut.",
        "noemailprefs": "Anda harus memasukkan alamat surel di preferensi Anda untuk dapat menggunakan fitur-fitur ini.",
        "parser-template-recursion-depth-warning": "Limit kedalaman hubungan berulang templat terlampaui ($1)",
        "language-converter-depth-warning": "Batas kedalaman pengonversi bahasa terlampaui ($1)",
        "node-count-exceeded-category": "Halaman dimana hitungan-node terlampaui",
+       "node-count-exceeded-category-desc": "Kategori untuk halaman dimana hitungan-node terlampaui.",
        "node-count-exceeded-warning": "Page exceeded the node-count",
        "expansion-depth-exceeded-category": "Pages where expansion depth is exceeded",
+       "expansion-depth-exceeded-category-desc": "Ini adalah kategori untuk halaman dimana kedalaman ekspansi terlampaui.",
        "expansion-depth-exceeded-warning": "Page exceeded the expansion depth",
        "parser-unstrip-loop-warning": "Unstrip loop detected",
        "parser-unstrip-recursion-limit": "Unstrip recursion limit exceeded ($1)",
        "currentrev": "Revisi terkini",
        "currentrev-asof": "Revisi terkini pada $1",
        "revisionasof": "Revisi per $1",
-       "revision-info": "Revisi per $1; $2",
+       "revision-info": "Revisi per $1 oleh {{GENDER:$6|$2}}$7",
        "previousrevision": "←Revisi sebelumnya",
        "nextrevision": "Revisi selanjutnya→",
        "currentrevisionlink": "Revisi terkini",
        "revdelete-selected-text": "{{PLURAL:$1|Revisi terpilih|Revisi terpilih}} dari [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Versi berkas terpilih|Versi berkas terpilih}} dari [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Log|Log-log}} pilihan untuk:",
+       "revdelete-text-text": "Revisi yang dihapus akan tetap muncul di halaman riwayat, tetapi bagian dari konten mereka akan menjadi tidak dapat diakses untuk umum.",
+       "revdelete-text-file": "Versi berkas yang dihapus akan tetap muncul di riwayat berkas, tetapi bagian dari konten mereka akan menjadi tidak dapat diakses untuk umum.",
+       "logdelete-text": "Acara log yang dihapus akan tetap muncul di log, tetapi bagian dari konten mereka akan menjadi tidak dapat diakses untuk umum.",
        "revdelete-text-others": "Pengurus lain pada {{SITENAME}} masih akan dapat mengakses konten tersembunyi dan dapat membatalkan penghapusan itu kembali melalui antarmuka yang sama ini, kecuali ada batasan-batasan tambahan yang ditetapkan.",
        "revdelete-confirm": "Tolong konfirmasi bahwa Anda memang bermaksud melakukan ini, memahami konsekuensinya, dan bahwa Anda melakukannya sesuai dengan [[{{MediaWiki:Policy-url}}|kebijakan]].",
        "revdelete-suppress-text": "Penyembunyian revisi '''hanya''' boleh digunakan untuk kasus-kasus berikut:\n* Informasi yang berpotensi memfitnah\n* Informasi pribadi yang tak sepantasnya\n*: ''alamat rumah dan nomor telepon, nomor kartu identitas, dan lain-lain.''",
        "editundo": "balikkan",
        "diff-empty": "(Tidak ada perbedaan)",
        "diff-multi-sameuser": "({{PLURAL:$1|Satu revisi antara|$1 revisi antara}} oleh pengguna yang sama tidak ditampilkan)",
+       "diff-multi-otherusers": "({{PLURAL:$1|Satu revisi antara|$1 revisi antara}} oleh {{PLURAL:$2|satu pengguna lainnya|$2 pengguna}} tidak ditampilkan)",
        "diff-multi-manyusers": "({{PLURAL:$1|Satu|$1}} revisi antara oleh lebih dari $2 {{PLURAL:$2|satu|$2}} pengguna tak ditampilkan)",
        "difference-missing-revision": "{{PLURAL:$2|Satu revisi|$2 revisi}} dari perbedaan ini ($1) {{PLURAL:$2|tidak|tidak}} ditemukan.\n\nHal ini biasanya disebabkan oleh tautan diff yang kedaluwarsa ke halaman yang sudah dihapus.\nRinciannya dapat ditemukan di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log penghapusan].",
        "searchresults": "Hasil pencarian",
        "searchresults-title": "Hasil pencarian untuk \"$1\"",
-       "toomanymatches": "Pencarian menghasilkan terlalu banyak hasil, silakan masukkan kueri lain",
        "titlematches": "Judul halaman yang sama",
        "textmatches": "Teks halaman yang cocok",
        "notextmatches": "Tidak ada teks halaman yang cocok",
        "search-interwiki-default": "Hasil dari $1:",
        "search-interwiki-more": "(selanjutnya)",
        "search-relatedarticle": "Berkaitan",
-       "searcheverything-enable": "Cari di semua ruang nama",
        "searchrelated": "berkaitan",
        "searchall": "semua",
        "showingresults": "Di bawah ini ditampilkan hingga {{PLURAL:$1|'''1''' hasil|'''$1''' hasil}}, dimulai dari #'''$2'''.",
        "powersearch-togglelabel": "Pilih:",
        "powersearch-toggleall": "Semua",
        "powersearch-togglenone": "Tidak ada",
+       "powersearch-remember": "Ingar pilihan untuk pencarian selanjutnya",
        "search-external": "Pencarian eksternal",
        "searchdisabled": "Pencarian {{SITENAME}} sementara dimatikan.\nAnda dapat mencari melalui Google untuk sementara waktu.\nPerlu diingat bahwa indeks Google untuk konten {{SITENAME}} mungkin belum mencakup perubahan-perubahan terakhir.",
        "search-error": "Kesalahan terjadi saat mencari: $1",
        "allowemail": "Izinkan pengguna lain mengirim surel",
        "prefs-searchoptions": "Cari",
        "prefs-namespaces": "Ruang nama",
-       "defaultns": "Atau cari dalam ruang-ruang nama berikut:",
        "default": "baku",
        "prefs-files": "Berkas",
        "prefs-custom-css": "CSS pribadi",
        "right-move": "Memindahkan halaman",
        "right-move-subpages": "Memindahkan halaman dengan seluruh subhalamannya",
        "right-move-rootuserpages": "Memindahkan halaman utama pengguna",
+       "right-move-categorypages": "Pindahkan halaman kategori",
        "right-movefile": "Memindahkan berkas",
        "right-suppressredirect": "Tidak membuat pengalihan dari nama lama ketika memindahkan halaman",
        "right-upload": "Memuat berkas",
        "action-createpage": "membuat halaman baru",
        "action-createtalk": "membuat halaman pembicaraan baru",
        "action-createaccount": "membuat akun pengguna ini",
+       "action-history": "lihat riwayat halaman ini",
        "action-minoredit": "menandai sebagai suntingan kecil",
        "action-move": "memindahkan halaman ini",
        "action-move-subpages": "memindahkan halaman ini, dan semua sub-halamannya",
        "action-move-rootuserpages": "memindahkan halaman utama pengguna",
+       "action-move-categorypages": "pindahkan halaman kategori",
        "action-movefile": "pindahkan berkas ini",
        "action-upload": "memuatkan berkas ini",
        "action-reupload": "menimpa berkas yang telah ada",
        "recentchanges-label-unpatrolled": "Suntingan ini belum terpatroli",
        "recentchanges-label-plusminus": "Perubahan ukuran halaman dalam bita",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "(lihat pula [[Special:NewPages|daftar halaman baru]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (lihat pula [[Special:NewPages|daftar halaman baru]])",
        "rcnotefrom": "Di bawah ini adalah perubahan sejak <strong>$2</strong> (ditampilkan sampai <strong>$1</strong> perubahan).",
        "rclistfrom": "Perlihatkan perubahan terbaru sejak $3 $2",
        "rcshowhideminor": "$1 suntingan kecil",
        "filetype-mime-mismatch": "Ekstensi berkas \".$1\" tidak cocok dengan jenis MIME yang terdeteksi dari berkas ($2).",
        "filetype-badmime": "Berkas dengan tipe MIME \"$1\" tidak diperkenankan untuk dimuat.",
        "filetype-bad-ie-mime": "Tidak dapat memuat berkas ini karena Internet Explorer mendeteksinya sebagai \"$1\", yang tak diizinkan dan merupakan tipe berkas yang memiliki potensi bahaya.",
-       "filetype-unwanted-type": "'''\".$1\"''' termasuk jenis berkas yang tidak diijinkan.\n{{PLURAL:$3|Jenis berkas yang disarankan adalah|Jenis berkas yang disarankan adalah}} $2.",
+       "filetype-unwanted-type": "'''\".$1\"''' termasuk jenis berkas yang tidak diizinkan.\n{{PLURAL:$3|Jenis berkas yang disarankan adalah|Jenis berkas yang disarankan adalah}} $2.",
        "filetype-banned-type": "'''\".$1\"''' {{PLURAL:$4|adalah ekstensi berkas yang tidak diizinkan|adalah ekstensi berkas yang tidak diizinkan}}.\n{{PLURAL:$3|Jenis berkas yang diperolehkan adalah|Jenis berkas yang diperolehkan adalah}} $2.",
        "filetype-missing": "Berkas tak memiliki ekstensi (misalnya \".jpg\").",
        "empty-file": "Berkas yang Anda kirim kosong.",
        "unwatchedpages": "Halaman yang tak dipantau",
        "listredirects": "Daftar pengalihan",
        "listduplicatedfiles": "Daftar berkas yang berduplikat",
+       "listduplicatedfiles-summary": "Ini adalah daftar berkas di mana versi terbaru dari berkas tersebut merupakan duplikat dari versi terbaru dari beberapa berkas lain. Hanya berkas lokal yang dianggap.",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] memiliki [[$3|{{PLURAL:$2|sebuah duplikat|$2 duplikat}}]].",
        "unusedtemplates": "Templat yang tak digunakan",
        "unusedtemplatestext": "Daftar berikut adalah semua halaman pada ruang nama {{ns:template}} yang tidak dipakai di halaman mana pun.\nCek dahulu pranala lain ke templat tersebut sebelum menghapusnya.",
        "trackingcategories-name": "Nama pesan",
        "trackingcategories-desc": "Kriteria inklusi kategori",
        "noindex-category-desc": "Halaman tidak diindeks oleh robot karena ini mempunyai kata khusus <code><nowiki>__NOINDEX__</nowiki></code> padanya dan berada dalam ruang nama yang mengizinkan penanda itu.",
+       "index-category-desc": "Halaman ini memiliki <code><nowiki>__INDEX__</nowiki></code> di atasnya (dan dalam ruang nama yang mana bendera yang diperbolehkan), dan karenanya diindeks oleh robot di mana itu biasanya tidak akan.",
        "post-expand-template-inclusion-category-desc": "Setelah memperluas semua templat, ukuran halaman menjadi lebih besar dari <code>$wgMaxArticleSize</code>, sehingga beberapa templat tidak diperluas.",
+       "post-expand-template-argument-category-desc": "Setelah memperluas argumen templat (sesuatu dalam tiga tanda kurung, seperti <code>{{{Foo}}}</code>), halaman tersebut lebih besar dari <code>$wgMaxArticleSize</code>.",
+       "expensive-parserfunction-category-desc": "Terlalu banyak fungsi parser (seperti <code>#ifexist</code>) termasuk pada halaman. Lihat [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
        "broken-file-category-desc": "Kategori ditambahkan jika halaman tersebut berisi pranala rusak (pranala untuk menanamkan sebuah berkas ketika berkas tersebut tidak ada).",
+       "hidden-category-category-desc": "Ini adalah kategori dengan <code><nowiki>__HIDDENCAT__</nowiki></code> di atasnya, yang mencegah dari muncul di kotak tautan kategori pada halaman, secara default.",
        "trackingcategories-nodesc": "Deskripsi tidak tersedia.",
        "trackingcategories-disabled": "Kategori dinonaktifkan",
        "mailnologin": "Tidak ada alamat surel",
        "watchnologin": "Belum masuk log",
        "addwatch": "Tambahkan ke daftar pantauan",
        "addedwatchtext": "Halaman \"[[:$1]]\" telah ditambahkan ke [[Special:Watchlist|daftar pantauan]] Anda.\nPerubahan-perubahan berikutnya pada halaman tersebut dan halaman pembicaraan terkaitnya akan tercantum di sini.",
+       "addedwatchtext-short": "Halaman \"$1\" telah ditambahkan ke daftar pantauan Anda.",
        "removewatch": "Hapus dari daftar pantauan",
        "removedwatchtext": "Halaman \"[[:$1]]\" telah dihapus dari [[Special:Watchlist|daftar pantauan]] Anda.",
+       "removedwatchtext-short": "Halaman \"$1\" telah dihapus dari daftar pantauan Anda.",
        "watch": "Pantau",
        "watchthispage": "Pantau halaman ini",
        "unwatch": "Batal pantau",
        "sp-contributions-newbies-sub": "Untuk pengguna baru",
        "sp-contributions-newbies-title": "Kontribusi pengguna baru",
        "sp-contributions-blocklog": "Log pemblokiran",
+       "sp-contributions-suppresslog": "kontribusi pengguna yang disembunyikan",
        "sp-contributions-deleted": "kontribusi pengguna yang dihapus",
        "sp-contributions-uploads": "unggahan",
        "sp-contributions-logs": "log",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] telah diblokir.<br />\nLihat [[Special:BlockList|daftar pemblokiran]] untuk meninjau kembali pemblokiran.",
        "ipb-blockingself": "Anda akan memblokir diri sendiri! Apakah Anda yakin akan melakukannya?",
        "ipb-confirmhideuser": "Anda akan memblokir pengguna dengan mengaktifkan \"sembunyikan pengguna\" diaktifkan. Ini akan menyembunyikan nama pengguna pada semua daftar dan entri log. Apakah Anda yakin ingin melakukannya?",
+       "ipb-confirmaction": "Jika Anda yakin Anda benar-benar ingin melakukannya, periksa kolom \"{{int:ipb-confirm}}\" di bagian bawah.",
        "ipb-edit-dropdown": "Sunting alasan pemblokiran",
        "ipb-unblock-addr": "Hilangkan blokir $1",
        "ipb-unblock": "Hilangkan blokir seorang pengguna atau suatu alamat IP",
        "movepagetalktext": "Halaman pembicaraan yang berkaitan juga akan dipindahkan secara otomatis '''kecuali apabila:'''\n\n*Sebuah halaman pembicaraan yang tidak kosong telah ada di bawah judul baru, atau\n*Anda tidak memberi tanda cek pada kotak di bawah ini\n\nDalam kasus tersebut, apabila diinginkan, Anda dapat memindahkan atau menggabungkan halaman secara manual.",
        "movearticle": "Pindahkan halaman:",
        "moveuserpage-warning": "'''Peringatan:''' Anda tengah memindahkan halaman pengguna. Perlu diketahui bahwa hanya halaman yang akan dipindahkan namun pengguna ''tidak akan'' berganti nama.",
+       "movecategorypage-warning": "<strong>Peringatan:</strong> Anda akan memindahkan halaman kategori. Perlu diketahui bahwa hanya halaman yang akan dipindahkan dan setiap halaman dalam kategori lama <em>tidak</em> akan dikategorikan ulang ke yang baru.",
        "movenologintext": "Anda harus menjadi pengguna terdaftar dan telah [[Special:UserLogin|masuk log]] untuk dapat memindahkan suatu halaman.",
        "movenotallowed": "Anda tak memiliki hak akses untuk memindahkan halaman.",
        "movenotallowedfile": "Anda tak memiliki hak untuk memindahkan berkas.",
        "cant-move-user-page": "Anda tidak memiliki hak akses untuk memindahkan halaman pengguna (terpisah dari subhalaman).",
        "cant-move-to-user-page": "Anda tidak memiliki hak akses untuk memindahkan halaman ke suatu halaman pengguna (kecuali ke subhalaman pengguna).",
+       "cant-move-category-page": "Anda tidak memiliki izin untuk memindahkan halaman kategori.",
+       "cant-move-to-category-page": "Anda tidak memiliki izin untuk memindahkan halaman ke halaman kategori.",
        "newtitle": "Ke judul baru:",
        "move-watch": "Pantau halaman ini",
        "movepagebtn": "Pindahkan halaman",
        "thumbnail_image-type": "Tipe gambar tidak didukung",
        "thumbnail_gd-library": "Konfigurasi pustaka GD tak lengkap: tak ada fungsi $1",
        "thumbnail_image-missing": "Berkas yang tampaknya hilang: $1",
+       "thumbnail_image-failure-limit": "Ada terlalu banyak upaya yang gagal baru-baru ini ($1 atau lebih) untuk membuat miniatur ini. Silakan coba lagi nanti.",
        "import": "Impor halaman",
        "importinterwiki": "Impor transwiki",
        "import-interwiki-text": "Pilih suatu wiki dan judul halaman yang akan di impor.\nTanggal revisi dan nama penyunting akan dipertahankan.\nSemua aktivitas impor transwiki akan dicatat di [[Special:Log/import|log impor]].",
        "tooltip-preferences-save": "Simpan preferensi",
        "tooltip-summary": "Masukkan sebuah ringkasan pendek",
        "common.css": "/* CSS yang ada di sini akan diterapkan pada semua kulit. */",
-       "monobook.css": "/* CSS yang ada di sini akan diterapkan pada kulit Monobook. */",
-       "vector.css": "/* CSS nan ado di siko diterapkan pado kulik Vektor. */",
        "print.css": "/* CSS yang ada di sini akan diterapkan pada tampilan cetak. */",
        "noscript.css": "/* CSS di sini akan mempengaruhi pengguna dengan skrip Java non-aktif */",
        "group-autoconfirmed.css": "/* CSS di sini hanya mempengaruhi pengguna terkonfirmasi otomatis */",
        "group-sysop.css": "/* CSS di sini hanya mempengaruhi pengurus */",
        "group-bureaucrat.css": "/* CSS di sini hanya mempengaruhi birokrat */",
        "common.js": "/* JavaScript yang ada di sini akan diterapkan untuk semua kulit. */",
-       "monobook.js": "/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit MonoBook */",
-       "vector.js": "/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Vector */",
        "group-autoconfirmed.js": "/* Semua JavaScript di sini hanya dimuatkan untuk pengguna terkonfirmasi otomatis */",
        "group-bot.js": "/* Semua JavaScript di sini hanya dimuatkan untuk bot */",
        "group-sysop.js": "/* Semua JavaScript di sini hanya dimuatkan untuk pengurus */",
        "pageinfo-category-pages": "Jumlah halaman",
        "pageinfo-category-subcats": "Jumlah subkategori",
        "pageinfo-category-files": "Jumlah berkas",
-       "skinname-monobook": "MonoBook",
-       "skinname-vector": "Vektor",
        "markaspatrolleddiff": "Tandai telah dipatroli",
        "markaspatrolledtext": "Tandai halaman ini telah dipatroli",
        "markedaspatrolled": "Ditandai telah dipatroli",
        "newimages-summary": "Halaman istimewa berikut menampilkan daftar berkas yang terakhir dimuat",
        "newimages-legend": "Penyaring",
        "newimages-label": "Nama berkas (atau sebagian dari nama berkas):",
+       "newimages-showbots": "Tampilkan unggahan oleh bot",
        "noimages": "Tidak ada yang dilihat.",
        "ilsubmit": "Cari",
        "bydate": "berdasarkan tanggal",
        "imgmultigo": "Cari!",
        "imgmultigoto": "Pergi ke halaman $1",
        "img-lang-default": "(bahasa default)",
+       "img-lang-info": "Jadikan gambar ini dalam $1. $2",
        "img-lang-go": "Tuju ke",
        "ascending_abbrev": "naik",
        "descending_abbrev": "turun",
        "watchlistedit-raw-done": "Daftar pantauan Anda telah diperbarui.",
        "watchlistedit-raw-added": "{{PLURAL:$1|$1 judul telah}} ditambahkan:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|$1 judul telah}} dikeluarkan:",
+       "watchlistedit-clear-title": "Daftar pantauan dihapus",
+       "watchlistedit-clear-legend": "Hapus daftar pantauan",
+       "watchlistedit-clear-explain": "Semua judul akan dihapus dari daftar pantauan Anda",
+       "watchlistedit-clear-titles": "Judul:",
+       "watchlistedit-clear-submit": "Hapus daftar pantauan (Ini bersifat permanen!)",
+       "watchlistedit-clear-done": "Daftar pantauan Anda telah dihapus.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 judul telah|$1 judul telah}} dihapus:",
+       "watchlistedit-too-many": "Ada terlalu banyak halaman untuk ditampilkan di sini.",
+       "watchlisttools-clear": "Hapus daftar pantauan",
        "watchlisttools-view": "Tampilkan perubahan terkait",
        "watchlisttools-edit": "Tampilkan dan sunting daftar pantauan",
        "watchlisttools-raw": "Sunting daftar pantauan mentah",
        "duration-centuries": "{{PLURAL:$1||}}$1 abad",
        "duration-millennia": "{{PLURAL:$1||}}$1 milenium",
        "rotate-comment": "Gambar diputar $1 {{PLURAL:$1|derajat}} searah jarum jam",
+       "limitreport-title": "Parser profil data:",
        "limitreport-cputime": "Penggunaan waktu CPU",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|detik|detik}}",
        "limitreport-walltime": "Penggunaan waktu riil",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|detik|detik}}",
+       "limitreport-ppvisitednodes": "Preprosesor mengunjungi hitungan node",
+       "limitreport-ppgeneratednodes": "Preprosesor menghasilkan hitungan node",
+       "limitreport-postexpandincludesize": "Pasca memperluas mencakup ukuran",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|bita|bita}}",
        "limitreport-templateargumentsize": "Ukuran argumen temlat",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|bita|bita}}",
index 2fc82c4..25394c1 100644 (file)
        "qbmyoptions": "Pampanidko",
        "faq": "MAS",
        "faqpage": "Project:MAS",
-       "vector-action-addsection": "Agnayon ti topiko",
-       "vector-action-delete": "Ikkaten",
-       "vector-action-move": "Iyalis",
-       "vector-action-protect": "Salakniban",
-       "vector-action-undelete": "Isubli ti inikkat",
-       "vector-action-unprotect": "Sukatan ti salaknib",
-       "vector-view-create": "Agaramid",
-       "vector-view-edit": "Urnosen",
-       "vector-view-history": "Kitaen ti pakasaritaan",
-       "vector-view-view": "Basaen",
-       "vector-view-viewsource": "Kitaen ti taudan",
        "actions": "Dagiti aramid",
        "namespaces": "Dagiti nagan ti espasio",
        "variants": "Sab-sabali a pagsasao",
        "currentrev": "Kinaudi a binaliwan",
        "currentrev-asof": "Kinaudi a panagbalbaliw manipud idi $1",
        "revisionasof": "Panagbalbaliw manipud idi $1",
-       "revision-info": "Panagbaliw manipud idi $1 babaen ni $2",
+       "revision-info": "Panagbaliw manipud idi $1 babaen ni {{GENDER:$6|$2}}$7",
        "previousrevision": "←Daan a panagbalbaliw",
        "nextrevision": "Nabarbaro a panagbalbaliw→",
        "currentrevisionlink": "Kinaudi a binaliwan",
        "difference-missing-revision": "{{PLURAL:$2|Maysa a panagbalbaliw|$2 kadagiti panagbalbaliw}} iti daytoy a paggiddiatan ($1) {{PLURAL:$2|ket ti|ket dagiti}} saan a naburikan.\n\nDaytoy ket kadawyan a gapuanan babaen ti sumaganad a nabaak a panilpo tipaggiddiatan ti maysa a panid a naikkaten.\nDagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].",
        "searchresults": "Dagiti nagbanagan ti panagbiruk",
        "searchresults-title": "Dagiti nabirukan a nagbanagan para iti \"$1\"",
-       "toomanymatches": "Adu unay ti napasubli nga agpapada, pangngaasi a padasem ti sabali a panagsapul",
        "titlematches": "Dagiti kapadpada a titulo ti panid",
        "textmatches": "Dagiti agpapada a testo ti panid",
        "notextmatches": "Awan dagiti kapadpada a testo ti panid",
        "search-interwiki-default": "Dagiti resulta manipud ti $1:",
        "search-interwiki-more": "(adu pay)",
        "search-relatedarticle": "Mainaig",
-       "searcheverything-enable": "Agbirukka kadagiti amin a nagan ti espasio",
        "searchrelated": "mainaig",
        "searchall": "amin",
        "showingresults": "Maiparang dita baba agingga {{PLURAL:$1|iti '''1''' a nagbanagan|dagiti '''$1''' a nagbanagan}} a mangrugi iti #'''$2'''.",
        "powersearch-togglelabel": "Markaan:",
        "powersearch-toggleall": "Amin",
        "powersearch-togglenone": "Awan",
+       "powersearch-remember": "Lagipen ti napili para kadagiti masakbayan a panagbiruk",
        "search-external": "Akinruar a panagbiruk",
        "searchdisabled": "Ti panagbiruk iti {{SITENAME}} ket nabaldado.\nMabalinmo ti agbiruk idiay Google tattan.\nLaglagipem laeng a dagiti pagsurotan nagyan ti {{SITENAME}} ket baka baak.",
        "search-error": "Adda maysa a biddut  napasamak bayat nga agbirbiruk:$1",
        "allowemail": "Pakabaelam ti esurat a naggapu kadagiti sabali nga agar-aramat",
        "prefs-searchoptions": "Biruken",
        "prefs-namespaces": "Dagiti nagan ti espasio",
-       "defaultns": "Wenno saan agbirukka kadagitoy a nagan ti espasio:",
        "default": "kasisigud",
        "prefs-files": "Dagiti papeles",
        "prefs-custom-css": "Naiduma a CSS",
        "recentchanges-label-unpatrolled": "Daytoy a panag-urnos ket saan pay a napatruliaan",
        "recentchanges-label-plusminus": "Ti panagbaliw ti kadakkel ti panid babaen ti bilang dagiti byte",
        "recentchanges-legend-heading": "'''Leyenda:'''",
-       "recentchanges-legend-newpage": "(kitaen pay ti [[Special:NewPages|listaan ti baro a pampanid]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (kitaen pay ti [[Special:NewPages|listaan ti baro a pampanid]])",
        "rcnotefrom": "Dita baba ket dagiti sinukatan manipud idi strong>$2</strong> (agingga iti <strong>$1</strong> a naipakita).",
        "rclistfrom": "Ipakita dagiti kabarbaro a sinukatan a mangrugi manipud idi $3 $2",
        "rcshowhideminor": "$1 dagiti bassit a panag-urnos",
index d7a1e69..cbcdf49 100644 (file)
        "qbmyoptions": "Mínar síður",
        "faq": "Algengar spurningar",
        "faqpage": "Project:Algengar spurningar",
-       "vector-action-addsection": "Bæta við umræðu",
-       "vector-action-delete": "Eyða",
-       "vector-action-move": "Færa",
-       "vector-action-protect": "Vernda",
-       "vector-action-undelete": "Hætta við eyðingu",
-       "vector-action-unprotect": "Breyta verndunarstigi",
-       "vector-view-create": "Skapa",
-       "vector-view-edit": "Breyta",
-       "vector-view-history": "Breytingaskrá",
-       "vector-view-view": "Lesa",
-       "vector-view-viewsource": "Sýna frumkóða",
        "actions": "Aðgerðir",
        "namespaces": "Nafnrými",
        "variants": "Útgáfur",
        "difference-missing-revision": "$2 {{PLURAL:$2|útgáfa|útgáfur}} samanburðarins ($1) {{PLURAL:$2|fannst|fundust}} ekki.\n\nÞetta gerist oftast þegar úreldur samanburðartengill tengir á síðu sem hefur verið eytt.\nFrekari upplýsingar eru í [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} eyðingarskránni].",
        "searchresults": "Leitarniðurstöður",
        "searchresults-title": "Leitarniðurstöður fyrir „$1“",
-       "toomanymatches": "Of mörgum niðurstöðum var skilað, gjörðu svo vel og reyndu aðra fyrirspurn",
        "titlematches": "Titlar greina sem pössuðu við fyrirspurnina",
        "textmatches": "Leitarorð fannst/fundust í innihaldi eftirfarandi greina",
        "notextmatches": "Engar samsvaranir á texta í síðum",
        "searchmenu-exists": "'''Það er síða að nafni „[[:$1]]“ á þessum wiki'''",
        "searchmenu-new": "<strong>Skapaðu síðuna \"[[:$1]]\" á þessum wiki!<strong>\nSjá einnig {{PLURAL:$2|0=|leitarniðurstöðuna|leitarniðurstöðurnar}}.",
        "searchprofile-articles": "Efnissíður",
-       "searchprofile-project": "Hjálpar- og verkefnasíður",
        "searchprofile-images": "Margmiðlanir",
        "searchprofile-everything": "Allt",
        "searchprofile-advanced": "Nánar",
        "searchprofile-articles-tooltip": "Leita í $1",
-       "searchprofile-project-tooltip": "Leita í $1",
        "searchprofile-images-tooltip": "Leita að skrám",
        "searchprofile-everything-tooltip": "Leita í öllu efni (þar á meðal spjallsíðum)",
        "searchprofile-advanced-tooltip": "Leita í ákveðnum nafnrýmum",
        "search-interwiki-default": "$1 útkomur:",
        "search-interwiki-more": "(fleiri)",
        "search-relatedarticle": "Tengt",
-       "searcheverything-enable": "Leita í öllum nafnrýmum",
        "searchrelated": "tengt",
        "searchall": "öllum",
        "showingresults": "Sýni <strong>$1</strong> {{PLURAL:$1|niðurstöðu|niðurstöður}} frá og með #<strong>$2</strong>.",
        "allowemail": "Virkja tölvupóst frá öðrum notendum",
        "prefs-searchoptions": "Leit",
        "prefs-namespaces": "Nafnrými",
-       "defaultns": "Leita í þessum nafnrýmum sjálfgefið:",
        "default": "sjálfgefið",
        "prefs-files": "Skrár",
        "prefs-custom-css": "Sérsniðið CSS-útlit",
        "prefs-emailconfirm-label": "Staðfesting netfangs:",
        "youremail": "Netfang:",
        "username": "{{Gender:$1|Notandanafn}}:",
-       "uid": "Raðnúmer {{GENDER:$1|notanda}}:",
        "prefs-memberingroups": "{{GENDER:$2|Meðlimur}} {{PLURAL:$1|hóps|hópa}}:",
        "prefs-registration": "Nýskráningartími:",
        "yourrealname": "Fullt nafn:",
        "recentchanges-label-minor": "Þetta er minniháttar breyting",
        "recentchanges-label-bot": "Þessi breyting var gerð af vélmenni",
        "recentchanges-label-unpatrolled": "Þessi breyting hefur ekki verið yfirfarin",
-       "recentchanges-legend-newpage": "(sjá einng [[Special:NewPages|lista yfir nýjar síður]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sjá einng [[Special:NewPages|lista yfir nýjar síður]])",
        "rcnotefrom": "Að neðan eru breytingar síðan <strong>$2<strong> (allt að <strong>$1<strong> sýndar).",
        "rclistfrom": "Sýna breytingar frá og með $3 $2",
        "rcshowhideminor": "$1 minniháttar breytingar",
        "log-title-wildcard": "Leita að titlum sem byrja á þessum texta",
        "showhideselectedlogentries": "Sýna/fela valdar aðgerða færslur",
        "allpages": "Allar síður",
-       "alphaindexline": "$1 til $2",
        "nextpage": "Næsta síða ($1)",
        "prevpage": "Fyrri síða ($1)",
        "allpagesfrom": "Sýna síður frá og með:",
        "tooltip-preferences-save": "Vista stillingar",
        "tooltip-summary": "Bættu við stuttu ágripi",
        "common.css": "/* Allt CSS sem sett er hér mun virka á öllum þemum. */",
-       "monobook.css": "/* Það sem sett er hingað er bætt við Monobook stilsniðið fyrir allan vefinn */",
        "common.js": "/* Allt JavaScript sem sett er hér mun virka í hvert skipti sem að síða hleðst. */",
        "anonymous": "$1 {{PLURAL:$1|óþekktur notandi|óþekktir notendur}} á {{SITENAME}}",
        "siteuser": "{{SITENAME}} notandi $1",
        "pageinfo-category-pages": "Fjöldi síðna",
        "pageinfo-category-subcats": "Fjöldi undirflokka",
        "pageinfo-category-files": "Fjöldi skráa",
-       "skinname-cologneblue": "Kölnarblátt",
-       "skinname-monobook": "EinBók",
-       "skinname-modern": "Nútímalegt",
        "markaspatrolleddiff": "Merkja sem yfirfarið",
        "markaspatrolledtext": "Merkja þessa síðu sem yfirfarna",
        "markedaspatrolled": "Merkja sem yfirfarið",
index fb5739b..ad0430d 100644 (file)
        "qbmyoptions": "Le mie pagine",
        "faq": "Domande frequenti",
        "faqpage": "Project:Domande frequenti",
-       "vector-action-addsection": "Aggiungi discussione",
-       "vector-action-delete": "Cancella",
-       "vector-action-move": "Sposta",
-       "vector-action-protect": "Proteggi",
-       "vector-action-undelete": "Ripristina",
-       "vector-action-unprotect": "Cambia la protezione",
-       "vector-view-create": "Crea",
-       "vector-view-edit": "Modifica",
-       "vector-view-history": "Cronologia",
-       "vector-view-view": "Leggi",
-       "vector-view-viewsource": "Visualizza sorgente",
        "actions": "Azioni",
        "namespaces": "Namespace",
        "variants": "Varianti",
        "noname": "Il nome utente indicato non è valido.",
        "loginsuccesstitle": "Accesso effettuato",
        "loginsuccess": "'''Sei stato connesso al server di {{SITENAME}} con il nome utente di \"$1\".'''",
-       "nosuchuser": "Non è registrato alcun utente di nome \"$1\". I nomi utente sono sensibili alle maiuscole. Verificare il nome inserito o [[Special:UserLogin/signup|creare un nuovo accesso]].",
+       "nosuchuser": "Non è registrato alcun utente di nome \"$1\".\nI nomi utente sono sensibili alle maiuscole.\nVerificare il nome inserito o [[Special:UserLogin/signup|creare una nuova utenza]].",
        "nosuchusershort": "Non è registrato alcun utente di nome \"$1\". Verificare il nome inserito.",
        "nouserspecified": "È necessario specificare un nome utente.",
        "login-userblocked": "Questa utenza è bloccata. Non è possibile effettuare il login.",
        "currentrev": "Versione attuale",
        "currentrev-asof": "Versione attuale delle $1",
        "revisionasof": "Versione delle $1",
-       "revision-info": "Versione del $4 alle $5 di $2",
+       "revision-info": "Versione del $4 alle $5 di {{GENDER:$6|$2}}$7",
        "previousrevision": "← Versione meno recente",
        "nextrevision": "Versione più recente →",
        "currentrevisionlink": "Versione attuale",
        "mergehistory-empty": "Nessuna versione da unire.",
        "mergehistory-success": "{{PLURAL:$3|Una versione di [[:$1]] è stata unita|$3 versioni di [[:$1]] sono state unite}} alla cronologia di [[:$2]].",
        "mergehistory-fail": "Impossibile unire le cronologie. Verificare la pagina e i parametri temporali.",
+       "mergehistory-fail-toobig": "Impossibile eseguire l'unione della cronologia con oltre $1 {{PLURAL:$1|revisione|revisioni}} da spostare.",
        "mergehistory-no-source": "La pagina di origine $1 non esiste.",
        "mergehistory-no-destination": "La pagina di destinazione $1 non esiste.",
        "mergehistory-invalid-source": "La pagina di origine deve avere un titolo corretto.",
        "difference-missing-revision": "{{PLURAL:$2|Una versione|$2 versioni}} di questa differenza ($1) {{PLURAL:$2|non è stata trovata|non sono state trovate}}.\n\nQuesto si verifica solitamente seguendo un collegamento obsoleto di un diff a una pagina cancellata.\nI dettagli possono essere trovati nel [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro delle cancellazioni].",
        "searchresults": "Risultati della ricerca",
        "searchresults-title": "Risultati della ricerca di \"$1\"",
-       "toomanymatches": "Troppe corrispondenze. Modificare la richiesta.",
        "titlematches": "Corrispondenze nel titolo delle pagine",
        "textmatches": "Corrispondenze nel testo delle pagine",
        "notextmatches": "Nessuna corrispondenza nel testo delle pagine",
        "search-interwiki-default": "Risultati da $1:",
        "search-interwiki-more": "(altro)",
        "search-relatedarticle": "Risultati correlati",
-       "searcheverything-enable": "Cerca in tutti i namespace",
        "searchrelated": "correlati",
        "searchall": "tutti",
        "showingresults": "Di seguito {{PLURAL:$1|viene presentato al massimo '''1''' risultato|vengono presentati al massimo '''$1''' risultati}} a partire dal numero '''$2'''.",
        "powersearch-togglelabel": "Seleziona:",
        "powersearch-toggleall": "Tutti",
        "powersearch-togglenone": "Nessuno",
+       "powersearch-remember": "Ricorda la selezione per le prossime ricerche",
        "search-external": "Ricerca esterna",
        "searchdisabled": "La ricerca interna di {{SITENAME}} non è attiva; nel frattempo si può provare ad usare un motore di ricerca esterno come Google. (Si noti però che i contenuti di {{SITENAME}} presenti in tali motori potrebbero non essere aggiornati.)",
        "search-error": "Si è verificato un errore durante la ricerca: $1",
        "allowemail": "Abilita la ricezione di messaggi email da altri utenti",
        "prefs-searchoptions": "Ricerca",
        "prefs-namespaces": "Namespace",
-       "defaultns": "Altrimenti, cerca in questi namespace:",
        "default": "predefinito",
        "prefs-files": "File",
        "prefs-custom-css": "CSS personalizzato",
        "recentchanges-label-unpatrolled": "Modifica non ancora verificata",
        "recentchanges-label-plusminus": "Variazione della pagina in numero di byte",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "(vedi [[Special:NewPages|le nuove pagine]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vedi [[Special:NewPages|le nuove pagine]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Di seguito sono elencate le modifiche apportate a partire da <strong>$2</strong> (mostrate fino a <strong>$1</strong>).",
        "rclistfrom": "Mostra le modifiche apportate a partire da $3 $2",
        "windows-nonascii-filename": "Questo wiki non supporta nomi di file con caratteri speciali.",
        "fileexists": "Un file con questo nome esiste già.\nVerificare prima <strong>[[:$1]]</strong> se non si è sicuri di volerlo sovrascrivere.\n[[$1|thumb]]",
        "filepageexists": "La pagina di descrizione di questo file è già stata creata all'indirizzo <strong>[[:$1]]</strong>, anche se non esiste ancora un file con questo nome. La descrizione dell'oggetto inserita in fase di caricamento non apparirà sulla pagina di descrizione. Per far sì che l'oggetto compaia sulla pagina di descrizione, sarà necessario modificarla manualmente.\n[[$1|thumb]]",
-       "fileexists-extension": "Un file con nome simile a questo esiste già: [[$2|thumb]]\n* Nome del file caricato: <strong>[[:$1]]</strong>\n* Nome del file esistente: <strong>[[:$2]]</strong>\nScegliere un nome diverso.",
+       "fileexists-extension": "Un file con nome simile a questo esiste già: [[$2|thumb]]\n* Nome del file caricato: <strong>[[:$1]]</strong>\n* Nome del file esistente: <strong>[[:$2]]</strong>\nForse vuoi scegliere un nome più caratteristico?.",
        "fileexists-thumbnail-yes": "Il file caricato sembra essere una miniatura ''(thumbnail)''. [[$1|thumb]]\nVerificare, per confronto, il file <strong>[[:$1]]</strong>.\nSe si tratta della stessa immagine, nelle dimensioni originali, non è necessario caricarne altre miniature.",
        "file-thumbnail-no": "Il nome del file inizia con <strong>$1</strong>; sembra quindi essere una miniatura ''(thumbnail)''.\nSe si dispone dell'immagine nella risoluzione originale, si prega di caricarla. In caso contrario, si prega di cambiare il nome del file.",
        "fileexists-forbidden": "Un file con questo nome esiste già e non può essere sovrascritto. Tornare indietro e modificare il nome con il quale caricare il file. [[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Cancellazione e recupero di file temporaneamente disattivati durante la manutenzione.",
        "filedelete-maintenance-title": "Impossibile eliminare il file",
        "mimesearch": "Ricerca in base al tipo MIME",
-       "mimesearch-summary": "Questa pagina consente di filtrare i file in base al tipo MIME. Inserire la stringa di ricerca nella forma tipo/sottotipo, ad es. <code>image/jpeg</code>.",
+       "mimesearch-summary": "Questa pagina consente di filtrare i file in base al tipo MIME.\nInserire la stringa di ricerca nella forma tipo/sottotipo o tipo/*, ad es. <code>image/jpeg</code>.",
        "mimetype": "Tipo MIME:",
        "download": "scarica",
        "unwatchedpages": "Pagine non osservate",
        "wantedtemplates": "Template richiesti",
        "mostlinked": "Pagine più richiamate",
        "mostlinkedcategories": "Categorie più richiamate",
-       "mostlinkedtemplates": "Template più utilizzati",
+       "mostlinkedtemplates": "Pagine più inlcuse",
        "mostcategories": "Pagine con più categorie",
        "mostimages": "File più richiamati",
        "mostinterwikis": "Pagine con più interwiki",
        "nolinkshere-ns": "Non vi sono pagine che puntano a '''[[:$1]]''' nel namespace selezionato.",
        "isredirect": "redirect",
        "istemplate": "inclusione",
-       "isimage": "link verso file",
+       "isimage": "collegamento a file",
        "whatlinkshere-prev": "{{PLURAL:$1|precedente|precedenti $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|successivo|successivi $1}}",
        "whatlinkshere-links": "← collegamenti",
        "whatlinkshere-hideredirs": "$1 redirect",
        "whatlinkshere-hidetrans": "$1 inclusioni",
-       "whatlinkshere-hidelinks": "$1 link",
+       "whatlinkshere-hidelinks": "$1 collegamenti",
        "whatlinkshere-hideimages": "$1 link da file",
        "whatlinkshere-filters": "Filtri",
        "autoblockid": "Autoblocco #$1",
        "tooltip-summary": "Inserire una breve sintesi",
        "interlanguage-link-title": "$1 - $2",
        "common.css": "/* Gli stili CSS inseriti qui si applicano a tutte le skin */",
-       "monobook.css": "/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Monobook */",
-       "vector.css": "/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Vector */",
        "print.css": "/* Gli stili CSS inseriti qui si applicano all'output in stampa */",
        "noscript.css": "/ * Gli stili CSS inseriti qui si applicano agli utenti che hanno JavaScript disabilitato * /",
        "group-autoconfirmed.css": "/ * Gli stili CSS inseriti qui si applicheranno solo ad utenti autoconvalidati * /",
        "group-sysop.css": "/ * Gli stili CSS inseriti qui si applicheranno solo agli amministratori/sysop * /",
        "group-bureaucrat.css": "/ * Gli stili CSS inseriti qui si applicheranno solo ai burocrati * /",
        "common.js": "/* Il codice JavaScript inserito qui viene caricato da ciascuna pagina, per tutti gli utenti. */",
-       "monobook.js": "/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin MonoBook */",
-       "vector.js": "/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Vector */",
        "group-autoconfirmed.js": "/ * Il codice JavaScript inserito qui viene caricato solo per gli utenti autoconvalidati * /",
        "group-user.js": "/ * Il codice JavaScript inserito qui viene caricato solo per gli utenti registrati * /",
        "group-bot.js": "/ * Il codice JavaScript inserito qui viene caricato solo per i bot * /",
        "version-hook-name": "Nome dell'hook",
        "version-hook-subscribedby": "Sottoscrizioni",
        "version-version": "($1)",
+       "version-no-ext-name": "[senza nome]",
        "version-license": "Licenza MediaWiki",
        "version-ext-license": "Licenza",
        "version-ext-colheader-name": "Estensione",
index e98596e..3eb9fdc 100644 (file)
@@ -58,7 +58,8 @@
                        "蝋燭α",
                        "青子守歌",
                        "아라",
-                       "Rxy"
+                       "Rxy",
+                       "Mfuji"
                ]
        },
        "tog-underline": "リンクの下線:",
        "qbmyoptions": "自分のページ",
        "faq": "よくある質問と回答",
        "faqpage": "Project:よくある質問と回答",
-       "vector-action-addsection": "話題追加",
-       "vector-action-delete": "削除",
-       "vector-action-move": "移動",
-       "vector-action-protect": "保護",
-       "vector-action-undelete": "復元",
-       "vector-action-unprotect": "保護再設定",
-       "vector-view-create": "作成",
-       "vector-view-edit": "編集",
-       "vector-view-history": "履歴表示",
-       "vector-view-view": "閲覧",
-       "vector-view-viewsource": "ソースを閲覧",
        "actions": "操作",
        "namespaces": "名前空間",
        "variants": "変種",
        "currentrev": "最新版",
        "currentrev-asof": "$1時点における最新版",
        "revisionasof": "$1時点における版",
-       "revision-info": "$1時点における$2による版",
+       "revision-info": "$1時点における{{GENDER:$6|$2}}による版$7",
        "previousrevision": "←前の版",
        "nextrevision": "次の版→",
        "currentrevisionlink": "最新版",
        "mergehistory-empty": "統合できる版がありません。",
        "mergehistory-success": "[[:$1]]の $3 {{PLURAL:$3|版}}を[[:$2]]に統合しました。",
        "mergehistory-fail": "履歴の統合を実行できません。ページと時刻の引数を再確認してください。",
+       "mergehistory-fail-toobig": "移動させた{{PLURAL:$1|版}}の数が上限を超えているため、履歴の統合を実行できません。",
        "mergehistory-no-source": "統合元ページ $1 が存在しません。",
        "mergehistory-no-destination": "統合先ページ $1 が存在しません。",
        "mergehistory-invalid-source": "統合元のページは有効な名前でなければなりません。",
        "difference-missing-revision": "指定された{{PLURAL:$2|$2版}}の差分 ($1) が見つかりませんでした。\n\n通常、削除されたページの版への古い差分表示や固定リンクをたどった際に、このようなことが起きます。 \n詳細は[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 削除記録]を参照してください。",
        "searchresults": "検索結果",
        "searchresults-title": "「$1」の検索結果",
-       "toomanymatches": "一致したページが多すぎます。他の検索語を指定してください。",
        "titlematches": "ページ名と一致",
        "textmatches": "ページ本文と一致",
        "notextmatches": "どのページ本文とも一致しませんでした",
        "search-interwiki-default": "$1からの結果:",
        "search-interwiki-more": "(続き)",
        "search-relatedarticle": "関連",
-       "searcheverything-enable": "すべての名前空間を検索",
        "searchrelated": "関連",
        "searchall": "すべて",
        "showingresults": "<strong>$2</strong> 件目以降の最大 {{PLURAL:$1|<strong>$1</strong> 件の結果}}を表示しています。",
        "allowemail": "他の利用者からのメールを受け取る",
        "prefs-searchoptions": "検索",
        "prefs-namespaces": "名前空間",
-       "defaultns": "指定した名前空間のみを検索:",
        "default": "既定",
        "prefs-files": "ファイル",
        "prefs-custom-css": "カスタムCSS",
        "recentchanges-label-unpatrolled": "巡回されていない編集",
        "recentchanges-label-plusminus": "ページ サイズの増減 (バイト単位)",
        "recentchanges-legend-heading": "'''凡例:'''",
-       "recentchanges-legend-newpage": "([[Special:NewPages|新しいページ一覧]]も参照)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|新しいページ一覧]]も参照)",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "rcnotefrom": "以下は<strong>$2</strong>以降の更新です (最大 <strong>$1</strong> 件)。",
        "rclistfrom": "$3の$2以降の更新を表示する",
        "largefileserver": "このファイルは、サーバー設定で許されている最大サイズより大きいです。",
        "emptyfile": "アップロードしたファイルは内容が空のようです。\nファイル名の指定が間違っている可能性があります。\n本当にこのファイルをアップロードしたいのか、確認してください。",
        "windows-nonascii-filename": "このウィキではファイル名に特殊文字を使用できません。",
-       "fileexists": "この名前のファイルは既に存在します。置き換えていいかどうか確信が持てない場合は、<strong>[[:$1]]</strong>を確認してください。\n[[$1|thumb]]",
+       "fileexists": "この名前のファイルは既に存在します。{{GENDER:|}}置き換えていいかどうか確信が持てない場合は、<strong>[[:$1]]</strong>を確認してください。\n[[$1|thumb]]",
        "filepageexists": "このファイルのための説明ページは既に<strong>[[:$1]]</strong>に作成されていますが、現在、ファイルが存在しません。\n入力した概要は説明ページに反映されません。\n新しい概要を表示させるには、説明ページを手動で編集する必要があります。\n[[$1|thumb]]",
        "fileexists-extension": "類似した名前のファイルが既に存在します: [[$2|thumb]]\n* アップロード中のファイルの名前: <strong>[[:$1]]</strong>\n* 既存ファイルの名前: <strong>[[:$2]]</strong>\n違う名前を選択してください。",
        "fileexists-thumbnail-yes": "このファイルは元の画像から縮小されたもの <em>(サムネイル)</em> のようです。\n[[$1|thumb]]\nファイル <strong>[[:$1]]</strong> を確認してください。\n確認したファイルが同じ画像の元のサイズの版の場合は、サムネイルを別途アップロードする必要はありません。",
        "filedelete-maintenance": "メンテナンス中のため、ファイルの削除と復元は一時的に無効化されています。",
        "filedelete-maintenance-title": "ファイルを削除できません",
        "mimesearch": "MIMEタイプ検索",
-       "mimesearch-summary": "このページでは、ファイルをMIMEタイプで絞り込みます。\ncontenttype/subtypeの形式で入力してください (例: <code>image/jpeg</code>)。",
+       "mimesearch-summary": "このページでは、ファイルをMIMEタイプで絞り込みます。\ncontenttype/subtype または contenttype/* の形式で入力してください (例: <code>image/jpeg</code>)。",
        "mimetype": "MIMEタイプ:",
        "download": "ダウンロード",
        "unwatchedpages": "ウォッチされていないページ",
        "allarticles": "全ページ",
        "allinnamespace": "全ページ ($1名前空間)",
        "allpagessubmit": "表示",
-       "allpagesprefix": "次の文字列から始まるページを表示:",
+       "allpagesprefix": "表示するページ名の先頭:",
        "allpagesbadtitle": "指定したページ名は無効か、言語間またはインターウィキ接頭辞を含んでいます。\nページ名に使用できない文字が1つ以上含まれている可能性があります。",
        "allpages-bad-ns": "{{SITENAME}}に「$1」という名前空間はありません。",
        "allpages-hide-redirects": "リダイレクトを隠す",
        "tooltip-summary": "短い要約を入力してください",
        "interlanguage-link-title": "$2: $1",
        "common.css": "/* ここに記述したCSSはすべての外装に反映されます */",
-       "monobook.css": "/* ここに記述したCSSはモノブック外装の利用者に影響します */",
-       "vector.css": "/* ここに記述したCSSはベクター外装の利用者に影響します */",
        "print.css": "/* ここに記述したCSSは印刷出力に影響します */",
        "noscript.css": "/* ここに記述したCSSはJavaScriptを無効にしている利用者に影響します */",
        "group-autoconfirmed.css": "/* ここに記述したCSSは自動承認された利用者のみに影響します */",
        "group-sysop.css": "/* ここに記述したCSSは管理者のみに影響します */",
        "group-bureaucrat.css": "/* ここに記述したCSSはビューロクラットのみに影響します */",
        "common.js": "/* ここにあるすべてのJavaScriptは、すべてのページ読み込みですべての利用者に対して読み込まれます */",
-       "monobook.js": "/* ここにあるすべてのJavaScriptは、モノブック外装を使用している利用者に対して読み込まれます */",
-       "vector.js": "/* ここにあるすべてのJavaScriptは、ベクター外装を使用している利用者に対して読み込まれます */",
        "group-autoconfirmed.js": "/* ここにあるすべてのJavaScriptは、自動承認された利用者のみに読み込まれます */",
        "group-user.js": "/* ここにあるすべてのJavaScriptは、登録利用者のみに読み込まれます */",
        "group-bot.js": "/* ここにあるすべてのJavaScriptは、ボットのみに読み込まれます */",
        "pageinfo-category-pages": "ページ数",
        "pageinfo-category-subcats": "下位カテゴリ数",
        "pageinfo-category-files": "ファイル数",
-       "skinname-monobook": "モノブック",
-       "skinname-vector": "ベクター",
        "markaspatrolleddiff": "巡回済みにする",
        "markaspatrolledtext": "このページを巡回済みにする",
        "markedaspatrolled": "巡回済みにしました",
        "watchlistedit-clear-removed": "{{PLURAL:$1|$1 件のページ}}を除去しました:",
        "watchlistedit-too-many": "ページ数が多すぎるため表示できません。",
        "watchlisttools-clear": "ウォッチリストの全消去",
-       "watchlisttools-view": "関連する変更を閲覧",
-       "watchlisttools-edit": "ウォッチリストの閲覧と編集",
+       "watchlisttools-view": "関連する変更を表示",
+       "watchlisttools-edit": "ウォッチリストの表示と編集",
        "watchlisttools-raw": "ウォッチリストをテキストで編集",
        "iranian-calendar-m1": "ファルヴァルディーン",
        "iranian-calendar-m2": "オルディーベヘシュト",
        "version-hook-name": "フック名",
        "version-hook-subscribedby": "使用個所",
        "version-version": "(バージョン $1)",
+       "version-no-ext-name": "[名前なし]",
        "version-license": "MediaWiki のライセンス",
        "version-ext-license": "ライセンス",
        "version-ext-colheader-name": "拡張機能",
index dc61e25..3ada493 100644 (file)
        "qbmyoptions": "Opsiku",
        "faq": "FAQ (Pitakonan sing kerep diajokaké)",
        "faqpage": "Project:FAQ",
-       "vector-action-addsection": "Tambah topik",
-       "vector-action-delete": "Busak",
-       "vector-action-move": "Pindhahna",
-       "vector-action-protect": "Reksa",
-       "vector-action-undelete": "Batalna pambusakan",
-       "vector-action-unprotect": "Owahi pangreksan",
-       "vector-view-create": "Gawé",
-       "vector-view-edit": "Sunting",
-       "vector-view-history": "Sajarah kaca",
-       "vector-view-view": "Waca",
-       "vector-view-viewsource": "Pirsani sumber",
        "actions": "Tindakan",
        "namespaces": "Ruang jeneng",
        "variants": "Varian",
        "difference-missing-revision": "{{PLURAL:$2|Sak pambenahan|$2 pambenahan}} saka prabédan iki ($1) {{PLURAL:$2|ora ditemokaké|ora ditemokaké}}.\n\nIki biasané kasebab pranala prabedan sing wis ora kanggo saka kaca isi wis dibusak.\nRinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log busak].",
        "searchresults": "Kasil panggolèkan",
        "searchresults-title": "Kasil panggolèkan saka \"$1\"",
-       "toomanymatches": "Olèhé panjenengan golèk ngasilaké kakèhan pituwas, mangga nglebokaké ''query'' liyané",
        "titlematches": "Irah-irahan artikel sing cocog",
        "textmatches": "Tèks artikel sing cocog",
        "notextmatches": "Ora ana tèks kaca sing cocog",
        "searchmenu-exists": "'''Ana kaca kanthi jeneng \"[[$1]]\" ing wiki iki'''",
        "searchmenu-new": "'''Gawé kaca \"[[:$1]]\" ing wiki iki!'''",
        "searchprofile-articles": "Kaca isi",
-       "searchprofile-project": "Kaca pitulung lan proyèk",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Kabèh",
        "searchprofile-advanced": "Tataran luwih dhuwur/maju",
        "searchprofile-articles-tooltip": "Panggolèkan ing $1",
-       "searchprofile-project-tooltip": "Panggolèkan ing $1",
        "searchprofile-images-tooltip": "Panggolèkan berkas",
        "searchprofile-everything-tooltip": "Panggolèkan kabèh isi (klebu kaca-kaca wicara)",
        "searchprofile-advanced-tooltip": "Panggolèkan ing bilik jeneng biasa (''custom'')",
        "search-interwiki-default": "Pituwas $1:",
        "search-interwiki-more": "(luwih akèh)",
        "search-relatedarticle": "Kagandhèng",
-       "searcheverything-enable": "Golèki ing kabèh bilik-jeneng",
        "searchrelated": "kagandhèng",
        "searchall": "kabèh",
        "showingresults": "Ing ngisor iki dituduhaké {{PLURAL:$1|'''1''' kasil|'''$1''' kasil}}, wiwitané saking #<strong>$2</strong>.",
        "allowemail": "Marengaké panganggo liyané ngirim layang èlèktronik (email).",
        "prefs-searchoptions": "Golèk",
        "prefs-namespaces": "Ruang jeneng / Bilik jeneng",
-       "defaultns": "Utawa golèki ing bilik jeneng iki:",
        "default": "baku",
        "prefs-files": "Berkas",
        "prefs-custom-css": "CSS pribadi",
        "prefs-emailconfirm-label": "Konfirmasi layang-e:",
        "youremail": "Layang élèktronik (E-mail):",
        "username": "{{GENDER:$1|Asma panganggo}}:",
-       "uid": "{{GENDER:$1|ID panganggo}}:",
        "prefs-memberingroups": "{{GENDER:$2|Anggota}} {{PLURAL:$1|klompok|klompok-klompok}}:",
        "prefs-registration": "Wektu régistrasi:",
        "yourrealname": "Asma sajatiné :",
        "recentchanges-label-unpatrolled": "Suntingan iki durung dipatroli",
        "recentchanges-label-plusminus": "Gedhene kaca wis diowahi segede niki.",
        "recentchanges-legend-heading": "'''Katrangan:'''",
-       "recentchanges-legend-newpage": "(dhelengen uga: [[Special:NewPages|daftar kaca anyar]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (dhelengen uga: [[Special:NewPages|daftar kaca anyar]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Ing ngisor iki owah-owahan wiwit <strong>$2</strong> (kapacak nganti <strong>$1</strong> owah-owahan).",
        "rclistfrom": "Saiki nuduhaké owah-owahan wiwit tanggal $3 $2",
        "log-title-wildcard": "Golèk irah-irahan utawa judhul sing diawali mawa tèks kasebut",
        "showhideselectedlogentries": "Tuduhalé/dhelikaké èntri log kapilih",
        "allpages": "Kabèh kaca",
-       "alphaindexline": "$1 tumuju $2",
        "nextpage": "Kaca sabanjuré ($1)",
        "prevpage": "Kaca sadurungé ($1)",
        "allpagesfrom": "Kaca-kaca kawiwitan kanthi:",
index 0712260..63f48d7 100644 (file)
        "qbmyoptions": "ჩემი გვერდები",
        "faq": "ხშირი შეკითხვები",
        "faqpage": "Project:ხშირი შეკითხვები",
-       "vector-action-addsection": "თემის ჩამატება",
-       "vector-action-delete": "წაშლა",
-       "vector-action-move": "გადატანა",
-       "vector-action-protect": "დაცვა",
-       "vector-action-undelete": "აღდგენა",
-       "vector-action-unprotect": "დაცვის შეცვლა",
-       "vector-view-create": "შექმნა",
-       "vector-view-edit": "რედაქტირება",
-       "vector-view-history": "ისტორია",
-       "vector-view-view": "შემოწმებული სტატია",
-       "vector-view-viewsource": "წყაროს ხილვა",
        "actions": "მოქმედებები",
        "namespaces": "სახელთა სივრცე",
        "variants": "ვარიანტები",
        "print": "ამობეჭდე",
        "view": "იხილე",
        "edit": "რედაქტირება",
+       "edit-local": "ლოკალური აღწერის რედაქტირება",
        "create": "შექმნა",
+       "create-local": "ლოკალური აღწერის დამატება",
        "editthispage": "გვერდის რედაქტირება",
        "create-this-page": "ამ გვერდის შექმნა",
        "delete": "წაშლა",
        "jumptonavigation": "ნავიგაცია",
        "jumptosearch": "ძიება",
        "view-pool-error": "უკაცრავად, მაგრამ სერვერები გადატვირთულია.\nშემოსულია ამ გვერდის სანახავად ძალიან ბევრი მოთხოვნა.\nგთხოვთ, დაელოდეთ და გაიმერეთ მოთხოვნა ცოტა მოგვიანებით.\n\n$1",
+       "generic-pool-error": "უკაცრავად, მაგრამ სერვერები გადატვირთულია.\nბევრი მომხმარებელი ცდილობს ამ რესურსის ნახვას.\nგთხოვთ, დაელოდეთ და გაიმერეთ მოთხოვნა ცოტა მოგვიანებით.",
        "pool-timeout": "ბლოკირების ლოდინის დრო ამოიწურა",
        "pool-queuefull": "მოთხოვნების დამგროვებელი სავსეა",
        "pool-errorunknown": "უცნობი შეცდომა",
        "loginlanguagelabel": "ენა: $1",
        "suspicious-userlogout": "თქვენი მოთხოვნა გასვლის შესახებ გაუქმებულია, რადგანაც იგი გავს ქეშირებადი პროქსის ან არაკორექტული ბრაუზერის მოთხოვნას.",
        "pt-login": "შესვლა",
+       "pt-login-button": "შესვლა",
        "pt-createaccount": "ანგარიშის შექმნა",
        "pt-userlogout": "გასვლა",
        "php-mail-error-unknown": "ამოუცნობი შეცდომა PHP-ის mail() ფუნქციაში",
        "edit-gone-missing": "გვერდის განახლეა შეუძლებელია.\nშესაძლოა, იგი წაიშალა.",
        "edit-conflict": "რედაქციების კონფლიქტი.",
        "edit-no-change": "თქვენი შესწორება არ იქნა შენახული, რადგანაც ტექსტის ცვლილება არ მოხდა.",
+       "postedit-confirmation-created": "გვერდი შეიქმნა.",
        "postedit-confirmation-saved": "თქვენი რედაქტირება შენახულია.",
        "edit-already-exists": "ახალი გვერდის შექმნა არ მოხერხდა.\nის უკვე არსებობს.",
        "defaultmessagetext": "შეტყობინების სტანდარტული ტექსტი",
        "difference-missing-revision": "{{PLURAL:$2|$2 ვერსია}} ამ შედარებისათვის ($1) {{PLURAL:$2|ვერ მოიძებნა}}.\n\nეს ჩვეულებრივ ხდება მაშინ, თუ ვერსიების შედარების მოძველებული ბმულით გადადიხართ გვერდზე, რომელიც წაიშალა.\nდეტალური ინფორმაცია შესაძლებელია იყოს [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} წაშლების ჟურნალში].",
        "searchresults": "ძიების შედეგები",
        "searchresults-title": "ძიების შედეგები „$1“",
-       "toomanymatches": "ნაპოვნია ძალიან ბევრი შესაბამისობა, ეცადეთ სხვა მოთხოვნა",
        "titlematches": "სტატიის სათაური შეესაბამება",
        "textmatches": "გვერდის ტექსტი შესაბამისია",
        "notextmatches": "არ შეესაბამება არცერთი გვერდის ტექსტი",
        "searchmenu-exists": "'''ამ ვიკიპროექტში არის გვერდი „[[:$1]]“'''",
        "searchmenu-new": "'''შექმენით გვერდი „[[:$1]]“ ამ ვიკიში!''' {{PLURAL:$2|0=|აგრეთვე იხილე ძიები შედეგი.|აგრეთვე იხილე ძიების შედეგები.}}",
        "searchprofile-articles": "ძირითადი გვერდები",
-       "searchprofile-project": "დახმარების და პროექტის გვერდები",
        "searchprofile-images": "მულტიმედია",
        "searchprofile-everything": "ყველაფერი",
        "searchprofile-advanced": "გაფართოებული",
        "searchprofile-articles-tooltip": "ძიება $1ში",
-       "searchprofile-project-tooltip": "ძიება $1ში",
        "searchprofile-images-tooltip": "ფაილების ძიება",
        "searchprofile-everything-tooltip": "ყველა გვერდზე ძიება (მათ შორის განხილვის გვერდები)",
        "searchprofile-advanced-tooltip": "ძიება სახელთა მოცემულ სივრცეში",
        "search-result-score": "რელევანტურობა $1 %",
        "search-redirect": "(გადამისამართება $1)",
        "search-section": "(სექცია $1)",
+       "search-file-match": "(ემთხვევა ფაილის შინაარსს)",
        "search-suggest": "ხომ არ იგულისხმეთ: $1?",
        "search-interwiki-caption": "დობილი პროექტები",
        "search-interwiki-default": "შედეგები $1-დან:",
        "search-interwiki-more": "(გაგრძელება)",
        "search-relatedarticle": "დაკავშირებული",
-       "searcheverything-enable": "ძიება სახელთა ყველა სივრცეებში",
        "searchrelated": "მიბმული",
        "searchall": "ყველა",
        "showingresults": "ქვემოთ იხილეთ <b>$1</b>-მდე შედეგი დაწყებული #<b>$2</b>-იდან.",
        "allowemail": "სხვა მომხმარებლებისგან ელ. ფოსტის მიღების ნებართვა",
        "prefs-searchoptions": "ძიების პარამეტრები",
        "prefs-namespaces": "სახელთა სივრცეები",
-       "defaultns": "სხვა შემთხვევაში ძიება შემდეგ სახელთა სივრცეებში:",
        "default": "სტანდარტული",
        "prefs-files": "ფაილები",
        "prefs-custom-css": "მომხმარებლის CSS",
        "recentchanges-label-unpatrolled": "ეს რედაქტირება გადაუმოწმებელია",
        "recentchanges-label-plusminus": "ცვლილებების ზომა ბაიტებში",
        "recentchanges-legend-heading": "'''ლეგენდა:'''",
-       "recentchanges-legend-newpage": "(იხ. აგრეთვე [[Special:NewPages|ახალი გვერდების სია]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (იხ. აგრეთვე [[Special:NewPages|ახალი გვერდების სია]])",
        "rcnotefrom": "ქვემოთ მოყვანილია ცვლილებები <strong>$2</strong>-დან (ნაჩვენებია არაუმეტეს <strong>$1</strong>).",
        "rclistfrom": "ახალი ცვლილებების ჩვენება დაწყებული $3 $2-დან",
        "rcshowhideminor": "მცირე რედაქტირების $1",
        "rcshowhideanons-show": "ჩვენება",
        "rcshowhideanons-hide": "დამალვა",
        "rcshowhidepatr": "გაკონტროლებული ცვლილებების $1",
+       "rcshowhidepatr-show": "ჩვენება",
+       "rcshowhidepatr-hide": "დამალვა",
        "rcshowhidemine": "ჩემი რედაქტირების $1",
        "rcshowhidemine-show": "ჩვენება",
        "rcshowhidemine-hide": "დამალვა",
        "ninterwikis": "$1 {{PLURAL:$1|ინტერვიკი|ინტერვიკი}}",
        "nlinks": "$1 ბმული",
        "nmembers": "$1 წევრი",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|წევრი|წევრი}}",
        "nrevisions": "$1 რედაქტირება",
        "nviews": "$1 ჩვენება",
        "nimagelinks": "გამოიყენება $1 {{PLURAL:$1|გვერდზე}}",
        "listgrouprights-removegroup-self": "შეუძლია წაშალოს {{PLURAL:$2|ჯგუფი|ჯგუფები}} თავისი ანგარიშიდან: $1",
        "listgrouprights-addgroup-self-all": "შეუძლია ყელა ჯგუფია ჩამატება ანგარიშს.",
        "listgrouprights-removegroup-self-all": "შეუძლია თავისი ანგარიშის ყველა ჯგუფის წაშლა.",
+       "listgrouprights-namespaceprotection-namespace": "სახელთა სივრცე",
+       "trackingcategories-name": "შეტყობინების სახელი",
+       "trackingcategories-nodesc": "აღწერა არ არის.",
+       "trackingcategories-disabled": "კატეგორია გამორთულია",
        "mailnologin": "გამგზავნი მისამართი არ არის მითითებული.",
        "mailnologintext": "თქვენ უნდა [[Special:UserLogin|წარადგენილი იყოთ სისტემისადმი]] და გქონდეთ წესიერი ელექტრონული ფოსტის მისამართი თქვენს [[Special:Preferences|კონფიგურაციაში]] იმისთვის, რომ გაუგზავნოთ წერილების სხვა მომხმარებლებს.",
        "emailuser": "გაუგზავნეთ იმეილი ამ მომხმარებელს",
        "watchnologin": "რეგისტრაცია ვერ შესრულდა",
        "addwatch": "კონტროლის სიაში დამატება",
        "addedwatchtext": "გვერდი „[[:$1]]“ დაემატა თქვენს [[Special:Watchlist|კონტროლის სიას]].\nამ და მასთან დაკავშირებული განხილვის გვერდის შემდგომი ცვლილებები აისახება იქ.",
+       "addedwatchtext-short": "გვერდი „$1“ დაემატა თქვენი კონტროლის სიას.",
        "removewatch": "კონტროლის სიიდან წაშლა",
        "removedwatchtext": "გვერდი „[[:$1]]“ ამოღებულია თქვენი [[Special:Watchlist|კონტროლის სიიდან]].",
+       "removedwatchtext-short": "გვერდი „$1“ წაიშალა თქვენი კონტროლის სიიდან.",
        "watch": "კონტროლი",
        "watchthispage": "ამ გვერდის კონტროლი",
        "unwatch": "კონტროლის მოხსნა",
        "contributions-title": "მომხმარებლის წვლილი $1",
        "mycontris": "წვლილი",
        "contribsub2": "მომხმარებელი {{GENDER:$3|$1}} წვლილი ($2)",
+       "contributions-userdoesnotexist": "მომხმარებლის ანგარიში „$1“ არ არის რეგისტრირებული.",
        "nocontribs": "ძებნისას მითითებული პარამეტრების შესაბამისი არც ერთი ცვლილება ნაპოვნი არ არის",
        "uctop": "(მიმდინარე)",
        "month": "თვე:",
        "sp-contributions-newbies-sub": "ახალბედებისთვის",
        "sp-contributions-newbies-title": "ბოლოს დარეგისტრირებულ მომხმარებელთა წვლილი",
        "sp-contributions-blocklog": "ბლოკირების ისტორია",
+       "sp-contributions-suppresslog": "მომხმარებლის წაშლილი წვლილი",
        "sp-contributions-deleted": "მომხმარებლის წაშლილი შესწოებები",
        "sp-contributions-uploads": "ატვირთვები",
        "sp-contributions-logs": "ჟურნალები",
        "sp-contributions-toponly": "აჩვენე მხოლოდ ბოლო ვერსიები",
        "sp-contributions-submit": "ძიება",
        "whatlinkshere": "ბმული გვერდზე",
-       "whatlinkshere-title": "გვერდები, რომლებიც შეიცავენ ბმულებს „$1“-ზე",
+       "whatlinkshere-title": "გვერდები, რომლებიც შეიცავენ „$1“-ის ბმულებს",
        "whatlinkshere-page": "გვერდი:",
        "linkshere": "მომდევნო გვერდები შეიცავენ ბმულებს '''[[:$1]]'''-ზე:",
        "nolinkshere": "'''[[:$1]]'''-ზე ბმული არ არის.",
        "tooltip-summary": "შეიყვანეთ მოკლე სქოლიო",
        "interlanguage-link-title": "$1 — $2",
        "common.css": "/** აქ ჩასმული CSS გამოყენებული იქნება გაფორმების ყველა გარეკანზე */",
-       "cologneblue.css": "/* აქ ჩასმული CSS გამოყენებული იქნება კელნის ლურჯი გაფორმების თემაში */",
-       "monobook.css": "/* აქ ჩასმული CSS გავლენას იქონიებს Monobook ინტერფეისის მომხმარებლებზე */",
-       "modern.css": "/* აქ ჩასმული CSS გამოყენებული იქნება თანამედროვე გაფორმების თემაში */",
-       "vector.css": "/* აქ ჩასმული CSS გამოყენებული იქნება ვექტორული გაფორმების თემაში */",
        "group-autoconfirmed.css": "/* აქ განთავსებული CSS გამოყენებული იქნება მხოლოდ ავტომატურად დადასტურებული მომხმარებლებისათვის */",
        "group-bot.css": "/* აქ განთავსებული CSS გამოყენებული იქნება მხოლოდ ბოტებისათვის */",
        "group-sysop.css": "/* აქ განთავსებული CSS გამოყენებული იქნება მხოლოდ ადმინისტრატორებისათვის */",
        "pageinfo-length": "გვერდის სიგრძე (ბაიტებში)",
        "pageinfo-article-id": "გვერდის ID",
        "pageinfo-language": "გვერდის შინაარსის ენა",
+       "pageinfo-content-model": "გვერდის შინაარსის მოდელი",
        "pageinfo-robot-policy": "ინდექსაცია საძიებო რობოტებით",
        "pageinfo-robot-index": "დაშვებულია",
        "pageinfo-robot-noindex": "არ არის დაშვებული",
        "pageinfo-category-pages": "გვერდების რაოდენობა",
        "pageinfo-category-subcats": "ქვეკატეგორიების რაოდენობა",
        "pageinfo-category-files": "ფაილების რაოდენობა",
-       "skinname-cologneblue": "კელნის ლურჯი",
-       "skinname-monobook": "მონობუკი",
-       "skinname-modern": "თანამედროვე",
-       "skinname-vector": "ვექტორული",
        "markaspatrolleddiff": "მონიშნე როგორც პატრულირებული",
        "markaspatrolledtext": "მონიშნე ეს სტატია როგორც პატრულირებული",
        "markedaspatrolled": "მონიშნულია როგორც პატრულირებული",
        "newimages-summary": "ეს სპეცგვერდი აჩვენებს ბოლო დროს ატვირთულ ფაილებს.",
        "newimages-legend": "ფილტრი",
        "newimages-label": "ფაილის (ან მისი სახელის) ნაწილი",
+       "newimages-showbots": "ბოტის ატვირთვების ჩვენება",
        "noimages": "გადასახედი არაფერია.",
        "ilsubmit": "ძიება",
        "bydate": "თარიღით",
        "percent": "$1%",
        "parentheses": "($1)",
        "brackets": "[$1]",
+       "quotation-marks": "„$1“",
        "imgmultipageprev": "&larr; წინა გვერდი",
        "imgmultipagenext": "შემდეგი გვერდი &rarr;",
        "imgmultigo": "გადასვლა",
        "imgmultigoto": "გადასვლა გვერდზე $1",
+       "img-lang-default": "(საწყისი ენა)",
        "img-lang-go": "წინ",
        "ascending_abbrev": "დაბრ",
        "descending_abbrev": "აღწერა",
        "watchlistedit-raw-done": "თქვენი კონტროლის სია განახლდა.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 სათაური|$1 სათაურები}} მიემატა:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 სათაური|$1 სათაურები}} წაიშალა:",
+       "watchlistedit-clear-title": "კონტროლის სიის გასუფთავება",
+       "watchlistedit-clear-legend": "კონტროლის სიის გასუფთავება",
+       "watchlistedit-clear-explain": "თქვენი კონტროლის სიიდან ყველა ჩანაწერი წაიშლება",
+       "watchlistedit-clear-titles": "სათაურები:",
+       "watchlistedit-clear-submit": "კონტროლის სიის გასუფთავება (ეს შეუქცევადია!)",
+       "watchlistedit-clear-done": "თქვენი კონტროლის სია გასუფთავდა.",
+       "watchlisttools-clear": "კონტროლის სიის გასუფთავება",
        "watchlisttools-view": "დაკავშირებული ცვლილებების ხილვა",
        "watchlisttools-edit": "კონტროლის სიის ხილვა და რედაქტირება",
        "watchlisttools-raw": "კონტროლის სიის რედაქტირება ტექსტის ფორმატში",
        "htmlform-no": "არა",
        "htmlform-yes": "დიახ",
        "htmlform-chosen-placeholder": "აირჩიეთ პარამეტრი",
+       "htmlform-cloner-create": "მეტის დამატება",
+       "htmlform-cloner-delete": "წაშლა",
        "sqlite-has-fts": "$1 სრული ტექსტის ძიების მხარდაჭერით",
        "sqlite-no-fts": "$1 სრული ტექსტის ძიების მხარდაჭერის გარეშე",
        "logentry-delete-delete": "მომხმარებელმა $1 {{GENDER:$2|წაშალა}} გვერდი: „$3“",
index 7737c39..dab63fa 100644 (file)
        "qbmyoptions": "isebtar inu",
        "faq": "Isteqsiyen",
        "faqpage": "Project:Isteqsiyen",
-       "vector-action-addsection": "Rnud ameggay",
-       "vector-action-delete": "Mḥu",
-       "vector-action-move": "Smimeḍ",
-       "vector-action-protect": "Mmesten",
-       "vector-action-undelete": "Uɣaled",
-       "vector-action-unprotect": "Beddel amesten",
-       "vector-view-create": "Snulfu",
-       "vector-view-edit": "Ẓẓiẓreg",
-       "vector-view-history": "Ẓeṛ amazray",
-       "vector-view-view": "Ɣer",
-       "vector-view-viewsource": "Ẓer aɣbalu",
        "actions": "Tigawtin",
        "namespaces": "Talluntin n isemawen",
        "variants": "Tineḍwa",
        "difference-missing-revision": "{{PLURAL:$1|Yiwet tacaggart|$1 ticaggartin}} n tameẓla agi ($1) {{PLURAL:$2|ur tella ara (ulac)|ur llant ara (ulac)}}.\n\nAcku azday n tameẓla, ɣef wayen tsennedeḍ, d-aqbur. Asebter yemḥa.\nTzemreḍ ad affeḍ tilɣa deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} uɣmis n isebtar yekksen].",
        "searchresults": "Igmad n unadi",
        "searchresults-title": "Igmad n unadi i \"$1\"",
-       "toomanymatches": "Teceggeɛeḍ amḍan ameqqṛan n igemmaḍ, ilaq ad ceggeɛeḍ tuttra nniḍen.",
        "titlematches": "Ayen yecban azwel n umegrad",
        "textmatches": "Ayen yecban azwel n usebter",
        "notextmatches": "ulac ayen yecban azwel n usebter",
        "searchmenu-exists": "'''Yella asebter s isem \"[[:$1]]\" deg wiki agi.'''",
        "searchmenu-new": "'''Snulfud asebter « [[:$1|$1]] » deg wiki agi !'''",
        "searchprofile-articles": "Isebtar n ugbur",
-       "searchprofile-project": "Isebtaren n tallat dɣa n usenfa",
        "searchprofile-images": "Agetmedia",
        "searchprofile-everything": "Akk",
        "searchprofile-advanced": "Anadi anemhal",
        "searchprofile-articles-tooltip": "Nadi deg $1",
-       "searchprofile-project-tooltip": "Nadi deg $1",
        "searchprofile-images-tooltip": "Nadi  ifuyla agetmedia",
        "searchprofile-everything-tooltip": "Nadi deg akk usmel (ula deg isebtaren n umyannan)",
        "searchprofile-advanced-tooltip": "Fren ideggen n isemawen i unadi",
        "search-interwiki-default": "Igemmaḍ ɣef $1 :",
        "search-interwiki-more": "(ugar)",
        "search-relatedarticle": "Amassaɣ",
-       "searcheverything-enable": "Nadi deg akkw tallunin n isemawen",
        "searchrelated": "ineqqes",
        "searchall": "akk",
        "showingresults": "Tamuli n {{PLURAL:$1|'''Yiwen''' wegmud|'''$1''' n yigmad}} seg  #'''$2'''.",
        "allowemail": "Eǧǧ imseqdacen wiyaḍ a k-aznen email",
        "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-emailconfirm-label": "Aragag n tirawt :",
        "youremail": "E-mail *:",
        "username": "{{GENDER:$1|Isem n umseqdac|Isem n tamseqdact}} :",
-       "uid": "Uḍḍun n {{GENDER:$1|umseqdac|tamseqdact}}:",
        "prefs-memberingroups": "{{GENDER:$2|Aεeggal|Taɛggalt}} n {{PLURAL:$1|ugraw|igrawen}} :",
        "prefs-registration": "Azmez n tiggezt :",
        "yourrealname": "Isem n ṣṣeḥ *:",
        "recentchanges-label-unpatrolled": "Abeddel agi mazal yesɛa aselken.",
        "recentchanges-label-plusminus": "Tiddi n usebtar tetwebeddel s umḍan agi n itamḍanen.",
        "recentchanges-legend-heading": "'''Aglam :'''",
-       "recentchanges-legend-newpage": "(zeṛ daɣen [[Special:NewPages|umuɣ n isebtar imaynuten]]).",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (zeṛ daɣen [[Special:NewPages|umuɣ n isebtar imaynuten]]).",
        "recentchanges-legend-plusminus": "(''± 123'')",
        "rcnotefrom": "Deg ukessar llan ibeddlen seg wasmi '''$2''' (ar '''$1''').",
        "rclistfrom": "Ssken ibeddlen imaynuten seg $3 $2",
        "log-title-wildcard": "Nadi ɣef izwal i yebdan s uḍris-agi",
        "showhideselectedlogentries": "Beqqeḍ/ffer isekcam n uɣmis agi",
        "allpages": "Akk isebtar",
-       "alphaindexline": "$1 ar $2",
        "nextpage": "Asebter ameḍfir ($1)",
        "prevpage": "Asebter ssabeq ($1)",
        "allpagesfrom": "Ssken isebtar seg:",
index 94d44db..bd13cab 100644 (file)
        "nov": "Teş",
        "dec": "Gağ",
        "pagecategories": "{{PLURAL:$1|Kategoriye|Kategoriy}}",
-       "category_header": "Pelê ke kategoriya \"$1\" derê",
+       "category_header": "Pelê ke kategoriya \"$1\" miyan derê",
        "subcategories": "Kategoriyê bınêni",
        "category-media-header": "Medyawa ke kategoriya \"$1\" dera",
        "category-empty": "''Na kategoriye de hona qet nustey ya ki medya çinê.''",
        "searchmenu-exists": "''Ena 'Wikipediya de ser \"[[:$1]]\" yew pel esto'''",
        "searchmenu-new": "'''Nê wiki de pela \"[[:$1]]\" baferne!'''",
        "searchprofile-articles": "Pelê tedeesteu",
-       "searchprofile-project": "Pelê yardımi u procey",
        "searchprofile-images": "Multimedya",
        "searchprofile-everything": "Her çi",
        "searchprofile-advanced": "Raverşiyae",
        "searchprofile-articles-tooltip": "$1 de cıfeteliye",
-       "searchprofile-project-tooltip": "$1 de cıfeteliye",
        "searchprofile-images-tooltip": "Dosya bıfeteliye",
        "searchprofile-everything-tooltip": "Zerreki pêro sae ke (pelunê hurênaişi daxıl)",
        "searchprofile-advanced-tooltip": "Caunê namunê xısusiu de cıfeteliye",
        "allowemail": "Karberunê binun ra ''e-mail''i fael ke",
        "prefs-searchoptions": "Alternatifê cıcêraişi",
        "prefs-namespaces": "Caê namey",
-       "defaultns": "Halo bin de zerrê nê caunê namey de cıfeteliye:",
        "default": "ihmal",
        "prefs-files": "Dosyey",
        "youremail": "E-poste:",
index b562bd2..32d4ccf 100644 (file)
        "qbmyoptions": "Беттерім",
        "faq": "Жиі қойылатын сұрақтар",
        "faqpage": "Project:Жиі қойылатын сұрақтар",
-       "vector-action-addsection": "Тақырып қосу",
-       "vector-action-delete": "Жою",
-       "vector-action-move": "Жылжыту",
-       "vector-action-protect": "Қорғау",
-       "vector-action-undelete": "Жоймау",
-       "vector-action-unprotect": "Қорғанысты өзгерту",
-       "vector-view-create": "Бастау",
-       "vector-view-edit": "Өңдеу",
-       "vector-view-history": "Өңделу тарихы",
-       "vector-view-view": "Оқу",
-       "vector-view-viewsource": "Қайнарын қарау",
        "actions": "Әрекеттер",
        "namespaces": "Есім кеңістіктері",
        "variants": "Нұсқалар",
        "suspicious-userlogout": "Сіздің жүйеден шығу сұранымыңыз қабылданбады, өйткені бұл бұзылған браузер немесе кэштеуші прокси арқылы жіберілгенге ұқсайды.",
        "pt-login": "Кіру",
        "pt-login-button": "Кіру",
-       "pt-createaccount": "Тіркелгі жасау",
+       "pt-createaccount": "Тіркелу",
        "pt-userlogout": "Шығу",
        "php-mail-error-unknown": "Mail() PHP-функциясындағы белгісіз қате.",
        "user-mail-no-addy": "Е-пошта мекенжайынсыз хабарлама жіберуді байқап көрді.",
        "explainconflict": "Осы бетті сіз өңдей бастағанда басқа біреу бетті өзгерткен.\nЖоғарғы мәтін аумағында қазіргі уақытта бар бет мәтінінен тұрады.\nТөменгі мәтін аумағында сіздің өзгертулеріңіз көрсетіледі.\nӨзгертуіңізді бар мәтінге біріктіруге тура келеді.\n«{{int:savearticle}}» батырмасын басқанда </strong>тек</strong> жоғарғы мәтін аумағы сақталады.",
        "yourtext": "Мәтініңіз",
        "storedversion": "Сақталған нұсқасы",
-       "nonunicodebrowser": "<strong>Ескерту: Шолғышыңыз Unicode белгілеуіне үйлесімді емес</strong>\nЖұмыс істеуге ықтималдық беру үшін, төмендегі кірістіру орнында ASCII емес таңбалар оналтылық кодымен көрсетіледі.",
-       "editingold": "<strong>Ð\95Ñ\81кеÑ\80Ñ\82Ñ\83: Ð\9eÑ\81Ñ\8b Ð±ÐµÑ\82Ñ\82Ñ\96Ò£ ÐµÑ\80Ñ\82еÑ\80ек Ñ\82үзеÑ\82Ñ\83Ñ\96н Ó©Ò£Ð´ÐµÐ¿ Ð¶Ð°Ñ\82Ñ\8bÑ\80Ñ\81Ñ\8bз.</strong>\nÐ\91ұнÑ\8b Ñ\81аÒ\9bÑ\82аÑ\81аңÑ\8bз Ð¾Ñ\81Ñ\8b Ñ\82үзеÑ\82Ñ\83ден кейінгі барлық өзгерістер жоғалады.",
+       "nonunicodebrowser": "<strong>Ескерту: Шолғышыңыз Юникод белгілеуіне үйлесімді емес</strong>\nЖұмыс істеуге ықтималдық беру үшін төмендегі кірістіру орнында ASCII емес таңбалар оналтылық кодымен көрсетіледі.",
+       "editingold": "<strong>Ð\95Ñ\81кеÑ\80Ñ\82Ñ\83: Ð\9eÑ\81Ñ\8b Ð±ÐµÑ\82Ñ\82Ñ\96Ò£ Ð±Ò±Ñ\80Ñ\8bÒ£Ò\93Ñ\8b Ð½Ò±Ñ\81Ò\9bаÑ\81Ñ\8bн Ó©Ò£Ð´ÐµÑ\83деÑ\81Ñ\96з.</strong>\nÐ\91ұнÑ\8b Ñ\81аÒ\9bÑ\82аÑ\81аңÑ\8bз Ð¾Ñ\81Ñ\8b Ð½Ò±Ñ\81Ò\9bадан кейінгі барлық өзгерістер жоғалады.",
        "yourdiff": "Айырмашылықтар",
-       "copyrightwarning": "Аңғартпа: {{SITENAME}} жобасына берілген барлық үлестер $2 (көбірек ақпарат үшін: $1) құжатына сай деп саналады.\nЕгер жазуыңыздың еркін өңделуін және ақысыз көпшілікке таратуын қаламасаңыз, мында жарияламауыңыз жөн.<br />\nТағы да, бұл мағлұмат өзіңіз жазғаныңызға, не қоғам қазынасынан немесе сондай ашық қорлардан көшірілгеніне бізге уәде бересіз.\n'''АВТОРЛЫҚ ҚҰҚЫҚПЕН ҚОРҒАУҒАН МАҒЛҰМАТТЫ РҰҚСАТСЫЗ ЖАРИЯЛАМАҢЫЗ!'''",
-       "copyrightwarning2": "Аңғартпа: {{SITENAME}} жобасына берілген барлық үлестерді басқа үлескерлер өңдеуге, өзгертуге, не аластауға мүмкін.\nЕгер жазуыңыздың еркін өңделуін қаламасаңыз, мында жарияламауыңыз жөн.<br />\nТағы да, бұл мағлұмат өзіңіз жазғаныңызға, не қоғам қазынасынан немесе сондай ашық қорлардан көшірілгеніне бізге уәде бересіз (көбірек ақпарат үшін $1 қужатын қараңыз).\n'''АВТОРЛЫҚ ҚҰҚЫҚПЕН ҚОРҒАУҒАН МАҒЛҰМАТТЫ РҰҚСАТСЫЗ ЖАРИЯЛАМАҢЫЗ!'''",
-       "longpageerror": "<strong>Ò\9aÐ\90ТÐ\95Ð\9bÐ\86Ð\9a: Ð¡Ð°Ò\9bÑ\82амаÒ\9bÑ\88Ñ\8b Ð±Ð¾Ð»Ò\93ан Ð¼Ó\99Ñ\82Ñ\96нÑ\96Ò£Ñ\96здÑ\96Ò£ ÐºÓ©Ð»ÐµÐ¼Ñ\96 {{PLURAL:$1|килобайÑ\82|$1 ÐºÐ¸Ð»Ð¾Ð±Ð°Ð¹Ñ\82}}, ең көбі {{PLURAL:$2|килобайт|$2 килобайт}} рұқсат етілген көлемінен асқан.</strong>\nБұл сақталмайды.",
-       "readonlywarning": "'''ЕСКЕТУ: Дерекқор баптау үшін құлыпталған, сондықтан дәл қазір өңдемеңізді сақтай алмайсыз.\nКейін қолдану үшін мәтінді қойып алып және қойып, мәтін файлына сақтауңызға болады.''' \nӘкімшінің құлыптау себебі келесідей: $1",
-       "protectedpagewarning": "<strong>Ескерту: Бұл бет өңдеуден қорғалған. Тек әкімші құқықтары бар қатысушылар ғана өңдей алады.</strong>\nТөменде бет журналының соңғы жазбасы көрсетілген:",
+       "copyrightwarning": "{{SITENAME}} жобасына қосқан барлық үлестеріңіз $2 (көбірек ақпарат үшін: $1) аясында жарияланатынын ескеріңіз.\nЕгер еңбегіңіздің еркін өңделуін және ақысыз көпшілікке таралуын қаламасаңыз мұнда жарияламаңыз<br />\nТағы да бұл мәліметті өзіңіз жазғаныңызға не қоғам қазынасынан немесе сондай ашық қорлардан көшірілгеніне бізге уәде бересіз.\n<strong>Авторлық құқықпен қорғалған мәліметті рұқсатсыз жарияламаңыз!</strong>",
+       "copyrightwarning2": "{{SITENAME}} жобасына қосқан барлық үлестеріңізді басқа үлескерлер өңдеуге, өзгертуге немесе аластауы мүмкін екенін ескеріңіз.\nЕгер еңбегіңіздің еркін өңделуін қаламасаңыз осында жарияламаңыз.<br />\nТағы да бұл мәліметті өзіңіз жазғаныңызға не қоғам қазынасынан немесе сондай ашық қорлардан көшірілгеніне бізге уәде бересіз. (көбірек ақпарат үшін $1 құжатын қараңыз).\n<strong>Авторлық құқықпен қорғалған мәліметті рұқсатсыз жарияламаңыз!",
+       "longpageerror": "<strong>Ò\9aÐ\90ТÐ\95Ð\9bÐ\86Ð\9a: Ð¡Ð°Ò\9bÑ\82амаÒ\9bÑ\88Ñ\8b Ð±Ð¾Ð»Ò\93ан Ð¼Ó\99Ñ\82Ñ\96нÑ\96Ò£Ñ\96здÑ\96Ò£ ÐºÓ©Ð»ÐµÐ¼Ñ\96 {{PLURAL:$1|бÑ\96Ñ\80 ÐºÐ¸Ð»Ð¾Ð±Ð°Ð¹Ñ\82|$1 ÐºÐ¸Ð»Ð¾Ð±Ð°Ð¹Ñ\82}} ең көбі {{PLURAL:$2|килобайт|$2 килобайт}} рұқсат етілген көлемінен асқан.</strong>\nБұл сақталмайды.",
+       "readonlywarning": "<strong>ЕСКЕРТУ: Дерекқор техникалық жұмыстар жасау үшін құлыпталған сондықтан дәл қазір өңдемеңізді сақтай алмайсыз.</strong>\nКейін сақтау үшін мәтініңізді мәтін файлына көшіріп алыпуңызға болады. \n\nАдминстратор оны құлыптау себебін келесідей түсіндіреді: $1",
+       "protectedpagewarning": "<strong>Ескерту: Бұл бет өңдеуден қорғалған сондықтан тек әкімші құқықтары бар қатысушылар ғана өңдей алады.</strong>\nТөменде соңғы журнал жазбасы көрсетілген:",
        "semiprotectedpagewarning": "<strong>Ескерту:</strong> Бет жартылай қорғалған, сондықтан осыны тек тіркелген қатысушылар өңдей алады.\nТөменде бет журналының соңғы жазбасы көрсетілген:",
-       "cascadeprotectedwarning": "<strong>Ескерту:</strong>  Бұл бет қорғалған, енді тек әкімші құқықтары бар қатысушылар ғана бұны өңдей алады, себебі бұл келесі «баулы қорғауы» бар {{PLURAL:$1|бетіне|беттеріне}} кірістілген бет:",
-       "titleprotectedwarning": "'''Ескерту: Бұл бет атауы бастаудан қорғалған, сондықтан [[Special:ListGroupRights|арнайы құқықтары]] бар қатысушылар бұндай атаумен бетті бастай алады.'''\nТөменде бет журналының соңғы жазбасы көрсетілген:",
+       "cascadeprotectedwarning": "<strong>Ескерту:</strong> Бұл бет қорғалған, сондықтан тек әкімші құқықтары бар қатысушылар ғана өңдей алады, себебі бұл келесі «баулы қорғауы» бар {{PLURAL:$1|бетіне|беттеріне}} кірістілген бет:",
+       "titleprotectedwarning": "</strong>Ескерту: Бұл бет атауы бастаудан қорғалған, сондықтан [[Special:ListGroupRights|арнайы құқықтары]] бар қатысушылар бұндай атаумен бетті бастай алады.</strong>\nТөменде бет журналының соңғы жазбасы көрсетілген:",
        "templatesused": "Бұл бетте қолданылған {{PLURAL:$1|үлгі|үлгілер}}:",
        "templatesusedpreview": "Беттің қарап шығуында қолданылған {{PLURAL:$1|үлгі|үлгілер}}:",
        "templatesusedsection": "Бұл бөлімде қолданылған {{PLURAL:$1|үлгі|үлгілер}}:",
        "template-protected": "(қорғалған)",
        "template-semiprotected": "(жартылай қорғалған)",
        "hiddencategories": "Бұл бет {{PLURAL:$1|1 жасырын санаттың|$1 жасырын санаттың}} мүшесі:",
-       "nocreatetext": "{{SITENAME}} жобасында жаңа бет бастауы шектелген.\nКері қайтып бар бетті өңдеуіңізге болады, немесе [[Special:UserLogin|кіруіңізге не тіркелуіңізге]] болады.",
-       "nocreate-loggedin": "Жаңа бет бастауға рұқсатыңыз жоқ.",
+       "nocreatetext": "{{SITENAME}} жобасында жаңа беттерді бастау мүмкіндігі шектелген.\nКері қайта аласыз және бар бетті өңдей аласыз немесе [[Special:UserLogin|кіріңіз не тіркеліңіз]].",
+       "nocreate-loggedin": "Жаңа беттерді бастауға рұқсатыңыз жоқ.",
        "sectioneditnotsupported-title": "Бөлімдерді өңдеу қолдамайды",
-       "sectioneditnotsupported-text": "Бұл бетте бөлімдерді өңдеуді қолдамайды.",
+       "sectioneditnotsupported-text": "Бұл бетте бөлім өңдеуін қолдамайды.",
        "permissionserrors": "Рұқсат қатесі",
-       "permissionserrorstext": "Ð\91ұнÑ\8b Ñ\96Ñ\81Ñ\82еÑ\83ге Ñ\80Ò±Ò\9bÑ\81аÑ\82Ñ\8bÒ£Ñ\8bз Ð¶Ð¾Ò\9b, ÐºÐµÐ»ÐµÑ\81Ñ\96 {{PLURAL:$1|Ñ\81ебеп|Ñ\81ебепÑ\82еÑ\80}} Ð±Ð¾Ð¹Ñ\8bнÑ\88а:",
-       "permissionserrorstext-withaction": "$2 дегенге рұқсатыңыз жоқ, келесі {{PLURAL:$1|себеп|себептер}} бойынша:",
-       "recreate-moveddeleted-warn": "'''Назар аудар: Алдында жойылған бетті қайта бастайын деп тұрсыз.'''\n\nБұл бетті жаңадан бастаудың орынды екеніне көз жеткізіңіз.\nТөменде бұл бетке қатысты жою және жылжыту журналы көрсетілген:",
+       "permissionserrorstext": "Ð\9aелеÑ\81Ñ\96 {{PLURAL:$1|Ñ\81ебеп|Ñ\81ебепÑ\82еÑ\80}} Ð±Ð¾Ð¹Ñ\8bнÑ\88а Ð±Ò±Ð½Ñ\8b Ñ\96Ñ\81Ñ\82еÑ\83ге Ñ\80Ò±Ò\9bÑ\81аÑ\82Ñ\8bÒ£Ñ\8bз Ð¶Ð¾Ò\9b:",
+       "permissionserrorstext-withaction": "Келесі {{PLURAL:$1|себеп|себептер}} бойынша $2 дегенге рұқсатыңыз жоқ:",
+       "recreate-moveddeleted-warn": "<strong>Назар аударыңыз: Алдында жойылған бетті қайта бастамақшысыз.</strong>\n\nБұл бетті жаңадан бастаудың орынды екеніне көз жеткізіңіз.\nТөменде бұл бетке қатысты жою және жылжыту журналы ыңғайлылық үшін көрсетілген:",
        "moveddeleted-notice": "Бұл бет жойылған.\nТөменде бұл бетке қатысты жою және жылжыту журналы көрсетілген:",
        "log-fulllog": "Толық журналды қарау",
-       "edit-hook-aborted": "Түзету ілмек арқылы болдырмады.\nҚосымша түсіндірмелер көрсетілмеген.",
-       "edit-gone-missing": "Ð\91еÑ\82Ñ\82Ñ\96 Ð¶Ð°Ò£Ð°Ñ\80Ñ\82Ñ\83 Ð¼Ò¯Ð¼ÐºÑ\96н ÐµÐ¼ÐµÑ\81.\nÐ\9cүмкÑ\96н, Ð±Ò±Ð» Ð±ÐµÑ\82 Ð¶Ð¾Ð¹Ñ\8bлÒ\93ан.",
+       "edit-hook-aborted": "Өңдеме ілмек арқылы болдырмады.\nҚандай да бір түсіндірме берілмеген.",
+       "edit-gone-missing": "Ð\91еÑ\82Ñ\82Ñ\96 Ð¶Ð°Ò£Ð°Ñ\80Ñ\82Ñ\83 Ð¼Ò¯Ð¼ÐºÑ\96н ÐµÐ¼ÐµÑ\81.\nÐ\91ұл Ð±ÐµÑ\82 Ð¶Ð¾Ð¹Ñ\8bлÒ\93ан Ð±Ð¾Ð»Ñ\83 Ð¼Ò¯Ð¼ÐºÑ\96н.",
        "edit-conflict": "Өңдемелер қақтығысы.",
        "edit-no-change": "Өңдемеңіз мәтінге өзгеріс жасамағандықтан еленілмеді.",
+       "postedit-confirmation-created": "Бетті бастадыңыз.",
+       "postedit-confirmation-restored": "Бетті қалпына келтірдіңіз.",
        "postedit-confirmation-saved": "Өңдемеңіз сақталды.",
-       "edit-already-exists": "Ð\96аңа Ð±ÐµÑ\82 Ð¶Ð°Ñ\81ау мүмкін емес.\nОл әлдеқашан бар.",
-       "defaultmessagetext": "Әдепкі мәтіні",
+       "edit-already-exists": "Ð\96аңа Ð±ÐµÑ\82 Ð±Ð°Ñ\81Ñ\82ау мүмкін емес.\nОл әлдеқашан бар.",
+       "defaultmessagetext": "Әдепкі хабарлама мәтіні",
        "invalid-content-data": "Жарамсыз дерек мазмұны",
-       "content-not-allowed-here": "\"$1\" контенті [[$2]] бетінде рұқсат етілмейді.",
-       "editwarning-warning": "Ð\91ұл Ð±ÐµÑ\82Ñ\82Ñ\96 Ò\9bалдÑ\8bÑ\80Ñ\81аңÑ\8bз қандай да бір жасаған өзгерістеріңізді жоғалтуыңыз мүмкін. \nЕгер сiз кіріп отырсаңыз баптауларыңыздағы «{{int:prefs-editing}}» бөлімінен бұл ескертуді өшіре аласыз.",
+       "content-not-allowed-here": "«$1» мазмұны [[$2]] бетінде рұқсат етілмейді.",
+       "editwarning-warning": "Ð\91ұл Ð±ÐµÑ\82Ñ\82Ñ\96 Ò\9bалдÑ\8bÑ\80Ñ\8bп ÐºÐµÑ\82Ñ\81еңÑ\96з қандай да бір жасаған өзгерістеріңізді жоғалтуыңыз мүмкін. \nЕгер сiз кіріп отырсаңыз баптауларыңыздағы «{{int:prefs-editing}}» бөлімінен бұл ескертуді өшіре аласыз.",
        "editpage-notsupportedcontentformat-title": "Контент форматы қолдамайды",
-       "content-model-wikitext": "Уикимәтін",
+       "content-model-wikitext": "уикимәтін",
        "content-model-text": "қалыпты мәтін",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
-       "expensive-parserfunction-warning": "'''Ескерту:''' Бұл бетте тым көп шығыс алатын құрылым талдатқыш жетелерінің қоңырау шалулары бар.\n\nБұл $2  {{PLURAL:$2|call|calls}} шамасынан кем болуы жөн, осы арада {{PLURAL:$1|қазір $1 call|қазір $1 calls}}.",
+       "expensive-parserfunction-warning": "<strong>Ескерту:</strong> Бұл бет тым көп шығыс алатын құрылым талдатқыш жетелер шақыруынан тұрады.\n\nБұл $2  {{PLURAL:$2|шақыру|шақырулар}} шамасынан кем болуы керек, осы арада {{PLURAL:$1|қазір $1 шақыру|қазір $1 шақыру}}.",
        "expensive-parserfunction-category": "Шығыс алатын құрылым талдатқыш жетелерінің тым көп шақырымы бар беттер",
-       "post-expand-template-inclusion-warning": "Ескерту: Үлгі кірістіру өлшемі тым үлкен.\nКейбір үлгілер кірістірілмейді.",
+       "post-expand-template-inclusion-warning": "<strong>Ескерту:</strong> Үлгі кірістіру мөлшері тым үлкен.\nКейбір үлгілер кірістірілмейді.",
        "post-expand-template-inclusion-category": "Үлгі кірістірілген беттер өлшемі асып кетті",
        "post-expand-template-argument-warning": "<strong>Ескерту:</strong> Бұл бетте тым көп ұлғайтылған өлшемі болған ең кемінде бір үлгі дәлелі бар.\nБұның дәлелдерін қалдырып кеткен.",
        "post-expand-template-argument-category": "Үлгі дәлелдерін қалдырып кеткен беттер",
-       "undo-success": "Бұл өңдеме жоққа шығарылуы мүмкін. Талабыңызды құптап алдын ала төмендегі салыстыруды тексеріп шығыңыз да, өңдемені жоққа шығаруын бітіру үшін төмендегі өзгерістерді сақтаңыз.",
+       "parser-template-loop-warning": "Үлгі тұйығы кездесті: [[$1]]",
+       "undo-success": "Бұл өңдемені жоққа шығарымақшысыз. Алдымен алдын-ала төмендегі салыстыруды тексеріп шығыңыз да бетті сақтаңыз.",
        "undo-failure": "Бұл өңдеме жоққа шығарылмайды, себебі арада қақтығысты өңдемелер бар.",
-       "undo-norev": "Бұл өңдеме жоққа шығарылмайды, себебі бұл жоқ немесе жойылған.",
+       "undo-norev": "Ð\91ұл Ó©Ò£Ð´ÐµÐ¼Ðµ Ð¶Ð¾Ò\9bÒ\9bа Ñ\88Ñ\8bÒ\93аÑ\80Ñ\8bлмайдÑ\8b, Ñ\81ебебÑ\96 Ð±Ò±Ð» Ð±ÐµÑ\82 Ð¶Ð¾Ò\9b Ð½ÐµÐ¼ÐµÑ\81е Ð¶Ð¾Ð¹Ñ\8bлÒ\93ан.",
        "undo-nochange": "Өңдеме әлдеқашан жоққа шығарылғаны анықталды.",
-       "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|т]]) істеген нөмір $1 түзетуін [[Project:Жоққа шығару|жоққа шығарды]]",
+       "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|т]]) істеген нөмір $1 түзетуін жоққа шығарды",
        "undo-summary-username-hidden": "$1 нұсқасын жасырылған қатысушы жоққа шығарды",
-       "cantcreateaccounttitle": "Ð\96аңа Ñ\82іркелгі жасалмады",
+       "cantcreateaccounttitle": "Тіркелгі жасалмады",
        "cantcreateaccount-text": "Бұл IP мекенжайдан (<strong>$1</strong>) жаңа тіркелгі жасауын [[User:$3|$3]] бұғаттаған.\n\n$3 есімді қатысушының келтіріген себебі: <em>$2</em>",
-       "viewpagelogs": "Бұл бет үшін журнал оқиғаларын қарау",
-       "nohistory": "Мында бұл беттінің түзету тарихы жоқ.",
-       "currentrev": "Ең соңғы түзету",
-       "currentrev-asof": "$1 кезіндегі нұсқасы",
-       "revisionasof": "$1 кезіндегі түзету",
-       "revision-info": "$1 кезіндегі $2 істеген түзету",
-       "previousrevision": "← Ескі түзетулер",
-       "nextrevision": "Жаңа түзетулер →",
-       "currentrevisionlink": "Ағымдағы түзетулер",
-       "cur": "ағым.",
-       "next": "кел.",
-       "last": "соң.",
+       "cantcreateaccount-range-text": "'''$1''' ауқымындағы IP мекенжайдан сіздің IP мекенжайыңыз да кіреді ('''$4''') жаңа тіркелгі жасауын [[User:$3|$3]] бұғаттаған.\n\n$3 есімді қатысушының келтіріген себебі: ''$2'",
+       "viewpagelogs": "Бұл беттің журнал оқиғаларын қарау",
+       "nohistory": "Мында бұл беттің өңделу тарихы жоқ.",
+       "currentrev": "Ең соңғы нұсқа",
+       "currentrev-asof": "$1 кезіндегі ең соңғы нұсқасы",
+       "revisionasof": "$1 кезіндегі нұсқасы",
+       "revision-info": "$1 кезіндегі $2 істеген нұсқа",
+       "previousrevision": "← Ескілеу нұсқасы",
+       "nextrevision": "Жаңалау нұсқасы →",
+       "currentrevisionlink": "Ең соңғы нұсқасы",
+       "cur": "ағым",
+       "next": "келесі",
+       "last": "соңғы",
        "page_first": "алғашқысына",
        "page_last": "соңғысына",
-       "histlegend": "Айырмасын бөлектеу: салыстырмақ нұсқаларының қосу көздерін белгілеп <Enter> пернесін басыңыз, немесе төмендегі батырманы нұқыңыз.<br />\nШартты белгілер: (ағым.) = ағымдық нұсқамен айырмасы,\n(соң.) = алдыңғы нұсқамен айырмасы, ш = шағын өңдеме",
+       "histlegend": "Айырмасын таңдау: Салыстырмақ нұсқаларының қосу көздерін белгілеп <Enter> пернесін басыңыз немесе төмендегі батырманы басыңыз.<br />\nШартты белгілер: <strong>({{int:cur}})</strong> = ең соңғы нұсқамен айырмасы,\n<strong>({{int:last}})</strong> = алдыңғы нұсқамен айырмасы, <strong>{{int:minoreditletter}}</strong> = шағын өңдеме",
        "history-fieldset-title": "Тарихынан іздеу",
        "history-show-deleted": "Жойылғанын ғана көрсету",
        "histfirst": "Ең ескісіне",
        "histlast": "Ең жаңасына",
        "historysize": "({{PLURAL:$1|1 байт|$1 байт}})",
        "historyempty": "(бос)",
-       "history-feed-title": "Түзету тарихы",
-       "history-feed-description": "Мына уикидегі бұл беттің түзету тарихы",
+       "history-feed-title": "Өңделу тарихы",
+       "history-feed-description": "Мына уикидегі бұл беттің өңделу тарихы",
        "history-feed-item-nocomment": "$2 кезіндегі $1 деген",
-       "history-feed-empty": "Сұратылған бет жоқ болды.\nОл мына уикиден жойылған, немесе атауы ауыстырылған.\nОсыған қатысты жаңа беттерді [[Special:Search|бұл уикиден іздеуді]] байқап көріңіз.",
-       "rev-deleted-comment": "(өңдеу түйіндемесі аласталды)",
-       "rev-deleted-user": "(қатысушы аты аласталды)",
-       "rev-deleted-event": "(әрекет журналы аласталды)",
-       "rev-deleted-user-contribs": "[Қатысушы аты немесе IP-мекенжайы жойылған — өңдемелері қатысушы үлесі бетінен жасырылған]",
-       "rev-deleted-text-permission": "Бұл беттің түзетуі (нұсқасы) <strong>жойылған</strong>.\n[{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} жою журналында] егжей-тегжейін таба аласыз.",
-       "rev-deleted-text-unhide": "Бұл беттің түзетуі (нұсқасы) <strong>жойылған</strong>.\n[{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} жою журналында] егжей-тегжейін таба аласыз.\nЕгер сіз жалғастырсаңыз [$1 бұл нұсқаны көре] аласыз.",
-       "rev-deleted-text-view": "Бұл беттің түзетуі (нұсқасы) <strong>жойылған</strong>.\n[{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} жою журналында] егжей-тегжейін таба аласыз.",
-       "rev-deleted-no-diff": "Бұл айырмашылықты көре алмайсыз себебі бір түзетуі (нұсқасы) <strong>жойылған</strong>.\n[{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} жою журналында] егжей-тегжейін таба аласыз.",
+       "history-feed-empty": "Сұратылған бет жоқ.\nОл бұл уикиден жойылған немесе атауы өзгертілген.\nОсыған қатысты жаңа беттерді [[Special:Search|бұл уикиден іздеуді]] байқап көріңіз.",
+       "rev-deleted-comment": "(өңдеу түйіндемесін аластады)",
+       "rev-deleted-user": "(қатысушы есімін аластады)",
+       "rev-deleted-event": "(әрекет журналын аластады)",
+       "rev-deleted-user-contribs": "[Қатысушы аты немесе IP мекенжайы жойылған — өңдемелері қатысушы үлесі бетінен жасырылған]",
+       "rev-deleted-text-permission": "Бұл беттің түзетуі (нұсқасы) <strong>жойылған</strong>.\n[{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Жою журналынан] егжей-тегжейін таба аласыз.",
+       "rev-deleted-text-unhide": "Бұл беттің түзетуі (нұсқасы) <strong>жойылған</strong>.\n[{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Жою журналынан] егжей-тегжейін таба аласыз.\nЕгер сіз жалғастырсаңыз [$1 бұл нұсқаны көре] аласыз.",
+       "rev-suppressed-text-unhide": "Бұл беттің түзетуі (нұсқасы) <strong>жасырылған</strong>.\n[{{fullurl:{{#special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Жасыру журналынан] егжей-тегжейін таба аласыз.\nЕгер сіз жалғастырсаңыз [$1 бұл нұсқаны көре] аласыз.",
+       "rev-deleted-text-view": "Бұл беттің түзетуі (нұсқасы) <strong>жойылған</strong>.\n[{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Жою журналынан] егжей-тегжейін таба аласыз.",
+       "rev-suppressed-text-view": "Бұл беттің түзетуі (нұсқасы) <strong>жасырылған</strong>.\n[{{fullurl:{{#special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Жасыру журналынан] егжей-тегжейін таба аласыз.",
+       "rev-deleted-no-diff": "Бұл айырмашылықты көре алмайсыз себебі бір түзетуі (нұсқасы) <strong>жойылған</strong>.\n[{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Жою журналынан] егжей-тегжейін таба аласыз.",
        "rev-suppressed-no-diff": "Бұл айырмашылықты көре алмайсыз себебі бір түзетуі (нұсқасы) <strong>жойылған</strong>.",
-       "rev-deleted-unhide-diff": "Бір түзетуі (нұсқасы) <strong>жойылған</strong>.\nегжей-тегжейін [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} жою журналынан] таба аласыз.\nЕгер жалғастырсаңыз [$1 бұл айырмашылықты] көре аласыз.",
+       "rev-deleted-unhide-diff": "Бір түзетуі (нұсқасы) <strong>жойылған</strong>.\nЕгжей-тегжейін [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} жою журналынан] таба аласыз.\nЕгер жалғастырсаңыз [$1 бұл айырмашылықты] көре аласыз.",
+       "rev-suppressed-unhide-diff": "Бір түзетуі (нұсқасы) <strong>жасырылған</strong>.\nЕгжей-тегжейін [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} жою журналынан] таба аласыз.\nЕгер жалғастырсаңыз [$1 бұл айырмашылықты] көре аласыз.",
+       "rev-deleted-diff-view": "Бұл нұсқалар айырмасының бір нұсқасы <strong>жойылған</strong>.\n[{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Жою журналынан] егжей-тегжейін таба аласыз.",
+       "rev-suppressed-diff-view": "Бұл нұсқалар айырмасының бір нұсқасы <strong>жасырылған</strong>.\n[{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Жасыру журналынан] егжей-тегжейін таба аласыз.",
        "rev-delundel": "көрінісін өзгерту",
        "rev-showdeleted": "көрсету",
-       "revisiondelete": "ТүзеÑ\82Ñ\83леÑ\80дÑ\96 жою/жоюды болдырмау",
+       "revisiondelete": "Ð\9dÒ±Ñ\81Ò\9bалаÑ\80дÑ\8b жою/жоюды болдырмау",
        "revdelete-nooldid-title": "Нысана түзету жарамсыз",
-       "revdelete-nooldid-text": "Бұл жетені орындау үшін нысана түзетуін/түзетулерін келтірілмепсіз,\nкелтірілген түзету жоқ, не ағымдық түзетуді жасыру үшін әрекеттеніп көрдіңіз.",
+       "revdelete-nooldid-text": "Бұл жетені орындау үшін нысана түзету(лер)ін келтірілмепсіз,\nкелтірілген нұсқа жоқ немесе ағымдық түзетуді жасыру үшін әрекеттеніп көрдіңіз.",
+       "revdelete-no-file": "Көрсетілген файл жоқ",
+       "revdelete-show-file-confirm": "$2 $3 кезіндегі «<nowiki>$1</nowiki>» файлының жойылған нұсқаларын көргіңіз келе ме?",
        "revdelete-show-file-submit": "Иә",
+       "revdelete-selected-text": "[[:$2]] бетінің {{PLURAL:$1|таңдалған нұсқасы|таңдалған нұсқалары}} :",
+       "revdelete-selected-file": "[[:$2]] дегеннің {{PLURAL:$1|таңдалған файл нұсқасы|таңдалған файл нұсқалары}} :",
        "logdelete-selected": "Бөлектенген {{PLURAL:$1|журнал оқиғасы|журнал оқиғалары}}:",
        "revdelete-legend": "Көрініс тиымдарын қою:",
        "revdelete-hide-text": "Түзету мәтінін жасыр",
        "difference-missing-revision": "Бұл ($1) {{PLURAL:$2|нұсқа|$2 нұсқалар}} айырмашылығы табылмады.\n\n\nБұл әлте жойылған беттің нұсқалар айырмашылығының сілтемесі.\nЕгжей-тегжейін [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} жою журналынан] таба аласыз.",
        "searchresults": "Іздеу нәтижелері",
        "searchresults-title": "\"$1\" сұранымына табылған нәтижелер",
-       "toomanymatches": "Тым көп сәйкес қайтарылды, өзге сұранымды байқап көріңіз",
        "titlematches": "Бет атауы сәйкес келеді",
        "textmatches": "Бет мәтіні сәйкес келеді",
        "notextmatches": "Еш бет мәтіні сәйкес емес",
        "search-interwiki-default": "$1 нәтиже:",
        "search-interwiki-more": "(көбірек)",
        "search-relatedarticle": "Қатысты",
-       "searcheverything-enable": "Барлық есім кеңістігінен іздеу",
        "searchrelated": "қатысты",
        "searchall": "барлық",
        "showingresults": "Төменде нөмір '''$2''' орнынан бастап барынша '''$1''' нәтиже көрсетіледі.",
        "allowemail": "Басқадан хат қабылдауын қосу",
        "prefs-searchoptions": "Іздеу бапталымдары",
        "prefs-namespaces": "Есім кеңістіктері",
-       "defaultns": "Мына есім кеңістіктерінде басқаша іздеу:",
        "default": "әдепкі",
        "prefs-files": "Файлдар",
        "prefs-custom-css": "CSS өзгертпелі",
        "right-sendemail": "Басқа қатысушыларға е-пошта жіберу",
        "right-passwordreset": "Өзгерген құпия сөз арқылы хабарламаларды шолу",
        "newuserlogpage": "Тіркелу журналы",
-       "newuserlogpagetext": "Бұл қатысушы тіркелгі жасау журналы",
+       "newuserlogpagetext": "Бұл қатысушы тіркелу журналы",
        "rightslog": "Қатысушы құқықтары журналы",
        "rightslogtext": "Бұл қатысушы құқықтарын өзгерту журналы.",
        "action-read": "Осы бетті оқу",
        "recentchanges-label-unpatrolled": "Бұл өңдеме әлі тексеруден өтпеді.",
        "recentchanges-label-plusminus": "Байт бойынша беттің өзгеріс өлшемі",
        "recentchanges-legend-heading": "'''Шартты белгілер:'''",
-       "recentchanges-legend-newpage": "(қ: [[Special:NewPages|бөлек бетте]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (қ: [[Special:NewPages|бөлек бетте]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "rcnotefrom": "Төменде <strong>$2</strong> кезінен бергі (<strong>$1</strong> өңдемеге дейін) өзгерістер көрсетіледі.",
        "rclistfrom": "$2, $3 кезінен бергі жаңа өзгерістерді көрсет.",
        "uctop": "(соңғы)",
        "month": "Мына айдан (және ертеректен):",
        "year": "Мына жылдан (және ертеректен):",
-       "sp-contributions-newbies": "Тек жаңа тіркелгіден жасаған үлестерді көрсету",
+       "sp-contributions-newbies": "Тек жаңа тіркелгендер үлестерін көрсету",
        "sp-contributions-newbies-sub": "Жаңа тіркелгендер үшін",
-       "sp-contributions-newbies-title": "Жаңа тіркелгендер үшін қатысушы үлестері",
+       "sp-contributions-newbies-title": "Жаңа тіркелген қатысушылар үлесі",
        "sp-contributions-blocklog": "бұғатталу журналы",
        "sp-contributions-deleted": "жойылған үлесі",
        "sp-contributions-uploads": "жүктеулері",
        "tooltip-ca-unprotect": "Бұл беттің қорғалуын өзгерту",
        "tooltip-ca-delete": "Бұл бетті жою",
        "tooltip-ca-undelete": "Бұл беттің жоюдың алдындағы болған өңдемелерін қалпына келтіру",
-       "tooltip-ca-move": "Бұл бетті жылжыту",
+       "tooltip-ca-move": "Бұл беттің атауын өзгерту",
        "tooltip-ca-watch": "Бұл бетті бақылау тізіміңізге үстеу",
        "tooltip-ca-unwatch": "Бұл бетті бақылау тізіміңізден аластау",
        "tooltip-search": "{{SITENAME}} жобасында іздеу",
        "tooltip-rollback": "\"Шегіндіру\" сілтемесін бір рет басу арқылы соңға редактордың барлық қатар өңдемелерін өшіру",
        "tooltip-preferences-save": "Бапталымдарыңызды сақтау",
        "tooltip-summary": "Қысқаша түйіндемесін енгізіңіз",
+       "interlanguage-link-title-nonlang": "$1 – $2",
        "common.css": "/* Мында орналастырылған CSS барлық мәнерлерде қолданылады */",
-       "monobook.css": "/* Мында орналастырылған CSS тек «Дара кітап» (monobook) мәнерін пайдаланушыларына ықпал етеді */",
        "common.js": "/* Мындағы әртүрлі JavaScript кез келген бет қотарылғанда барлық пайдаланушылар үшін жегіледі. */",
-       "monobook.js": "/* Мындағы JavaScript тек «Дара кітап» (monobook) мәнерін пайдаланушылар үшін жегіледі */",
        "anonymous": "{{SITENAME}} тіркелгісіз {{PLURAL:$1|қатысушысы|қатысушылары}}",
        "siteuser": "{{SITENAME}} қатысушы $1",
        "anonuser": "{{SITENAME}} анонимді қатысушы: $1",
        "pageinfo-category-pages": "Беттер саны",
        "pageinfo-category-subcats": "Санатшалар саны",
        "pageinfo-category-files": "Файлдар саны",
-       "skinname-monobook": "Жеке кітап (monobook)",
        "markaspatrolleddiff": "Зерттелді деп белгілеу",
        "markaspatrolledtext": "Бұл бетті тексерілді деп белгілеу",
        "markedaspatrolled": "Тексерілді деп белгіленді",
        "specialpages-note": "* Қалпты арнайы беттер.\n* <span class==\"mw-specialpagerestricted\">Шектелген арнайы беттер.</span>",
        "specialpages-group-maintenance": "Техникалық талқылау есептері",
        "specialpages-group-other": "Тағы басқа арнайы беттер",
-       "specialpages-group-login": "Кіру / тіркелгі жасау",
+       "specialpages-group-login": "Кіру / тіркелу",
        "specialpages-group-changes": "Жуықтағы өзгерістер мен журналдар",
        "specialpages-group-media": "Медиа баянаттары және жүктелгендер",
        "specialpages-group-users": "Қатысушылар және олардың құқықтары",
        "logentry-move-move-noredirect": "$1 $3 бетін $4 бетіне {{GENDER:$2|жылжытты}} (айдатқыш қалдырмады)",
        "logentry-move-move_redir": "$1 $3 бетін $4 деген айдатқыш үстіне {{GENDER:$2|жылжытты}}",
        "logentry-move-move_redir-noredirect": "$1 $3 бетін $4 деген айдатқыш үстіне {{GENDER:$2|жылжытты}} (айдатқыш қалдырылмады)",
-       "logentry-newusers-newusers": "$1 жаңадан қатысушы тіркелгісін {{GENDER:$2|жасады}}",
-       "logentry-newusers-create": "$1 жаңадан аккаунт тіркеді",
+       "logentry-newusers-newusers": "$1 жаңадан тіркелді",
+       "logentry-newusers-create": "$1 жаңадан тіркелді",
        "logentry-newusers-create2": "$1 $3 деген аккаунт {{GENDER:$2|тіркеді}}",
        "logentry-newusers-byemail": "$1 $3 деген аккаунт {{GENDER:$2|тіркеді}} және құпия сөзі е-пошта арқылы жіберілді",
        "logentry-newusers-autocreate": "$1 қатысушы аккаунтын автоматты түрде {{GENDER:$2|тіркеді}}",
index fa16fff..7c3f223 100644 (file)
        "qbmyoptions": "ទំព័ររបស់ខ្ញុំ",
        "faq": "សំណួរដែលសួរញឹកញាប់",
        "faqpage": "Project:សំណួរដែលសួរញឹកញាប់",
-       "vector-action-addsection": "បន្ថែម​ប្រធានបទ​",
-       "vector-action-delete": "លុបចោល",
-       "vector-action-move": "ប្តូរទីតាំង",
-       "vector-action-protect": "ការពារ",
-       "vector-action-undelete": "ឈប់លុបចោល",
-       "vector-action-unprotect": "ប្ដូរការការពារ",
-       "vector-view-create": "បង្កើត​",
-       "vector-view-edit": "កែប្រែ​",
-       "vector-view-history": "មើល​ប្រវត្តិ​",
-       "vector-view-view": "អាន",
-       "vector-view-viewsource": "មើល​កូដ",
        "actions": "សកម្មភាព​",
        "namespaces": "លំហឈ្មោះ",
        "variants": "សណ្ដាន",
        "difference-missing-revision": " {{PLURAL:$2|រកមិនឃើញ|រកមិនឃើញ}}{{PLURAL:$2|កំណែមួយ|កំណែចំនួន $2}} របស់ភាពខុសគ្នានេះ ($1) ទេ។\n\nជាធម្មតានេះបណ្ដាលមកពីការតាមទៅកាន់តំនភ្ជាប់ភាពខុសគ្នារបស់ទំព័រដែលត្រូវបានលុបចោល។\nព័ត៌មានលំអិតអាចរកបាននៅក្នុង [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} កំណត់ហេតុនៃការលុបចោល]។",
        "searchresults": "លទ្ធផលស្វែងរក",
        "searchresults-title": "លទ្ធផល​ស្វែងរក​សម្រាប់ \"$1\"",
-       "toomanymatches": "មានតំណភ្ជាប់ច្រើនណាស់ត្រូវបានបង្ហាញ ចូរព្យាយាមប្រើសំណួរផ្សេងមួយទៀត",
        "titlematches": "ភាពត្រូវគ្នានៃចំណងជើងទំព័រ",
        "textmatches": "ទំព័រអត្ថបទផ្គូរផ្គងគ្នា",
        "notextmatches": "គ្មានអត្ថបទទំព័រណាមួយដែលមានខ្លឹមសារផ្គូផ្គងនឹងឃ្លាឬពាក្យនេះទេ",
        "searchmenu-exists": "* ទំព័រ '''[[$1]]'''",
        "searchmenu-new": "'''បង្កើតទំព័រ \"[[:$1]]\" នៅ​លើ​វិគី​នេះ!'''",
        "searchprofile-articles": "ទំព័រ​មាតិកា",
-       "searchprofile-project": "ជំនួយ និង​ទំព័រ​គម្រោង",
        "searchprofile-images": "ពហុ​ព័ត៌មាន",
        "searchprofile-everything": "ទាំងអស់",
        "searchprofile-advanced": "ថ្នាក់ខ្ពស់",
        "searchprofile-articles-tooltip": "ស្វែងរកក្នុង $1",
-       "searchprofile-project-tooltip": "ស្វែងរកក្នុង $1",
        "searchprofile-images-tooltip": "ស្វែងរកឯកសាររូបភាព",
        "searchprofile-everything-tooltip": "ស្វែងរកក្នុងខ្លឹមសារទាំងអស់(រួមបញ្ចូលទាំងទំព័រពិភាក្សា)",
        "searchprofile-advanced-tooltip": "ស្វែងរកក្នុងប្រភេទកំណត់ដោយអ្នកប្រើប្រាស់",
        "search-interwiki-default": "លទ្ធផលពី$1៖",
        "search-interwiki-more": "(បន្ថែមទៀត)",
        "search-relatedarticle": "ទាក់ទិន",
-       "searcheverything-enable": "ស្វែងរកនៅក្នុងលំហឈ្មោះទាំងអស់",
        "searchrelated": "ទាក់ទិន",
        "searchall": "ទាំងអស់",
        "showingresults": "ខាងក្រោមកំពុងបង្ហាញរហូតដល់ {{PLURAL:$1|'''១''' លទ្ឋផល|'''$1''' លទ្ឋផល}} ចាប់ផ្ដើមពីលេខ #'''$2'''។",
        "allowemail": "ទទួលអ៊ីមែលពីអ្នកប្រើប្រាស់ដទៃទៀត",
        "prefs-searchoptions": "ស្វែងរក",
        "prefs-namespaces": "ប្រភេទ",
-       "defaultns": "ស្វែងរក​ក្នុង​លំហឈ្មោះ​ទាំងនេះ​តាម​បែប​ផ្សេង៖",
        "default": "លំនាំដើម",
        "prefs-files": "ឯកសារ",
        "prefs-custom-css": "កែតំរូវ CSS",
        "prefs-emailconfirm-label": "បញ្ជាក់ទទួលស្គាល់អ៊ីមែល៖",
        "youremail": "អ៊ីមែល៖",
        "username": "{{GENDER:$1|អត្តនាម}}៖",
-       "uid": "អត្តលេខ{{GENDER:$1|អ្នកប្រើប្រាស់}}៖",
        "prefs-memberingroups": "{{GENDER:$2|សមាជិក}}ក្នុង{{PLURAL:$1|ក្រុម|ក្រុម}}៖",
        "prefs-registration": "កាលបរិច្ឆេទចុះឈ្មោះ៖",
        "yourrealname": "ឈ្មោះពិត៖",
        "recentchanges-label-unpatrolled": "ការកែប្រែនេះមិនទាន់ត្រូវបានល្បាតទេ",
        "recentchanges-label-plusminus": "ទំហំទំព័រត្រូវបានផ្លាស់ប្ដូរគិតជាចំនួនបៃ",
        "recentchanges-legend-heading": "''កំណត់សម្គាល់៖'''",
-       "recentchanges-legend-newpage": "(មើលផងដែរនូវ [[Special:NewPages|បញ្ជីទំព័រថ្មី]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (មើលផងដែរនូវ [[Special:NewPages|បញ្ជីទំព័រថ្មី]])",
        "rcnotefrom": "ខាងក្រោមនេះជាបន្លាស់ប្ដូរនានាគិតចាប់តាំងពី '''$2''' (បង្ហាញអតិបរមាចំនួន '''$1''')។",
        "rclistfrom": "បង្ហាញបន្លាស់ប្ដូរថ្មីៗចាប់តាំងពី $3 $2",
        "rcshowhideminor": "$1កំណែប្រែ​តិចតួច",
        "log-title-wildcard": "ស្វែងរកចំណងជើងចាប់ផ្តើមដោយឃ្លានេះ",
        "showhideselectedlogentries": "បង្ហាញ/លាក់កំណត់ហេតុដែលបានជ្រើសយក",
        "allpages": "ទំព័រទាំងអស់",
-       "alphaindexline": "ពីទំព័រ $1 ដល់ទំព័រ $2",
        "nextpage": "ទំព័របន្ទាប់ ($1)",
        "prevpage": "ទំព័រមុន ($1)",
        "allpagesfrom": "បង្ហាញទំព័រផ្ដើមដោយ៖",
        "tooltip-preferences-save": "រក្សាទុកចំណង់ចំណូលចិត្ត",
        "tooltip-summary": "សរសេរចំណារពន្យល់ថ្មីមួយ",
        "common.css": "/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើគ្រប់សំបកទាំងអស់ */",
-       "cologneblue.css": "/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Cologne Blue */",
-       "monobook.css": "/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Monobook */",
-       "modern.css": "/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Modern */",
-       "vector.css": "/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Vector */",
        "anonymous": "{{PLURAL:$1|user|អ្នកប្រើប្រាស់}}អនាមិកនៃ {{SITENAME}}",
        "siteuser": "អ្នកប្រើប្រាស់{{SITENAME}} $1",
        "anonuser": "អ្នកប្រើប្រាស់{{SITENAME}}អនាមិក $1",
        "pageinfo-category-pages": "ចំនួនទំព័រ",
        "pageinfo-category-subcats": "ចំនួនកូនចំណាត់ថ្នាក់ក្រុម",
        "pageinfo-category-files": "ចំនួនឯកសារ",
-       "skinname-cologneblue": "ទឹកអប់ខៀវ",
-       "skinname-monobook": "សៀវភៅឯក",
-       "skinname-modern": "ទំនើប",
-       "skinname-vector": "វ៉ិចទ័រ​​",
        "markaspatrolleddiff": "ចំណាំថាបានល្បាត",
        "markaspatrolledtext": "ចំណាំទំព័រនេះថាបានល្បាត",
        "markedaspatrolled": "បានចំណាំថាបានល្បាត",
index a2e70a9..cc392e1 100644 (file)
        "allowemail": "ಬೇರೆ ಸದಸ್ಯರಿಂದ ಈ-ಮೈಲ್‍ಗಳನ್ನು ಸ್ವೀಕರಿಸು",
        "prefs-searchoptions": "ಹುಡುಕು",
        "prefs-namespaces": "ನಾಮವರ್ಗಗಳು",
-       "defaultns": "ಮೂಲಸ್ಥಿತಿಯಲ್ಲಿ ಈ ಪುಟಪ್ರಬೇಧಗಳಲ್ಲಿ ಹುಡುಕಿ:",
        "default": "ಮೂಲಸ್ಥಿತಿ",
        "prefs-files": "ಫೈಲುಗಳು",
        "youremail": "ಇ-ಅಂಚೆ:",
index bda0f5b..15d9641 100644 (file)
@@ -37,7 +37,8 @@
                        "לערי ריינהארט",
                        "관인생략",
                        "아라",
-                       "Keysuck"
+                       "Keysuck",
+                       "Infinity"
                ]
        },
        "tog-underline": "링크에 밑줄:",
        "qbmyoptions": "내 사용자 문서",
        "faq": "자주 묻는 질문",
        "faqpage": "Project:FAQ",
-       "vector-action-addsection": "새 주제",
-       "vector-action-delete": "삭제",
-       "vector-action-move": "옮기기",
-       "vector-action-protect": "보호",
-       "vector-action-undelete": "삭제 취소",
-       "vector-action-unprotect": "보호 설정 바꾸기",
-       "vector-view-create": "만들기",
-       "vector-view-edit": "편집",
-       "vector-view-history": "역사 보기",
-       "vector-view-view": "읽기",
-       "vector-view-viewsource": "원본 보기",
        "actions": "행위",
        "namespaces": "이름공간",
        "variants": "변수",
        "virus-scanfailed": "검사 실패 (코드 $1)",
        "virus-unknownscanner": "알 수 없는 백신 소프트웨어:",
        "logouttext": "'''지금 로그아웃했습니다.'''\n\n브라우저 캐시를 지우지 않으면 일부 문서에서 로그인이 되어 있는 것처럼 보일 수 있습니다.",
-       "welcomeuser": "$1 님, 환영합니다!",
+       "welcomeuser": "$1님, 환영합니다!",
        "welcomecreation-msg": "계정이 만들어졌습니다.\n[[Special:Preferences|{{SITENAME}} 사용자 환경 설정]]을 바꿀 수 있습니다.",
        "yourname": "사용자 이름:",
        "userlogin-yourname": "사용자 계정 이름",
        "currentrev": "최신판",
        "currentrev-asof": "$1 기준 최신판",
        "revisionasof": "$1 판",
-       "revision-info": "$2 사용자의 $1 판",
+       "revision-info": "{{GENDER:$6|$2}} 사용자의 $1 판$1",
        "previousrevision": "← 이전 판",
        "nextrevision": "다음 판 →",
        "currentrevisionlink": "최신판",
        "historyempty": "(비었음)",
        "history-feed-title": "편집 역사",
        "history-feed-description": "이 문서의 편집 역사",
-       "history-feed-item-nocomment": "$2에 대한 $1의 편집",
+       "history-feed-item-nocomment": "$2에 $1님의 편집",
        "history-feed-empty": "요청한 문서가 존재하지 않습니다.\n해당 문서가 삭제되었거나, 문서 이름이 바뀌었을 수 있습니다.\n[[Special:Search|위키의 검색]]을 사용해 관련 문서를 찾아보세요.",
        "rev-deleted-comment": "(편집 요약 삭제됨)",
        "rev-deleted-user": "(사용자 이름 삭제됨)",
        "mergehistory-empty": "합칠 수 있는 판이 없습니다.",
        "mergehistory-success": "[[:$1]] 문서의 {{PLURAL:$3|판}} $3개가 [[:$2]]에 성공적으로 합쳐졌습니다.",
        "mergehistory-fail": "역사 합치기를 수행할 수 없습니다, 문서와 시간 변수를 다시 확인하세요.",
+       "mergehistory-fail-toobig": "옮기려는 {{PLURAL:$1|판}} $1개 제한보다 많이 역사 병합을 수행할 수 없습니다.",
        "mergehistory-no-source": "원본인 $1 문서가 존재하지 않습니다.",
        "mergehistory-no-destination": "대상인 $1 문서가 존재하지 않습니다.",
        "mergehistory-invalid-source": "원본 문서는 올바른 제목이어야 합니다.",
        "difference-missing-revision": "문서 비교에서 {{PLURAL:$2|하나|$2개}}의 판($1)을 찾을 수 {{PLURAL:$2|없습니다}}.\n\n이 문제는 주로 삭제된 문서를 가리키는 오래된 문서 비교 링크로 인해 발생합니다.\n자세한 내용은 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 삭제 기록]에서 확인할 수 있습니다.",
        "searchresults": "검색 결과",
        "searchresults-title": "\"$1\"에 대한 검색 결과",
-       "toomanymatches": "일치하는 결과가 너무 많습니다. 다른 검색어를 입력해주세요.",
        "titlematches": "문서 제목 일치",
        "textmatches": "문서 내용 일치",
        "notextmatches": "해당하는 문서 없음",
        "search-interwiki-default": "$1 로부터의 결과:",
        "search-interwiki-more": "(더 보기)",
        "search-relatedarticle": "관련",
-       "searcheverything-enable": "모든 이름공간에서 검색",
        "searchrelated": "관련",
        "searchall": "모두",
        "showingresults": "'''$2'''번 부터의 {{PLURAL:$1|결과 '''1'''개|결과 '''$1'''개}}입니다.",
        "powersearch-togglelabel": "확인:",
        "powersearch-toggleall": "모두",
        "powersearch-togglenone": "모두 제외",
+       "powersearch-remember": "향후 검색에 선택 기억하기",
        "search-external": "바깥에서 검색",
        "searchdisabled": "{{SITENAME}} 검색이 비활성화되어 있습니다.\n검색이 작동하지 않는 동안에는 Google(구글)을 통해 검색할 수 있습니다.\n검색 엔진의 내용은 최신이 아닐 수 있다는 점을 참고하세요.",
        "search-error": "검색하는 동안 오류가 발생했습니다: $1",
        "allowemail": "다른 사용자가 보낸 이메일을 받음",
        "prefs-searchoptions": "검색",
        "prefs-namespaces": "이름공간",
-       "defaultns": "다음 이름공간에서 검색:",
        "default": "기본값",
        "prefs-files": "파일",
        "prefs-custom-css": "사용자 CSS",
        "right-purge": "확인 없이 문서의 캐시를 새로 고침",
        "right-autoconfirmed": "IP 기반의 속도 제한에 영향을 받지 않음",
        "right-bot": "봇의 편집으로 취급",
-       "right-nominornewtalk": "토론 문서를 새로 만들때 사소한 편집 사용 불가능",
+       "right-nominornewtalk": "토론 문서에 사소한 편집으로 새 메시지를 보낼 수 없음",
        "right-apihighlimits": "API 상한 상승",
        "right-writeapi": "API 작성",
        "right-delete": "문서 삭제",
        "recentchanges-label-unpatrolled": "아직 순찰하지 않은 편집",
        "recentchanges-label-plusminus": "바이트로 표기된 바뀐 문서 크기",
        "recentchanges-legend-heading": "'''범례:'''",
-       "recentchanges-legend-newpage": "([[Special:NewPages|새 문서 목록]]도 보세요)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|새 문서 목록]]도 보세요)",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "다음은 <strong>$2</strong>에서부터 바뀐 문서 <strong>$1</strong>개입니다.",
        "rclistfrom": "$3 $2부터 시작하는 새로 바뀐 문서 보기",
        "largefileserver": "이 파일의 크기가 서버에서 허용된 설정보다 큽니다.",
        "emptyfile": "올리려는 파일이 빈 파일입니다.\n파일 이름을 잘못 입력했을 수도 있습니다.\n올리려는 파일을 다시 한 번 확인해 주시기 바랍니다.",
        "windows-nonascii-filename": "이 위키에서는 특수 문자가 포함된 파일 이름을 지원하지 않습니다.",
-       "fileexists": "같은 이름의 파일이 이미 있습니다. 파일을 바꾸고 싶지 않다면 <strong>[[:$1]]</strong> 파일을 확인해 주세요.\n[[$1|thumb]]",
+       "fileexists": "같은 이름의 파일이 이미 있습니다. {{GENDER:|}}파일을 바꾸고 싶지 않다면 <strong>[[:$1]]</strong> 파일을 확인해 주세요.\n[[$1|thumb]]",
        "filepageexists": "이 파일의 설명 문서가 <strong>[[:$1]]</strong>에 존재하지만, 이 이름을 가진 파일이 존재하지 않습니다.\n입력한 설명은 설명 문서에 반영되지 않을 것입니다.\n설명을 반영시키려면, 직접 편집하셔야 합니다.\n[[$1|thumb]]",
-       "fileexists-extension": "비슷한 이름의 파일이 존재합니다: [[$2|thumb]]\n* 올리려는 파일 이름: <strong>[[:$1]]</strong>\n* 존재하는 파일 이름: <strong>[[:$2]]</strong>\n다른 이름으로 선택하세요.",
+       "fileexists-extension": "비슷한 이름의 파일이 존재합니다: [[$2|thumb]]\n* 올리려는 파일 이름: <strong>[[:$1]]</strong>\n* 존재하는 파일 이름: <strong>[[:$2]]</strong>\n아마도 더 독특한 이름을 사용하고 싶으신가요?",
        "fileexists-thumbnail-yes": "파일은 그림의 크기를 줄인 (섬네일) 파일인 것 같습니다.\n[[$1|thumb]]\n<strong>[[:$1]]</strong> 파일을 확인하세요.\n해당 파일이 현재 올리려는 파일과 같다면 더 작은 크기의 그림을 올릴 필요는 없습니다.",
        "file-thumbnail-no": "파일 이름이 <strong>$1</strong>으로 시작합니다.\n이 파일은 그림의 크기를 줄인 (섬네일) 파일인 것 같습니다.\n더 해상도가 좋은 파일이 있다면 그 파일을 올리거나 아니면 올리려는 파일 이름을 바꾸세요.",
        "fileexists-forbidden": "같은 이름의 파일이 이미 있고, 덮어쓸 수 없습니다.\n그래도 파일을 올리시려면, 뒤로 돌아가서 다른 이름으로 시도해 주시기 바랍니다.\n[[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "점검 중에는 임시적으로 삭제와 되살리기를 할 수 없습니다.",
        "filedelete-maintenance-title": "파일을 삭제할 수 없습니다",
        "mimesearch": "MIME 검색",
-       "mimesearch-summary": "MIME 유형에 해당하는 파일을 검색합니다.\n다음 형태로 입력해주세요: 내용종류/하위종류, 예를 들어 <code>image/jpeg</code>",
+       "mimesearch-summary": "이 페이지는 MIME 유형에 해당하는 파일을 필터합니다.\n입력: 내용종류/하위종류나 내용종류/*, 예를 들어 <code>image/jpeg</code>",
        "mimetype": "MIME 형식:",
        "download": "다운로드",
        "unwatchedpages": "주시되지 않는 문서 목록",
        "unusedtemplateswlh": "다른 링크",
        "randompage": "임의 문서로",
        "randompage-nopages": "{{PLURAL:$2|다음}} 이름공간에는 문서가 없습니다: $1",
-       "randomincategory": "분류에 있는 임의 문서",
+       "randomincategory": "분류 안의 임의 문서",
        "randomincategory-invalidcategory": "\"$1\"(은)는 올바른 분류 이름이 아닙니다.",
        "randomincategory-nopages": "[[:Category:$1]]에 문서가 없습니다.",
        "randomincategory-selectcategory": "분류에서 임의 문서 얻기: $1 $2",
        "wantedtemplates": "필요한 틀 목록",
        "mostlinked": "가장 많이 연결된 문서 목록",
        "mostlinkedcategories": "가장 많이 연결된 분류 목록",
-       "mostlinkedtemplates": "가장 많이 사용된 틀 목록",
+       "mostlinkedtemplates": "가장 많이 끼워진 문서",
        "mostcategories": "가장 많이 분류된 문서 목록",
        "mostimages": "가장 많이 사용된 파일 목록",
        "mostinterwikis": "가장 많이 인터위키가 달린 문서 목록",
        "listgrouprights-namespaceprotection-header": "이름공간 제한",
        "listgrouprights-namespaceprotection-namespace": "이름공간",
        "listgrouprights-namespaceprotection-restrictedto": "사용자가 편집할 수 있는 권한",
-       "trackingcategories": "분류 추적",
-       "trackingcategories-summary": "이 페이지는 미디어위키 소프트웨어에 의해 자동으로 채워지는 분류 추적을 나열합니다. 그들의 이름은 {{ns:8}} 이름공간에 관련된 시스템 메시지를 바꾸어서 바꿀 수 있습니다.",
-       "trackingcategories-msg": "분류 추적",
+       "trackingcategories": "추적용 분류",
+       "trackingcategories-summary": "이 페이지는 미디어위키 소프트웨어에 의해 자동으로 만들어지는 추적용 분류를 나열합니다. 그들의 이름은 {{ns:8}} 이름공간에 관련된 시스템 메시지를 바꾸어서 바꿀 수 있습니다.",
+       "trackingcategories-msg": "추적용 분류",
        "trackingcategories-name": "메시지 이름",
        "trackingcategories-desc": "분류 포함 기준",
        "noindex-category-desc": "문서는 그것과 그 플래그가 허용된 곳에 있는 이름공간에서 <code><nowiki>__NOINDEX__</nowiki></code> 특수 명령이 있기 때문에 로봇이 색인하지 않습니다.",
        "sp-contributions-newbies-sub": "새 사용자의 기여",
        "sp-contributions-newbies-title": "새 사용자의 기여",
        "sp-contributions-blocklog": "차단 기록",
-       "sp-contributions-suppresslog": "ì\82­ì \9cë\90\9c 사용자 기여",
+       "sp-contributions-suppresslog": "ì\88¨ê²¨ì§\84 사용자 기여",
        "sp-contributions-deleted": "삭제된 사용자 기여",
        "sp-contributions-uploads": "올린 파일",
        "sp-contributions-logs": "기록",
        "importbadinterwiki": "인터위키 링크가 잘못되었습니다.",
        "importsuccess": "가져오기 완료!",
        "importnosources": "문서를 가져올 출처가 정의되지 않았고 문서 역사 올리기가 비활성화되었습니다.",
-       "importnofile": "가져오기 파일이 올려지지 않았습니다.",
+       "importnofile": "가져오기 파일이 올려지지 않았습니다.",
        "importuploaderrorsize": "파일 올리기를 통한 가져오기에 실패했습니다.\n파일이 허용된 크기 제한보다 큽니다.",
        "importuploaderrorpartial": "가져오기 파일을 올리는 데 실패하였습니다.\n파일이 부분적으로만 올려졌습니다.",
        "importuploaderrortemp": "가져오기 파일을 올리는 데 실패했습니다.\n임시 폴더가 존재하지 않습니다.",
        "tooltip-summary": "짧은 요약을 적어주세요",
        "interlanguage-link-title": "$1 – $2",
        "common.css": "/* 이 CSS 설정은 모든 스킨에 동일하게 적용됩니다 */",
-       "monobook.css": "/* 이 CSS 설정은 모노북 스킨을 사용하는 사용자에게 적용됩니다 */",
-       "vector.css": "/* 이 CSS 설정은 벡터 스킨을 사용하는 사용자에게 적용됩니다 */",
        "print.css": "/* 이 CSS 설정은 인쇄 출력 화면에 적용됩니다 */",
        "noscript.css": "/* 이 CSS 설정은 자바스크립트를 비활성화한 사용자에 적용됩니다 */",
        "group-autoconfirmed.css": "/* 이 CSS 설정은 자동 인증된 사용자에만 적용됩니다 */",
        "group-sysop.css": "/* 이 CSS 설정은 관리자에만 적용됩니다 */",
        "group-bureaucrat.css": "/* 이 CSS 설정은 사무관에만 적용됩니다 */",
        "common.js": "/* 이 자바스크립트 설정은 모든 문서, 모든 사용자에게 적용됩니다. */",
-       "monobook.js": "/* 이 자바스크립트 설정은 모노북 스킨을 사용하는 사용자에게 적용됩니다 */",
-       "vector.js": "/* 이 자바스크립트 설정은 벡터 스킨을 사용하는 사용자에게 적용됩니다 */",
        "group-autoconfirmed.js": "/* 이 자바스크립트 설정은 자동 인증된 사용자에만 적용됩니다 */",
        "group-bot.js": "/* 이 자바스크립트 설정은 봇에만 적용됩니다 */",
        "group-sysop.js": "/* 이 자바스크립트 설정은 관리자에만 적용됩니다 */",
        "pageinfo-category-pages": "문서 수",
        "pageinfo-category-subcats": "하위 분류 수",
        "pageinfo-category-files": "파일 수",
-       "skinname-monobook": "모노북",
-       "skinname-vector": "벡터",
        "markaspatrolleddiff": "검토한 문서로 표시",
        "markaspatrolledtext": "이 문서를 검토한 것으로 표시",
        "markedaspatrolled": "검토한 문서로 표시",
        "watchlistedit-normal-legend": "주시문서 목록에서 문서 제거하기",
        "watchlistedit-normal-explain": "주시문서 목록에 있는 문서의 제목이 아래에 나와 있습니다.\n주시문서 목록에서 제거하려는 문서가 있으면 각 항목의 확인 상자를 선택한 다음 \"{{int:Watchlistedit-normal-submit}}\"를 클릭해주세요.\n또는 [[Special:EditWatchlist/raw|목록을 직접 편집]]할 수도 있습니다.",
        "watchlistedit-normal-submit": "항목 삭제",
-       "watchlistedit-normal-done": "{{PLURAL:$1|제목 1개|제목 $1개}}를 주시문서 목록에서 제거했습니다:",
+       "watchlistedit-normal-done": "{{PLURAL:$1|문서 1개|문서 $1개}}를 주시문서 목록에서 제거했습니다:",
        "watchlistedit-raw-title": "주시문서 목록 직접 편집하기",
        "watchlistedit-raw-legend": "주시문서 목록 직접 편집하기",
        "watchlistedit-raw-explain": "주시문서 목록의 각 항목이 나와 있습니다. 필요한 항목을 직접 추가하거나 제거할 수 있습니다.\n각 줄마다 하나의 제목을 입력하세요.\n수정을 마쳤다면 \"{{int:Watchlistedit-raw-submit}}\"을 누르면 됩니다.\n또는 [[Special:EditWatchlist|일반적인 편집기]]를 쓸 수도 있습니다.",
        "watchlistedit-raw-titles": "목록:",
        "watchlistedit-raw-submit": "주시문서 목록 새로 고침",
        "watchlistedit-raw-done": "주시문서 목록을 새로 고쳤습니다.",
-       "watchlistedit-raw-added": "{{PLURAL:$1|제목 1개|제목 $1개}}를 추가했습니다:",
-       "watchlistedit-raw-removed": "{{PLURAL:$1|제목 1개|제목 $1개}}를 제거했습니다:",
-       "watchlistedit-clear-title": "주시문서 목록이 지워짐",
+       "watchlistedit-raw-added": "{{PLURAL:$1|문서 1개|문서 $1개}}를 추가했습니다:",
+       "watchlistedit-raw-removed": "{{PLURAL:$1|문서 1개|문서 $1개}}를 제거했습니다:",
+       "watchlistedit-clear-title": "주시문서 목록 지우기",
        "watchlistedit-clear-legend": "주시문서 목록 지우기",
-       "watchlistedit-clear-explain": "모든 제목이 주시문서 목록에서 제거됩니다",
+       "watchlistedit-clear-explain": "모든 문서가 주시문서 목록에서 제거됩니다",
        "watchlistedit-clear-titles": "제목:",
        "watchlistedit-clear-submit": "주시목록 문서 지우기 (이는 영구적입니다!)",
        "watchlistedit-clear-done": "주시문서 목록을 지웠습니다.",
-       "watchlistedit-clear-removed": "{{PLURAL:$1|제목 1개|제목 $1개}}를 제거했습니다:",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|문서 1개|문서 $1개}}를 제거했습니다:",
        "watchlistedit-too-many": "여기에 보여질 문서가 너무 많습니다.",
        "watchlisttools-clear": "주시문서 목록 비우기",
        "watchlisttools-view": "주시문서 최근 바뀜",
index 157fd68..a3abd89 100644 (file)
        "qbmyoptions": "Бетлерим",
        "faq": "FAQ",
        "faqpage": "Project:FAQ",
-       "vector-action-addsection": "Джангы тема къош",
-       "vector-action-delete": "Кетер",
-       "vector-action-move": "Атын ауушдур",
-       "vector-action-protect": "Джакъла",
-       "vector-action-undelete": "Къайтар",
-       "vector-action-unprotect": "Джакълауну тюрлендир",
-       "vector-view-create": "Къура",
-       "vector-view-edit": "Тюрлендир",
-       "vector-view-history": "Тарихин кёргюз",
-       "vector-view-view": "Окъу",
-       "vector-view-viewsource": "Кодха къара",
        "actions": "Этиуле",
        "namespaces": "Атланы аламы",
        "variants": "Вариантла",
        "jumptonavigation": "навигация",
        "jumptosearch": "излеу",
        "view-pool-error": "Кечгинлик, бусагъатда серверле бош тюйюлдюле.\nБу бетге къараргъа излегенле асыры кёбдюле.\nКечирек кириб кёрюгюз.\n\n$1",
+       "generic-pool-error": "Кечгинлик, бусагъатда серверле бош тюйюлдюле.\nБу ресурсха къараргъа излегенле асыры кёбдюле.\nКечирек кириб кёрюгюз.",
        "pool-timeout": "Блокланыуну сакълау заман ётдю",
        "pool-queuefull": "Соруула джыйыучу толуду",
        "pool-errorunknown": "Билинмеген халат",
+       "pool-servererror": "Пул санаучу къуллукъ ишлемеди ($1).",
        "aboutsite": "{{SITENAME}} сайтны юсюнден",
        "aboutpage": "Project:Суратлау",
        "copyright": "Ичиндегиси,  $1 лицензиягъа кёре бериледи (башха белгиленмеген эсе).",
        "nospecialpagetext": "<strong>Сиз излеген къуллукъ бет джокъду.</strong>\n\nБолгъан къуллукъ бетлени тизмеси: [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Халат",
        "databaseerror": "Информация базада халат",
+       "databaseerror-textcl": "Билгиле базада халат чыкъды.",
        "databaseerror-query": "Соруулау: $1",
        "databaseerror-error": "Халат: $1",
        "laggedslavemode": "Эс бёлюгюз! Бу бетге ахыр джангыртыула болмазгъа боллукъдула.",
        "changeemail-submit": "Адресни тюрлендир",
        "changeemail-cancel": "Ызына алыу",
        "resettokens": "Токенлени джибер",
+       "resettokens-legend": "Токенлени джибер",
        "resettokens-tokens": "Токенле:",
+       "resettokens-token-label": "$1 (бусагъатдагъы: $2)",
        "bold_sample": "Къалын джазыу",
        "bold_tip": "Къалын джазыу",
        "italic_sample": "Сёдегей джазыу",
        "titleprotectedwarning": "'''Эсгертиу: Бу бет джакъланыбды. Джангыз [[Special:ListGroupRights|энчи хакълары]] болгъанла текстни салыргъа боллукъдула.'''\nТюбюнде, билги ючюн журналдан ахыр джазыу берилгенди:",
        "templatesused": "Бу бетде хайырланылгъан {{PLURAL:$1|шаблон|шаблонла}}:",
        "templatesusedpreview": "Ал къаралыучу бетде хайырланнган {{PLURAL:$1|1=шаблон|шаблонла}}:",
-       "templatesusedsection": "Бу бетде хайырланнган {{PLURAL:$1|1=шаблон|шаблонла}}:",
+       "templatesusedsection": "Бу бёлюмде хайырланылгъан {{PLURAL:$1|шаблон|шаблонла}}:",
        "template-protected": "(джакъланнган)",
        "template-semiprotected": "(джарты джакъланыбды)",
        "hiddencategories": "Бу бет $1 {{PLURAL:$1|1 джашырылгъан категориягъа|$1 джашырылгъан категориягъа}} киреди:",
        "nocreate-loggedin": "Джангы бетле къураргъа эркинлигигиз джокъду.",
        "sectioneditnotsupported-title": "Бёлюмлени тюрлендирир мадар джокъду.",
        "sectioneditnotsupported-text": "Бу бетде бёлюмлени тюрлендирирге болмайды.",
-       "permissionserrors": "Эркинликлени халатлары",
-       "permissionserrorstext": "Ð\91Ñ\8bлайдагÑ\8aÑ\8b {{PLURAL:$1|1=Ñ\87Ñ\83Ñ\80Ñ\83м|Ñ\87Ñ\83Ñ\80Ñ\83мла}} Ñ\8eÑ\87Ñ\8eн, Ð±Ñ\83нÑ\83 Ñ\8dÑ\82еÑ\80ге Ñ\85акÑ\8aÑ\8bгÑ\8aÑ\8bз Ð´Ð¶Ð¾ÐºÑ\8aдÑ\83:",
+       "permissionserrors": "Эркинликлени халаты",
+       "permissionserrorstext": "Ð\91Ñ\83 Ð¾Ð¿ÐµÑ\80аÑ\86иÑ\8fнÑ\8b Ñ\8dÑ\82еÑ\80ге Ñ\8dÑ\80кинлигигиз Ð´Ð¶Ð¾ÐºÑ\8aдÑ\83, Ð±Ñ\8bлайдагÑ\8aÑ\8b {{PLURAL:$1|1=Ñ\87Ñ\83Ñ\80Ñ\83м|Ñ\87Ñ\83Ñ\80Ñ\83мла}} Ñ\8eÑ\87Ñ\8eн:",
        "permissionserrorstext-withaction": "«'''$2'''» этерге амалыгъыз джокъду. {{PLURAL:$1|1=Чуруму|Чурумлары}}:",
        "recreate-moveddeleted-warn": "'''Эс бёлюгюз! Сиз алгъын кетерилген бетни джангыдан къураргъа излейсиз'''\n\nБетни джангыдан къураргъа кереклигине сагъыш этигиз.\nБетни кетериу бла атын тюрлендирилиуню журналы тюбюнде кёргюзюлгенди.",
        "moveddeleted-notice": "Бу бет кетерилгенди.\nХапарлашдырыу ючюн тюбюрек кетериуле бла ат тюрлендириулени журналы берилгенди.",
        "difference-missing-revision": "Бу тенглешдириу ($1) ючюн {{PLURAL:$2|бир версия|$2 версия}} {{PLURAL:$2|табылмады}}.\n\n\nБу, эскирген джибериу бла кетерилген бетни версияларын тенглешдириуге кёчген сагъатда кёбюсюне болады.\nТолуракъ информация [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} кетериулени журналында] болургъа боллукъду.",
        "searchresults": "Излеуню эсеби",
        "searchresults-title": "«$1» ючюн излеуню эсеблери",
-       "toomanymatches": "Асыры кёб бирчалыкъ барды, джангыдан соруу джиберирге кюрешигиз",
        "titlematches": "Бетлени атында бирчалыкъ барды",
        "textmatches": "Бетлени текстлеринде бирчалыкъла барды",
        "notextmatches": "Бетлени текстлеринде бирчалыкъ джокъду",
        "searchmenu-exists": "'''Бу викиде «[[:$1]]» бет барды'''",
        "searchmenu-new": "<strong>Бу вики-проектде «[[:$1]]» бетни къура!</strong>\n{{PLURAL:$2|0=|Дагъыда табылгъан излеу эсебге къарагъыз.|Дагъыда табылгъан излеу эсеблеге къарагъыз.}}",
        "searchprofile-articles": "Баш бетле",
-       "searchprofile-project": "Болушлукъ эм проект бетле",
        "searchprofile-images": "Мультимедия",
        "searchprofile-everything": "Хар къайда",
        "searchprofile-advanced": "Кенгерген",
        "searchprofile-articles-tooltip": "$1 ичинде изле",
-       "searchprofile-project-tooltip": "$1 ичинде изле",
        "searchprofile-images-tooltip": "Файлланы изле",
        "searchprofile-everything-tooltip": "Бютеу бетледе изле (сюзюу бетледе да)",
        "searchprofile-advanced-tooltip": "Энчи ат аланладада изле",
        "search-result-score": "Келишиулюк: $1%",
        "search-redirect": "(Джиберилиниу $1)",
        "search-section": "($1 бёлюм)",
+       "search-file-match": "(файлны ичиндегиси бла бирди)",
        "search-suggest": "Муну излей болурмусуз: $1",
        "search-interwiki-caption": "Джууукъ проектле",
-       "search-interwiki-default": "$1 Ñ\8dÑ\81еблеÑ\80и:",
+       "search-interwiki-default": "$1 Ñ\81айÑ\82дан Ñ\8dÑ\81ебле:",
        "search-interwiki-more": "(дагъыда)",
        "search-relatedarticle": "Байламлы",
-       "searcheverything-enable": "Атланы бютеу аламларында изле",
        "searchrelated": "бейламлы",
        "searchall": "бютеу",
        "showingresults": "Тюбюрек №&nbsp;<strong>$2</strong> башлаб <strong>$1</strong> {{PLURAL:$1|1=эсеб|эсебле}} {{PLURAL:$1|1=кёргюзюлгенди|кёргюзюлгендиле}}.",
        "allowemail": "Башха къошулуучуладан электрон почтаны келмеге къой",
        "prefs-searchoptions": "Излеу",
        "prefs-namespaces": "Атла алам",
-       "defaultns": "Башха халда бу атла аламлада изле:",
        "default": "тынгылау бла",
        "prefs-files": "Файлла",
        "prefs-custom-css": "Энчи CSS",
        "right-move": "бетлени атларын тюрлендириу",
        "right-move-subpages": "бетлени атларын тюббетлери бла бирге тюрлендириу",
        "right-move-rootuserpages": "Къошулуучуланы тамыр бетлерин атын тюрлендир",
+       "right-move-categorypages": "категория бетлени атларын тюрлендириу",
        "right-movefile": "файлланы атларын тюрлендириу",
        "right-suppressredirect": "Бетни атытюрленсе, эски атындан джбериу этилмейди",
        "right-upload": "файлла джюклеу",
        "right-reupload-shared": "Орта файл сакълау джерни, локал бла ауушдур",
        "right-upload_by_url": "URL адресинден файлла джюклеу",
        "right-purge": "Мюкюл бетсиз бетлени кешлерин ариула",
-       "right-autoconfirmed": "Джарым-джакълы бетлени тюрлендир",
+       "right-autoconfirmed": "IP-адресге кёре теркликни чеклеу джокъду",
        "right-bot": "Автомат процесс кибик сана",
        "right-nominornewtalk": "Къошулуучу сюзюу бетде этген гитче тюрлениуле, къошулуучугъа джангы билдириу бла билдирилмез",
        "right-apihighlimits": "API-соруулагъа мийик лимит хайырлан",
        "action-move": "бу бетни атын тюрлендириу",
        "action-move-subpages": "Бу бетни бютеу бёлюмлери бла атын тюрлендириу",
        "action-move-rootuserpages": "къошулуучуланы тамыр бетлерини атларын тюрлендириу",
+       "action-move-categorypages": "категория бетлени атларын тюрлендириу",
        "action-movefile": "бу файлны атын тюрлендириу",
        "action-upload": "бу файлны джюклеу",
        "action-reupload": "болгъан файлны юсюне джаздырыу",
        "action-editmywatchlist": "кёзде тургъан тизменги тюрлендириу",
        "action-viewmywatchlist": "кёзде тургъан тизменги кёрюу",
        "nchanges": "$1 {{PLURAL:$1|тюрлениу|тюрлениу}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|ахыр кере киргенден бери}}",
        "enhancedrc-history": "тарих",
        "recentchanges": "Ахыр тюрлениуле",
        "recentchanges-legend": "Ахыр тюрлениулени джарашдырыулары",
        "recentchanges-label-bot": "Бу тюрлендириуню бот этгенди",
        "recentchanges-label-unpatrolled": "Бу тюрлендириу алкъын патруль этилинмегенди",
        "recentchanges-label-plusminus": "Бетни ёлчеми быллай бир байтха тюрленнгенди",
-       "recentchanges-legend-newpage": "(къарагъыз: [[Special:NewPages|джангы бетлени тизмеси]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (къарагъыз: [[Special:NewPages|джангы бетлени тизмеси]])",
+       "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Тюбюрекде <strong>$2</strong> башлаб (<strong>$1</strong> дери) тюрлендириуле кёрюнедиле",
        "rclistfrom": "$3 $2 башлаб джангы тюрлениулени кёргюз",
        "rcshowhideminor": "гитче тюрлениулени $1",
        "unusedtemplateswlh": "башха джибериуле",
        "randompage": "Эсде болмагъан бет",
        "randompage-nopages": "{{PLURAL:$2|1=Ат аланында|Ат аланында}} чырт бир бет джокъду: $1.",
+       "randomincategory": "Категориядагъы эсде болмагъан бет",
+       "randomincategory-invalidcategory": "«$1» категория джокъду.",
+       "randomincategory-nopages": "[[:Category:$1]] категорияда бетле джокъдула.",
        "randomincategory-selectcategory-submit": "Кёч",
        "randomredirect": "Сакъланмагъан джибериу",
        "randomredirect-nopages": "«$1» ат аланда чырт бир джибериу джокъду.",
        "statistics-users-active": "Актив къошулуучула",
        "statistics-users-active-desc": "Ахыр {{PLURAL:$1|кюнде|$1 кюнде}} ишлеме этген къошулуучула",
        "statistics-mostpopular": "Эм кёб къаралгъан бетле",
+       "pageswithprop-prop": "Амалны аты:",
        "pageswithprop-submit": "Таб",
        "doubleredirects": "Джибериу болгъан джибериуле",
        "doubleredirectstext": "Бу бетде башхы джибериулеге этилген джибериулени тизмеси барды.\nХар тизгин биринчи неда экинчи джибериуню эмда асламысында бетни аты джазылгъан, биринчи джибериу кёргюзген, экинчи джибериуню нюзюр бети джазылады.\n<del>Юсю сызылгъан</del> джазыула тюзетилген этгендиле.",
        "protectedpages-timestamp": "Дата/заман",
        "protectedpages-page": "Бет",
        "protectedpages-expiry": "Бошалыу датасы",
+       "protectedpages-performer": "Къошулуучуну джакълау",
+       "protectedpages-params": "Джакълауну параметрлери",
        "protectedpages-reason": "Чурум",
        "protectedpages-unknown-timestamp": "Билинмейди",
        "protectedpages-unknown-performer": "Белгили болмагъан къошулуучу",
        "listgrouprights-removegroup-self": "кесини тергеу джазыуундан {{PLURAL:$2|1=къауум|къауумланы}} къораталлыкъды: $1",
        "listgrouprights-addgroup-self-all": "Бютеу къауумланы кесини тергеу джазыууна къошаллыкъды",
        "listgrouprights-removegroup-self-all": "Кесини тергеу джазыуундан бютеу къауумланы къораталлыкъды",
+       "listgrouprights-namespaceprotection-header": "Ат аламны чеклеулери",
        "listgrouprights-namespaceprotection-namespace": "Атла алам",
        "trackingcategories": "Марлаб туруучу категорияла",
        "trackingcategories-msg": "Марлаб туруучу категория",
        "file-exists-sharedrepo": "Сайланнган файл ат орта сакълауда алайсызда барды.\nБашха ат сайлагъыз.",
        "export": "Статьяланы экспорт эт",
        "exporttext": "Белгили бетни неда бет къауумну  текстлерин эмда тюрлендириу журналын XML-гъа экспорт этерге боллукъсуз. Бу МедиаВики хайырланнган башха бир  викиге [[Special:Import|импорт]] этерге боллукъду.\n\nБетлени экспорт этер ючюн атын тюбюндеги тюрлендириу сафда  джазыгъыз, бир ат бир сафха болсун, сора статьяланы тюрлендириуюню бютеу тарихинми огъесе статьяланы ахыр версияларынмы экспорт этерге излегенигизни оноуун этигиз.\n\nСиз дагъыда джангыз ахыр версияланы эскпорт этерча айры адресни хайырландырыргъа боллукъсуз. Сёз ючюн [[{{MediaWiki:Mainpage}}]] бет ючюн [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] адрес боллукъду.",
+       "exportall": "Бютеу бетлени экспорт эт",
        "exportcuronly": "Озгъан версияланы алмай, джангыз ахыр версияны ал",
        "exportnohistory": "----\n'''Эсгертиу:''' Бетни тюрлендириуню толу тарихини экспорту, перформанс проблемалары ючюн джукълатылыбды.",
        "export-submit": "Эспорт эт",
        "importlogpage": "Импортну журналы",
        "importlogpagetext": "Башха викиледен бетлени тюрлендириу тарихин администраторланы импорт этиую.",
        "import-logentry-upload": "[[$1]] файл джюклениую бла импорт этилди",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|1=версия|версия}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|версия}}",
        "import-logentry-interwiki": "$1 трансвикиленди",
-       "import-logentry-interwiki-detail": "$2 бетден  $1 {{PLURAL:$1|1=весрия|версия}}",
+       "import-logentry-interwiki-detail": "$2 бетден  $1 {{PLURAL:$1|версия}}",
        "javascripttest": "JavaScript тинтилиую",
        "javascripttest-title": "$1 тинтиле турады",
        "tooltip-pt-userpage": "Къошулуучу бетигиз",
        "lastmodifiedatby": "Бет эм ахыр $3 джанындан $2, $1 заманда тюрлендирилгенди.",
        "othercontribs": "$1 джанындан этилген ишге тамалланады.",
        "others": "башхала",
-       "siteusers": "{{SITENAME}} {{PLURAL:$2|1=къошулуучу|къошулуучула}} $1",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|къошулуучусу|къошулуучулары}} $1",
        "anonusers": "{{SITENAME}} аноним {{PLURAL:$2|къошулуучусу|къошулуучулары}} $1",
        "creditspage": "Бетни кредитлери",
        "nocredits": "Бу къошулуучу ючюн кредит билги джокъду.",
        "pageinfo-category-pages": "Бетлени саны",
        "pageinfo-category-subcats": "Тюбкатегорияланы саны",
        "pageinfo-category-files": "Файлланы саны",
-       "skinname-cologneblue": "Кёльн такъылыкъ",
-       "skinname-monobook": "Моно-китаб",
-       "skinname-modern": "Бусагъатдагъы",
-       "skinname-vector": "Вектор",
        "markaspatrolleddiff": "Контроль этилгенин белгиле",
        "markaspatrolledtext": "Сыналгъан статья кибик белгиле",
        "markedaspatrolled": "Сыналгъан кибик белгиленнгенди",
        "watchlistedit-raw-done": "Кёзюгюзде тургъан тизмегиз сакъланнганды.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 башлыкъ|$1 башлыкъ}} къошулду:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 башлыкъ|$1 башлыкъ}} кетерилди:",
+       "watchlistedit-clear-legend": "Кёздеги тизмени ариула",
        "watchlistedit-clear-titles": "Башлыкъла:",
        "watchlisttools-view": "Тизмеден бетледе тюрлениуле",
        "watchlisttools-edit": "Тизмеге къарау эм тюрлендириу",
index 8a7e9cb..9789d61 100644 (file)
        "qbmyoptions": "Ming Sigge",
        "faq": "FAQ",
        "faqpage": "Project:FAQ",
-       "vector-action-addsection": "Ne neue Afschnet onge draan!",
-       "vector-action-delete": "Fottschmiiße!",
-       "vector-action-move": "Ömnänne!",
-       "vector-action-protect": "Schöze!",
-       "vector-action-undelete": "Zerökholle!",
-       "vector-action-unprotect": "Schoz ändere!",
-       "vector-view-create": "Neu Schriive!",
-       "vector-view-edit": "Ändere!",
-       "vector-view-history": "Versione zeije!",
-       "vector-view-view": "Lesse!",
-       "vector-view-viewsource": "Wikitex aanlooere!",
        "actions": "Akßjuhne",
        "namespaces": "Appachtemangs",
        "variants": "Variante",
        "difference-missing-revision": "{{PLURAL:$2|Ein Version|$2 Versione}} vun heh däm Verjlisch zwesche Versione ($1) {{PLURAL:$2|hammer}} nit jefonge.\n\nEsu jät kütt för jewöhnlesch, wam_mer enem övverhollte Lengk ob der Ongerscheid zwesche de Versione vun en Sigg follesch, di zweschedren fottjeschmeße woode es.\nMieh doh drövver fengk mer em [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Logbooch vum Sigge Fottschmiiße].",
        "searchresults": "Wat beim Söke eruskom",
        "searchresults-title": "Noh „$1“ jesoht.",
-       "toomanymatches": "Dat wore zo vill Treffer, beß esu joot, un donn en annder Ußwahl probeere!",
        "titlematches": "Zopass Üvverschrefte",
        "textmatches": "Sigge met däm Täx",
        "notextmatches": "Kein Sigg met däm Tex",
        "searchmenu-exists": "*Sigg '''[[$1]]'''",
        "searchmenu-new": "<strong>Donn de Sigg „[[:$1|$1]]“ hee em Wiki aanlääje.</strong>\n{{PLURAL:$2|Beloor Der ävver och die Sigg, di beim Söhke jefonge wood.|Beloor Der ävver och die Sigge, di beim Söhke jefonge woode sin.|}}",
        "searchprofile-articles": "Sigge vum Enhalt",
-       "searchprofile-project": "Hülp- ov Projäk-Sigge",
        "searchprofile-images": "Dateie met Medije",
        "searchprofile-everything": "Övverall noh",
        "searchprofile-advanced": "Extra",
        "searchprofile-articles-tooltip": "Söök en de $1",
-       "searchprofile-project-tooltip": "Söök en de $1",
        "searchprofile-images-tooltip": "Söök noh Dateie",
        "searchprofile-everything-tooltip": "Söök övverall dren, och op de Klaafsigge",
        "searchprofile-advanced-tooltip": "Donn en ußjesohte Appachtemangs sööke",
        "search-interwiki-default": "Op $1 woodte heh di Träffer jefonge:",
        "search-interwiki-more": "(mieh)",
        "search-relatedarticle": "Ähnlesch",
-       "searcheverything-enable": "En alle Appachtemangs söhke",
        "searchrelated": "ähnlesch",
        "searchall": "all",
        "showingresults": "Onge {{PLURAL:$1|weed <strong>eine</strong>|wääde bes <strong>$1</strong>|weed <strong>keine</strong>}} vun de jefonge Endrähsch jezeisch, vun de Nommer <strong>$2</strong> av.",
        "allowemail": "E-Mail vun andere Metmaacher zolooße",
        "prefs-searchoptions": "Enschtällonge för et Söhke",
        "prefs-namespaces": "Appachtemangs",
-       "defaultns": "Söns don en hee dä Appachtemengs söhke:",
        "default": "Standaad",
        "prefs-files": "Dateie",
        "prefs-custom-css": "Selfsjemaat <i lang=\"en\">Cascading Style Sheet</i>",
        "recentchanges-label-unpatrolled": "Heh di Änderung es noch nit nohjeloort",
        "recentchanges-label-plusminus": "Der Ömvang vun dä Sigg hät sesch öm di Aanzahl Bytes verändert.",
        "recentchanges-legend-heading": "'''Lejänd:'''",
-       "recentchanges-legend-newpage": "(Loor och noh de [[Special:NewPages|Leß met de neue Sigge]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (Loor och noh de [[Special:NewPages|Leß met de neue Sigge]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Hee {{PLURAL:$1|es ein|sin bes op <strong>$1</strong>|es keine}} fun de Änderunge zick dem <strong>$3</strong> öm <strong>$4</strong> Uhr opjelėß.",
        "rclistfrom": "Zeich de Änderunge vum $3 $2 aan",
        "tooltip-summary": "Jif en koote Zesammefassung en",
        "interlanguage-link-title": "$1 ($2)",
        "common.css": "/* CSS heh aan dä Stell hät Uswirkunge op all Ovverflääsche */",
-       "cologneblue.css": "/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Kölsch Blau“ */",
-       "monobook.css": "/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Monobooch“ */",
-       "modern.css": "/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Modern“ */",
-       "vector.css": "/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Vector“ */",
        "print.css": "/* CSS heh aan dä Stell wirrek nur op et Sigge Drökke */",
        "noscript.css": "/* Dat CSS heh aan dä Stell krijje nur de Metmaacher met affjeschaldt JavaSkrepp jescheck */",
        "group-autoconfirmed.css": "/* Dat CSS heh aan dä Stell krijje nur de automattesch beshtääteshte Metmacher jescheck */",
        "group-sysop.css": "/* Dat CSS heh aan dä Stell krijje nur dem Wiki sing Köbeße jescheck */",
        "group-bureaucrat.css": "/* Dat CSS heh aan dä Stell krijje nur de Bürrokraate jescheck */",
        "common.js": "/* Jedes JavaScrip hee kütt för jede Metmaacher in jede Sigg erinn */",
-       "cologneblue.js": "/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch \"Kölsch Blou\" jescheck */",
-       "monobook.js": "/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch \"Monnobooch\" jescheck */",
-       "modern.js": "/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch \"Modern\" jescheck */",
-       "vector.js": "/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch \"Vector\" jescheck */",
        "group-autoconfirmed.js": "/* De JavaSkreppte fun hee krijje bloß de autemattesch beshtääteschte Metmaacher jescheck */",
        "group-bot.js": "/* De JavaSkreppte fun hee krijje bloß de Bots jescheck */",
        "group-sysop.js": "/* De JavaSkreppte fun hee krijje bloß de Wiki_Köbeße jescheck */",
        "pageinfo-category-pages": "De Aanzahl Sigge",
        "pageinfo-category-subcats": "De Aanzahl Ongerjroppe",
        "pageinfo-category-files": "De Aanzahl Dateie",
-       "skinname-cologneblue": "Kölsch Blau",
-       "skinname-monobook": "MonoBoch",
-       "skinname-modern": "Modern",
-       "skinname-vector": "Vektor",
        "markaspatrolleddiff": "Nohjeluurt. Dun dat fasshallde.",
        "markaspatrolledtext": "De Änderung es nohjeluert, dun dat fasshallde",
        "markedaspatrolled": "Et Kennzeiche „Nohjeluurt“ speichere",
index b9b62ad..689a9ad 100644 (file)
        "createaccount-title": "Çêkirina hesabekî ji {{SITENAME}}",
        "createaccount-text": "Kesek ji te ra account'ekî bikarhêneran \"$2\" li {{SITENAME}} ($4) çêkir. Şîfreya otomatîk ji \"$2\" ra \"$3\" ye.\nNiha ê baş be eger tu xwe qeyd bikê û tu şîfreya xwe biguherînê.\n\nEger account'a bikarhêneran şaşî hate çêkirin, guhdare vê peyamê meke.",
        "loginlanguagelabel": "Ziman: $1",
+       "pt-login": "Têkeve",
+       "pt-login-button": "Têkeve",
+       "pt-createaccount": "Hesabekî çêke",
+       "pt-userlogout": "Derkeve",
        "user-mail-no-addy": "Hewl da e-nameyekê bê navnîşana e-nameyê bişîne",
        "changepassword": "Şîfreyê biguherîne",
        "resetpass_announce": "Te xwe bi şîfreyekê tomar kiriye ku bi riya e-nameyekê ji te re hatiye şandin.\nJi bo xelaskirina tomarkirinê, divê tu niha şîfreyeke nû binivîsî:",
        "searchmenu-exists": "'''Rûpeleke bi navê \"[[:$1]]\" li ser vê wîkiyê heye.'''",
        "searchmenu-new": "Rûpela \"[[:$1]]\" çêke!",
        "searchprofile-articles": "Rûpelên naverokê",
-       "searchprofile-project": "Rûpelên alîkariyê û projeyê",
        "searchprofile-images": "Multîmedya",
        "searchprofile-everything": "Her tişt",
        "searchprofile-advanced": "Pêşketî",
        "searchprofile-articles-tooltip": "Di $1 da lêbigere",
-       "searchprofile-project-tooltip": "Di $1 da lêbigere",
        "searchprofile-images-tooltip": "Li pelan bigere",
        "search-result-size": "$1 ({{PLURAL:$2|peyvek|$2 peyv}})",
        "search-result-score": "Lêhatin: $1%",
        "prefs-emailconfirm-label": "Piştrastkirina E-nameyê:",
        "youremail": "E-nameya te:",
        "username": "{{GENDER:$1|Navê bikarhêner}}:",
-       "uid": "Nasnameya bikarhêner:",
        "prefs-memberingroups": "Endamê/a {{PLURAL:$1|komê|koman}}:",
        "prefs-registration": "Dema xweqeydkirinê:",
        "yourrealname": "Navê te yê rast:",
        "logempty": "Tiştek di vir de nîne.",
        "log-title-wildcard": "Li sernavan bigere, yê bi vê destpêdikin",
        "allpages": "Hemû rûpel",
-       "alphaindexline": "$1 heta $2",
        "nextpage": "Rûpela pêşî ($1)",
        "prevpage": "Rûpelê berî vê ($1)",
        "allpagesfrom": "Rûpela di rêza yekemîn de:",
index c48b946..fc34096 100644 (file)
        "qbmyoptions": "Paginae meae",
        "faq": "Quaestiones frequentes",
        "faqpage": "Project:Quaestiones frequentes",
-       "vector-action-addsection": "Partem novam addere",
-       "vector-action-delete": "Delere",
-       "vector-action-move": "Movere",
-       "vector-action-protect": "Protegere",
-       "vector-action-undelete": "Restituere",
-       "vector-action-unprotect": "Protectionem mutare",
-       "vector-view-create": "Creare",
-       "vector-view-edit": "Recensere",
-       "vector-view-history": "Historiam inspicere",
-       "vector-view-view": "Legere",
-       "vector-view-viewsource": "Fontem inspicere",
        "actions": "Actiones",
        "namespaces": "Spatia nominalia",
        "variants": "Variantes",
        "searchmenu-exists": "'''Iam est pagina \"[[:$1]]\"'''",
        "searchmenu-new": "'''Creare paginam \"[[:$1]]\"'''",
        "searchprofile-articles": "Paginae contentorum",
-       "searchprofile-project": "Paginae adiutati et incepti",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Omnia",
        "searchprofile-advanced": "Callidissime",
        "searchprofile-articles-tooltip": "Quaerere in $1",
-       "searchprofile-project-tooltip": "Quaerere in $1",
        "searchprofile-images-tooltip": "Fasciculos quaerere",
        "searchprofile-everything-tooltip": "Omnia perscrutari (etiam paginae disputationis)",
        "searchprofile-advanced-tooltip": "In spatiis nominalibus accommotis quaerere",
        "search-interwiki-default": "$1 eventus:",
        "search-interwiki-more": "(plus)",
        "search-relatedarticle": "Relata",
-       "searcheverything-enable": "Quaerere in omnibus spatiis nominalibus",
        "searchrelated": "relata",
        "searchall": "omnia",
        "showingresults": "Subter monstrans {{PLURAL:$1|'''1''' eventu|'''$1''' eventibus}} tenus incipiens ab #'''$2'''.",
        "allowemail": "Sinere litteras electronicas inscriptioni electronicae meae mittere",
        "prefs-searchoptions": "Quaerere",
        "prefs-namespaces": "Spatia nominalia",
-       "defaultns": "Aut quaerere per haec spatia nominalia:",
        "default": "praedeterminatum",
        "prefs-files": "Fasciculi",
        "prefs-custom-css": "CSS proprium",
        "prefs-emailconfirm-label": "Adfirmatio inscriptionis electronicae:",
        "youremail": "Inscriptio electronica:",
        "username": "Nomen usoris:",
-       "uid": "ID usoris:",
        "prefs-registration": "Dies creationis rationis:",
        "yourrealname": "Nomen verum:",
        "yourlanguage": "Lingua:",
        "right-edit": "Paginas recensere",
        "right-createpage": "Paginas creare (sine paginis disputationis)",
        "right-createtalk": "Paginas disputationis creare",
-       "right-createaccount": "Rationes usoris novas creare",
+       "right-createaccount": "Rationes usorum novas creare",
        "right-minoredit": "Recensiones minores designare",
        "right-move": "Paginas movere",
        "right-move-subpages": "Paginas una cum subpaginis movere",
        "recentchanges-label-bot": "Hanc recensionem automaton fecit",
        "recentchanges-label-unpatrolled": "Haec recensio nondum est examinata",
        "recentchanges-label-plusminus": "Magnitudo paginae per istam copiam octetorum mutata est",
-       "recentchanges-legend-newpage": "(vide etiam [[Special:NewPages|indicem paginarum novarum]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vide etiam [[Special:NewPages|indicem paginarum novarum]])",
        "rcnotefrom": "Subter sunt '''$1''' nuperrime mutata in proxima '''$2''' die.",
        "rclistfrom": "Monstrare mutata nova incipiens ab $3 $2",
        "rcshowhideminor": "$1 recensiones minores",
        "alllogstext": "Ostentantur omnia acta {{grammar:genitive|{{SITENAME}}}}.\nAdspectum graciliorem potes facere modum indicum, nomen usoris (cave litteras maiusculas minusculasque), vel titulum paginae (cave etiam litteras maiusculas minusculasque) seligendo.",
        "log-title-wildcard": "Quaerere titulos qui incipiunt litteris",
        "allpages": "Paginae omnes",
-       "alphaindexline": "$1 ad $2",
        "nextpage": "Pagina proxima ($1)",
        "prevpage": "Pagina superior ($1)",
        "allpagesfrom": "Monstrare paginas ab:",
        "pageinfo-recent-edits": "Praesens numerus recensionum (intra praeterita $1)",
        "pageinfo-hidden-categories": "{{PLURAL:$1|Categoria celata|Categoriae celatae}} ($1)",
        "pageinfo-toolboxlink": "De hac pagina",
-       "skinname-cologneblue": "Caerulus Colonia",
        "markaspatrolleddiff": "Indicare hanc paginam qua circumita",
        "markaspatrolledtext": "Indicare hanc paginam qua circumita",
        "markedaspatrolled": "Indicare hanc paginam qua circumita",
index 42633ac..dac67fa 100644 (file)
        },
        "tog-underline": "Linken ënnersträichen:",
        "tog-hideminor": "Kleng Ännerungen an de rezenten Ännerunge verstoppen",
-       "tog-hidepatrolled": "Iwwerkuckten Ännerungen an de \"Rezenten Ännerungen\" verstoppen",
-       "tog-newpageshidepatrolled": "Iwwerkuckte Säiten op der Lëscht vun den \"Neie Säite\" verstoppen",
+       "tog-hidepatrolled": "Nogekuckt Ännerungen an de \"Rezenten Ännerungen\" verstoppen",
+       "tog-newpageshidepatrolled": "Nogekuckt Säiten op der Lëscht vun den \"Neie Säite\" verstoppen",
        "tog-extendwatchlist": "Iwwerwaachungslëscht op all Ännerungen ausbreeden, net nëmmen op déi rezentst",
-       "tog-usenewrc": "Rezent Ännerunge an Iwwerwaachungslëscht pro Säit weisen",
+       "tog-usenewrc": "Rezent Ännerungen an Iwwerwaachungslëscht pro Säit weisen",
        "tog-numberheadings": "Iwwerschrëften automatesch numeréieren",
        "tog-showtoolbar": "Ännerungstoolbar weisen",
        "tog-editondblclick": "Säite mat Duebelklick änneren",
        "qbmyoptions": "Meng Säiten",
        "faq": "FAQ",
        "faqpage": "Project:FAQ",
-       "vector-action-addsection": "Sujet derbäisetzen",
-       "vector-action-delete": "Läschen",
-       "vector-action-move": "Réckelen",
-       "vector-action-protect": "Spären",
-       "vector-action-undelete": "Restauréieren",
-       "vector-action-unprotect": "Spär änneren",
-       "vector-view-create": "Uleeën",
-       "vector-view-edit": "Änneren",
-       "vector-view-history": "Versioune weisen",
-       "vector-view-view": "Liesen",
-       "vector-view-viewsource": "Quellcode weisen",
        "actions": "Aktiounen",
        "namespaces": "Nummraim",
        "variants": "Varianten",
        "redirectpagesub": "Viruleedungssäit",
        "lastmodifiedat": "Dës Säit gouf de(n) $1 ëm $2 Auer fir d'lescht geännert.",
        "viewcount": "Dës Säit gouf bis elo {{PLURAL:$1|emol|$1-mol}} ofgefrot.",
-       "protectedpage": "Gespaarte Säit",
+       "protectedpage": "Gespaart Säit",
        "jumpto": "Wiesselen op:",
        "jumptonavigation": "Navigatioun",
        "jumptosearch": "sichen",
        "currentrev": "Aktuell Versioun",
        "currentrev-asof": "Aktuell Versioun vum $1",
        "revisionasof": "Versioun vum $1",
-       "revision-info": "Versioun vum $1 vum $2.",
+       "revision-info": "Versioun vum $1 vum {{GENDER:$6|$2}}$7.",
        "previousrevision": "← Méi al Versioun",
        "nextrevision": "Méi rezent Versioun →",
        "currentrevisionlink": "Aktuell Versioun",
        "difference-missing-revision": "{{PLURAL:$2|Eng Versioun|$2 Versioune}} vun dëser Differenz ($1) {{PLURAL:$2|gouf|goufen}} net fonnt.\n\nDat geschitt normalerweis wann Dir op e vereelste Link vun enger Versioun vun enger Säit klickt déi geläscht ginn ass.\nDetailer fannt Dir am [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Logbuch vum Läschen].",
        "searchresults": "Resultat vum Sichen",
        "searchresults-title": "Resultater vum Sichen no \"$1\"",
-       "toomanymatches": "Zevill Resultater goufe fonnt, versicht w.e.g. eng aner Ufro",
        "titlematches": "Iwwereneestëmmungen am Säitentitel",
        "textmatches": "Iwwereneestëmmungen am Säitentext",
        "notextmatches": "Keng Iwwereneestëmmungen",
        "search-interwiki-default": "Resultater vu(n) $1:",
        "search-interwiki-more": "(méi)",
        "search-relatedarticle": "A Verbindung",
-       "searcheverything-enable": "An allen Nummraim sichen",
        "searchrelated": "a Verbindng",
        "searchall": "all",
        "showingresults": "Hei gesitt der  {{PLURAL:$1| '''1''' Resultat|'''$1''' Resultater}}, ugefaange mat #'''$2'''.",
        "allowemail": "E-Maile vun anere Benotzer kréien.",
        "prefs-searchoptions": "Sichen",
        "prefs-namespaces": "Nummraim",
-       "defaultns": "Soss an dësen Nummraim sichen:",
        "default": "Standard",
        "prefs-files": "Fichieren",
        "prefs-custom-css": "Benotzerdefinéierten CSS",
        "action-move": "dës Säit ze réckelen",
        "action-move-subpages": "dës Säit an déi Ënnersäiten déi dozou gehéieren ze réckelen",
        "action-move-rootuserpages": "Haapt-Benotzersäite réckelen",
+       "action-move-categorypages": "Kategorie-Säite ze réckelen",
        "action-movefile": "Dëse Fichier réckelen",
        "action-upload": "dëse Fichier eropzelueden",
        "action-reupload": "dëse Fichier (deen et scho gëtt) z'iwwerschreiwen",
        "recentchanges-label-unpatrolled": "Dës Ännerung gouf nach net nogekuckt",
        "recentchanges-label-plusminus": "D'Gréisst vun der Säit huet sech ëm déi Zuel vu Bytes geännert",
        "recentchanges-legend-heading": "'''Legend:'''",
-       "recentchanges-legend-newpage": "(kuckt och [[Special:NewPages|Lëscht vun den neie Säiten]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (kuckt och [[Special:NewPages|Lëscht vun den neie Säiten]])",
        "recentchanges-legend-plusminus": "''(±123)''",
        "rcnotefrom": "Ugewise ginn d'Ännerunge vum <strong>$2</strong> un (maximal <strong>$1</strong> Ännerunge gi gewisen).",
        "rclistfrom": "Nei Ännerunge vu(n) $3 $2 u weisen",
        "largefileserver": "Dëse Fichier ass méi grouss wéi déi um Server agestallte Maximalgréisst.",
        "emptyfile": "De Fichier deen Dir eropgelueden hutt, schéngt eidel ze sinn. Dëst kann duerch en Tippfeeler am Numm vum Fichier kommen. Préift w.e.g. no, op Dir dëse Fichier wierklech eropluede wëllt.",
        "windows-nonascii-filename": "Dës Wiki ënnerstëtzt d'Spezialzeechen an de Fichiersnimm net.",
-       "fileexists": "Et gëtt schonn e Fichier mat dësem Numm, kuckt w.e.g.\n<strong>[[:$1]]</strong> wann Dir net sécher sidd, ob Dir den Numm ännere wëllt.\n[[$1|thumb]]",
+       "fileexists": "Et gëtt schonn e Fichier mat dësem Numm, kuckt w.e.g.\n<strong>[[:$1]]</strong> no wann {{GENDER:|Dir}} net sécher sidd, ob Dir en ännere wëllt.\n[[$1|thumb]]",
        "filepageexists": "D'Beschreiwungssäit fir dëse Fichier gouf schonn als <strong>[[:$1]]</strong> ugeluecht, et gëtt awer kee Fichier mat deem Numm.\n\nDe Resumé deen Dir agitt, gëtt net op d'Beschreiwungssäit iwwerholl.\nFir datt Äre Resumé do opdaucht musst Dir e manuell änneren.\n[[$1|thumb]]",
-       "fileexists-extension": "E Fichier mat engem ähnlechen Numm gëtt et schonn: [[$2|thumb]]\n* Numm vum Fichier deen Dir versicht eropzelueden: <strong>[[:$1]]</strong>\n* Numm vum Fichier deen et scho gëtt: <strong>[[:$2]]</strong>\nWielt w.e.g. en aneren Numm.",
+       "fileexists-extension": "E Fichier mat engem ähnlechen Numm gëtt et schonn: [[$2|thumb]]\n* Numm vum Fichier fir eropzelueden: <strong>[[:$1]]</strong>\n* Numm vum Fichier deen et scho gëtt: <strong>[[:$2]]</strong>\nWëllt Dir eventuell méi en expliziten Numm benotzen?",
        "fileexists-thumbnail-yes": "Beim Fichier schéngt et sech ëm e klengt Bild ''(Miniatur)'' ze handelen. [[$1|thumb]]\nKuckt de Fichier <strong>[[:$1]]</strong> w.e.g. no.\nWann et sech ëm d'Bild an der Originalgréisst handelt, da brauch kee separat Bild als Miniatur eropgelueden ze ginn.",
        "file-thumbnail-no": "Den Numm vum Fichier fänkt mat <strong>$1</strong> un.\nDa deit drop hin datt et eng Minitaur ''(thumbnail)'' ass.\nWann Dir dat Bild a méi enger grousser Opléisung hutt, da luet dëst erop, wann net dann ännert w.e.g. den Numm vum Fichier.",
        "fileexists-forbidden": "Et gëtt schonn e Fichier mat dësem Numm an dee kann net iwwerschriwwe ginn.\nWann Dir de Fichier nach ëmmer eropluede wëllt, da gitt w.e.g. zréck a benotzt en neien Numm. [[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Läschen a Restauréiere vu Fichieren temporär ausgeschalt wéinst Maintenance.",
        "filedelete-maintenance-title": "De Fichier kann net geläscht ginn",
        "mimesearch": "No MIME-Zort sichen",
-       "mimesearch-summary": "Op dëser Spezialsäit kënnen d'Fichieren no hirem MIME-Typ gefiltert ginn.\nDir musst ëmmer de Medien- a Subtyp aginn: z. Bsp. <code>image/jpeg</code>.",
+       "mimesearch-summary": "Op dëser Spezialsäit kënnen d'Fichieren no hirem MIME-Typ gefiltert ginn.\nDir musst de Medien- a Subtyp respektiv den Typ vum Inhalt aginn: z. Bsp. <code>image/jpeg</code>.",
        "mimetype": "MIME-Typ:",
        "download": "eroflueden",
        "unwatchedpages": "Net iwwerwaacht Säiten",
        "wantedtemplates": "Gewënscht Schablounen",
        "mostlinked": "Dacks verlinkt Säiten",
        "mostlinkedcategories": "Dacks benotzt Kategorien",
-       "mostlinkedtemplates": "Dacks benotzt Schablounen",
+       "mostlinkedtemplates": "Säiten déi am dacksten agebonn sinn",
        "mostcategories": "Säite mat de meeschte Kategorien",
        "mostimages": "Dacks benotzt Biller",
        "mostinterwikis": "Säite mat de meeschten Interwikilinken",
        "cant-move-user-page": "Dir hutt net déi néideg Rechter fir Benotzerhaaptsäiten ze réckelen.",
        "cant-move-to-user-page": "Dir hutt net d'Recht fir eng Säit op eng Benotzersäit (ausser op eng Ënnersäit vun enger Benotzersäit) ze réckelen.",
        "cant-move-category-page": "Dir hutt net déi néideg Rechter fir Kategorie-Säiten ze réckelen.",
+       "cant-move-to-category-page": "Dir hutt net déi néideg Rechter fir eng Säit op eng Kategoriesäit ze réckelen.",
        "newtitle": "Op den neien Titel:",
        "move-watch": "Dës Säit iwwerwaachen",
        "movepagebtn": "Säit réckelen",
        "tooltip-preferences-save": "Astellunge späicheren",
        "tooltip-summary": "Gitt e kuerze Resumé an",
        "interlanguage-link-title": "$1 - $2",
+       "interlanguage-link-title-nonlang": "$1 - $2",
        "common.css": "/* Dës CSS huet nëmmen Afloss op de Skin ''Chick''  */",
-       "monobook.css": "/* Dës CSS huet nëmmen Afloss op de Skin ''Monobook''  */",
        "common.js": "/* All JavaScript hei gëtt fir all Benotzer beim Luede vun all Säit gelueden. */",
        "anonymous": "{{PLURAL:$1|Anonyme Benotzer|Anonym Benotzer}} op {{SITENAME}}",
        "siteuser": "{{SITENAME}}-Benotzer $1",
        "pageinfo-category-pages": "Zuel vun de Säiten",
        "pageinfo-category-subcats": "Zuel vun den Ënnerkategorien",
        "pageinfo-category-files": "Zuel vun de Fichieren",
-       "skinname-monobook": "MonoBook",
        "markaspatrolleddiff": "Als nogekuckt markéieren",
        "markaspatrolledtext": "Dës Säit als nogekuckt markéieren",
        "markedaspatrolled": "ass als nogekuckt markéiert",
        "newimages-summary": "Dës Spezialsäit weist eng Lëscht mat de Fichieren déi als lescht eropgeluede goufen.",
        "newimages-legend": "Filter",
        "newimages-label": "Numm vum Fichier (oder en Deel dovun):",
+       "newimages-showbots": "Vu Botten eropgeluede Fichiere weisen",
        "noimages": "Keng Biller fonnt.",
        "ilsubmit": "Sichen",
        "bydate": "no Datum",
        "version-hook-name": "Numm vun der Klamer",
        "version-hook-subscribedby": "Opruff vum",
        "version-version": "(Versioun $1)",
+       "version-no-ext-name": "[keen Numm]",
        "version-license": "MediaWiki-Lizenz",
        "version-ext-license": "Lizenz",
        "version-ext-colheader-name": "Erweiderung",
index 365b76f..a301c5a 100644 (file)
        "searchmenu-exists": "'''И вики-проектда \"[[:$1]]\" тlвар алай ччин ава.'''",
        "searchmenu-new": "'''И вики-проектда «[[:$1]]» ччин туькӀуьрун!'''",
        "searchprofile-articles": "Асул ччинар",
-       "searchprofile-project": "Куьмек гунин ва проектдин ччинар",
        "searchprofile-images": "Мультимедиа",
        "searchprofile-everything": "Вири",
        "searchprofile-advanced": "Гегьеншдиз",
        "searchprofile-articles-tooltip": "$1-да къекъуьгъ",
-       "searchprofile-project-tooltip": "$1-да къекъуьгъ",
        "searchprofile-images-tooltip": "Файлар жугъура",
        "searchprofile-everything-tooltip": "Вири ччинра къекъуьгъ (веревирдрин ччинар кваз)",
        "searchprofile-advanced-tooltip": "Ганвай тlварарин генгвилера къекъуьгъ",
        "group-bureaucrat-member": "{{GENDER:$1|бюрократ}}",
        "grouppage-user": "{{ns:project}}:Иштиракчияр",
        "grouppage-bot": "{{ns:project}}:Бот",
-       "grouppage-sysop": "{{ns:project}}:Ð\9aÑ\8aавÑ\85аÑ\8fр",
+       "grouppage-sysop": "{{ns:project}}:Ð\90дминиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80ар",
        "right-read": "Ччинар кIелун",
        "right-edit": "Дегишар хъувун",
        "right-move": "Ччинрин тIварар эхцигун",
index c6244cd..cf83330 100644 (file)
@@ -67,7 +67,7 @@
        "editfont-sansserif": "Font sans-serif",
        "editfont-serif": "Font serif",
        "sunday": "Dumeniga",
-       "monday": "Lündesdí",
+       "monday": "Lünesdí",
        "tuesday": "Martedì",
        "wednesday": "Merculdí",
        "thursday": "Giuedí",
        "qbmyoptions": "I mè paginn",
        "faq": "FAQ",
        "faqpage": "Project:Dumand frequent",
-       "vector-action-addsection": "Giunta argument",
-       "vector-action-delete": "Scancela",
-       "vector-action-move": "Sposta",
-       "vector-action-protect": "Prutegg",
-       "vector-action-undelete": "Recüpera",
-       "vector-action-unprotect": "Càmbia la protesiù",
-       "vector-view-create": "Crea",
-       "vector-view-edit": "Mudifega",
-       "vector-view-history": "Varda la storia",
-       "vector-view-view": "Legg",
-       "vector-view-viewsource": "Varda el codes",
        "actions": "Azión",
        "namespaces": "Namespace",
        "variants": "Variant",
        "postcomment": "Sezión növa",
        "articlepage": "Varda l'articul",
        "talk": "Discüssión",
-       "views": "Visid",
+       "views": "Vìste",
        "toolbox": "Arnés",
        "userpage": "Vidè la pàgina del dovrat",
        "projectpage": "Varda la pagina de servizzi",
        "viewsourcelink": "fà vidè el codes surgent",
        "editsectionhint": "Mudifega la sezión $1",
        "toc": "Cuntegnüü",
-       "showtoc": "fà vidè",
+       "showtoc": "fà ved",
        "hidetoc": "scund",
        "collapsible-collapse": "sara sü",
-       "collapsible-expand": "slarga",
+       "collapsible-expand": "dèrf fò",
        "thisisdeleted": "Varda o rimet a post $1?",
-       "viewdeleted": "Te vöret vidè $1?",
+       "viewdeleted": "Vöret vidè $1?",
        "restorelink": "{{PLURAL:$1|1 mudifega scancelada|$1 mudifegh scancelaa}}",
        "feedlinks": "Feed:",
        "feed-invalid": "Mudalità de sotascrizión del feed minga valida",
        "nospecialpagetext": "<strong>T'hee ciamaa una pagina speciala minga valida.</strong>\n\nUna lista di paginn special la se pö truà in de la [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Erur",
        "databaseerror": "Erur in del database",
+       "databaseerror-text": "Gh'è stat 'n erùr endèna query söl database.\nPöl das che ghe sàpe en erùr de programasiù endèl software.",
+       "databaseerror-textcl": "Gh'è stat 'n erùr endèna query söl database",
        "databaseerror-query": "Ricérca: $1",
        "databaseerror-function": "Funsiù: $1",
        "databaseerror-error": "Erur: $1",
+       "laggedslavemode": "<strong>Ocio:</strong> Pöl das che la pàgina la g'hape gnemò dét i agiurnamèncc piö nöf.",
        "readonly": "Database blucaa",
+       "enterlockreason": "Indicà el mutìf del bloch e specificà el momènt che se pènsa de tiràl vià",
+       "readonlytext": "Adès come adès el database l'è blocàt e se pöl mìa fà mudìfiche a le pàgine gne creàn de nöe. El bloch de sòlet el depènt de operasiù de maütensiù del database. Se pödarà turnà a doprà 'l database quan che le operasiù de manütensiù le sarà finìde.\n\nL'aministradur del sistéma che g'ha blocàt el database el g'ha dat chèsta spiegasiù: $1",
        "missing-article": "El database l'ha minga truaa el test d'una pagina che l'avaria duvüü truà, ciamaa \"$1\" $2.\n\nQuest chì a l'è de solet causaa perchè al s'è riciamaa un paragón intra revisión vegg de la pagina o un ligam a una versión vegia d'una pagina che l'è stada scancelada\n\nSe l'è minga inscì, te pudariet vegh truà un bug in del software.\n\nPer piasè, fa raport a 'n'[[Special:ListUsers/sysop|aministradur]], cun la nota de l'URL.",
        "missingarticle-rev": "(revision#: $1)",
        "missingarticle-diff": "(Diff: $1, $2)",
+       "readonly_lag": "El database l'è stat blocàt en automàtich per lasà che i server i se sincrunìze col master.",
        "internalerror": "Erur in del sistema",
        "internalerror_info": "Erur intern: $1",
        "filecopyerror": "L'è mía staa pussibel cubià l'archivi \"$1\" in \"$2\"",
        "directorycreateerror": "L'è mía staa pussibel creà la cartèla \"$1\"",
        "filenotfound": "L'è mía staa pussibel trövà l'archivi \"$1\"",
        "unexpected": "Valur inaspetaa: \"$1\"=\"$2\"",
+       "formerror": "Erur: el sistéma 'l rìa mìa a mandà vià 'l mòdulo",
+       "badarticleerror": "Operasiù mìa pirmitìda per chèsta pàgina.",
        "cannotdelete": "La pagina o l'archivi \"$1\" i g'ha mìa püdìt véser scancelàcc.\nPöl das che i sàpe zà stacc scancelàcc de vergü óter.",
        "cannotdelete-title": "L'è mìa stat pusìbol scancelà la pàgina \"$1\"",
        "delete-hook-aborted": "El scancelamènt l'è stat anulàt de l'hook.\nGh'è stat dat nesöna spiegasiù.",
        "mypreferencesprotected": "Te g'hét mìa i permès nesesàre per mudificà le tò preferènse",
        "ns-specialprotected": "I paginn special i pören mía vess mudifegaa",
        "exception-nologin": "Te seet minga dent in del sistema",
+       "exception-nologin-text": "Te g'harèset de [[Special:Userlogin|autenticàt]] (cioè fà 'l log-in) per püdì doprà chèsta pàgina o asiù.",
        "virus-scanfailed": "scansiù falìda (còdes $1)",
        "logouttext": "'''Ades te sét scolegàt.'''\n\nOcio che 'na quach pàgina la te pödarès vègner fò compàgn che se te g'hèset mìa fat el log-out enfìna a che te snètet mìa fò la cache del tò browser.",
        "welcomeuser": "Benvegnüü\\Benriàt, $1",
        "login-userblocked": "Chèsta ütènsa l'è blocàda. La conesiù l'è mìa cunsentìda.",
        "wrongpassword": "La ciav che t'hee metüü denter l'è nò giüsta. Pröva turna per piasè.",
        "wrongpasswordempty": "T'hee no metüü denter la parola ciav. Pröva turna per piasè.",
+       "passwordtooshort": "Le password le g'ha de ìga alméno {{PLURAL:$1|1 caràter|$1 caràter}}.",
        "password-name-match": "La tò password la g'ha de éser diferènta del tò nòm de ütènt",
+       "password-login-forbidden": "L'üzo de chesto nom ütent e de chèsta password l'è stat pruibìt.",
        "mailmypassword": "Tùrna a defenéser la password",
        "passwordremindertext": "Un quajdün (prubabilment ti, cun l'indiriz IP $1) l'ha ciamaa da mandagh 'na ciav növa per andà denter int 'l sistema de {{SITENAME}} ($4).\nLa ciav per 'l druvadur \"$2\" adess l'è \"$3\".\nSariss mej andà denter int 'l sit almanch una völta prima de cambià la ciav.\nLa to ciav tempuranea la scaderà da chì a {{PLURAL:$5|un dì|$5 dì}}.\n\nSe te nò staa ti a ciamà 'sta ciav chì, o magara t'hee truaa la ciav vegia e te vör pü cambiala, te pör ignurà 'stu messagg chì e 'ndà inanz a druà la ciav vegia.",
        "noemail": "Gh'è registràt nisü indirìs e-mail per l'ütènt \"$1\".",
        "pt-login-button": "Va dent",
        "pt-createaccount": "Creá un cünt",
        "pt-userlogout": "Va fö (logout)",
-       "changepassword": "Mudifega la paròla d'urdin",
+       "user-mail-no-addy": "Te g'hét sercàt de mandà vià 'na e-mail sènsa specificà l'indirìs",
+       "user-mail-no-body": "Te g'hét sercàt de mandà vià 'na e-mail conden tèst vöt o tròp cürt.",
+       "changepassword": "Càmbia la password",
        "resetpass_announce": "Per completà la conesiù, te g'hét de definì 'na password nöa.",
        "resetpass_header": "Càmbia la password de l'ütènsa",
        "oldpassword": "Password vècia:",
        "retypenew": "Tùrna a mèter dét la password nöa:",
        "resetpass_submit": "Defenés la password e regìstret (fà 'l log-in)",
        "changepassword-success": "La tò password l'è stàda cambiàda sènsa erùr!",
-       "changepassword-throttled": "Te g'hét fat tròp tacc tentatìf de cunitìt en poch tép, adès te g'hét de spetà $1 per püdì turnà a pröà.",
+       "changepassword-throttled": "Te g'hét fat tròp tacc tentatìf de autenticàt en poch tép, adès te g'hét de spetà $1 per püdì turnà a pröà.",
        "resetpass_forbidden": "Te pödet mìa cambià le password",
        "resetpass-no-info": "Te g'hét de éser cunitìt per acéder diretamènt a la pàgina",
        "resetpass-submit-loggedin": "Càmbia la password",
        "resetpass-submit-cancel": "Scancèla l'operasiù",
+       "resetpass-wrong-oldpass": "Password temporànea o atöàla mìa bùna.\nLa password la pödarès véser stàda zamò cambiàda, o sedenò te pödarèset vìga zamò fat domànda de 'na password temporànea nöa.",
+       "resetpass-recycled": "Te g'harèset de turnà a defenéser la tò password con vergót de diferènt de la password che te g'hét adès.",
+       "resetpass-temp-emailed": "L'autenticasiù l'è stàda fàda conden còdes temporàneo, mandàt per e-mail. Per completà la registrasiù, bizògna che te defenéset 'na password nöa ché:",
+       "resetpass-temp-password": "Password temporànea:",
+       "resetpass-abort-generic": "La mudìfica de la password l'è stàda blocàda de 'n estensiù.",
+       "resetpass-expired": "La tò password l'è scadìda. Te g'harèset de defenéser 'na password nöa semài che te öt autenticàt.",
+       "resetpass-validity-soft": "La tò password l'è mìa bùna: $1\n\nTe g'harèset de catà fò 'n ótra password o clicà sö \"{{int:resetpass-submit-cancel}}\" per turnà a definìla piö tàrde.",
        "passwordreset": "Tùrna a defenéser la password",
+       "passwordreset-text-one": "Empenés chèsto mòdulo per turnà a defenéser la tò password.",
        "passwordreset-legend": "Tùrna a defenéser la password",
        "passwordreset-disabled": "La ridefinisiù de la password l'è mìa atìva sö chèsta wiki",
        "passwordreset-emaildisabled": "Le funsiù de pòsta eletrònica i è stàde disativàde sö chèsta wiki.",
        "passwordreset-username": "Nòm de ütènt",
        "passwordreset-domain": "Domini:",
        "passwordreset-email": "Indirìs e-mail:",
+       "passwordreset-emailtitle": "Detài de l'ütènsa sö {{SITENAME}}",
+       "passwordreset-emailelement": "Nòm ütènt: $1\nPassword temporànea: $2",
+       "passwordreset-emailsent": "Gh'è stat mandàt vià 'na e-mail de redefinisiù de la password.",
+       "passwordreset-emailsent-capture": "Gh'è stat mandàt vià chèsta e-mail de redefinisiù de la password:",
+       "changeemail": "Càmbia l'indirìs e-mail",
+       "changeemail-header": "Càmbia l'indirìs e-mail de l'ütènsa",
        "changeemail-none": "(nisü)",
        "changeemail-password": "La password sö {{SITENAME}}:",
        "changeemail-submit": "Càmbia l'indirìs e-mail",
        "changeemail-cancel": "Scancèla l'operasiù",
+       "changeemail-throttled": "Te g'hét fat tròp tacc tentatìf de autenticàt, adès te g'hét de spetà $1 per püdì turnà a pröà.",
        "resettokens": "Redefenés i tokens",
+       "resettokens-no-tokens": "Gh'è nisü token de redefenéser.",
        "resettokens-legend": "Redefenés i tokens",
        "resettokens-tokens": "Token:",
        "resettokens-token-label": "$1 (valùr de adès: $2)",
        "showpreview": "Famm vedè prima",
        "showdiff": "Famm vedè i cambiament",
        "anoneditwarning": "Tì te set minga entraa. In de la crunulugia de la pagina se vedarà el tò IP.",
+       "anonpreviewwarning": "''Te g'hét mìa fat el log-in. Semài che te sàlvet la pàgina, el tò indirìs IP el vegnarà registràt endèla crunulugìa.''",
        "missingcommenttext": "Mèt dét en comènt ché sota",
        "summary-preview": "Pröva de l'uget:",
        "blockedtitle": "Ütènsa blocàda",
        "explainconflict": "'N óter ütènt el g'ha salvàt 'na versiù nöa de l'articol entàt che te sìet dré a fà le tò mudìfiche.\nL'area de mudìfica de sura la g'ha dét el test de la pàgina che gh'è on-line adès, isé come che l'è stat agiurnàt de l'óter ütènt.\nLa versiù co le tò mudìfiche envéce te la tróet endèl'area de mudìfica de sòta.\nSemài che te ölarèset confermàle, te g'hét de riportà le tò mudìfiche endèl tèst de l'area de sura.\nA schisà el butù '{{int:savearticle}}', se salvarà '''apéna''' el test che gh'è dét endèl'àrea de mudìfica de sura.",
        "yourtext": "El tò test",
        "storedversion": "La versiù en memória",
+       "editingold": "<strong>Ocio: Te sét dré a mudificà 'na versiù mìa agiurnàda de chèsta pàgina.</strong> Semài che te la sàlvet, töcc i cambiamèncc facc dòpo de chèsta versiù le narà pèrde.",
        "yourdiff": "Diferenz",
        "copyrightwarning": "Ten per piasè present che tüt i cuntribüzión a {{SITENAME}} se cunsideren daa sota una licenza $2 (varda $1 per savèn püssee).\nSe te vöret minga che i tò test i poden vess mudifegaa e redistribüii d'una persona qualsessia senza nissüna limitazión, mandei minga a {{SITENAME}}<br />\nCunt el test che te mandet tì te deciaret anca che, sota la tò respunsabilità, che el test te l'hee scrivüü depertì 'me uriginal, o pür che l'è una cobia d'una funt de dumini pübligh o un'altra funt libera in manera cumpagna.<br />\n'''MANDA MINGA DEL MATERIAL CHE L'E' CUERT D'UN DIRIT D'AUTUR SENZA UTURIZAZIUN'''",
        "protectedpagewarning": "'''Ocio: quela pagina chì l'è stada blucaa in manéra che dumá i dupradur cunt i privilegg de sysop i pören mudificàla.''' L'öltem element del register l'è riportàt ché sota per dà 'n riferimènt:",
        "currentrev": "Versiù de adès",
        "currentrev-asof": "Versión curenta di $1",
        "revisionasof": "Revisión $1",
-       "revision-info": "Versiù del $4 a le $5 de $2",
+       "revision-info": "Versiù del $4 a le $5 de {{GENDER:$6|$2}}$7",
        "previousrevision": "←Versión püssee vegia",
        "nextrevision": "Revisión püssee növ →",
        "currentrevisionlink": "Varda la revisión curenta",
        "revdelete-radio-same": "(càmbia mìa)",
        "revdelete-radio-set": "Scond",
        "revdelete-radio-unset": "Fà vèt",
+       "revdelete-unsuppress": "Tira vià le restrisiù sö le versiù ripristinàde",
        "revdelete-log": "Mutìf:",
+       "revdelete-submit": "Aplica {{PLURAL:$1|a la versiù selesiunàda|a le versiù selesiunàde}}",
        "revdel-restore": "Cambia la visibilità",
        "pagehist": "Crunulugia de la pagina",
        "deletedhist": "Crunulugìa scancelàda",
        "mergehistory-reason": "Mutìf:",
        "pagemerge-logentry": "el g'ha ünìt [[$1]] a [[$2]] (reviziù 'nfìna al $3)",
        "revertmerge": "Scancela i ünión",
-       "history-title": "Cronolugia di mudifegh de \"$1\"",
+       "history-title": "Crunulugia di mudifegh de \"$1\"",
+       "difference-title-multipage": "Diferènsa 'ntra le pàgine \"$1\" e \"$2\"",
+       "difference-multipage": "(Diferènsa 'ntra le pàgine)",
        "lineno": "Riga $1:",
        "compareselectedversions": "Compara i versión seleziunaa",
        "editundo": "turna a 'me che l'era",
+       "diff-empty": "(Nesöna diferènsa)",
        "searchresults": "Risültaa de la recerca.",
        "searchresults-title": "Resültaa de la ricerca de \"$1\"",
-       "toomanymatches": "Gh'è tropi curispundens. Mudifichè la richiesta.",
+       "titlematches": "Corespondènse endel tìtol de le pàgine",
        "textmatches": "Truvaa int 'l test di paginn",
        "notextmatches": "La vus che t'hee ciamaa la gh'ha minga una curispundenza in del test di paginn.",
        "prevn": "precedent {{PLURAL:$1|$1}}",
        "nextn": "pròssim {{PLURAL:$1|$1}}",
        "prevn-title": "{{PLURAL:$1|Rezültàt precedènt|$1 rezültàcc precedèncc}}",
        "nextn-title": "Next $1 {{PLURAL:$1|result|results}}",
-       "viewprevnext": "Vidé ($1 {{int:pipe-separator}} $2) ($3).",
+       "shown-title": "Fà ved {{PLURAL:$1|on resultaa|$1 resultaa}} per pàgina",
+       "viewprevnext": "Ved ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-new": "'''Trà in pee la pagina \"[[:$1]]\" ins quel sit chì!'''",
        "searchprofile-articles": "Paginn de cuntegnüü",
        "searchprofile-images": "Multimedia",
        "search-result-score": "Atinènsa: $1%",
        "search-redirect": "(redirezión $1)",
        "search-section": "(sessión $1)",
+       "search-file-match": "(corespondènsa endèl test de l'archivi)",
        "search-suggest": "Vurivet dì: $1",
        "search-interwiki-caption": "Pruget fredej",
        "search-interwiki-default": "Rezültàcc de $1:",
        "search-interwiki-more": "(püssee)",
        "search-relatedarticle": "Rezültàcc corelàcc",
-       "searcheverything-enable": "Sérca en töcc i namespaces",
        "searchrelated": "Corelàcc",
        "searchall": "tücc",
        "powersearch-legend": "Recerca avanzada",
        "preferences": "Preferenz",
        "mypreferences": "Preferenz",
        "prefs-edits": "Quantità de mudifegh faa:",
+       "prefsnologintext2": "Te g'harèset de $1 per defenéser le preferènse de l'ütènt.",
        "prefs-skin": "Aspett de l'interfacia",
        "skin-preview": "Anteprìma",
        "datedefault": "Nesöna preferènsa",
        "prefs-watchlist-days": "Nümer de dì da mustrà ind i paginn da tegn d'ögg:",
        "prefs-watchlist-days-max": "Màsimo $1 {{PLURAL:$1|dé|dé}}",
        "prefs-watchlist-edits": "Nümer de mudifegh da mustrà cunt i fünzión avanzaa:",
+       "prefs-watchlist-edits-max": "Nömer màsim: 1000",
        "prefs-misc": "Ólter",
        "prefs-resetpass": "Càmbia la password",
        "prefs-changeemail": "Càmbia l'indirìs e-mail",
        "columns": "Culònn:",
        "searchresultshead": "Cerca",
        "stub-threshold-disabled": "Dezativàt",
+       "recentchangesdays": "Dé de fà éder endèi öltem cambiamèncc:",
+       "recentchangesdays-max": "Màsimo $1 {{PLURAL:$1|dé|dé}}",
        "recentchangescount": "Nümer de mudifegh da mustrà per ''default'':",
        "savedprefs": "I preferenz hinn stai salvaa.",
        "timezonelegend": "Füs oràre:",
        "allowemail": "Permètt ai altar üteent də cuntatamm par email",
        "prefs-searchoptions": "Ricerca",
        "prefs-namespaces": "Namespaces",
-       "defaultns": "Sedenò, serca en chèsti namespaces:",
        "default": "predefinit",
        "prefs-files": "Archivi",
        "prefs-custom-css": "CSS personalizàt",
        "prefs-help-variant": "La variant o grafia co la qual te preferéset véder le pàgine de la wiki.",
        "yournick": "Suranomm:",
        "prefs-help-signature": "I cument ind i paginn de discüssion i gh'han de vess firmaa cun \"<nowiki>~~~~</nowiki>\" che 'l sarà pö cunvertì int la tua firma cun tacada la data e l'ura.",
-       "yourgender": "Géner:",
+       "yourgender": "Gh'è de rivulgìs a té come màs·cc o fèmina?",
        "gender-unknown": "Preferissi specifegaa nò",
-       "gender-male": "Mas'c",
-       "gender-female": "Femena",
-       "prefs-help-gender": "Upziunal: druvaa per adatà i messagg del software a segónda del gener del druvadur. Questa infurmazion chì la sarà püblica.",
+       "gender-male": "L'è registrat sö {{SITENAME}}",
+       "gender-female": "L'è registràda sö {{SITENAME}}",
+       "prefs-help-gender": "La definisiù de chèsta preferènsa l'è m,ìa ubligatória.\nEl software el dòpra chèsto valur per rivulgìs a té o lüminàt ai óter col tò zèner gramaticàl giöst (al maschìl o al feminìl).\nChèsta 'nformasiù però la sarà püblica.",
        "email": "Indirizz de pòsta elettrònica.",
-       "prefs-help-email": "L'e-mail a l'è mia obligatòri, però al permet da mandàv una ciav noeva in cas che ve la desmenteghé. A podé apó scernì da lassà entrà i alter dovrat in contat con violter senza da busogn da svelà la vosta identità.",
+       "prefs-help-email": "L'indirìs e-mail l'è mìa ubligatóre, ma 'l serf per mandàt la tò password semài che te g'hèset de desmentegàtela.",
        "prefs-help-email-required": "L'indirìs e-mail l'è ubligatóre",
        "prefs-info": "Infurmazion de bas",
        "prefs-i18n": "Internaziunalizazión",
        "userrights-lookup-user": "Gestion di grüp di druvaduu",
        "userrights-user-editname": "Butée dent un nom da dovrat",
        "editusergroup": "Mudifega i grüp del druvadur",
-       "editinguser": "Mudifega di dirit del druvadur '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+       "editinguser": "Mudìfica i dirìcc de ütènt de l'ütènsa '''[[User:$1|$1]]''' $2",
        "userrights-editusergroup": "Mudifega i grüp del druvadur",
        "saveusergroups": "Salva i grüp di druvadur",
        "userrights-groupsmember": "El fà part di grüp:",
        "userrights-no-interwiki": "Te gh'hee mía i permiss necessari per pudè mudifegà i dirit di druvadur di olter wiki.",
        "userrights-nodatabase": "La base dat $1 a gh'é mia, o pura a l'é mia locala.",
        "userrights-nologin": "Al gh'a da [[Special:UserLogin|rintrà ent el sistema]] con un cunt d'administrator par podé dà di drecc ai dovracc.",
-       "userrights-notallowed": "A l'ha mia li permission par podé dà di drecc ai dovracc.",
+       "userrights-notallowed": "Te g'hét mìa l'autorizasiù per mudificà i permès de ütènt.",
        "userrights-changeable-col": "Grüp che te pö mudifegà",
        "userrights-unchangeable-col": "Grüp che te pö mia mudifegà",
        "group-user": "Druvadur",
        "grouppage-bot": "{{ns:project}}:Bots",
        "grouppage-sysop": "{{ns:project}}:Aministradur",
        "right-edit": "Edita pàgini",
-       "right-createaccount": "Crea cünt de dovratt bej-e növ",
+       "right-createtalk": "Creà pàgine de discusiù",
+       "right-createaccount": "Creà ütènse nöe",
+       "right-minoredit": "Segnà le mudìfiche come picinìne",
+       "right-move": "Spostà le pàgine",
+       "right-move-subpages": "Spostà le pàgine e le sotapàgine",
+       "right-move-rootuserpages": "Spostà le pàgine principài dei ütèncc",
+       "right-move-categorypages": "Spostà le categurìe",
+       "right-movefile": "Spostà i archivi",
+       "right-suppressredirect": "Mìa creà 'n ''redirect'' automàtich quan che se spòsta 'na pàgina",
+       "right-upload": "Cargà sö 'n archivi",
+       "right-reupload": "Surascrìer i archìvi che ezìste zamò",
+       "right-reupload-own": "Surascrìer en ardchivi che ezìste zamò cargàt sö del stès ütènt",
        "right-delete": "Scancelà pàgine",
+       "right-browsearchive": "Sercà pàgine scancelàde",
+       "right-undelete": "Ripristinà pàgine scancelàde",
+       "right-suppressrevision": "Eder e ripristinà versiù scundìde ai aministradùr",
+       "right-suppressionlog": "Eder regìster privàcc",
+       "right-block": "Blocà le mudìfiche de ótre ütènse",
+       "right-blockemail": "Fà in manera che quel ütent chì 'l poda mia spedì di messagg e-mail",
+       "right-hideuser": "Blocà en nòm de ütènt e scundìl al püblich",
+       "right-unblockself": "Desblocà sè stès",
        "right-siteadmin": "Blocà e desblocà el database",
        "newuserlogpage": "Register di ütent növ",
        "rightslog": "Dirit di druvat",
        "action-history": "ardà la crunulugìa de chèsta pàgina",
        "action-minoredit": "segnà chèsta mudìfica come picinìna",
        "action-move": "spostà chèsta pàgina",
+       "action-move-rootuserpages": "spostà le pàgine principài dei ütèncc",
        "action-move-categorypages": "spostà le categurìe",
-       "action-movefile": "Spòsta chèsto archivi",
-       "action-upload": "Càrga sö chèsto archivi",
+       "action-movefile": "spòsta chèsto archivi",
+       "action-upload": "càrga sö chèsto archivi",
        "action-reupload": "surascrìf chèsto archivi (che l'ezìste zà)",
        "action-upload_by_url": "cargà chèsto archivi de 'n indirìs URL",
        "action-writeapi": "doprà le API en scritüra",
        "action-undelete": "ripristinà chèsta pàgina",
        "action-suppressrevision": "riéder e ripristinà le mudìfiche scundìde",
        "action-suppressionlog": "éder chèsto regìster privàt",
+       "action-block": "blocà le mudìfiche de chèsto ütènt",
        "action-protect": "cambià i leèi de protesiù de chèsta pàgina",
        "action-import": "emportà pàgine de le ótre wiki",
        "action-importupload": "emportà pàgine col upload de archivi",
        "recentchanges-label-minor": "Quela chì l'è una mudifega piscinina.",
        "recentchanges-label-bot": "Quela mudifega chì l'ha fada un bot",
        "recentchanges-label-unpatrolled": "Quela mudifega chì a l'è stada mimga anmò verificada.",
-       "recentchanges-legend-newpage": "(arda apò [[Special:NewPages|la lìsta de le pàgine nöe]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (arda apò [[Special:NewPages|la lìsta de le pàgine nöe]])",
        "rcnotefrom": "Chì de sota gh'è la lista di mudifegh de <b>$2</b> (fina a <b>$1</b>).",
        "rclistfrom": "Fà vidè i cambiament növ a partì de $3 $2",
        "rcshowhideminor": "$1 i mudifegh piscinín",
        "rcshowhidebots": "$1 i bot",
        "rcshowhidebots-show": "Fà ved",
        "rcshowhidebots-hide": "Scond",
-       "rcshowhideliu": "$1 i dupradur cunetüü",
+       "rcshowhideliu": "$1 ütèncc registràcc",
        "rcshowhideliu-show": "Fà ved",
        "rcshowhideliu-hide": "Scond",
        "rcshowhideanons": "$1 i dupradur anònim",
        "rcshowhideanons-show": "Fà ved",
        "rcshowhideanons-hide": "Scond",
+       "rcshowhidepatr": "$1 mudìfiche verificàde",
        "rcshowhidepatr-show": "Fà ved",
        "rcshowhidepatr-hide": "Scond",
        "rcshowhidemine": "$1 i mè mudifich",
        "diff": "dif",
        "hist": "stòria",
        "hide": "Scund",
-       "show": "Famm vedè",
+       "show": "Fà ved",
        "minoreditletter": "m",
        "newpageletter": "N",
        "boteditletter": "b",
+       "number_of_watching_users_pageview": "[tignìda d'öcc de {{PLURAL:$1|1 ütènt|$1 ütèncc}}]",
        "rc_categories_any": "Töcc",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} dopo la mudìfica",
        "newsectionsummary": "/* $1 */ sezión növa",
-       "rc-enhanced-expand": "Fà ved i detali",
+       "rc-enhanced-expand": "Fà ved i detai",
        "rc-enhanced-hide": "Scund i detali",
        "rc-old-title": "creàda en urìgin come \"$1\"",
        "recentchangeslinked": "Cambiament culegaa",
        "filename": "Nom de l'archivi",
        "filedesc": "Sumari",
        "fileuploadsummary": "Sumari:",
+       "filesource": "Fónt:",
        "ignorewarnings": "Ignora tücc i avertimeent",
        "largefileserver": "Chel archivi-chí al è püssee graant che ul serviduur al sía cunfigüraa da permett.",
        "savefile": "Salva l'archivi",
        "filehist-thumb": "Miniadüra",
        "filehist-thumbtext": "Miniadüra de la versión di $1",
        "filehist-nothumb": "Nesöna miniadüra",
-       "filehist-user": "Dovrat",
-       "filehist-dimensions": "Dimensión",
+       "filehist-user": "Ütent",
+       "filehist-dimensions": "Dimensiù",
        "filehist-filesize": "Dimensiù de l'archivi",
        "filehist-comment": "Comènt",
        "imagelinks": "Üzo de l'archivi",
        "protectedpages": "Pàgine prutigìde",
        "protectedpages-indef": "Apéna protesiù infinìte",
        "protectedpages-noredirect": "Scond i redirezion (redirect)",
+       "protectedpages-page": "Articul",
+       "protectedpages-expiry": "Scadènsa:",
+       "protectedpages-performer": "Ütènt che l'ha prutigìda",
+       "protectedpages-params": "Tìpo de protesiù",
+       "protectedpages-reason": "Mutìf",
+       "protectedpages-unknown-timestamp": "Mìa cunusìt",
+       "protectedpages-unknown-performer": "Ütènt mìa cunusìt",
+       "protectedtitles": "Tìtoi prutigìcc",
        "listusers": "Lista di dupradur registraa",
        "listusers-editsonly": "Mustra dumà i dupradur cun di mudifegh",
        "listusers-creationsort": "Cavèzza per data de creazión",
+       "listusers-desc": "Mèt en ùrden a calà",
+       "usereditcount": "$1 {{PLURAL:$1|cambiamènt|cambiamèncc}}",
        "usercreated": "Creaa el $1 a $2",
        "newpages": "Paginn növ",
+       "newpages-username": "Nòm ütènt:",
        "ancientpages": "Paginn püssee vegg",
        "move": "Sposta",
        "movethispage": "Sposta quela pagina chì",
        "allpagesprefix": "Varda i pagin ch'i scumenza per:",
        "allpages-hide-redirects": "Scond i bot",
        "categories": "Categurij",
-       "deletedcontributions": "Cuntribüziun scancelaa",
+       "special-categories-sort-count": "mèt en ùrden per nömer",
+       "special-categories-sort-abc": "mèt en ùrden alfabétich",
+       "deletedcontributions": "Mudìfiche del ütènt scancelàde",
        "deletedcontributions-title": "Cuntribüziun scancelaa",
+       "sp-deletedcontributions-contribs": "mudìfiche",
        "linksearch": "Sérca ligam de föra",
        "listusersfrom": "Fàm vedè i dupradur a partì da:",
        "listusers-submit": "Fà ved",
+       "activeusers": "Lìsta dei ütèncc atìf",
        "activeusers-from": "Fàm vedè i dupradur a partì da:",
        "activeusers-hidebots": "Scond i bot",
-       "listgrouprights": "Dirit del grüp di druvat",
+       "activeusers-hidesysops": "Scond i aministradur",
+       "activeusers-noresult": "Nisü ütènt troàt",
+       "listgrouprights": "Diricc del grüp dei ütèncc",
+       "listgrouprights-group": "Grüp",
        "listgrouprights-rights": "Dirìcc",
        "listgrouprights-helppage": "Help:Diricc del grupo",
        "listgrouprights-members": "(Lista di member)",
        "modifiedarticleprotection": "A l'è müdaa el nivel de prutezión per \"[[$1]]\"",
        "unprotectedarticle": "l'ha sblucaa \"[[$1]]\"",
        "protect-title": "Prutezziún da \"$1\"",
+       "protect-title-notallowed": "Arda el leèl de protesiù de \"$1\"",
        "prot_1movedto2": "[[$1]] spustaa in [[$2]]",
-       "protect-legend": "Cunferma de blocch",
+       "protect-norestrictiontypes-title": "Pàgina che se pöl mìa protèger",
+       "protect-legend": "Cunferma la protesiù",
        "protectcomment": "Mutìf:",
        "protectexpiry": "Scadènsa:",
        "protect_expiry_invalid": "Scadenza pü bona",
        "protect-level-sysop": "dumà per i aministradur",
        "protect-summary-cascade": "recursiva",
        "protect-expiring": "scadenza: $1 (UTC)",
+       "protect-expiring-local": "scadés ai $1",
+       "protect-expiry-indefinite": "per semper",
        "protect-cascade": "Prutegg i paginn ch'i fan part de questa (prutezión recursiva)",
        "protect-cantedit": "Te pödet minga mudifegà i nivel de prutezión a quela pagina chì, per via che t'hee minga el permiss de mudifegala.",
        "protect-dropdown": "*Mutiv cumün per la prutezion\n** Tròp vandalism\n** Tròp spam\n** Edit war\n** Pagina cun parecc tràfich",
        "maximum-size": "Misüra màssima:",
        "pagesize": "(byte)",
        "restriction-edit": "Mudifega",
+       "restriction-move": "Sposta",
+       "restriction-create": "Crea",
+       "restriction-upload": "Carga sö",
+       "restriction-level-all": "töcc i leèi",
        "undelete": "Varda i pagin scancelaa",
+       "undeletepage": "Arda e riprìstina le pàgine scancelàde",
+       "viewdeletedpage": "Varda i pagin scancelaa",
+       "undelete-fieldset-title": "Riprìstina versiù",
        "undelete-nodiff": "Per questa pagina gh'è nanca una revisiun precedenta.",
        "undeletebtn": "Rimett a post",
        "undeletelink": "Varda/büta indree",
+       "undeleteviewlink": "arda",
+       "undeleteinvert": "Invertì la seleziòn",
+       "undeletecomment": "Mutìf:",
        "undeletedrevisions": "{{PLURAL:$1|1 revision|$1 versiun}} rimetüü a post",
+       "undelete-search-title": "Sérca pàgine scancelàde",
+       "undelete-search-box": "Sérca pàgine scancelàde",
        "undelete-search-prefix": "Fà ved i paginn che scumenzen per:",
+       "undelete-search-submit": "Sérca",
+       "undelete-show-file-submit": "Sé",
        "namespace": "Namespace:",
        "invert": "Invertì la seleziòn",
        "blanknamespace": "(Principal)",
        "linkshere": "I paginn chì de sota gh'hann di ligam che porten a '''[[:$1]]''':",
        "isredirect": "redirezión",
        "istemplate": "inclüsión",
-       "isimage": "ligam a una figüra",
+       "isimage": "ligam a un archivi",
        "whatlinkshere-prev": "{{PLURAL:$1|quel prima|$1 prima}}",
        "whatlinkshere-next": "{{PLURAL:$1|dopu|$1 dopu}}",
        "whatlinkshere-links": "← ligam",
        "unblockip": "Desblòca quel druvàt chì",
        "ipusubmit": "Tö via 'stu bloch chì",
        "unblocked": "[[User:$1|$1]] l'è staa desblucaa",
-       "ipblocklist": "Adrèss IP e druvàt blucaa",
+       "ipblocklist": "Ütèncc blocàcc",
+       "ipblocklist-legend": "Sérca 'n ütènt blocàt",
+       "blocklist-userblocks": "Scond i bloch dei ütencc registràcc",
+       "blocklist-tempblocks": "Scond i bloch temporanei",
+       "blocklist-addressblocks": "Scond i bloch de 'n IP",
+       "blocklist-rangeblocks": "Scond i bloch de pachècc de IP",
+       "blocklist-timestamp": "Data e ùra",
+       "blocklist-target": "Destinasiù",
+       "blocklist-expiry": "Scadés",
+       "blocklist-by": "Aministradur che g'ha blocàt",
+       "blocklist-params": "Tìpo de bloch",
        "blocklist-reason": "Mutìf",
+       "ipblocklist-submit": "Sérca",
+       "ipblocklist-localblock": "Bloch locàl",
+       "ipblocklist-otherblocks": "{{PLURAL:$1|Óter blòch|Óter blòch}}",
        "infiniteblock": "per semper",
        "expiringblock": "el finiss el $1 a $2",
        "anononlyblock": "dumà i anònim",
        "emailblock": "e-mail blucaa",
        "blocklist-nousertalk": "el pö mía mudifegà la soa pagina de discüssión",
        "ipblocklist-empty": "El register di bloch l'è vöj.",
+       "ipblocklist-no-results": "L'indirìs IP o 'l nòm de ütènt sercàt l'è mìa blocàt.",
        "blocklink": "bloca",
        "unblocklink": "desbloca",
        "change-blocklink": "cambia bloch",
        "noimages": "Gh'è negót de éder.",
        "ilsubmit": "Truvá",
        "bydate": "per data",
+       "monday-at": "Lönesdé a le $1",
+       "tuesday-at": "Martedé a le $1",
+       "wednesday-at": "Mercoldé a le $1",
+       "thursday-at": "Giöedé a le $1",
+       "friday-at": "Venerdé a le $1",
+       "saturday-at": "Sàbot a le $1",
+       "sunday-at": "Dümìnica a le $1",
+       "yesterday-at": "Gér a le $1",
        "bad_image_list": "El furmaa a l'è quest chì:\n\nSe tegnen bón dumà i list póntaa (i righ che scumincen per *).\nEl prim ligam de ogni riga la gh'ha de vess un ligam a un file minga desideraa.\nI ligam che i vegnen dopu, in sü l'istessa riga, i vegnen cónsideraa di ecezión (che'l vör dì paginn induè che 'l file se'l pö riciamà in manera nurmala).",
        "metadata": "Metadat",
        "metadata-help": "Quel file chì al gh'ha dent di infurmazión adiziunaj, che l'è prubabil che j'ha giuntaa la fotocamera o 'l scanner dupraa per fàl o digitalizàl. Se el file a l'è staa mudifegaa, un quajvün di detali i pudarien curespund pü ai mudifegh faa.",
        "metadata-expand": "Fà vidè i detali",
        "metadata-collapse": "Scund i detali",
        "metadata-fields": "I camp di metadat EXIF listaa in quel messagg chì i saran mustraa in de la pagina de la figüra quand che la tabela di metadat la sarà presentada furma cürta. Per impustazión i alter camp i saran scundüü.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "exif-imagewidth": "Larghèsa",
+       "exif-imagelength": "Altèsa",
+       "exif-bitspersample": "Bit per componènt",
+       "exif-compression": "Sistéma de compresiù",
+       "exif-photometricinterpretation": "Strütüra dei pixel",
+       "exif-orientation": "Orientamènt",
+       "exif-samplesperpixel": "Nömer de le componencc",
+       "exif-planarconfiguration": "Dispuzisiù dei dati",
+       "exif-ycbcrsubsampling": "Rapórt de campinamènt Y / C",
+       "exif-ycbcrpositioning": "Puzisiù componèncc Y e C",
+       "exif-xresolution": "Resulusiù orizontàla",
+       "exif-yresolution": "Resulusiù verticàla",
+       "exif-stripoffsets": "Puzisiù dei dati de la foto",
+       "exif-rowsperstrip": "Nömer de rìghe per fàsa",
+       "exif-imagedescription": "Tìtol de la foto",
        "watchlistall2": "tücc",
        "namespacesall": "tücc",
        "monthsall": "tücc",
        "tags-active-yes": "Sé",
        "tags-active-no": "Nò",
        "tags-edit": "mudìfica",
-       "rightsnone": "(nisü)"
+       "rightsnone": "(nisü)",
+       "expand_templates_ok": "OK"
 }
index e9e4a8d..5352d96 100644 (file)
        "tog-previewontop": "پیش سیل نه دما جعوه ویرایشت نشو بیئه",
        "tog-previewonfirst": "پیش سیل نه د اولین ویرایشت نشو بیئه",
        "tog-enotifwatchlistpages": "اوسه که یه گل بلگه یا فایلی د سیل برگ مه آلشت بوئه منه وا ایمیل خور کو",
-       "tog-enotifusertalkpages": "وختی که بلگه گپسن کارور آلشت پیدا کرد منه وا ایمیل خور کو",
+       "tog-enotifusertalkpages": "وختی که بلگه گپسن کاریار آلشت پیدا کرد منه وا ایمیل خور کو",
        "tog-enotifminoredits": "همچنو اوسه که ویرایشتیا کؤچکی د بلگیا یا فایلیا انجوم بوئه منه خور کو",
        "tog-enotifrevealaddr": "نشونی ایمیل منه د ایمیل اشگار نشو بیه",
-       "tog-shownumberswatching": "انازه کاروریایی که د حالت دیئنن نشو بیه",
+       "tog-shownumberswatching": "انازه کاریاریایی که د حالت دیئنن نشو بیه",
        "tog-oldsig": "امضايی هيئش:",
        "tog-fancysig": "وا امضا چی ویکی متن برخورد کو",
        "tog-uselivepreview": "د پیش سیل زنه استفاده کو",
        "tog-watchlisthideown": "قام كو ويرايشت منه د",
        "tog-watchlisthidebots": "ویرایشت یا بوت نه د سیل برگ قام کو",
        "tog-watchlisthideminor": "قام كو ويرايشت کؤچک منه د",
-       "tog-watchlisthideliu": "ویرایشت یا کاروریا وامئن سیستم نه د سیل برگ قام کو",
+       "tog-watchlisthideliu": "ویرایشت یا کاریاریا وامئن سیستم نه د سیل برگ قام کو",
        "tog-watchlisthideanons": "ویرایشت یا کاروریا ناشناس نه د سیل برگ قام کو",
        "tog-watchlisthidepatrolled": "ویرایش تیا د تی رس نه د سیل برگ قام کو",
-       "tog-ccmeonemails": "کپی ایمیل یا منه که سی کسونا تر می فرسنم سیم کل کو",
+       "tog-ccmeonemails": "کپی انجومانامه یا منه که سی کاریاریا تر می فرسنم سیم کل کو",
        "tog-diffonly": "بلگیایی که شومل فرخیا هارن نشون نیه",
        "tog-showhiddencats": "دسه يا قام بيئنه نشون بيه",
        "tog-norollbackdiff": "فرخیا نه د بین بوریت نها یه گل عقو گرد کردن",
        "about": "دباره",
        "article": "محتوا بلگه",
        "newwindow": "(نيمدری  تازه وا کو)",
-       "cancel": "رد Ù\83ردن",
+       "cancel": "اÙ\86جÙ\88Ù\85 Ø´Û\8cÙ\88سن",
        "moredotdotdot": "بيشتر",
        "morenotlisted": "ای ليست كامل نبيه",
        "mypage": "بلگه",
        "qbmyoptions": "بلگيا مه",
        "faq": "اف ای كيو",
        "faqpage": "پروجه:اف اي كيو",
-       "vector-action-addsection": "موضوع اضاف بكيد",
-       "vector-action-delete": "حذف بكيد",
-       "vector-action-move": "جاوه جا بوئيت",
-       "vector-action-protect": "حمايت بكيد",
-       "vector-action-undelete": "حذف نبيئني",
-       "vector-action-unprotect": "حمايت آلشت بكيد",
-       "vector-view-create": "راس كردن",
-       "vector-view-edit": "ويرايشت",
-       "vector-view-history": "ديئن ويرگار",
-       "vector-view-view": "حنن",
-       "vector-view-viewsource": "سرچشمه نه بوينيت",
        "actions": "جمشت",
        "namespaces": "نوم جا",
        "variants": "آلشت ونی يا",
        "permalink": "چسب ون هميشئی",
        "print": "چاپ كردن",
        "view": "ديئن",
+       "view-foreign": "د $1 نه بوینیت",
        "edit": "ويرايشت",
        "create": "راس كردن",
        "editthispage": "ويرايشت ای بلگه",
        "talk": "گپ",
        "views": "ديئنيا",
        "toolbox": "اوزاريا",
-       "userpage": "ديئن بلگه كارور",
+       "userpage": "ديئن بلگه کاریار",
        "projectpage": "ديئن بلگه پروجه",
        "imagepage": "ديئن بلگه جانیا",
        "mediawikipage": "ديئن بلگه پيغوم",
        "sort-descending": "كم بيئن منظم",
        "sort-ascending": "زياد بيئن منظم",
        "nstab-main": "بلگه",
-       "nstab-user": "بلگه كارور",
+       "nstab-user": "بلگه کاریار",
        "nstab-media": "بلگه رسانه",
        "nstab-special": "بلگيا ويجه",
        "nstab-project": "بلگه پروجه",
        "virus-scanfailed": "زل بیئن شکست حرد($1)",
        "virus-unknownscanner": "ويروس كش ناآشگار",
        "welcomeuser": "خوش اومايت،$1!",
-       "yourname": "نوم كاروری:",
+       "yourname": "نوم کاریاری:",
        "userlogin-yourname": "نوم كاروری",
-       "userlogin-yourname-ph": "نوم كاروری تو نه وارد بكيد",
+       "userlogin-yourname-ph": "نوم کاریاری تو نه وارد بكيد",
        "createacct-another-username-ph": "نوم كاروری ته وارد كو",
        "yourpassword": "پاسورد:",
        "userlogin-yourpassword": "رمز",
        "yourpasswordagain": "دوواره رمز بزه",
        "createacct-yourpasswordagain": "رمز محكم كو",
        "createacct-yourpasswordagain-ph": "دوواره رمز بزه",
-       "remembermypassword": "اومائن وا مئن منه د ای مرورگر د ویر داشتو(سی بیشترین$1{{PLURAL:$1|day|days}})",
+       "remembermypassword": "اومائن وا مئن منه د ای مرورگر د ویر داشتو(سی بیشترونه$1{{جمی:$1|روز|روزیا}})",
        "userlogin-remembermypassword": "منه مئن سيستم وادار",
        "userlogin-signwithsecure": "د وصل بيئن امن استفاده كو",
        "yourdomainname": "پوشگیر شما:",
        "userlogin-resetlink": "جزییات وامین اومائن تونه د ویر بردیته",
        "userlogin-resetpassword-link": "پاسورد د ویرتو رئته؟",
        "userlogin-helplink2": "هومیاری وا مین اومائن",
-       "userlogin-loggedin": "شما ایسه د عنوان {{جنس:$1|$1}} اومایته وا مین.\nد فرم هاری سی وا مین اومائن وه عنوان کارور هنی استفاده بکیتو.",
+       "userlogin-loggedin": "شما ایسه د عنوان {{جنس:$1|$1}} اومایته وا مین.\nد فرم هاری سی وا مین اومائن وه عنوان کاریار هنی استفاده بکیتو.",
        "userlogin-createanother": "يه گل حساوهنی راست بكيد",
        "createacct-emailrequired": "نشونی ايميل",
        "createacct-emailoptional": "نشونی ايميل",
        "noemail": "هیچ نشونی ایمیلی سی کارور $1 ضفط نبیه.",
        "noemailcreate": "شما باید یه نشونی نومه معتور فراهم بکید",
        "mailerror": "خطا داره کل موئه:$1",
-       "emailauthenticated": "نشونی ایمیلتو د $2 سی 3$ مئکم بیه.",
+       "emailauthenticated": "نشونی انجومانامه تونه د $2 سی 3$ مئکم بیه.",
        "emailconfirmlink": "نشونی ايملتو نه محكم بكيد",
        "cannotchangeemail": "نشونی ایمیل حساو نتونه د ای ویکی آلشت بوئه.",
        "emaildisabled": "ای مالگه نتونه ایمیل بفرسنه",
        "resetpass_forbidden": "پاسوردیا نتونن آلشت بوئن",
        "resetpass-no-info": "شما با بیایت د سیستم تا د ای بلگه دسرسی داشتویت",
        "resetpass-submit-loggedin": "پاسورد نه آلشت بكيت",
-       "resetpass-submit-cancel": "رد Ù\83ردن",
+       "resetpass-submit-cancel": "اÙ\86جÙ\88Ù\85 Ø´Û\8cÙ\88سن",
        "resetpass-temp-password": "رمز موقت:",
        "passwordreset": "د نۈ وارد كردن رمز",
        "passwordreset-legend": "د نۈ وارد كردن رمز",
        "changeemail-none": "(هيش كوم)",
        "changeemail-password": "شما {{SITENAME}} پاسورد:",
        "changeemail-submit": "آلشت کردن ایمیل",
-       "changeemail-cancel": "رد Ù\83ردن",
+       "changeemail-cancel": "اÙ\86جÙ\88Ù\85 Ø´Û\8cÙ\88سن",
        "resettokens": "تازه کردن نشونه یا",
        "resettokens-no-tokens": "هیژ نشونه ای سی تازه کردن نئ.",
        "resettokens-legend": "تازه کردن نشونه یا",
        "subject": "موضو/سر خط:",
        "minoredit": "يه ويرايشت كؤچكيه",
        "watchthis": "ديئن ای بلگه",
-       "savearticle": "بÙ\84Ú¯Ù\87 Ø¶Ø¨Ø· Ø¨Ù\88ئه",
+       "savearticle": "اÙ\85اÛ\8cÛ\8cÙ\87 Ú©Ø±Ø¯Ù\86 Ø¨Ù\84Ú¯ه",
        "preview": "پيش سيل",
        "showpreview": "پيش نمائش نشون بيئه",
        "showdiff": "آلشتيانه نشون بيئه",
        "blocked-notice-logextract": "ای کارور ایسنی دسرسی ناره.\nآخری نشون قلف ورودی د هار ایچه سی سرچشمه آماده بیه:",
        "updated": "(تازه بيه)",
        "note": "'''نيسنن:'''",
-       "previewnote": "Ù\81Ù\82Ø· Ø§Û\8c Ù¾Û\8cØ´ Ø³Û\8cÙ\84 Ø¯ Ù\88Û\8cرتÙ\88 Ø¨Ø§.\nØ¢Ù\84شتÛ\8cاتÙ\88 Ù\87Ù\86Û\8c Ø°Ø®Û\8cره نبیه.",
+       "previewnote": "Ù\81Ù\82Ø· Ø§Û\8c Ù¾Û\8cØ´ Ø³Û\8cÙ\84 Ø¯ Ù\88Û\8cرتÙ\88 Ø¨Ø§.\nØ¢Ù\84شتÛ\8cاتÙ\88 Ù\87Ù\86Û\8c Ø§Ù\85اÛ\8cÛ\8cه نبیه.",
        "continue-editing": "رو د راساگه ویرایشت",
        "editing": "د حالت ويرايشت$1",
        "creating": "راس كردن $1",
        "editingsection": "د حال ویرایشت$1(بشخ)",
        "editingcomment": "د حال ویرایشت$1(بشخ تازه)",
        "editconflict": "تضاد د ویرایشت:$1",
-       "explainconflict": "داÙ\88سÙ\87 Ú©Ù\87 Ø´Ù\85ا Ø´Ø±Ù\88 Ø¯ Ù\88Û\8cراÛ\8cشت Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ú©Ø±Ø¯Û\8cتÙ\87Ø\8c Û\8cÙ\87 Ù\86Ù\81ر Ù\87Ù\86Û\8c Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ù\86Ù\87 Ø¢Ù\84شت Ø¯Ø¦Ù\87.\nراساگÙ\87 Ø±Ù\88ئÛ\8c Ù\85تÙ\86 Ø¨Ù\84Ú¯Ù\87 Ù\85تÙ\86 Ù\86Ù\87 Ú\86Û\8c Û\8cÙ\87 Ú©Ù\87 Ù\88جÙ\88د Ø¯Ø§Ø´ØªÙ\88Ù\87 Ø¯ Ù\88ر Ù\85Û\8cئرÙ\87.\nØ¢Ù\84شتÛ\8cا Ø´Ù\85ا Ø¯ Ù\85تÙ\86 Ù\87ارÛ\8c Ù\86Ø´Ù\88 Ø¯Ø¦Ù\87 Ù\87ئ.\nØ´Ù\85ا Ø¨Ø§ Ø¢Ù\84شتÛ\8cاتÙ\88Ù\86Ù\87 Ø¯ Ù\85تÙ\86 Ú©Ù\87 Ù\87ئش Û\8cÚ©Û\8c Ø¨Ú©Û\8cد.\nÙ\81Ù\82Ø· Ù\85تÙ\86Û\8c Ú©Ù\87 Ù\87ا Ø¯ Ø±Ù\88 Ø¯ Ù\88ختÛ\8c Ú©Ù\87 Ø´Ù\85ا\"{{رÙ\82Ù\85:ذخÛ\8cرÙ\87 Ú¯Ù\88تار}}\" Ù\86Ù\87 Ú¯Ø²Ø§Ø±Ø´Øª Ù\85Û\8c Ú©Û\8cد Ø°Ø®Û\8cره بوئه",
+       "explainconflict": "داÙ\88سÙ\87 Ú©Ù\87 Ø´Ù\85ا Ø´Ø±Ù\88 Ø¯ Ù\88Û\8cراÛ\8cشت Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ú©Ø±Ø¯Û\8cتÙ\87Ø\8c Û\8cÙ\87 Ù\86Ù\81ر Ù\87Ù\86Û\8c Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ù\86Ù\87 Ø¢Ù\84شت Ø¯Ø¦Ù\87.\nراساگÙ\87 Ø±Ù\88ئÛ\8c Ù\85تÙ\86 Ø¨Ù\84Ú¯Ù\87 Ù\85تÙ\86 Ù\86Ù\87 Ú\86Û\8c Û\8cÙ\87 Ú©Ù\87 Ù\88جÙ\88د Ø¯Ø§Ø´ØªÙ\88Ù\87 Ø¯ Ù\88ر Ù\85Û\8cئرÙ\87.\nØ¢Ù\84شتÛ\8cا Ø´Ù\85ا Ø¯ Ù\85تÙ\86 Ù\87ارÛ\8c Ù\86Ø´Ù\88 Ø¯Ø¦Ù\87 Ù\87ئ.\nØ´Ù\85ا Ø¨Ø§ Ø¢Ù\84شتÛ\8cاتÙ\88Ù\86Ù\87 Ø¯ Ù\85تÙ\86 Ú©Ù\87 Ù\87ئش Û\8cÚ©Û\8c Ø¨Ú©Û\8cد.\nÙ\81Ù\82Ø· Ù\85تÙ\86Û\8c Ú©Ù\87 Ù\87ا Ø¯ Ø±Ù\88 Ø¯ Ù\88ختÛ\8c Ú©Ù\87 Ø´Ù\85ا\"{{رÙ\82Ù\85:ذخÛ\8cرÙ\87 Ú¯Ù\88تار}}\" Ù\86Ù\87 Ú¯Ø²Ø§Ø±Ø´Øª Ù\85Û\8c Ú©Û\8cد Ø§Ù\85اÛ\8cÛ\8cه بوئه",
        "yourtext": "متن شما",
        "storedversion": "دوواره دیئن انبار بیه.",
        "yourdiff": "فرخيا",
        "moveddeleted-notice": "ای بلگه پاک بیه.\nپاک بین و جمشت ای بلگه سی سرچشمه دئین فراهم بیه",
        "log-fulllog": "دیئن همه پهرستنومه یا",
        "edit-conflict": "مخالفت نه ویرایشت بکید",
-       "postedit-confirmation": "ویرایشتتو ذخیره بی",
+       "postedit-confirmation-saved": "ویرایشتتو اماییه بی",
        "edit-already-exists": "نبوئه یه گل بلگه تازه راس بکید.\nوه هئیش.",
        "defaultmessagetext": "متن پیغوم پیش فرض",
        "content-failed-to-parse": "د یک تیچیسن چیا مئن $2 د مدل $1:$3",
        "searchmenu-exists": "'''ایچه بلگه ای هئ وه نوم\"[[:$1]]\" که ها د ای ویکی'''",
        "searchmenu-new": "'''ای بلگه نه راس كو \"[[:$1]]\" د ای  ويكي!'''",
        "searchprofile-articles": "بلگيا محتوا",
-       "searchprofile-project": "بلگيا هومياری پروجه",
        "searchprofile-images": "رسانيا جمی",
        "searchprofile-everything": "همه چی",
        "searchprofile-advanced": "پيشرفته",
        "searchprofile-articles-tooltip": "بگرد مئن $1",
-       "searchprofile-project-tooltip": "بگرد مئن $1",
        "searchprofile-images-tooltip": "بگرد سی فايليا",
        "searchprofile-everything-tooltip": "همه محتوا نه پی جوری كو (شاملا بلگيا چك چنه)",
        "searchprofile-advanced-tooltip": "نوم جايا نوم ديار بگرد",
        "search-interwiki-default": "$1 نتیجه یا:",
        "search-interwiki-more": "(بیشتر)",
        "search-relatedarticle": "مرتوط",
-       "searcheverything-enable": "همه نوم جايا نوم ديار بگرد",
        "searchrelated": "مرتوط",
        "searchall": "همه",
        "showingresultsheader": "{{PLURAL:$5|نتيجه '''$1''' د'''$3'''|نتيجه يا '''$1 - $2''' د'''$3'''}} سيli'''$4'''",
        "prefs-rc": "آلشتیا تازه باو",
        "prefs-watchlist": "سیل برگ",
        "prefs-watchlist-days": "روزیا نه د سیل برگ نشو دئه بو:",
-       "prefs-watchlist-edits-max": "فره تری شماره:1000",
+       "prefs-watchlist-edits-max": "شماره بیشترونه:1000",
        "prefs-misc": "شيوسن",
        "prefs-resetpass": "پاسورد نه آلشت بكيت",
        "prefs-changeemail": "نشونی ایمیل تو نه آلشت بکید",
        "prefs-setemail": "يه گل ايميل بنیت",
+       "prefs-email": "چیا هنی انجومانامه",
        "prefs-rendering": "شلک و ری",
-       "saveprefs": "ذخÙ\8aره كردن",
+       "saveprefs": "اÙ\85اÛ\8cÛ\8cه كردن",
        "prefs-editing": "د حالت ويرايشت",
        "rows": "رديفيا:",
        "columns": "ستينا:",
        "searchresultshead": "پی جوری",
        "stub-threshold-disabled": "د كار ونن",
        "recentchangesdays": "روزیا آلشتیا تازه باو نه نشو بیه:",
-       "recentchangesdays-max": "فره ترین $1 {{جمی:$1|روز|روزیا}}",
+       "recentchangesdays-max": "$1 بیشترونه {{جمی:$1|روز|روزیا}}",
        "prefs-help-recentchangescount": "یه شامل آلشتیا تازه،ویرگاریا بلگه و پهرستنومه یا هئ.",
-       "savedprefs": "Ù\88Û\8cجÙ\87 Ú¯Û\8cا Ù\87Ù\86Û\8c ØªÙ\88 Ø°Ø®Û\8cره بیه.",
+       "savedprefs": "Ù\88Û\8cجÙ\87 Ú¯Û\8cا Ù\87Ù\86Û\8c ØªÙ\88 Ø§Ù\85اÛ\8cÛ\8cه بیه.",
        "timezonelegend": "وخت راساگه",
        "localtime": "وخت ولاتی:",
        "timezoneuseserverdefault": "وخت راساگه",
        "prefs-emailconfirm-label": "مئکم کردن ایمیل:",
        "youremail": "ايميل:",
        "username": "{{جنس:$1|نوم کاروری}}:",
-       "uid": "{{جنس:$1|کارور}}آی دی:",
        "prefs-memberingroups": "{{جنس:$2|اندوم}}  {{جمی:$1|گرویا|گرویا}}:",
        "prefs-registration": "موقع ثوت نام:",
        "yourrealname": "نوم راستكی:",
        "userrights-user-editname": "نوم كاروری ته وارد كو",
        "editusergroup": "ویرایشت گرویا کاروری",
        "userrights-editusergroup": "ویرایشت گرویا کاروری",
-       "saveusergroups": "ذخÛ\8cرÙ\87 Ú©Ø±Ø¯ Ú¯Ø±Ù\88Û\8cا Ú©Ø§Ø±Ù\88ری",
+       "saveusergroups": "اÙ\85اÛ\8cÛ\8cÙ\87 Ú©Ø±Ø¯Ù\86 Ú¯Ø±Ù\88Û\8cا Ú©Ø§Ø±Û\8cاری",
        "userrights-groupsmember": "اندوم:",
        "userrights-reason": "دليل:",
        "userrights-no-interwiki": "شما سی ویرایشت حقوق کارور د ویکی یا هنی دسرسی ناریت.",
        "right-move-subpages": "بلگه یا و زیر بلگه یا شونه جا وه جا کو",
        "right-move-rootuserpages": "بلگه یا ریشه ای کارور نه جا وه جا کو",
        "right-movefile": "فایلیا نه جا وه جا کو",
+       "right-suppressredirect": "اوسه که بلگه یا د بین رئتنه هیچ واگردونی سی بلگه یا سرچشمه دروس نبیه",
        "right-upload": "سوار کردن فايلا",
        "right-upload_by_url": "سوار کرد فایلیا د یو آر ال",
        "right-writeapi": "د نیسنن ای پی آی استفاده بکید",
        "recentchanges-label-bot": "ای ويرايشت نه يه بوت انجوم ديئه",
        "recentchanges-label-unpatrolled": "ای ويرايشت هنی تيه واداشت نبيه",
        "recentchanges-legend-heading": "'''میراث:'''",
-       "recentchanges-legend-newpage": "(همچنو بوینیت [[ویجه:بلگیا تازه|نوم گه بلگیا تازه]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (همچنو بوینیت [[ویجه:بلگیا تازه|نوم گه بلگیا تازه]])",
        "rcnotefrom": "د هار آلشتیا د $2 هیئن(د بال د $1 نشون دئه بیه)",
        "rclistfrom": "آلشتیا تازه ایی که وا $3 $2 شرو بیه نشونش بئه",
        "rcshowhideminor": "ويرايشتيا کؤچک $1",
        "minoreditletter": "م",
        "newpageletter": "ن",
        "boteditletter": "ب",
-       "number_of_watching_users_pageview": "[$1 دینه {{جمی:$1|کارور|کاروریا}}]",
+       "number_of_watching_users_pageview": "[$1 دینه {{جمی:$1|کاریار|کاریاریا}}]",
        "rc_categories": "دسه یا نه محدود کو(وا \"|\" جگا بوئن",
        "rc_categories_any": "هرکوم",
        "rc-change-size-new": "$1 {{جمی:$1|بایت|بایتیا}} نها آلشت",
        "recentchangeslinked-to": "آلشتیایی که د بلگه یا هوم پیوند بینه وه جا بلگه دئیه بیه نشو بیه",
        "upload": "بلم گير كردن فايلا",
        "uploadbtn": "سوار کردن فایل",
-       "reuploaddesc": "سÙ\88ار Ú©Ø±Ø¯Ù\86 Ù\86Ù\87 Ø±Ø¯ Ø¨Ú©Û\8cد و د ورئردیت جابلگ سوارکرد",
+       "reuploaddesc": "سÙ\88ار Ú©Ø±Ø¯Ù\86 Ù\86Ù\87 Ø§Ù\86جÙ\88Ù\85 Ø´Û\8cÙ\88 Ø¨Ú©Û\8cت و د ورئردیت جابلگ سوارکرد",
        "uploadnologin": "وارد نبیه",
        "uploadnologintext": "لطفن $1 سی سوارکرد جانیایا.",
        "uploaderror": "خطا د سوار کردن",
        "filename-tooshort": "نوم فایل فره کؤچکه.",
        "illegal-filename": "نوم فایل اجاره ندئه بیه.",
        "unknown-error": "یه گل خطا نادیار ری ون کرده.",
-       "savefile": "جاÙ\86Û\8cا Ù\86Ù\87 Ø°Ø®Û\8cره کو",
+       "savefile": "جاÙ\86Û\8cا Ù\86Ù\87 Ø§Ù\85اÛ\8cÛ\8cه کو",
        "uploadedimage": "سوارکرد\"[[$1]]\"",
        "overwroteimage": "یه گل نسقه تازه د \"[[$1]]\" سوار بیه",
        "uploaddisabled": "سوار کردن د کار نئ.",
        "upload-proto-error": "پروتکل نادروس",
        "upload-file-error": "خطا مینونه",
        "upload-misc-error": "خطا سوار کرد ناشناخته",
+       "upload-too-many-redirects": "ای یو آر ال د ورگیرنه واگردونیا فرئی هئ",
        "upload-copy-upload-invalid-domain": "ورداشتن سوارکردیا د ای پوشگئر د دسرس نئ.",
        "backend-fail-notexists": "فایل $1 وجود ناره.",
        "backend-fail-delete": "نبوئه جانیا $1 پاک بوئه",
        "listfiles_thumb": "بن کلکی",
        "listfiles_date": "تاريخ",
        "listfiles_name": "نوم",
-       "listfiles_user": "كارور",
+       "listfiles_user": "کاریار",
        "listfiles_size": "انازه",
        "listfiles_count": "نسقیا",
        "listfiles-show-all": "شومل نسقه یا نهاتری عسگیا",
        "filehist-thumb": "عسگ كؤچك بيه",
        "filehist-thumbtext": "كؤچك كردن سی  نسقه چی $1",
        "filehist-nothumb": "هیچ بن کلیکی نئ",
-       "filehist-user": "كارور",
+       "filehist-user": "کاریار",
        "filehist-dimensions": "بعديا",
        "filehist-filesize": "انازه فایل",
        "filehist-comment": "نظر",
        "linkstoimage": "دمال بيه {{PLURAL:$1|ديس ونيا بلگه|$1 ديس ون بلگيا}} دای فایل:",
        "nolinkstoimage": "ایچه هیژ بلگه ای سی هوم پیوند بیئن وا ای فایل نی",
        "morelinkstoimage": " [[ویجه:چه هوم پیوندی ها ایچه/$1|هوم پیوندیا هنی]]سی ای فایل بونیت.",
+       "linkstoimage-redirect": "$1 (واگردونی جانیا) $2",
        "sharedupload": "ای جانیا که د $1 هئ شایت د پروجه یا هنی استفاده بیه.",
        "sharedupload-desc-here": "فایلی که د $1 شایت د مئن پروجیا هنی استفاده بیه.\nتوضی دباره[$2 file description page] د هار نشو دئئه بیه",
        "filepage-nofile": "چنو فایلی وا ای نوم نئ.",
        "mimesearch": "پی جوری ام آی ام ای",
        "download": "گرتن",
        "unwatchedpages": "بلگه یا ندئیه بیه",
+       "listredirects": "نوم گه واگردونیا",
        "unusedtemplates": "قالویا وه کار نبرده بیه.",
        "unusedtemplateswlh": "هوم پیوندیا هنی",
        "randompage": "بلگه بختكی",
        "randomincategory-invalidcategory": "\"$1\"  نوم دسه معتوری نئ.",
        "randomincategory-nopages": "هیچ بلگه ای د ای  [[:دسه نئ:$1|$1]] دسه.",
        "randomincategory-selectcategory-submit": "رو",
+       "randomredirect": "واگردونی بختکی",
        "statistics": "آماريا",
        "statistics-header-pages": "بلگه آماریا",
        "statistics-header-edits": "آماریا نه ویرایشت بکید",
        "statistics-header-views": "آماریا نه بوینیت",
-       "statistics-header-users": "آماریا کارور",
+       "statistics-header-users": "آماریا کاریار",
        "statistics-header-hooks": "آماریا هنی",
        "statistics-articles": "بلگه یا مینونه",
        "statistics-pages": "بلگیا",
+       "statistics-pages-desc": "همه بلگه یا د ویکی،د ور گیرنه بلگه یا چک چنه،واگردونیا و چیا هنیه.",
        "statistics-files": "جانیا یا سوار بیه",
        "statistics-edits-average": "میانگین ویرایشت یا سی هر بلگه",
        "statistics-views-total": "همه نه بوینیت",
        "statistics-views-peredit": "هر ویرایشت نه بوینیت",
-       "statistics-users": "ثوت نام بیه [[ویجه:نوم گه کاروریا|کاروریا]]",
+       "statistics-users": "ثوت نام بیه [[ویجه:نوم گه کاریاریا|کاریاریا]]",
        "statistics-users-active": "کاروریا کارکو",
        "statistics-mostpopular": "بلگه یایی که بیشتر دیئه بینه",
        "pageswithprop-submit": "رو",
+       "doubleredirects": "واگردونیا دوتایی",
+       "double-redirect-fixed-move": "[[$1]]جا وه جا بیه .\nوه خودکارونه وه روز بیه و ایسه وه د[[$2]] واگردونی بیه.",
+       "double-redirect-fixer": "تعمیر کننه واگردونی",
+       "brokenredirectstext": "واگردونیا نهاتر د بلگه یایی که وجود نارن هوم پیوند بینه.",
        "brokenredirects-edit": "ویرایشت",
        "brokenredirects-delete": "پاك كردن",
        "withoutinterwiki": "بلگه یایی که هوم پیوند زون نارن",
        "longpages": "بلگه یا گپ",
        "deadendpages": "بلگه یا نابود بیئنی",
        "protectedpages": "بلگه یا حفاظت بيه",
+       "protectedpages-noredirect": "واگردونیا قام بیه",
        "protectedpages-page": "بلگه",
        "protectedpages-expiry": "تموم بیه آ",
        "protectedpages-performer": "کارور حفاظت بیه",
        "log": "نیسنن رخ ونیا",
        "all-logs-page": "همه پهرستنومه یا عمومی",
        "allpages": "همه بلگيا",
-       "alphaindexline": "$1 د\n$2",
        "nextpage": "بلگه نهایی($1)",
        "prevpage": "بلگه دمایی($1)",
        "allarticles": "همه بلگيا",
        "allpagessubmit": "رو",
        "allpagesbadtitle": "عنوان بلگه حاسته بیه معتور نی،یا  یه گل مئن زونی یا مئن ویکی عنوان غلطه.\nیه شایت شومل یکی با یا بیشتر کاراکتریا نبوئه که سی ای موضوعیا استفاده بوئن",
+       "allpages-hide-redirects": "واگردونیا قام بیه",
        "cachedspecial-refresh-now": "دیئن آخری.",
        "categories": "دسه يا",
        "deletedcontributions": "هومیاریا پاک بیه کارور",
        "blocklogentry": " [[$1]] وا یه گل وخت تموم بیئن $2 و $3  قلف بیه",
        "block-log-flags-nocreate": "حساو راس کردن عاجز بیه.",
        "block-log-flags-nousertalk": "نبوئه بلگه چک چنه خوتونه ویرایشت بکید",
+       "lockdb": "قلف کردن رسینه گا",
+       "unlockconfirm": "هره، مه واقعند میهام که رسینه گا وا بوئه.",
+       "unlockbtn": "رسینه گا قلف نبیه",
+       "lockdbsuccesssub": "رسینه گا د خوئی قلف بیه",
        "move-page": "$1 جا وه جا کو",
        "movenotallowed": "شما وه جا وه جا کردن بلگه دسرسی ناریت",
        "movenotallowedfile": "شما وه جا وه جا کردن جانیایا دسرسی ناریت",
        "movepagebtn": "بلگه جا وه جا کو",
+       "movepage-moved-redirect": "یه گل واگردونی دروس بیه.",
        "movelogpage": "جاوه جا کردن",
        "movelogpagetext": "د هار یه گل نوم گه د جا وه جایی یا بلگه هئ",
        "revertmove": "لرستن",
        "tooltip-ca-nstab-template": "ديئن قالو",
        "tooltip-ca-nstab-category": "ديئن بلگه دسه بنی",
        "tooltip-minoredit": "یه نه د عنوان حیرده ویرایشت ثوت کو",
-       "tooltip-save": "Ø¢Ù\84شتÙ\8aاتÙ\88Ù\86Ù\87 Ø°Ø®Ù\8aره بكيد",
+       "tooltip-save": "Ø¢Ù\84شتÙ\8aاتÙ\88Ù\86Ù\87 Ø§Ù\85اÛ\8cÛ\8cه بكيد",
        "tooltip-preview": "پیش سیل آلشتیاتو،لطفن پیش د ذخیره دش استفاده بکیتو",
        "tooltip-diff": "آلشتیا نه که شما د ای متن راس کردیته نشو بیئه",
        "tooltip-compareselectedversions": "فرخیا مینجا دو تا د دو بار دیئن ای بلگه نه بوینیت",
        "siteusers": "{{نوم سیل جا}} {{جمی:$2|کارور|کاروریا}} $1",
        "pageinfo-language": "بلگه مینونه زون",
        "pageinfo-content-model": "شلگ مینونه بلگه",
+       "pageinfo-redirects-name": "شماره واگردونیا ای بلگه",
+       "pageinfo-redirectsto": "واگردونی سی",
        "pageinfo-category-files": "شماره جانیایا",
        "patrol-log-page": "پهرستنومه گشتن",
        "filedeleteerror-short": "خطا پاک نبیئن جانیا:$1",
        "img-lang-go": "رو",
        "table_pager_limit_submit": "رو",
        "autosumm-replace": "مینونه وا \"َ$1\" جاگزین بی",
+       "autoredircomment": "بلگه واگردونی بیه سی[[$1]]",
        "watchlisttools-view": "آلشتیا مرتوط نه بوینیت",
        "watchlisttools-edit": "سیل برگ بوینیتو و ویرایشت بکید",
        "watchlisttools-raw": "سیل برگ نه ردیفی ویرایشت کو",
        "version-ext-colheader-version": "نسقه",
        "version-ext-colheader-license": "ليسانس",
        "version-ext-colheader-credits": "نیسنه یا",
+       "redirect": "واگردونی وا جانیا،بلگه یا وانیئری نوم دیارکو",
        "redirect-submit": "رو",
        "redirect-file": "نوم جانیا",
        "fileduplicatesearch-filename": "نوم جانیا:",
        "specialpages-group-media": "گزارشتیا رسانه و سوارکردیا",
        "specialpages-group-users": "کاروریا و حقوق",
        "specialpages-group-pages": "نوم گه بلگه یا",
+       "specialpages-group-redirects": "بلگه ویجه واگردونی بیه",
        "external_image_whitelist": "یه خط نه ول بکید چی وه<pre>",
        "tag-filter": "فيلتر [[Special:Tags|Tag]]:",
        "tags-display-header": "دیاری کردن د نوم گه آلشتیا",
index 781b149..fb25cc8 100644 (file)
        "qbmyoptions": "Manas lapas",
        "faq": "BUJ",
        "faqpage": "Project:BUJ",
-       "vector-action-addsection": "Jauna sadaļa",
-       "vector-action-delete": "Dzēst",
-       "vector-action-move": "Pārvietot",
-       "vector-action-protect": "Aizsargāt",
-       "vector-action-undelete": "Atjaunot",
-       "vector-action-unprotect": "Mainīt aizsardzību",
-       "vector-view-create": "Izveidot",
-       "vector-view-edit": "Labot",
-       "vector-view-history": "Hronoloģija",
-       "vector-view-view": "Skatīt",
-       "vector-view-viewsource": "Aplūkot kodu",
        "actions": "Darbības",
        "namespaces": "Vārdtelpas",
        "variants": "Varianti",
        "image_sample": "Piemers.jpg",
        "image_tip": "Ievietots attēls",
        "media_sample": "Piemers.ogg",
-       "media_tip": "Saite uz multimēdiju failu",
+       "media_tip": "Faila saite",
        "sig_tip": "Tavs paraksts ar laika atzīmi",
        "hr_tip": "Horizontāla līnija (neizmanto lieki)",
        "summary": "Kopsavilkums:",
        "expensive-parserfunction-category": "Lapas ar pārāk daudz laikietilpīgiem apstrādes funkciju izsaukumiem",
        "post-expand-template-inclusion-warning": "'''Brīdinājums:''' iekļauto veidņu izmērs ir par lielu.\nDažas veidnes netiks iekļautas.",
        "post-expand-template-inclusion-category": "Lapas, kurām pārsniegts iekļauto veidņu apjoms",
-       "post-expand-template-argument-warning": "'''Brīdinājums:''' Šī lapa satur vairāk neka vienu veidni argumentu, kas ir pārāk liels pec paplašināšanas.\nŠie argumenti ir izlaists.",
+       "post-expand-template-argument-warning": "'''Brīdinājums:''' Šī lapa satur vismaz vienu veidnes argumentu, kura lielums pēc paplašināšanas pārsniedz tehnisko limitu.\nVisi šādi argumenti tiks izlaisti.",
        "post-expand-template-argument-category": "Lapas, kurās ir izlaisti veidņu argumenti",
        "parser-template-loop-warning": "Veidne ir ievietota tādā pašā veidnē: [[$1]]",
        "undo-success": "Šo izmaiņu ir iespējams atcelt.\nLūdzu, pārbaudi zemāk redzamajā salīdzinājumā, vai tu to tiešām vēlies darīt, un pēc tam saglabā lapu, lai pabeigtu izmaiņas atcelšanu.",
        "diff-multi-manyusers": "({{PLURAL:$1|Viena starpversija|$1 starpversijas}}, ko saglabājuši vairāk nekā $2 {{PLURAL:$2|lietotājs|lietotāji}}, nav parādīta{{PLURAL:$1||s}})",
        "searchresults": "Meklēšanas rezultāti",
        "searchresults-title": "Meklēšanas rezultāti \"$1\"",
-       "toomanymatches": "Tika atgriezti poārāk daudzi rezultāti, lūdzu pamēģini citādāku pieprasījumu",
        "titlematches": "Rezultāti virsrakstos",
        "textmatches": "Rezultāti lapu tekstos",
        "notextmatches": "Neviena rezultāta, meklējot lapas tekstā",
        "searchmenu-exists": "'''Šajā projektā ir raksts ar nosaukumu \"[[:$1]]\"'''",
        "searchmenu-new": "'''Izveido rakstu \"[[:$1]]\" šajā projektā!'''",
        "searchprofile-articles": "Rakstos",
-       "searchprofile-project": "Palīdzības un projektu lapās",
        "searchprofile-images": "Multivides failos",
        "searchprofile-everything": "Visur",
        "searchprofile-advanced": "Izvēlēties sīkāk",
        "searchprofile-articles-tooltip": "Meklēt iekš $1",
-       "searchprofile-project-tooltip": "Meklēt iekš $1",
        "searchprofile-images-tooltip": "Meklēt attēlus, audio un video failus",
        "searchprofile-everything-tooltip": "Meklēt visur (ieskaitot diskusiju lapas)",
        "searchprofile-advanced-tooltip": "Izvēlēties nosaukumvietas, kurās meklēt",
        "search-interwiki-default": "Rezultāti no $1:",
        "search-interwiki-more": "(vairāk)",
        "search-relatedarticle": "Saistītais",
-       "searcheverything-enable": "Meklēt visās nosaukumvietās",
        "searchrelated": "saistītais",
        "searchall": "viss",
        "showingresults": "Šobrīd ir {{PLURAL:$1|redzama|redzamas}} '''$1''' {{PLURAL:$1|lapa|lapas}}, sākot ar #'''$2'''.",
        "allowemail": "Atļaut saņemt e-pastus no citiem lietotājiem",
        "prefs-searchoptions": "Meklēšana",
        "prefs-namespaces": "Vārdtelpas",
-       "defaultns": "Meklēt šajās vārdtelpās pēc noklusējuma:",
        "default": "pēc noklusējuma",
        "prefs-files": "Attēli",
        "prefs-custom-css": "Personīgais CSS",
        "prefs-emailconfirm-label": "E-pasta statuss:",
        "youremail": "Tava e-pasta adrese:",
        "username": "{{GENDER:$1|Lietotājvārds}}:",
-       "uid": "{{GENDER:$1|Lietotāja|Lietotājas}} ID:",
        "prefs-memberingroups": "Pieder {{PLURAL:$1|grupai|grupām}}:",
        "prefs-registration": "Reģistrēšanās datums:",
        "yourrealname": "Tavs īstais vārds:",
        "recentchanges-label-unpatrolled": "Šis labojums vēl nav pārbaudīts",
        "recentchanges-label-plusminus": "Par tik baitiem tika izmainīts lapas izmērs",
        "recentchanges-legend-heading": "'''Apzīmējumi:'''",
-       "recentchanges-legend-newpage": "(skatīt arī [[Special:NewPages|jaunās lapas]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (skatīt arī [[Special:NewPages|jaunās lapas]])",
        "rcnotefrom": "Šobrīd redzamas izmaiņas kopš '''$2''' (parādītas ne vairāk par '''$1''').",
        "rclistfrom": "Parādīt jaunas izmaiņas kopš $3 $2",
        "rcshowhideminor": "$1 maznozīmīgos",
        "logempty": "Reģistrā nav atbilstošu ierakstu.",
        "log-title-wildcard": "Meklēt virsrakstus, kas sākas ar šo tekstu",
        "allpages": "Visas lapas",
-       "alphaindexline": "no $1 līdz $2",
        "nextpage": "Nākamā lapa ($1)",
        "prevpage": "Iepriekšējā lapa ($1)",
        "allpagesfrom": "Parādīt lapas sākot ar:",
index bea4e6f..e372e99 100644 (file)
        "qbmyoptions": "Ny pejiko",
        "faq": "FMM",
        "faqpage": "Project:FMM",
-       "vector-action-addsection": "Hanampy lohahevitra",
-       "vector-action-delete": "Fafana",
-       "vector-action-move": "Hanolo anarana",
-       "vector-action-protect": "Arovy",
-       "vector-action-undelete": "Avereno",
-       "vector-action-unprotect": "Hanala ny fiarovana",
-       "vector-view-create": "Foronona",
-       "vector-view-edit": "Hanova",
-       "vector-view-history": "Hijery ny tantara",
-       "vector-view-view": "Hamaky",
-       "vector-view-viewsource": "Hijery fango",
        "actions": "Tao",
        "namespaces": "Valam-pejy",
        "variants": "Ny ''skin'' Voasintona",
        "difference-missing-revision": "Tsy hita ny versiona $2{{PLURAL:$2||}} ny fahasamihafanna ($1) an'ity pejy ity.\n\nVokatry ny fanarahana rohy fampitahana lany daty mankany amy pejy efa voafafa izan . Ho hita eo amin'ny [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} laogim-pamafàna] ny antsipirihany.",
        "searchresults": "Valim-pikarohana",
        "searchresults-title": "Valim-pikarohana ho an'ny « $1 »",
-       "toomanymatches": "Betsaka loatra ny isan'ny mitovy naverina, mametraha fangatahana hafa.",
        "titlematches": "Mifanitsy amin'ny lohatenin'ny lahatsoratra",
        "textmatches": "Mifanitsy amin'ny votoatin'ny pejy",
        "notextmatches": "Tsy nahitana votoatim-pejy mifanaraka",
        "search-interwiki-default": "Valiny amin'ny $1 :",
        "search-interwiki-more": "(be kokoa)",
        "search-relatedarticle": "voadinika",
-       "searcheverything-enable": "Hitady anatin'ny anaran-tsehatra rehetra:",
        "searchrelated": "voadinika",
        "searchall": "rehetra",
        "showingresults": "Omeo ny valiny{{PLURAL:$1||}} miisa hatramin'ny <b>$1</b> manomboka ny #<b>$2</b>.",
        "allowemail": "Hanaiky ny fandefasana mailaka avy amin'ny mpikambana hafa",
        "prefs-searchoptions": "Karoka",
        "prefs-namespaces": "Toeran'anarana",
-       "defaultns": "Fikarohana tsipalotra anatin'ireo anaran-tsehatra ireo :",
        "default": "tsipalotra",
        "prefs-files": "Rakitra",
        "prefs-custom-css": "CSS manokana",
        "recentchanges-label-unpatrolled": "Ity fanovana ity dia mbola tsy voamarina",
        "recentchanges-label-plusminus": "IO ny isan'ny oktety niova tamin'ilay pejy",
        "recentchanges-legend-heading": "'''Maribolana:'''",
-       "recentchanges-legend-newpage": "(jereo koa ny [[Special:NewPage|lisitry ny pejy vaovao]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (jereo koa ny [[Special:NewPage|lisitry ny pejy vaovao]])",
        "rcnotefrom": "Ity eto ambany ity ny lisitry ny vao niova manomboka ny <b>$2</b> (hatramin'ny <b>$1</b> no miseho).",
        "rclistfrom": "Asehoy izay vao niova manomboka ny $3 $2",
        "rcshowhideminor": "$1 ny fanovàna kely",
        "tooltip-undo": "Manala n'io fanovàna io ilay rohy « esory ».\nMamerina ny version taloha io asa io ary afaka manometraka ny antony anatin'ny ambangovangony.",
        "tooltip-preferences-save": "Tehirizina ny safidy",
        "tooltip-summary": "Atsofohy eo ambangovangony fohifohy",
-       "monobook.css": "/* Ovay ity rakitra ity raha hampiasa takilan'angaly (stylesheet) anao manokana amin'ny wiki iray manontolo */",
        "anonymous": "Mpikambana {{PLURAL:$1}} tsy mitonona anarana eto amin'ny {{SITENAME}}",
        "siteuser": "{{SITENAME}} mpikambana $1",
        "anonuser": "ny mpikambana tsy nisoratra anarana $1 an'i {{SITENAME}}",
index df1ce4f..1ce7021 100644 (file)
        "usercsspreview": "'''Ingeklah bahawa Sanak sadang manampilan pratayang dari CSS Sanak.\nPratayang iko alun disimpan!'''",
        "userjspreview": "'''Ingeklah bahawa nan Sanak liek hanyolah pratayang JavaScript Sanak, dan bahawa pratayang tasabuik alun disimpan!'''",
        "sitecsspreview": "'''Ingeklah bahawa Sanak hanyo manampilan pratayang dari CSS iko.'''\n'''Parubahan alun disimpan!'''",
-       "sitejspreview": "'''Ingeklah bahawa Sanak hanyo manampilan pratayang dari Kode JavaScript iko.'''\n'''Parubahan alun disimpan!'''",
+       "sitejspreview": "<strong>Ingek! Sanak hanyo manampilan pratonton kode JavaScript ko. Parubahan alun basimpan!</strong>",
        "userinvalidcssjstitle": "'''Paringatan:''' Kulik \"$1\" indak ditamuan. Harap diingek bahawa laman .css dan .js manggunokan huruf kecil, contoh {{ns:user}}:Foo/vector.css dan bukannyo {{ns:user}}:Foo/Vector.css.",
        "updated": "(Dipabaharui)",
        "note": "'''Catatan:'''",
        "searchmenu-exists": "'''Ado laman nan banamo \"[[:$1]]\" pado wiki ko.'''",
        "searchmenu-new": "'''Buek laman \"[[:$1]]\" di wiki ko!'''",
        "searchprofile-articles": "Laman isi",
-       "searchprofile-project": "Laman Bantuan jo Proyek",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Sadonyo",
        "searchprofile-advanced": "Labiah lanjuik",
        "searchprofile-articles-tooltip": "Cari di $1",
-       "searchprofile-project-tooltip": "Cari di $1",
        "searchprofile-images-tooltip": "Cari untuak berkas",
        "searchprofile-everything-tooltip": "Cari kasadonyo (tamasuak laman rundiang)",
        "searchprofile-advanced-tooltip": "Pacarian di ruang namo tatantu",
        "search-interwiki-default": "Hasil $1:",
        "search-interwiki-more": "(salanjuiknyo)",
        "search-relatedarticle": "Bakaitan",
-       "searcheverything-enable": "Cari kasado ruangnamo",
        "searchrelated": "bakaitan",
        "searchall": "sado",
        "showingresults": "Di bawah ko dikaluaan sampai {{PLURAL:$1|'''$1''' hasil}}, dimulai dari #'''$2'''.",
        "allowemail": "Izinkan pangguno lain mangirim surel",
        "prefs-searchoptions": "Cari",
        "prefs-namespaces": "Ruangnamo",
-       "defaultns": "Ataupun cari dalam ruangnamo ko:",
        "default": "baku",
        "prefs-files": "Berkas",
        "prefs-custom-css": "CSS paribadi",
        "prefs-emailconfirm-label": "Surel konfirmasi:",
        "youremail": "Surel:",
        "username": "{{GENDER:$1|Namo pangguno}}:",
-       "uid": "ID {{GENDER:$1|pangguno}}:",
        "prefs-memberingroups": "{{GENDER:$2|Anggota}} {{PLURAL:$1|kalompok}}:",
        "prefs-registration": "Wakatu pandaftaran:",
        "yourrealname": "Namo asli:",
        "log-title-wildcard": "Cari judul nan diawali jo teks ko",
        "showhideselectedlogentries": "Tunjuakan/Suruakan entri log tapiliah",
        "allpages": "Kasado laman",
-       "alphaindexline": "$1 sampai $2",
        "nextpage": "Laman salanjuiknyo ($1)",
        "prevpage": "Laman sabalunnyo ($1)",
        "allpagesfrom": "Tunjuakan laman mulai dari:",
        "blockip": "Sakek pangguno",
        "blockip-legend": "Sakek pangguno",
        "blockiptext": "Gunoan formulir di bawah ko untuak manyakek akses dari sabuah alamaik IP atau pangguno.\nIko hanyo buliah dilakuan untuak mancagah vandal, dan sajalan jo [[{{MediaWiki:Policy-url}}|kabijakan]].\nMasuakan alasan sakek di bawah (contoh, mambuek karusakan atau vandal).",
-       "ipadressorusername": "Alamaik IP atau namo pangguno:",
+       "ipaddressorusername": "Alamaik IP atau namo pangguno:",
        "ipbexpiry": "Sampai:",
        "ipbreason": "Alasan:",
        "ipbreason-dropdown": "*Alasan umum sakek\n** Marusak (vandal)\n** Mangagiah informasi palsu\n** Mangilangkan isi laman\n** Spam pautan ka situs lua\n** Mambuek ota gadang di laman\n** Babuek intimidasi/palecehan\n** Manyalahgunoan babarapo akun\n** Namo pangguno talarang\n** Bot alun ado bot flag",
        "pageinfo-category-pages": "Jumlah laman",
        "pageinfo-category-subcats": "Jumlah subkategori",
        "pageinfo-category-files": "Jumlah berkas",
-       "skinname-cologneblue": "Biru Köln",
        "skinname-monobook": "MonoBook",
-       "skinname-modern": "Moderen",
        "skinname-vector": "Vektor",
        "markaspatrolleddiff": "Tandoi lah dipatroli",
        "markaspatrolledtext": "Tandoi laman ko lah dipatroli",
        "newimages-summary": "Laman istimewa barikuik manunjuakan daftar berkas nan tarakhia dimuek",
        "newimages-legend": "Panyariang",
        "newimages-label": "Namo berkas (atau sabagian darinyo):",
-       "showhidebots": "($1 bot)",
        "noimages": "Indak ado nan dicaliak.",
        "ilsubmit": "Cari",
        "bydate": "jo tanggal",
index 9bb0619..c772ddf 100644 (file)
        "qbmyoptions": "Мои страници",
        "faq": "ЧПП",
        "faqpage": "Project:ЧПП",
-       "vector-action-addsection": "Додај тема",
-       "vector-action-delete": "Избриши",
-       "vector-action-move": "Премести",
-       "vector-action-protect": "Заштити",
-       "vector-action-undelete": "Врати",
-       "vector-action-unprotect": "Измени заштита",
-       "vector-view-create": "Создај",
-       "vector-view-edit": "Уреди",
-       "vector-view-history": "Историја",
-       "vector-view-view": "Читај",
-       "vector-view-viewsource": "Извор",
        "actions": "Дејства",
        "namespaces": "Именски простори",
        "variants": "Варијанти",
        "currentrev": "Тековна преработка",
        "currentrev-asof": "Последна преработка од $1",
        "revisionasof": "Преработка од $1",
-       "revision-info": "Преработка од $1; направена од $2",
+       "revision-info": "Преработка од $1; направена од {{GENDER:$6|$2}}$7",
        "previousrevision": "← Претходна преработка",
        "nextrevision": "Следна преработка →",
        "currentrevisionlink": "Последна преработка",
        "mergehistory-empty": "Нема преработки кои можат да се спојат.",
        "mergehistory-success": "$3 {{PLURAL:$3|преработка |преработки}} на [[:$1]] успешно {{PLURAL:$3|е споена|се споени}} во [[:$2]].",
        "mergehistory-fail": "Не е возможно да се направи спојување на историјата, проверете ја страницата и временските параметри.",
+       "mergehistory-fail-toobig": "Не можам да извршам спојување на историјата бидејќи така ќе се надмине границата од {{PLURAL:$1|една преработка|$1 преработки}}.",
        "mergehistory-no-source": "Изворната страница $1 не постои.",
        "mergehistory-no-destination": "Целната страница $1 не постои.",
        "mergehistory-invalid-source": "Изворната страница мора да има важечки наслов.",
        "difference-missing-revision": "Не пронајдов {{PLURAL:$2|една преработка|$2 преработки}} од оваа разлика ($1).\n\nОва обично се должи на застарена врска за разлики што води кон избришана страница.\nПовеќе подробности ќе најдете во [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневникот на бришења].",
        "searchresults": "Резултати од пребарувањето",
        "searchresults-title": "Резултати од пребарувањето на „$1“",
-       "toomanymatches": "Премногу резултати од пребарувањето, ве молиме обидете се со поинакво барање",
        "titlematches": "Совпаднати наслови",
        "textmatches": "Совпаднат текст во страниците",
        "notextmatches": "Ниеден текст во статиите не одговара",
        "searchmenu-exists": "'''На ова вики има страница со наслов „[[:$1]]“'''",
        "searchmenu-new": "<strong>Создајте ја страницата „[[:$1]]“ на ова вики!</strong> {{PLURAL:$2|0=|Погледајте ја и страницата најдена со пребарувањето.|Погледајте ги и најдените резултати од пребарувањето.}}",
        "searchprofile-articles": "Статии",
-       "searchprofile-project": "Помош и проектни страници",
        "searchprofile-images": "Податотеки",
        "searchprofile-everything": "Сè",
        "searchprofile-advanced": "Напредно",
        "searchprofile-articles-tooltip": "Пребарување во $1",
-       "searchprofile-project-tooltip": "Пребарување во $1",
        "searchprofile-images-tooltip": "Пребарување на податотеки",
        "searchprofile-everything-tooltip": "Пребарување по сета содржина (вклучувајќи страници за разговор)",
        "searchprofile-advanced-tooltip": "Пребарување во именски простори по избор",
        "search-interwiki-default": "Најдено на $1:",
        "search-interwiki-more": "(уште)",
        "search-relatedarticle": "Поврзано",
-       "searcheverything-enable": "Барај во сите именски простори",
        "searchrelated": "поврзано",
        "searchall": "сè",
        "showingresults": "Подолу {{PLURAL:$1|е прикажан '''1''' резултат|се прикажани '''$1''' резултати}} почнувајќи од бр. '''$2'''.",
        "powersearch-togglelabel": "Одбери:",
        "powersearch-toggleall": "Сè",
        "powersearch-togglenone": "Ништо",
+       "powersearch-remember": "Запамти го изборот за идни пребарувања",
        "search-external": "Надворешно пребарување",
        "searchdisabled": "{{SITENAME}} пребарувањето е оневозможено.\nВо меѓувреме, можете да пребарувате преку Google.\nДа напоменеме дека нивното индексирање на {{SITENAME}} содржините може да биде застарено.",
        "search-error": "Се појави грешка при пребарувањето: $1",
        "allowemail": "Дозволи е-пошта од други корисници",
        "prefs-searchoptions": "Пребарување",
        "prefs-namespaces": "Именски простори",
-       "defaultns": "Инаку пребарувај во овие именски простори:",
        "default": "по основно",
        "prefs-files": "Податотеки",
        "prefs-custom-css": "Посебно CSS",
        "recentchanges-label-unpatrolled": "Ова уредување сè уште не е испатролирано",
        "recentchanges-label-plusminus": "Промена на големината на страницата во бајти",
        "recentchanges-legend-heading": "'''Легенда:'''",
-       "recentchanges-legend-newpage": "(погл. и [[Special:NewPages|списокот на нови страници]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (погл. и [[Special:NewPages|списокот на нови страници]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Подолу се промените направени од <strong>$2</strong> наваму (се прикажуваат до <b>$1</b>).",
        "rclistfrom": "Прикажи нови промени почнувајќи од $3 $2",
        "largefileserver": "Големината на оваа податотека е поголема од максимално дозволената големина од серверот.",
        "emptyfile": "Податотеката што ја подигнавте е празна.\nОва може да се должи на грешка во нејзиното име.\nПроверете дали навистина сакате да ја подигнете ваквата податотека.",
        "windows-nonascii-filename": "Опслужувачот не поддржува податотечни имиња со специјални знаци.",
-       "fileexists": "Податотека со ова име веќе постои, проверете <strong>[[:$1]]</strong> ако не сте сигурни дали сакате да го промените.\n[[$1|thumb]]",
+       "fileexists": "Податотека со ова име веќе постои. Проверете <strong>[[:$1]]</strong> ако не {{GENDER:|сте}} сигурни дали сакате да ја промените.\n[[$1|thumb]]",
        "filepageexists": "Страницата за опис на оваа податотека е веќе создадена на <strong>[[:$1]]</strong>, но не постои податотека со тоа име.\nОписот кој го внесовте нема да стои на страницата за опис.\nДоколку сакате описот да стои тука, ќе морате да го уредите рачно.\n[[$1|thumb]]",
-       "fileexists-extension": "Податотека со слично име веќе постои: [[$2|thumb]]\n* Име на податотека која се подигнува: <strong>[[:$1]]</strong>\n* Име на постоечка податотека: <strong>[[:$2]]</strong>\nВе молиме изберете друго име за податотеката.",
+       "fileexists-extension": "Податотека со слично име веќе постои: [[$2|thumb]]\n* Име на податотека која се подигнува: <strong>[[:$1]]</strong>\n* Име на постоечката податотека: <strong>[[:$2]]</strong>\nДали можеби би сакале да користите покарактеристично име.",
        "fileexists-thumbnail-yes": "Се чини дека податотеката е слика со намалена големина ''(минијатура)''. [[$1|thumb]]\nПроверете ја податотеката <strong>[[:$1]]</strong>.\nАко податотеката која ја проверувате е истата слика во својата изворна големина тогаш не мора да ја подигате дополнително.",
        "file-thumbnail-no": "Името на податотеката почнува со <strong>$1</strong>.\nИзгледа дека е слика со намалена големина ''(мини, thumbnail)''.\nАко ја имате оваа слика во изворна големина, подигнете ја неја. Во спротивно сменете го името на податотеката.",
        "fileexists-forbidden": "Податотека со тоа име веќе постои и не може да биде заменета.\nАко и понатаму сакате да ја подигнете вашата податотеката, ве молиме вратете се назад и подигнете ја под друго име. [[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Бришење и враќање на податотеки е привремено оневозможено поради одржување на базата на податоци.",
        "filedelete-maintenance-title": "Не можам да ја избришам податотеката",
        "mimesearch": "Пребарување по MIME",
-       "mimesearch-summary": "Ð\9eваа Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¾Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ñ\83ва Ñ\84илÑ\82Ñ\80иÑ\80аÑ\9aе Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82еки Ð²Ñ\80з Ð¾Ñ\81нова Ð½Ð° Ð½Ð¸Ð²Ð½Ð¸Ð¾Ñ\82 MIME-Ñ\82ип.\nФоÑ\80маÑ\82 Ð½Ð° Ð²Ð½Ð¾Ñ\81: Ñ\82ип Ð½Ð° Ñ\81одÑ\80жина/поÑ\82Ñ\82ип, на пр. <code>image/jpeg</code>.",
+       "mimesearch-summary": "Ð\9eваа Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¾Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ñ\83ва Ñ\84илÑ\82Ñ\80иÑ\80аÑ\9aе Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82еки Ð²Ñ\80з Ð¾Ñ\81нова Ð½Ð° Ð½Ð¸Ð²Ð½Ð¸Ð¾Ñ\82 MIME-Ñ\82ип.\nÐ\92ноÑ\81: Ñ\82ипнаÑ\81одÑ\80жина/поÑ\82Ñ\82ип Ð¸Ð»Ð¸ Ñ\82ипнаÑ\81одÑ\80жина/, на пр. <code>image/jpeg</code>.",
        "mimetype": "MIME-тип:",
        "download": "преземи",
        "unwatchedpages": "Ненабљудувани страници",
        "wantedtemplates": "Потребни шаблони",
        "mostlinked": "Најмногу врски до страници",
        "mostlinkedcategories": "Најмногу врски до категории",
-       "mostlinkedtemplates": "Ð\9dаÑ\98многÑ\83 Ð²Ñ\80Ñ\81ки ÐºÐ¾Ð½ Ñ\88аблони",
+       "mostlinkedtemplates": "Ð\9dаÑ\98многÑ\83 Ð¿Ñ\80евмеÑ\82наÑ\82и Ñ\81Ñ\82Ñ\80аниÑ\86и",
        "mostcategories": "Страници со најмногу категории",
        "mostimages": "Најмногу врски до податотеки",
        "mostinterwikis": "Страници со најмногу меѓувики",
        "tooltip-preferences-save": "Зачувај",
        "tooltip-summary": "Внесете краток опис",
        "interlanguage-link-title": "$1 — $2",
+       "interlanguage-link-title-nonlang": "$1 — $2",
        "common.css": "/* Тука поставениот CSS ќе се применува врз сите рува */",
-       "cologneblue.css": "/* Тука поставениот CSS ќе се применува врз корисниците што го избрале рувото „Келнско сино“ */",
-       "monobook.css": "/* Тука поставениот CSS ќе се применува врз корисниците на рувото „Монобук“ */",
-       "modern.css": "/* Тука поставениот CSS се однесува на корисниците на рувото „Современо“ */",
-       "vector.css": "/* Тука поставениот CSS се однесува на корисниците на рувото „Векторско“ */",
        "print.css": "/* Тука поставениот CSS ќе се применува во верзијата за печатење */",
        "noscript.css": "/* Тука поставениот CSS се однесува на корисниците што имаат оневозможено JavaScript */",
        "group-autoconfirmed.css": "/* Тука поставениот CSS ќе се применува само на автопотврдените корисници */",
        "group-sysop.css": "/* Тука поставениот CSS ќе се применува само врз системските оператори */",
        "group-bureaucrat.css": "/* Тука поставениот CSS ќе се применува само врз бирократите */",
        "common.js": "/* Тука поставениот JavaScript ќе им се вчитува на сите корисници при отворањето на секоја страница. */",
-       "cologneblue.js": "/* Тука поставениот JavaScript  ќе им се вчитува на корисниците што го користат рувото „Келнско сино“ */",
-       "monobook.js": "/* Тука поставениот JavaScript  ќе им се вчитува на корисниците што го користат рувото „Монобук“ */",
-       "modern.js": "/* Било која Јава скрипта поставена овде ќе биде вчитана за сите корисници што го користат рувото Современо */",
-       "vector.js": "/* Тука поставениот JavaScript  ќе им се вчитува на корисниците што го користат рувото „Векторско“ */",
        "group-autoconfirmed.js": "/* Тука поставениот JavaScript  ќе им се вчитува само на автопотврдените корисници */",
        "group-user.js": "/* Тука поставениот JavaScript  ќе им се вчитува само на регистрираните корисници */",
        "group-bot.js": "/* Тука поставениот JavaScript  ќе им се вчитува само на ботовите */",
        "pageinfo-category-pages": "Број на страници",
        "pageinfo-category-subcats": "Број на поткатегории",
        "pageinfo-category-files": "Број на податотеки",
-       "skinname-cologneblue": "Келнско сино",
-       "skinname-monobook": "Монобук",
-       "skinname-modern": "Современо",
-       "skinname-vector": "Векторско",
        "markaspatrolleddiff": "Означи како проверена верзија",
        "markaspatrolledtext": "Означи ја верзијата како проверена",
        "markedaspatrolled": "Означено како проверено",
        "version-hook-name": "Име на кука",
        "version-hook-subscribedby": "Претплатено од",
        "version-version": "(Верзија $1)",
+       "version-no-ext-name": "[нема име]",
        "version-svn-revision": "прер. $1",
        "version-license": "Лиценца на МедијаВики",
        "version-ext-license": "Лиценца",
index 9c59c20..6f1a12c 100644 (file)
        "qbmyoptions": "എന്റെ താളുകൾ",
        "faq": "പതിവുചോദ്യങ്ങൾ",
        "faqpage": "Project:പതിവുചോദ്യങ്ങൾ",
-       "vector-action-addsection": "വിഷയം ചേർക്കുക",
-       "vector-action-delete": "മായ്ക്കുക",
-       "vector-action-move": "തലക്കെട്ട് മാറ്റുക",
-       "vector-action-protect": "സം‌രക്ഷിക്കുക",
-       "vector-action-undelete": "മായ്ക്കപ്പെട്ടത് പുനഃസ്ഥാപിക്കുക",
-       "vector-action-unprotect": "സംരക്ഷണത്തിൽ മാറ്റംവരുത്തുക",
-       "vector-view-create": "സൃഷ്ടിക്കുക",
-       "vector-view-edit": "തിരുത്തുക",
-       "vector-view-history": "നാൾവഴി കാണുക",
-       "vector-view-view": "വായിക്കുക",
-       "vector-view-viewsource": "മൂലരൂപം കാണുക",
        "actions": "നടപടികൾ",
        "namespaces": "നാമമേഖല",
        "variants": "രൂപഭേദങ്ങൾ",
        "currentrev": "ഇപ്പോഴുള്ള രൂപം",
        "currentrev-asof": "$1 -ൽ നിലവിലുള്ള രൂപം",
        "revisionasof": "$1-നു നിലവിലുണ്ടായിരുന്ന രൂപം",
-       "revision-info": "$1-നു ഉണ്ടായിരുന്ന രൂപം സൃഷ്ടിച്ചത്:- $2",
+       "revision-info": "$1-നു ഉണ്ടായിരുന്ന രൂപം സൃഷ്ടിച്ചത്:- {{GENDER:$6|$2}}$7",
        "previousrevision": "←പഴയ രൂപം",
        "nextrevision": "പുതിയ രൂപം→",
        "currentrevisionlink": "ഇപ്പോഴുള്ള രൂപം",
        "difference-missing-revision": "ഈ വ്യത്യാസത്തിൽ ($1) {{PLURAL:$2|ഒരു നാൾപ്പതിപ്പ്|$2 നാൾപ്പതിപ്പുകൾ}} കാണാനായില്ല.\n\nമായ്ക്കപ്പെട്ട താളിന്റെ കാലഹരണപ്പെട്ട നാൾവഴി കണ്ണി ഉപയോഗിച്ചാലാണ് സാധാരണ ഇങ്ങനെ സംഭവിക്കുക.\nകൂടുതൽ വിവരങ്ങൾ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} മായ്ക്കൽ രേഖയിൽ] കാണാവുന്നതാണ്.",
        "searchresults": "തിരച്ചിലിന്റെ ഫലം",
        "searchresults-title": "\"$1\" എന്നു തിരഞ്ഞതിനു ലഭ്യമായ ഫലങ്ങൾ",
-       "toomanymatches": "യോജിച്ച ഫലങ്ങൾ വളരെയധികം കിട്ടിയിരിക്കുന്നു; ദയവായി വേറൊരു അന്വേഷണ വാക്ക് ഉപയോഗിച്ച് തിരയുക.",
        "titlematches": "താളിന്റെ തലക്കെട്ടുമായി യോജിക്കുന്ന ഫലങ്ങൾ",
        "textmatches": "താങ്കൾ തിരഞ്ഞ വാക്കുകൾ ഉള്ള താളുകൾ",
        "notextmatches": "താളുകളുടെ ഉള്ളടക്കത്തിൽ താങ്കൾ തിരഞ്ഞ വാക്കുമായി യോജിക്കുന്ന ഫലങ്ങൾ ഒന്നും തന്നെയില്ല",
        "search-interwiki-default": "$1 വിക്കിയിൽ നിന്നുള്ള ഫലങ്ങൾ:",
        "search-interwiki-more": "(കൂടുതൽ)",
        "search-relatedarticle": "ബന്ധപ്പെട്ടവ",
-       "searcheverything-enable": "എല്ലാ നാമമേഖലകളും തിരയുക",
        "searchrelated": "ബന്ധപ്പെട്ടവ",
        "searchall": "എല്ലാം",
        "showingresults": "'''$2''' മുതലുള്ള {{PLURAL:$1|'''ഒരു''' ഫലം|'''$1''' ഫലങ്ങൾ}} താഴെ പ്രദർശിപ്പിക്കുന്നു.",
        "powersearch-togglelabel": "അടയാളപ്പെടുത്തുക:",
        "powersearch-toggleall": "എല്ലാം",
        "powersearch-togglenone": "ഒന്നുംവേണ്ട",
+       "powersearch-remember": "ഭാവിയിലെ തിരച്ചിലുകൾക്കായി ഇപ്പോൾ തിരഞ്ഞെടുത്തവ ഓർത്തുവെയ്ക്കുക",
        "search-external": "ബാഹ്യ അന്വേഷണം",
        "searchdisabled": "{{SITENAME}} സം‌രംഭത്തിൽ തിരച്ചിൽ ദുർബലപ്പെടുത്തിയിരിക്കുന്നു. താങ്കൾക്ക് ഗൂഗിൾ ഉപയോഗിച്ച് തത്കാലം തിരച്ചിൽ നടത്താവുന്നതാണ്‌. പക്ഷെ ഗൂഗിളിൽ {{SITENAME}} സം‌രംഭത്തിന്റെ സൂചിക കാലഹരണപ്പെട്ടതായിരിക്കാൻ സാദ്ധ്യതയുണ്ട്.",
        "search-error": "തിരയുന്നതിനിടെ ഒരു പിഴവുണ്ടായി: $1",
        "allowemail": "എനിക്ക് എഴുത്തയക്കാൻ മറ്റുള്ളവരെ അനുവദിക്കുക",
        "prefs-searchoptions": "തിരച്ചിൽ",
        "prefs-namespaces": "നാമമേഖലകൾ",
-       "defaultns": "അല്ലെങ്കിൽ ഈ നാമമേഖലകളിൽ തിരയുക:",
        "default": "സ്വതേ",
        "prefs-files": "പ്രമാണങ്ങൾ",
        "prefs-custom-css": "സ്വന്തം സി.എസ്.എസ്.",
        "action-viewmyprivateinfo": "താങ്കളുടെ സ്വകാര്യവിവരങ്ങൾ കാണുക",
        "action-editmyprivateinfo": "താങ്കളുടെ സ്വകാര്യവിവരങ്ങൾ തിരുത്തുക",
        "nchanges": "{{PLURAL:$1|ഒരു മാറ്റം|$1 മാറ്റങ്ങൾ}}",
-       "enhancedrc-since-last-visit": "കഴിഞ്ഞ സന്ദർശനത്തിനു ശേഷം {{PLURAL:$1|ഒരെണ്ണം|$1 എണ്ണം}}.",
+       "enhancedrc-since-last-visit": "കഴിഞ്ഞ സന്ദർശനത്തിനു ശേഷം {{PLURAL:$1|ഒരെണ്ണം|$1 എണ്ണം}}",
        "enhancedrc-history": "നാൾവഴി",
        "recentchanges": "സമീപകാല മാറ്റങ്ങൾ",
        "recentchanges-legend": "സമീപകാല മാറ്റങ്ങളുടെ ക്രമീകരണം",
        "recentchanges-label-unpatrolled": "ഇതുവരെ റോന്തുചുറ്റപ്പെടാത്ത തിരുത്ത്",
        "recentchanges-label-plusminus": "താളിന്റെ വലിപ്പം ഇത്രയും ബൈറ്റുകൾ മാറിയിരിക്കുന്നു",
        "recentchanges-legend-heading": "'''സൂചന:'''",
-       "recentchanges-legend-newpage": "([[Special:NewPages|പുതിയ താളുകളുടെ പട്ടികയും]] കാണുക)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|പുതിയ താളുകളുടെ പട്ടികയും]] കാണുക)",
        "rcnotefrom": "<strong>$2</strong> മുതലുള്ള മാറ്റങ്ങൾ (<strong>$1</strong> എണ്ണം വരെ കാണാം).",
        "rclistfrom": "$3 $2 മുതലുള്ള മാറ്റങ്ങൾ പ്രദർശിപ്പിക്കുക",
        "rcshowhideminor": "ചെറുതിരുത്തലുകൾ $1",
        "largefileserver": "സെർവറിൽ ചിട്ടപ്പെടുത്തിയതുപ്രകാരം ഈ പ്രമാണത്തിന്റെ വലിപ്പം അനുവദനീയമായതിലും കൂടുതലാണ്‌.",
        "emptyfile": "താങ്കൾ അപ്‌ലോഡ് ചെയ്ത പ്രമാണം ശൂന്യമാണെന്നു കാണുന്നു.\nപ്രമാണത്തിന്റെ പേരിലുള്ള അക്ഷരത്തെറ്റായിരിക്കാം ഇതിനു കാരണം.\nഈ പ്രമാണം അപ്‌ലോഡ് ചെയ്യണോ എന്നൊരിക്കൽ കൂടി പരിശോധിക്കുക.",
        "windows-nonascii-filename": "പ്രത്യേകാക്ഷരങ്ങളുള്ള പ്രമാണനാമങ്ങൾ ഈ വിക്കി പിന്തുണയ്ക്കുന്നില്ല.",
-       "fileexists": "ഇതേ പേരിൽ വേറെ ഒരു പ്രമാണം നിലവിലുണ്ട്.\nദയവായി <strong>[[:$1]]</strong> പരിശോധിച്ച് പ്രസ്തുത പ്രമാണം മാറ്റണമോ എന്നു തീരുമാനിക്കുക.\n[[$1|thumb]]",
+       "fileexists": "ഇതേ പേരിൽ വേറെ ഒരു പ്രമാണം നിലവിലുണ്ട്.\nദയവായി <strong>[[:$1]]</strong> പരിശോധിച്ച് പ്രസ്തുത പ്രമാണം {{GENDER:|മാറ്റണമോ}} എന്നു തീരുമാനിക്കുക.\n[[$1|thumb]]",
        "filepageexists": "ഈ പ്രമാണത്തിനുള്ള വിവരണതാൾ <strong>[[:$1]]</strong> എന്നു സൃഷ്ടിക്കപ്പെട്ടിട്ടുണ്ട്, പക്ഷേ ഇതേ പേരിൽ പ്രമാണം ഒന്നും നിലവിലില്ല.\nവിവരണതാളിൽ താങ്കൾ ഇവിടെ ചേർക്കുന്ന ലഘുകുറിപ്പ് പ്രത്യക്ഷപ്പെടുന്നതല്ല.\nഅവിടെ ലഘുകുറിപ്പ് വരാൻ ആ താൾ താങ്കൾ സ്വയം തിരുത്തേണ്ടതാണ്.\n[[$1|ലഘുചിത്രം]]",
        "fileexists-extension": "ഇതേ പേരിൽ മറ്റൊരു പ്രമാണം നിലവിലുണ്ട്: [[$2|ലഘുചിത്രം]]\n* ഇപ്പോൾ അപ്‌ലോഡ് ചെയ്ത പ്രമാണത്തിന്റെ പേര്‌: <strong>[[:$1]]</strong>\n* നിലവിലുള്ള പ്രമാണത്തിന്റെ പേര്‌: <strong>[[:$2]]</strong>\nമറ്റൊരു പേരു തിരഞ്ഞെടുക്കുക.",
        "fileexists-thumbnail-yes": "ഈ ചിത്രം വലിപ്പം കുറച്ച ഒന്നാണെന്നു ''(ലഘുചിത്രം)'' കാണുന്നു.\n[[$1|ലഘുചിത്രം]]\nദയവായി <strong>[[:$1]]</strong> എന്ന ചിത്രം പരിശോധിക്കുക.\n[[:$1]] എന്ന ചിത്രവും ഈ ചിത്രവും ഒന്നാണെങ്കിൽ ലഘുചിത്രത്തിനു വേണ്ടി മാത്രമായി ചിത്രം അപ്‌ലോഡ് ചെയ്യേണ്ടതില്ല.",
        "wantedtemplates": "അവശ്യ ഫലകങ്ങൾ",
        "mostlinked": "ഏറ്റവുമധികം കണ്ണികളാൽ ചേർത്തിരിക്കുന്ന താളുകൾ",
        "mostlinkedcategories": "ഏറ്റവുമധികം താളുകൾ ചേർത്തിട്ടുള്ള വർഗ്ഗങ്ങൾ",
-       "mostlinkedtemplates": "à´\8fà´±àµ\8dറവàµ\81മധിà´\95à´\82 à´\95à´£àµ\8dണി à´\9aàµ\87ർതàµ\8dതിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ à´«à´²à´\95à´\99àµ\8dà´\99ൾ",
+       "mostlinkedtemplates": "à´\8fà´±àµ\8dറവàµ\81മധിà´\95à´\82 à´\89ൾപàµ\8dà´ªàµ\86à´\9fàµ\81à´¤àµ\8dതിയിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ à´¤à´¾à´³àµ\81à´\95ൾ",
        "mostcategories": "ഏറ്റവുമധികം വർഗ്ഗങ്ങൾ ഉൾപ്പെടുത്തിയിരിക്കുന്ന താളുകൾ",
        "mostimages": "ഏറ്റവുമധികം കണ്ണി ചേർത്തിരിക്കുന്ന പ്രമാണങ്ങൾ",
        "mostinterwikis": "ഏറ്റവുമധികം അന്തർവിക്കികളുള്ള താളുകൾ",
        "tooltip-preferences-save": "ക്രമീകരണങ്ങൾ ഓർത്തുവെയ്ക്കുക",
        "tooltip-summary": "ചെറിയൊരു ചുരുക്കം ചേർക്കുക",
        "common.css": "/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. എല്ലാ ദൃശ്യരൂപങ്ങൾക്കും ബാധകമായിരിക്കും */",
-       "monobook.css": "/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. മോണോബുക്ക് ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */",
-       "vector.css": "/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. വെക്റ്റർ ദൃശ്യരൂപത്തിനു ബാധകമായിരിക്കും*/",
        "noscript.css": "/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്., ജാവാസ്ക്രിപ്റ്റ് സജ്ജമാക്കിയിട്ടില്ലാത്ത ഉപയോക്താക്കൾക്ക് ബാധകമായിരിക്കും */",
        "group-autoconfirmed.css": "/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. യാന്ത്രികമായി സ്ഥിരീകരിച്ച ഉപയോക്താക്കൾക്ക് ബാധകമായിരിക്കും */",
        "group-bot.css": "/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. ബോട്ടുകൾക്ക് ബാധകമായിരിക്കും */",
        "group-sysop.css": "/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. കാര്യനിർവാഹകർക്ക് ബാധകമായിരിക്കും */",
        "group-bureaucrat.css": "/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. ബ്യൂറോക്രാറ്റുകൾക്ക് ബാധകമായിരിക്കും */",
        "common.js": "/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് എല്ലാ ഉപയോക്താക്കൾക്കും, എല്ലാ താളുകളിലും പ്രവർത്തിക്കുന്നതായിരിക്കും */",
-       "monobook.js": "/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് മോണോബുക്ക് ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */",
-       "vector.js": "/*ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് വെക്റ്റർ ദൃശ്യരൂപം ഉപയോഗിക്കുന്ന ഉപയോക്താക്കൾക്ക് ബാധകമായിരിക്കും*/",
        "group-autoconfirmed.js": "/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് യാന്ത്രികമായി സ്ഥിരീകരിക്കപ്പെട്ട ഉപയോക്താക്കൾക്ക് ബാധകമായിരിക്കും */",
        "group-bot.js": "/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് ബോട്ടുകൾക്ക് ബാധകമായിരിക്കും */",
        "group-sysop.js": "/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് കാര്യനിർവാഹകർക്ക് ബാധകമായിരിക്കും */",
        "pageinfo-category-pages": "താളുകളുടെ എണ്ണം",
        "pageinfo-category-subcats": "ഉപവർഗ്ഗങ്ങളുടെ എണ്ണം",
        "pageinfo-category-files": "പ്രമാണങ്ങളുടെ എണ്ണം",
-       "skinname-monobook": "മോണോബുക്ക്",
-       "skinname-vector": "വെക്റ്റർ",
        "markaspatrolleddiff": "റോന്തുചുറ്റിയതായി അടയാളപ്പെടുത്തുക",
        "markaspatrolledtext": "ഈ താളിൽ റോന്തുചുറ്റിയതായി രേഖപ്പെടുത്തുക",
        "markedaspatrolled": "റോന്തുചുറ്റിയതായി രേഖപ്പെടുത്തിയിരിക്കുന്നു",
index a184e82..e7d9776 100644 (file)
        "qbmyoptions": "Миний хуудсууд",
        "faq": "Тогтмол тавигддаг асуултууд",
        "faqpage": "Project:Тогтмол тавигддаг асуултууд",
-       "vector-action-addsection": "Сэдэв нэмэх",
-       "vector-action-delete": "Устгах",
-       "vector-action-move": "Зөөх",
-       "vector-action-protect": "Хамгаалах",
-       "vector-action-undelete": "Үл устгах",
-       "vector-action-unprotect": "Хамгаалалтаа солих",
-       "vector-view-create": "Үүсгэх",
-       "vector-view-edit": "Засварлах",
-       "vector-view-history": "Түүх",
-       "vector-view-view": "Унших",
-       "vector-view-viewsource": "Кодыг харах",
        "actions": "Үйлдлүүд",
        "namespaces": "Хуудсын төрөл",
        "variants": "Хувилбарууд",
        "diff-multi-manyusers": "($2 гаруй {{PLURAL:$2|хэрэглэгчийн}} {{PLURAL:$1|дундын нэг засварыг|дундын $1 засварыг}} үзүүлсэнгүй)",
        "searchresults": "Хайлтын үр дүн",
        "searchresults-title": "\"$1\" гэх хайлтын үр дүн",
-       "toomanymatches": "Хэт олон илэрц илэрлээ. Өөр үгээр хайна уу.",
        "titlematches": "Хуудасны гарчигтай таарсан хуудсууд",
        "textmatches": "Хуудасны тексттэй таарсан хуудсууд",
        "notextmatches": "Хуудасны тексттэй таарсан хуудсууд байхгүй байна",
        "searchmenu-exists": "'''Энэ викид \"[[:$1]]\" гэсэн хуудас байна'''",
        "searchmenu-new": "<strong> Энэ викид \"[[:$1]]\" хуудсыг үүсгэх!</strong> {{PLURAL:$2|0=|Мөн хайлтаар олдсон хуудсаа харна.|Мөн хайлтаар олдсон хуудсаа харна.}}",
        "searchprofile-articles": "Агуулгын хуудсууд",
-       "searchprofile-project": "Тусламжийн болон төслийн хуудсууд",
        "searchprofile-images": "Мультмедиа",
        "searchprofile-everything": "Бүгдийг",
        "searchprofile-advanced": "Шилж хайх",
        "searchprofile-articles-tooltip": "$1 дотор хайх",
-       "searchprofile-project-tooltip": "$1 дотор хайх",
        "searchprofile-images-tooltip": "Файлуудаас хайх",
        "searchprofile-everything-tooltip": "Бүх агуулгаас хайх (үүнд ярианы хуудсуудыг оролцуулах)",
        "searchprofile-advanced-tooltip": "Сонгосон нэрний зайнуудаас хайх",
        "search-interwiki-default": "$1 үр дүн:",
        "search-interwiki-more": "(илүү их)",
        "search-relatedarticle": "Холбоотой",
-       "searcheverything-enable": "Бүх нэрний зайнуудад хайх",
        "searchrelated": "холбоотой",
        "searchall": "бүгдийг",
        "showingresults": "Доор #'''$2'''-с эхлэсэн '''$1''' илэрцийг үзүүлж байна.",
        "allowemail": "Бусад хэрэглэгчдээс ирэх мэйлийг зөвшөөрөх",
        "prefs-searchoptions": "Хайлт",
        "prefs-namespaces": "Нэрний зайнууд",
-       "defaultns": "Үгүй бол эдгээр нэрний зайнуудад хайх:",
        "default": "анхны байдал",
        "prefs-files": "Файлууд",
        "prefs-custom-css": "Өөрийн сонгосон CSS",
        "prefs-emailconfirm-label": "Мэйлийн баталгаажуулалт:",
        "youremail": "Мэйл хаяг:",
        "username": "{{GENDER:$1|Хэрэглэгчийн нэр}}:",
-       "uid": "{{GENDER:$1|Хэрэглэгчийн}} ID:",
        "prefs-memberingroups": "{{PLURAL:$1|грүпийн|грүпийн}} {{GENDER:$2|гишүүн}} :",
        "prefs-registration": "Бүртгүүлсэн цаг:",
        "yourrealname": "Жинхэнэ нэр:",
        "recentchanges-label-newpage": "Шинэ хуудас үүссэн байна",
        "recentchanges-label-minor": "Бага зэргийн засвар",
        "recentchanges-label-bot": "Робот гүйцэтгэсэн засвар",
-       "recentchanges-label-unpatrolled": "ЭнÑ\8d Ð·Ð°Ñ\81ваÑ\80Ñ\8bг Ð¾Ð´Ð¾Ð¾Ð³Ð¸Ð¹Ð½ Ð±Ð°Ð¹Ð´Ð»Ð°Ð°Ñ\80 Ð¼Ð°Ð½Ð°Ð°Ð³Ò¯Ð¹ Ð±Ð°Ð¹Ð½Ð°",
+       "recentchanges-label-unpatrolled": "ЭнÑ\8d Ð·Ð°Ñ\81ваÑ\80Ñ\8bг Ð¼Ð°Ð½Ð°Ð¶ Ð°Ð¼Ð¶Ð°Ð°Ð³Ò¯Ð¹",
        "recentchanges-label-plusminus": "Өөрчлөгдсөн байт хэмжээ",
        "recentchanges-legend-heading": "'''Таних үсэг:'''",
-       "recentchanges-legend-newpage": "([[Special:NewPages|жагсааж харах]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|жагсааж харах]])",
        "rcnotefrom": "Доорх нь '''$2'''-с хойших өөрчлөлтүүд ('''$1''' хүртэлхийг харуулав) юм.",
        "rclistfrom": "$3 $2-с хойших шинэ засваруудыг үзүүлэх",
        "rcshowhideminor": "Бага зэргийн засваруудыг $1",
        "log-title-wildcard": "Энэ текстээр эхлэсэн гарчигуудыг хайх",
        "showhideselectedlogentries": "Сонгосон логуудыг харагдуулах/нуух",
        "allpages": "Бүх хуудас",
-       "alphaindexline": "$1-с $2 хүртэл",
        "nextpage": "Дараагийн хуудас ($1)",
        "prevpage": "Өмнөх хуудас ($1)",
        "allpagesfrom": "Хамгийн эхэлж харуулах хуудас:",
index 418cbb6..cc5252f 100644 (file)
        "qbmyoptions": "माझी पाने",
        "faq": "नेहमी विचारण्यात येणारे प्रश्न",
        "faqpage": "Project:प्रश्नावली",
-       "vector-action-addsection": "विषय जोडा",
-       "vector-action-delete": "वगळा",
-       "vector-action-move": "स्थानांतरण",
-       "vector-action-protect": "सुरक्षित करा",
-       "vector-action-undelete": "वगळलेले पुनर्स्थापित करा",
-       "vector-action-unprotect": "सुरक्षितता बदला",
-       "vector-view-create": "तयार करा",
-       "vector-view-edit": "संपादन",
-       "vector-view-history": "इतिहास पहा",
-       "vector-view-view": "वाचा",
-       "vector-view-viewsource": "स्रोत पहा",
        "actions": "क्रिया",
        "namespaces": "नामविश्वे",
        "variants": "अस्थिरके",
        "difference-missing-revision": "या लेखाचे/ची  ($1) हे {{PLURAL:$2|संस्करण|$2 संस्करणे}} {{PLURAL:$2|सापडले नाही|सापडली नाहीत}}.वगळल्या गेलेल्या लेखपानाच्या जुन्या इतिहास-दुव्याचे अनुसरण केल्यामुळे, शक्यतोवर,असे घडु शकते.याबाबत अधिक तपशील  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळलेल्या नोंदी] येथे बघता येईल.",
        "searchresults": "शोध निकाल",
        "searchresults-title": "\"$1\" साठीचे शोध निकाल",
-       "toomanymatches": "खूप एकसारखी उत्तरे मिळाली, कृपया पृच्छा वेगळ्या तऱ्हेने करून पहा",
        "titlematches": "पानाचे शीर्षक जुळते",
        "textmatches": "पानातील मजकूर जुळतो",
        "notextmatches": "कोणत्याही पानातील मजकुराशी जुळत नाही",
        "searchmenu-exists": "'''या विकिवर \"[[:$1]]\" या नावाचे पान आहे.'''",
        "searchmenu-new": "<strong>या विकिवर \"[[:$1]]\" हे पान तयार करा!</strong> {{PLURAL:$2|0=|See also the page found with your search.|सापडलेले शोध निकालही पहा.}}",
        "searchprofile-articles": "आशय-पाने",
-       "searchprofile-project": "साहाय्य व प्रकल्प पाने",
        "searchprofile-images": "बहुमाध्यमे",
        "searchprofile-everything": "सगळे",
        "searchprofile-advanced": "प्रगत",
        "searchprofile-articles-tooltip": "$1 मध्ये शोधा",
-       "searchprofile-project-tooltip": "$1मध्ये शोधा",
        "searchprofile-images-tooltip": "संचिकांसाठी शोधा",
        "searchprofile-everything-tooltip": "सर्व पाने शोधा (चर्चापानांसहित)",
        "searchprofile-advanced-tooltip": "निवडलेल्या नामविश्वांमध्ये शोधा:",
        "search-interwiki-default": "$1चे निकाल:",
        "search-interwiki-more": "(आणखी)",
        "search-relatedarticle": "जवळील",
-       "searcheverything-enable": "सर्वनामविश्वांमध्ये शोधा:",
        "searchrelated": "संबंधित",
        "searchall": "सर्व",
        "showingresults": "#'''$2'''पासून {{PLURAL:$1|'''1'''पर्यंतचा निकाल|'''$1'''पर्यंतचे निकाल}} खाली दाखवले आहे.",
        "allowemail": "इतर सदस्यांकडून माझ्या ई-मेल पत्त्यावर ई-मेल येण्यास मुभा द्या",
        "prefs-searchoptions": "शोधा",
        "prefs-namespaces": "नामविश्वे",
-       "defaultns": "या नामविश्वातील अविचल शोध :",
        "default": "अविचल",
        "prefs-files": "संचिका",
        "prefs-custom-css": "सीएसएस पद्धत बदला",
        "prefs-emailconfirm-label": "विपत्र निश्चितीकरण:",
        "youremail": "विपत्र:",
        "username": "{{GENDER:$1|सदस्यनाम}}:",
-       "uid": "{{GENDER:$1|सदस्य}}खाते:",
        "prefs-memberingroups": "{{PLURAL:$1|गटातील|गटांतील}}{{GENDER:$2|सदस्य}} :",
        "prefs-registration": "नोंदणीची वेळ:",
        "yourrealname": "खरे नाव:",
        "recentchanges-label-unpatrolled": "हे संपादन अजून तपासल्या गेले नाही",
        "recentchanges-label-plusminus": "या पानाचा आकार इतक्या बाइट्स ने बदलला",
        "recentchanges-legend-heading": "'''विवरण:'''",
-       "recentchanges-legend-newpage": "([[Special:NewPages|नविन पानांची यादी]] हेही पाहा)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नविन पानांची यादी]] हेही पाहा)",
        "recentchanges-legend-plusminus": "(''±१२३'')",
        "rcnotefrom": "खाली <b>$2</b> पासूनचे ('''$1''' पर्यंत) बदल दाखविले आहेत.",
        "rclistfrom": "$3 $2 नंतर केले गेलेले बदल दाखवा.",
        "log-title-wildcard": "या मजकुरापासून सुरू होणारी शीर्षके शोधा.",
        "showhideselectedlogentries": "निवडलेले लॉग पहाणे /लपवणे",
        "allpages": "सर्व पृष्ठे",
-       "alphaindexline": "$1 पासून $2 पर्यंत",
        "nextpage": "पुढील पान ($1)",
        "prevpage": "मागील पान ($1)",
        "allpagesfrom": "पुढील शब्दाने सुरू होणारे लेख दाखवा:",
        "pageinfo-category-pages": "पानांची संख्या",
        "pageinfo-category-subcats": "उपवर्गांची संख्या",
        "pageinfo-category-files": "संचिकांची संख्या",
-       "skinname-cologneblue": "सुरेखनीळी",
-       "skinname-monobook": "मोनोबुक",
-       "skinname-modern": "आधुनिक",
-       "skinname-vector": "सदिश",
        "markaspatrolleddiff": "टेहळणी केल्याची खूण करा",
        "markaspatrolledtext": "या पानावर गस्त झाल्याची खूण करा",
        "markedaspatrolled": "गस्त केल्याची खूण केली",
index de5046f..4f0b46d 100644 (file)
        "moredotdotdot": "Lagi...",
        "morenotlisted": "Senarai ini tidak lengkap.",
        "mypage": "Halaman",
-       "mytalk": "Perbualan",
-       "anontalk": "Perbualan bagi IP ini",
+       "mytalk": "Perbincangan",
+       "anontalk": "Perbincangan bagi IP ini",
        "navigation": "Pandu arah",
        "and": "&#32;dan",
        "qbfind": "Cari",
        "qbmyoptions": "Laman-laman saya",
        "faq": "Soalan Lazim",
        "faqpage": "Project:Soalan Lazim",
-       "vector-action-addsection": "Buka topik",
-       "vector-action-delete": "Hapus",
-       "vector-action-move": "Pindah",
-       "vector-action-protect": "Lindung",
-       "vector-action-undelete": "Nyahhapus",
-       "vector-action-unprotect": "Ubah perlindungan",
-       "vector-view-create": "Cipta",
-       "vector-view-edit": "Sunting",
-       "vector-view-history": "Lihat sejarah",
-       "vector-view-view": "Baca",
-       "vector-view-viewsource": "Lihat sumber",
        "actions": "Tindakan",
        "namespaces": "Ruang nama",
        "variants": "Kelainan",
        "cannotchangeemail": "Alamat e-mel akaun tidak boleh diubah di wiki ini.",
        "emaildisabled": "Tapak ini tidak boleh menghantar e-mel.",
        "accountcreated": "Akaun dibuka",
-       "accountcreatedtext": "Akaun pengguna [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|bual]]) telah dibuka.",
+       "accountcreatedtext": "Akaun pengguna untuk [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|bincang]]) telah dibuka.",
        "createaccount-title": "Pembukaan akaun {{SITENAME}}",
        "createaccount-text": "Seseorang telah membuka akaun untuk\nalamat e-mel anda di {{SITENAME}} ($4) dengan nama \"$2\" dan kata laluan \"$3\".\nAnda boleh log masuk dan tukar kata laluan anda sekarang.\n\nSila abaikan mesej ini jika anda tidak meminta untuk membuka akaun tersebut.",
        "login-throttled": "Anda telah mencuba log masuk berulang kali.\nSila tunggu $1 dan cuba lagi.",
        "difference-missing-revision": "{{PLURAL:$2|Satu semakan|$2 semakan}} bagi perbezaan ini ($1) tidak ditemui.\n\nHal ini biasanya disebabkan oleh pautan perbezaan yang lapuk ke halaman yang sudah dihapuskan.\nButirannya boleh didapati di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log penghapusan].",
        "searchresults": "Hasil carian",
        "searchresults-title": "Hasil carian \"$1\"",
-       "toomanymatches": "Terlalu banyak padanan dipulangkan, sila cuba pertanyaan lain",
        "titlematches": "Padanan tajuk laman",
        "textmatches": "Padanan teks laman",
        "notextmatches": "Tiada teks laman yang sepadan",
        "searchmenu-exists": "* Laman '''[[$1]]'''",
        "searchmenu-new": "<strong>Cipta laman \"[[:$1]]\" di wiki ini!</strong>\n{{PLURAL:$2|0=|Lihat juga halaman yang ditemui dalam pencarian anda.|Lihat juga hasil pencarian yang ditemui.}}",
        "searchprofile-articles": "Laman kandungan",
-       "searchprofile-project": "Laman bantuan dan projek",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Semua",
        "searchprofile-advanced": "Maju",
        "searchprofile-articles-tooltip": "Cari dalam $1",
-       "searchprofile-project-tooltip": "Cari dalam $1",
        "searchprofile-images-tooltip": "Cari fail",
        "searchprofile-everything-tooltip": "Cari semua kandungan (termasuk laman perbincangan)",
        "searchprofile-advanced-tooltip": "Cari dalam ruang nama yang tersuai",
        "search-interwiki-default": "Hasil dari $1:",
        "search-interwiki-more": "(lagi)",
        "search-relatedarticle": "Berkaitan",
-       "searcheverything-enable": "Cari dalam semua ruang nama",
        "searchrelated": "berkaitan",
        "searchall": "semua",
        "showingresults": "Yang berikut ialah '''$1''' hasil bermula daripada yang {{PLURAL:$2|pertama|ke-'''$2'''}}.",
        "allowemail": "Benarkan e-mel daripada pengguna lain",
        "prefs-searchoptions": "Cari",
        "prefs-namespaces": "Ruang nama",
-       "defaultns": "Jika tidak cari dalam ruang nama ini:",
        "default": "asali",
        "prefs-files": "Fail",
        "prefs-custom-css": "CSS tempahan",
        "email": "E-mel",
        "prefs-help-realname": "Nama sebenar adalah tidak wajib. Jika dinyatakan, ia akan digunakan untuk mengiktiraf karya anda.",
        "prefs-help-email": "Alamat e-mail adalah tidak wajib, tapi diperlukan untuk set semula kata laluan jika anda terlupa kata laluan anda.",
-       "prefs-help-email-others": "Anda juga boleh memilih untuk membiarkan pengguna lain menghubungi anda menerusi laman perbualan anda tanpa perlu mendedahkan identiti anda.",
+       "prefs-help-email-others": "Anda juga boleh memilih untuk membolehkan pengguna lain menghubungi anda melalui e-mel melalui sebuah pautan pada laman pengguna atau perbincangan anda.\nAlamat e-mel anda tidak didedahkan apabila pengguna lain menghubungi anda.",
        "prefs-help-email-required": "Alamat e-mel adalah wajib.",
        "prefs-info": "Maklumat asas",
        "prefs-i18n": "Pengantarabangsaan",
        "recentchanges-label-unpatrolled": "Suntingan ini belum dirondai",
        "recentchanges-label-plusminus": "Saiz laman telah berubah sebanyak jumlah bait ini",
        "recentchanges-legend-heading": "'''Petunjuk:'''",
-       "recentchanges-legend-newpage": "(lihat juga [[Special:NewPages|senarai laman baru]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (lihat juga [[Special:NewPages|senarai laman baru]])",
        "rcnotefrom": "Yang berikut adalah semua suntingan sejak <b>$2</b> (yang dipaparkan sehingga <b>$1</b>).",
        "rclistfrom": "Paparkan perubahan sejak $3 $2",
        "rcshowhideminor": "$1 suntingan kecil",
        "rollbacklinkcount-morethan": "mengundurkan lebih daripada $1 {{PLURAL:$1|suntingan}}",
        "rollbackfailed": "Pengunduran gagal",
        "cantrollback": "Suntingan tersebut tidak dapat dibalikkan: penyumbang terakhir adalah satu-satunya pengarang bagi rencana ini.",
-       "alreadyrolled": "Suntingan terakhir bagi [[:$1]] oleh [[User:$2|$2]] ([[User talk:$2|Perbualan]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) tidak dapat dibalikkan; terdapat pengguna lain yang telah menyunting atau membalikkan laman itu.\n\nSuntingan terakhir telah dibuat oleh [[User:$3|$3]] ([[User talk:$3|Perbualan]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+       "alreadyrolled": "Suntingan terakhir bagi [[:$1]] oleh [[Pengguna:$2|$2]] ([[Perbincangan pengguna:$2|bincang]]{{int:pipe-separator}}[[Khas:Sumbangan/$2|{{int:contribslink}}]]) tidak dapat dibalikkan; seorang pengguna lain sudahpun menyunting atau membalikkan laman itu.\n\nSuntingan terakhir kepada laman ini telah dibuat oleh [[Pengguna:$3|$3]] ([[Perbincangan pengguna:$3|bincang]]{{int:pipe-separator}}[[Khas:Sumbangan/$3|{{int:contribslink}}]]).",
        "editcomment": "Ringkasan sutingan: \"''$1''\".",
        "revertpage": "Membalikkan suntingan oleh [[Special:Contributions/$2|$2]] ([[User talk:$2|Perbincangan]]) kepada versi terakhir oleh [[User:$1|$1]]",
        "revertpage-nouser": "Membalikkan suntingan oleh seorang pengguna tersorok kepada semakan terakhir oleh {{GENDER:$1|[[User:$1|$1]]}}",
        "javascripttest-pagetext-unknownframework": "Kerangka \"$1\" tidak dikenali.",
        "javascripttest-pagetext-frameworks": "Sila pilih salah satu kerangka yang berikut: $1",
        "javascripttest-pagetext-skins": "Sila pilih satu kulit untuk menjalankan ujian:",
-       "javascripttest-qunit-intro": "Rujuk [$1 dokumentasi ujian] di mediawiki.org.",
+       "javascripttest-qunit-intro": "Lihat [$1 pendokumenan ujian] di mediawiki.org.",
        "javascripttest-qunit-heading": "Suit ujian MediaWiki JavaScript QUnit",
        "tooltip-pt-userpage": "Laman pengguna anda",
        "tooltip-pt-anonuserpage": "Laman pengguna bagi alamat IP anda",
-       "tooltip-pt-mytalk": "Laman perbualan anda",
+       "tooltip-pt-mytalk": "Laman perbincangan anda",
        "tooltip-pt-anontalk": "Perbincangan mengenai penyuntingan daripada alamat IP anda",
        "tooltip-pt-preferences": "Keutamaan saya",
        "tooltip-pt-watchlist": "Senarai laman yang anda pantau",
        "tooltip-preferences-save": "Simpan keutamaan",
        "tooltip-summary": "Berikan ringkasan",
        "common.css": "/* CSS yang terletak di sini akan digunakan pada semua kulit */",
-       "cologneblue.css": "/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Cologne Blue */",
-       "monobook.css": "/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Monobook */",
-       "modern.css": "/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Moden */",
-       "vector.css": "/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Vector */",
        "anonymous": "{{PLURAL:$1|Pengguna|Pengguna-pengguna}} {{SITENAME}} tanpa nama",
        "siteuser": "Pengguna {{SITENAME}}, $1",
        "anonuser": "Pengguna {{SITENAME}} tanpa nama $1",
        "pageinfo-category-pages": "Bilangan halaman",
        "pageinfo-category-subcats": "Bilangan subkategori",
        "pageinfo-category-files": "Bilangan fail",
-       "skinname-cologneblue": "Cologne Blue",
-       "skinname-monobook": "MonoBook",
-       "skinname-modern": "Moden",
-       "skinname-vector": "Vector",
        "markaspatrolleddiff": "Tanda ronda",
        "markaspatrolledtext": "Tanda ronda laman ini",
        "markedaspatrolled": "Tanda ronda",
index 328e7c2..3189c68 100644 (file)
@@ -8,7 +8,8 @@
                        "Roderick Mallia",
                        "Urhixidur",
                        "아라",
-                       "CharlieTheCabbie"
+                       "CharlieTheCabbie",
+                       "Leli Forte"
                ]
        },
        "tog-underline": "Ħoloq sottolinjati:",
        "qbmyoptions": "Il-paġni tiegħi",
        "faq": "Mistoqsijiet komuni",
        "faqpage": "Project:FAQ",
-       "vector-action-addsection": "Żid diskussjoni",
-       "vector-action-delete": "Ħassar",
-       "vector-action-move": "Mexxi",
-       "vector-action-protect": "Ipproteġi",
-       "vector-action-undelete": "Irkupra",
-       "vector-action-unprotect": "Biddel il-protezzjoni",
-       "vector-view-create": "Oħloq",
-       "vector-view-edit": "Editja",
-       "vector-view-history": "Ara l-kronoloġija",
-       "vector-view-view": "Aqra",
-       "vector-view-viewsource": "Ara s-sors",
        "actions": "Azzjonijiet",
        "namespaces": "Spazji tal-isem",
        "variants": "Varjanti",
        "viewsourcetext": "Tista' tara u tikkopja s-sors ta' din il-paġna:",
        "viewyourtext": "Tista' tara u tikkopja s-sors tal-'''modifiki tiegħek''' fuq din il-paġna:",
        "protectedinterface": "Din il-paġna għanda element li tagħmel parti mill-interfaċċa tal-utent tas-software, u għaldaqstant ġiet protetta sabiex ma jkunx hemm abbuż.",
-       "editinginterface": "'''Avviż:''' Qiegħed tagħmel modifiki lejn paġna li qegħdha tintuża biex tipprovdi interfaċċa għall-messaġġi tas-software. Kull modifika f'din il-paġna se taffetwa l-apparenza tal-faċċata tal-utenti kollha. Għat-traduzzjonijiet, ikkunsidra l-possibilità li tuża'  [//translatewiki.net/wiki/Main_Page?setlang=mt translatewiki.net], il-proġett MediaWiki għal-lokalizzazzjoni.",
+       "editinginterface": "'''Avviż:''' Qiegħed tagħmel modifiki lejn paġna li qiegħda tintuża biex tipprovdi interfaċċa għall-messaġġi tas-software. Kull modifika f'din il-paġna se taffetwa l-apparenza tal-faċċata tal-utenti kollha. Għat-traduzzjonijiet, ikkunsidra l-possibilità li tuża  [//translatewiki.net/wiki/Main_Page?setlang=mt translatewiki.net], il-proġett MediaWiki għal-lokalizzazzjoni.",
        "cascadeprotected": "Din il-paġna ġiet protetta mill-modifiki, minħabba li tinkludi {{PLURAL:$1|paġni, li huwa|paġni, li huma}} protetti bil-preferenza tal-\"kaskata\" mixewla:\n$2",
        "namespaceprotected": "Inti m'għandhekx il-permess li timodifika paġni fin-''namespace'' '''$1''.",
        "customcssprotected": "M'għandekx il-permessi neċessarji sabiex timmodifika din il-paġna tas-CSS, minħabba li għandha tqegħid personali ta' utent ieħor.",
        "virus-scanfailed": "Tfittxija falliet (kodiċi $1)",
        "virus-unknownscanner": "antivirus mhux magħruf:",
        "logouttext": "'''Bħalissa tinsab barra mill-kont tiegħek.'''\n\nTista' 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.\nKun af li ċerti paġni jistgħu jkomplu jidhru bħallikieku l-illogjar 'l barra mill-kont qatt ma seħħ, sakemm ma tħassarx il-cache tal-browser.",
-       "yourname": "Isem tal-utent:",
-       "userlogin-yourname": "Isem tal-utent",
-       "userlogin-yourname-ph": "Daħħal l-isem tal-utent tiegħek",
+       "yourname": "Isem l-utent:",
+       "userlogin-yourname": "Isem l-utent",
+       "userlogin-yourname-ph": "Daħħal isem l-utent tiegħek",
        "yourpassword": "Password:",
        "userlogin-yourpassword": "Password",
        "userlogin-yourpassword-ph": "Daħħal il-password tiegħek",
+       "createacct-yourpassword-ph": "Daħħal password",
        "yourpasswordagain": "Erġa' ikteb il-password:",
        "createacct-yourpasswordagain": "Ikkonferma l-password",
        "createacct-yourpasswordagain-ph": "Erġa' daħħal il-password",
        "userlogin-resetlink": "Insejt kif tidħol fil-kont tiegħek?",
        "userlogin-resetpassword-link": "Irrisettja l-password",
        "createacct-emailrequired": "Indirizz elettroniku",
-       "createacct-emailoptional": "Indirizz elettroniku (fakultattiv)",
+       "createacct-emailoptional": "Indirizz elettroniku (mhux obbligatorju)",
        "createacct-email-ph": "Daħħal l-indirizz elettroniku tiegħek",
        "createaccountmail": "Uża password każwali temporanja u ibgħatha fuq l-indirizz elettroniku mniżżel hawn taħt",
        "createacct-realname": "Isem proprju (fakultattiv)",
        "createacct-benefit-body2": "paġna",
        "createacct-benefit-body3": "{{PLURAL:$1|kontributur|kontributuri}} riċenti",
        "badretype": "Il-passwords li daħħalt ma jaqblux.",
-       "userexists": "L-isem tal-utent li daħħalt diġà meħud. Jekk jogħġbok, agħżel isem differenti.",
+       "userexists": "L-isem l-utent li daħħalt diġà meħud. Jekk jogħġbok, agħżel isem differenti.",
        "loginerror": "Problemi fil-login",
        "createacct-error": "Problema fil-ħolqien tal-kont",
        "createaccounterror": "Il-kont ma jistax jinħoloq: $1",
-       "nocookiesnew": "Il-Kont tal-utent għal l-aċċess ġie maħluq, però ma kienx possibli li tagħmel aċċess għal {{SITENAME}} għax il-''cookies'' huma disattivati. Erġa' prova l-aċċess bl-isem tal-utent u l-password wara li tkun attivajt il-''cookies'' tal-''browser''.",
+       "nocookiesnew": "Ir-reġistrazzjoni ġiet kompluta, imma mhuwiex possibbli li taċċessa {{SITENAME}} minħabba li l-cookies huma diżattivati. Attiva l-cookies, u erġa' pprova idħol bl-isem l-utent u l-password tiegħek.",
        "nocookieslogin": "L-aċċess għal {{SITENAME}} jagħmel użu minn ''cookies'', li bħalissa huma disattivati. Jekk jogħġbok erġa' prova idħol wara li tkun attivajt il-''cookies'' fil-browser.",
        "nocookiesfornew": "Il-kont ma ġiex maħluq, minħabba li ma stajniex nikkonfermaw is-sors. Assigura ruħek li l-cookies huma attivati, u erġa' tella' l-paġna biex terġa' tipprova.",
        "noname": "L-isem tal-utent li tajt mhuwiex validu.",
        "passwordreset-text-one": "Imla din il-formola sabiex tirrisettja l-password.",
        "passwordreset-legend": "Irrisettja l-password",
        "passwordreset-disabled": "L-irrisettjar tal-password fuq din il-wiki ġie diżattivat.",
-       "passwordreset-username": "Isem tal-utent:",
+       "passwordreset-username": "Isem l-utent:",
        "passwordreset-domain": "Dominju:",
        "passwordreset-capture": "Ara l-kontenut tal-messaġġ?",
        "passwordreset-capture-help": "Jekk tagħżel din il-kaxxa, l-indirizz elettroniku (bil-password temporanja) se jiġi muri lilek barra milli jintbagħat lill-utent.",
        "edit-gone-missing": "Il-paġna ma tistax tiġi aġġornata.\nJidher li din ġiet imħassra.",
        "edit-conflict": "Kunflitt tal-editjar.",
        "edit-no-change": "Il-modifika li għamilt ġiet injorata, minħabba li ebda bidla ma saret lejn it-test.",
+       "postedit-confirmation-created": "Il-paġna ġiet maħluqa.",
        "postedit-confirmation-saved": "Il-modifika tiegħek ġiet salvata.",
        "edit-already-exists": "Ma tistax tinħoloq din il-paġna.\nDin teżisti diġà.",
        "editwarning-warning": "Jekk tħalli din il-paġna jista' jwassal sabiex titlef kwalunkwe tibdil li tkun għamilt. Jekk int tinsab fil-kont tiegħek, tista' tneħħi dan l-avviż fis-sezzjoni \"Modifiki\" tal-preferenzi tiegħek.",
        "diff-multi-manyusers": "(Mhux qed {{PLURAL:$1|tintwera reviżjoni intermedja|jintwerew $1 reviżjonijit intermedji}} mingħand iktar minn $2 {{PLURAL:$2|utent|$2 utenti}})",
        "searchresults": "Riżultat tat-tfittxija",
        "searchresults-title": "Riżultati tat-tfittxija għal \"$1\"",
-       "toomanymatches": "Ħafna tqabbil ġew ritornati, jekk jogħġbok prova inkjesta differenti",
        "titlematches": "Titlu tal-paġna taqbel",
        "textmatches": "It-test tal-paġni, jaqbel",
        "notextmatches": "L-ebda test ta' paġna ma jaqbel",
        "search-interwiki-default": "Riżultati ta' $1:",
        "search-interwiki-more": "(aktar)",
        "search-relatedarticle": "Relatati",
-       "searcheverything-enable": "Fittex fl-ispazji tal-isem kollha",
        "searchrelated": "relatati",
        "searchall": "kollha",
        "showingresults": "Hawn taħt ġie inkluż massimu ta' {{PLURAL:$1|riżultat '''1''' li jibda|'''$1''' riżultat li jibdew}} bin-numru '''$2'''.",
        "prefs-email": "Opzjonijiet għall-posta elettronika",
        "prefs-rendering": "Dehra",
        "saveprefs": "Salva l-preferenzi",
-       "restoreprefs": "Irkupra l-impostazzjonijiet awtomatiċi",
+       "restoreprefs": "Irkupra l-konfigurazzjoni oriġinali (fis-sezzjonijiet kollha)",
        "prefs-editing": "Modifiki",
        "rows": "Fillieri:",
        "columns": "Kolonni:",
        "allowemail": "Ħalli li jaslulek ittri-e mingħand utenti oħrajn",
        "prefs-searchoptions": "Fittex",
        "prefs-namespaces": "Namespace",
-       "defaultns": "Fil-każ kuntrarju, fittex f'dawn l-ispazji tal-isem:",
        "default": "predefinit",
        "prefs-files": "Fajls",
        "prefs-custom-css": "CSS personalizzat",
        "prefs-reset-intro": "Inti tista' tuża' din il-paġna sabiex terġa' tbiddel il-preferenzi tiegħek għal dawk li ngħatawlek fil-bidu. Din l-operazzjoni hija definittiva u ma tistax tiġi mħassra.",
        "prefs-emailconfirm-label": "Konferma tal-ittra-e:",
        "youremail": "E-mail:",
-       "username": "{{GENDER:$1|Isem tal-utent}}:",
+       "username": "{{GENDER:$1|Isem l-utent}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membru}} tal-{{PLURAL:$1|grupp|gruppi}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Ħin ta' reġistrazzjoni:",
        "recentchanges-label-bot": "Din il-modifika ġiet effettwata minn bot",
        "recentchanges-label-unpatrolled": "Din il-modifika għadha ma ġietx verifikata",
        "recentchanges-label-plusminus": "Id-daqs tal-paġna nbidel b'dan in-numru ta' bytes",
-       "recentchanges-legend-newpage": "(ara wkoll il-[[Special:NewPages|lista tal-paġni l-ġodda]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ara wkoll il-[[Special:NewPages|lista tal-paġni l-ġodda]])",
        "rcnotefrom": "Ħawn taħt jinsabu l-modifiki minn '''$2''' (sa '''$1''').",
-       "rclistfrom": "Uri l-modifiki ġodda jibdew minn $3 $2",
+       "rclistfrom": "Uri l-modifiki ġodda li jibdew minn $3 $2",
        "rcshowhideminor": "$1 modifiki żgħar",
+       "rcshowhideminor-show": "Uri",
        "rcshowhidebots": "$1 bot",
+       "rcshowhidebots-show": "Uri",
        "rcshowhideliu": "Utenti reġistrati: $1",
+       "rcshowhideliu-show": "Uri",
        "rcshowhideanons": "Utenti anonimi: $1",
+       "rcshowhideanons-show": "Uri",
        "rcshowhidepatr": "$1 modifiki kontrollati",
+       "rcshowhidepatr-show": "Uri",
        "rcshowhidemine": "$1 modifiki tiegħi",
+       "rcshowhidemine-show": "Uri",
        "rclinks": "Uri l-aħħar $1 modifiki fl-aħħar $2 ġranet<br />$3",
        "diff": "diff",
        "hist": "kron",
        "usereditcount": "$1 {{PLURAL:$1|kontribuzzjonijiet|kontribuzzjoni}}",
        "usercreated": "{{GENDER:$3|Maħluq}} nhar il-$1 fil-$2",
        "newpages": "Paġni ġodda",
-       "newpages-username": "Isem tal-utent:",
+       "newpages-username": "Isem l-utent:",
        "ancientpages": "L-iktar paġni qodma",
        "move": "Mexxi",
        "movethispage": "Ċaqlaq din il-paġna",
        "nowikiemailtext": "Dan l-utent iddeċieda li ma jirċivix posta elettronika minn utenti oħrajn.",
        "emailnotarget": "Isem tal-utent tar-riċevitur ma jeżistix jew mhuwiex validu.",
        "emailtarget": "Daħħal l-isem tal-utent tar-riċevitur",
-       "emailusername": "Isem tal-utent:",
+       "emailusername": "Isem l-utent:",
        "emailusernamesubmit": "Ibgħat",
        "email-legend": "Ibgħat posta elettronika lil utent ieħor fuq {{SITENAME}}",
        "emailfrom": "Minn:",
        "undelete-show-file-confirm": "Inti ċert li trid tara reviżjoni imħassra tal-fajl \"<nowiki>$1</nowiki>\" ta' nhar $2, fil-ħin ta' $3?",
        "undelete-show-file-submit": "Iva",
        "namespace": "Spazju tal-isem:",
-       "invert": "Inverti l-għażla",
+       "invert": "Aqleb l-għażla",
        "tooltip-invert": "Agħżel din il-kaxxa biex taħbi l-modifiki lejn paġni li jinsabu fl-ispazji tal-isem magħżula (u l-ispazju tal-isem assoċjat jekk hu magħżul)",
        "namespace_association": "Spazju tal-isem assoċjat",
        "tooltip-namespace_association": "Agħżel din il-kaxxa sabiex tinkludi l-paġna ta' diskussjoni jew l-oġġett tal-ispazju tal-isem assoċjat mal-ispazju tal-isem magħżul",
        "tooltip-pt-preferences": "Il-preferenzi tiegħek",
        "tooltip-pt-watchlist": "Il-lista ta' paġni li qiegħed tosserva",
        "tooltip-pt-mycontris": "Lista tal-kontribuzzjonijiet tiegħek",
-       "tooltip-pt-login": "Tirreġistra ruħek huwa avviżat però mhux obbligatorju.",
+       "tooltip-pt-login": "Ir-reġistrazzjoni hija mħeġġa, għalkemm mhijiex obbligatorja",
        "tooltip-pt-logout": "Oħroġ (illogja 'l barra)",
        "tooltip-ca-talk": "Diskussjoni dwar il-kontenut tal-paġna",
        "tooltip-ca-edit": "Tista' timmodifika din il-paġna. Jekk jogħġbok uża l-buttuna tad-dehra proviżorja qabel ma ssalva l-modifiki.",
        "tooltip-ca-addsection": "Ibda sezzjoni ġdida",
-       "tooltip-ca-viewsource": "Din il-paġna hija protetta. Tista' tara l-fonti tagħha.",
+       "tooltip-ca-viewsource": "Din il-paġna hija protetta. Tista' tara s-sors tagħha.",
        "tooltip-ca-history": "Verżjonijiet preċedenti ta' din il-paġna",
        "tooltip-ca-protect": "Ipproteġi din il-paġna",
        "tooltip-ca-unprotect": "Biddel il-protezzjoni ta' din il-paġna",
        "tooltip-t-specialpages": "Lista tal-paġni speċjali kollha",
        "tooltip-t-print": "Verżjoni tal-ipprintjar ta' din il-paġna",
        "tooltip-t-permalink": "Ħolqa permanenti għal din il-verżjoni tal-paġna",
-       "tooltip-ca-nstab-main": "Uri l-kontenut tal-paġna",
+       "tooltip-ca-nstab-main": "Uri l-paġna ta' kontenut",
        "tooltip-ca-nstab-user": "Uri l-paġna tal-utent",
        "tooltip-ca-nstab-media": "Uri l-paġna tal-medja",
        "tooltip-ca-nstab-special": "Din hija paġna speċjali, ma tistax tagħmel modifiki f'din il-paġna",
        "tooltip-preferences-save": "Salva l-preferenzi",
        "tooltip-summary": "Daħħal taqsira żgħira",
        "common.css": "/* CSS li tpoġġa hawnhekk irrid jiġi applikat fl-iskins kollha */",
-       "monobook.css": "/* CSS li tpoġġa hawnhekk se jaffetwa dawk l-utenti li jagħmlu użu mill-iskin ''Monobook'' */",
        "common.js": "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal kull utent f'kull tniżżil ta' paġna. */",
-       "monobook.js": "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal dawk l-utenti li qegħdin jagħmlu użu mill-iskin ''Monobook'' */",
        "anonymous": "{{PLURAL:$1|Utent anonimu|Utenti anonimi}} ta' {{SITENAME}}",
        "siteuser": "$1, utent tal-{{SITENAME}}",
        "anonuser": "$1, utent anonimu ta' {{SITENAME}}",
        "pageinfo-protect-cascading": "Protezzjoni li tintiret minn hawnhekk",
        "pageinfo-protect-cascading-yes": "Iva",
        "pageinfo-protect-cascading-from": "Protezzjoni li tintiret minn",
-       "skinname-monobook": "Monobook",
        "markaspatrolleddiff": "Marka l-modifiki bħalha verifikati",
        "markaspatrolledtext": "Immarka din il-paġna bħala verifikata",
        "markedaspatrolled": "Markat bħalha verifikat",
index d4630c2..4c29381 100644 (file)
        "qbmyoptions": "Монь лопан",
        "faq": "Сеедьстэ кепедень кевкстемат",
        "faqpage": "Project:Сеедьстэ кепедень кевкстемат",
-       "vector-action-addsection": "Поладомс мезде кортамс",
-       "vector-action-delete": "Нардамс",
-       "vector-action-move": "Печтевтемс",
-       "vector-action-protect": "Аравтомс ванстомас",
-       "vector-action-undelete": "Вельмевтемс нардазенть",
-       "vector-action-unprotect": "Полавтомс ванстоманзо",
-       "vector-view-create": "Теемс-Шкамс",
-       "vector-view-edit": "Витнемс-петнемс",
-       "vector-view-history": "Ваномс юронзо-путовксонзо",
-       "vector-view-view": "Ловномс",
-       "vector-view-viewsource": "Ваномс косто саезь",
        "actions": "Тев теемат",
        "namespaces": "Лемпотмот",
        "variants": "Вариантт",
        "searchmenu-exists": "'''Те викисэнть ули \"[[$1]]\" лем марто лопа'''",
        "searchmenu-new": "<strong>Шкик \"[[:$1]]\" лопанть те викисэнть!</strong> {{PLURAL:$2|0=|Ваномс лопантькак, конань муик вешнемасонть.|Ваномс савкстнэньгак, конатне вешнемасонть муевсть.}}",
        "searchprofile-articles": "Потмокс лопат",
-       "searchprofile-project": "Лезкс ды проекттэ лопат",
        "searchprofile-images": "Мультимедия",
        "searchprofile-everything": "Весе",
        "searchprofile-advanced": "Седе домка",
        "searchprofile-articles-tooltip": "Вешнемс вана тестэ $1",
-       "searchprofile-project-tooltip": "Вешнемс вана тестэ $1",
        "searchprofile-images-tooltip": "Вешнемс файлат",
        "searchprofile-everything-tooltip": "Вешнемс весе лопатнева (кортнема лопатневаяк)",
        "searchprofile-advanced-tooltip": "Вешнемс башка теезь лемпотмотнестэ",
        "search-interwiki-default": "$1 савкс:",
        "search-interwiki-more": "(седе ламо)",
        "search-relatedarticle": "Малавикс",
-       "searcheverything-enable": "Вешнемс весе лем потмотнестэ",
        "searchrelated": "малавикс",
        "searchall": "весе",
        "showingresultsheader": "{{PLURAL:$5|муевсь <strong>$1</strong> вана <strong>$3</strong>-тнень эйстэ|муевсть <strong>$1 - $2</strong> <strong>$3</strong>-тнень эйстэ}} <strong>$4</strong> вешнеманть лангс",
        "prefs-files": "Файлат",
        "youremail": "Е-сёрма:",
        "username": "Теицянь леметь:",
-       "uid": "Теицянь ID:",
        "yourrealname": "Алкуксонь леметь:",
        "yourlanguage": "Келесь:",
        "yournick": "Кедень путома:",
        "recentchanges-label-minor": "Те а покшкэ витнемась-петнемась",
        "recentchanges-label-bot": "Те витнеманть-петнеманть теизе кона-кона бот",
        "recentchanges-label-unpatrolled": "",
-       "recentchanges-legend-newpage": "(вантаять [[Special:NewPages|од лопань лемрисьме]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (вантаять [[Special:NewPages|од лопань лемрисьме]])",
        "rcnotefrom": "Ало невтезь  '''$2''' лиякстомтомасто саезь ('''$1''' видс).",
        "rclistfrom": "Невтемс од витьнематнень $3 $2-нть эйстэ саезь.",
        "rcshowhideminor": "$1 апокшкэ витнемат-петнемат",
        "all-logs-page": "Весемень туртов весе совамодо-кемекстамодо журналт",
        "logempty": "Сови-лиси журналсто а муевить тень марто вейкеть тевть",
        "allpages": "Весе лопат",
-       "alphaindexline": "$1-сто  $2-нтень",
        "nextpage": "Седе тов лопась ($1)",
        "prevpage": "Седе икелень лопа ($1)",
        "allpagesfrom": "Невтемс лопатнень тестэ ушодозь:",
        "unblock": "Нолдамс теицянть саймасто",
        "blockip": "Аравтомс теицянть саймас",
        "blockip-legend": "Аравтомс теицянть саймас",
-       "ipadressorusername": "IP адрес эли теицянь лем:",
+       "ipaddressorusername": "IP адрес эли теицянь лем:",
        "ipbexpiry": "Таштомома шказо:",
        "ipbreason": "Тувталось:",
        "ipbsubmit": "Озавтомс те теицянть саймес",
        "pageinfo-subpages-name": "Те лопанть явкслопанзо",
        "pageinfo-edits": "Зяроксть витнезь-петнезь",
        "pageinfo-authors": "Весемезэ зяро авторонзо",
-       "skinname-modern": "НееньШкань",
        "markaspatrolleddiff": "Тешкстамс ванстнемань ютазекс",
        "markaspatrolledtext": "Тешкстамс те лопанть ванстнемань ютазекс",
        "markedaspatrolled": "Тешкстазь ванстнемань ютазекс",
        "newimages": "Од файлатьнень галлереясь",
        "newimages-legend": "Сувтеме",
        "newimages-label": "Файлалем (эли пельксэзэ):",
-       "showhidebots": "($1 ботт)",
        "noimages": "Арась мезе ваномс.",
        "ilsubmit": "Вешнэмс",
        "bydate": "чинь коряс",
index 5e6e0c3..b85b1f2 100644 (file)
        "qbmyoptions": "Goá ê ia̍h",
        "faq": "Būn-tah",
        "faqpage": "Project:Būn-tah",
-       "vector-action-addsection": "Ke chi̍t-ê toān-lo̍h",
-       "vector-action-delete": "Thâi",
-       "vector-action-move": "Sóa khì",
-       "vector-action-protect": "Pó-hō·",
-       "vector-action-undelete": "chhú-siau thâi tiàu",
-       "vector-action-unprotect": "kái pó-hō·",
-       "vector-view-create": "Khai-sí siá",
-       "vector-view-edit": "Siu-kái",
-       "vector-view-history": "khoàⁿ le̍k-sú",
-       "vector-view-view": "Tha̍k",
-       "vector-view-viewsource": "Khoàⁿ goân-sú lōe-iông",
        "actions": "Tōng-chok",
        "namespaces": "Miâ-khong-kan",
        "variants": "piàn-thé",
        "ok": "Hó ah",
        "retrievedfrom": "Lâi-goân: \"$1\"",
        "youhavenewmessages": "Lí ū $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$3|个儂|$3个儂}}的$1 ($2)个通知。",
+       "youhavenewmessagesmanyusers": "有誠濟儂($2)予你 $1 个通知。",
+       "newmessageslinkplural": "{{PLURAL:$1|一个新通知|999=新通知}}",
+       "newmessagesdifflinkplural": "choè-kīn kái{{PLURAL:$1|pái|pái}}",
        "youhavenewmessagesmulti": "Lí tī $1 ū sin sìn-sit",
        "editsection": "siu-kái",
        "editold": "siu-kái",
        "nospecialpagetext": "<strong>Bô lí beh tih ê te̍k-sû-ia̍h。</strong>\n\n[[Special:SpecialPages|{{int:specialpages}}]] sī só͘-ū ê te̍k-sû-ia̍h lia̍t-pió.",
        "error": "Chhò-gō·",
        "databaseerror": "Chu-liāu-khò· chhò-gō·",
+       "databaseerror-text": "一个資料庫的查詢發生錯誤。\n這有可能是系統軟體臭蟲引起的。",
+       "databaseerror-textcl": "有一个資料庫的查詢錯誤。",
        "databaseerror-query": "揣:$1",
        "databaseerror-function": "功能:$1",
        "databaseerror-error": "chhò-gō͘",
        "badarticleerror": "Bē-tàng tiàm chit ia̍h chip-hêng chit ê tōng-chok.",
        "cannotdelete": "Bô-hoat-tō· kā hit ê ia̍h a̍h-sī iáⁿ-siōng 「$1」 thâi tiāu. (Khó-lêng pa̍t-lâng í-keng kā thâi tiāu ah.)",
        "cannotdelete-title": "無法度共\"$1\"這頁刣掉。",
+       "delete-hook-aborted": "有設定阻擋刣掉的動作。\n毋閣無其他的解說。",
+       "no-null-revision": "袂當予\"$1\"產生一个空的修訂本。",
        "badtitle": "M̄-chiâⁿ piau-tê",
        "badtitletext": "Iau-kiû ê piau-tê sī bô-hāu ê, khang ê, a̍h-sī liân-kiat chhò-gō· ê inter-language/inter-wiki piau-tê.",
-       "perfcached": "Ē-kha ê chu-liāu tùi lâi--ê, só·-í bī-pit oân-choân hoán-èng siōng sin ê chōng-hóng. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
-       "perfcachedts": "Ē-kha ê chu-liāu tùi lâi--ê, tī $1 keng-sin--koè. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
+       "perfcached": "Ē-kha ê chu-liāu tùi lâi--ê, só·-í bô it-tēng sī siōng sin ê. Tī khoài-chhûn-khu siōng chē ē-tàng khǹg{{PLURAL:$1| pit|$1 pit}} chu-liāu.",
+       "perfcachedts": "Ē-kha ê chu-liāu tùi lâi--ê, tī $1 keng-sin--koè. Tī khoài-chûn-khu siōng chē ē-tàng khǹg {{PLURAL:$4|pit|$4 pit}} chu-liāu.",
        "querypage-no-updates": "Chit-má bē-sái kái chit ia̍h.\nChia ê chu-liāu bē-tàng sui tiông-sin chéng-lí.",
        "viewsource": "Khoàⁿ goân-sú lōe-iông",
+       "viewsource-title": "看 $1的原本編碼。",
        "actionthrottled": "Tōng-chok hông tóng leh.",
        "actionthrottledtext": "Ūi-tio̍h thê-hông lah-sap ê chhú-tì,  lí ū hông hān-chè tī té sî-kan lāi chò siuⁿ chē pái chit ê tōng-chok,  taⁿ lí í-keng chhiau-koè hān-chè.\nChhiáⁿ tī kúi hun-cheng hāu chiah koh chhì.",
-       "protectedpagetext": "Chit ia̍h hông só tiâu leh, bē pian-chi̍p tit.",
+       "protectedpagetext": "Chit ia̍h hông só tiâu leh, bē pian-chi̍p tit, mā bē-tàng chò kî-thaⁿ oa̍h-tāng.",
        "viewsourcetext": "Lí ē-sái khoàⁿ ia̍h khó͘-pih chit ia̍h ê goân-sú loē-iông:",
-       "protectedinterface": "Chit ia̍h thê-kiong nńg-thé kài-bīn ēng ê bûn-jī. Ūi beh ī-hông lâng chau-that, só͘-í ū siū tio̍h pó-hō͘.",
-       "editinginterface": "'''Sè-jī:''' Lí tng teh siu-kái 1 bīn thê-kiong nńg-thé kài-bīn bûn-jī ê ia̍h. Jīn-hô kái-piàn to ē éng-hióng tio̍h kî-thaⁿ iōng-chiá ê sú-iōng kài-bīn.",
+       "protectedinterface": "Chit ia̍h thê-kiong nńg-thé kài-bīn ēng ê bûn-jī. Ūi beh ī-hông lâng chau-that, só͘-í ū siū tio̍h pó-hō͘. Nā beh kái hoan-e̍k, chhiaⁿ khì Ûi-ki Mûi-thé chāi-tē-hoà sū-kang [//translatewiki.net/ translatewiki.net] hiâ.",
+       "editinginterface": "'''Sè-jī:''' Lí tng teh siu-kái 1 bīn thê-kiong nńg-thé kài-bīn bûn-jī ê ia̍h. Jīn-hô kái-piàn to ē éng-hióng tio̍h kî-thaⁿ iōng-chiá ê sú-iōng kài-bīn. Nā beh kái hoan-e̍k, chhiaⁿ khì Ûi-ki Mûi-thé chāi-tē-hoà sū-kang [//translatewiki.net/ translatewiki.net] hiâ.",
        "cascadeprotected": "Chit-ê ia̍h í-keng hông pó-hō͘ bē kái tit. In-ūi i tī ē-bīn {{PLURAL:$1|ê|ê}} liân-só pó-hō͘ lāi-té:\n$2",
        "namespaceprotected": "Lí bô khoân-lī kái '''$1'''  miâ-khong-kan ê ia̍h",
        "virus-unknownscanner": "M̄-chai siáⁿ pēⁿ-to̍k:",
-       "logouttext": "'''Lí í-keng teng-chhut.'''\n\nLí ē-sái mài kì-miâ kè-siok sú-iōng {{SITENAME}}, mā ē-sái iōng kāng-ê a̍h-sī pa̍t-ê sin-hūn têng teng-ji̍p.\nChhiaⁿ chù-ì: ū-kóa ia̍h ū khó-lêng khoàⁿ-tio̍h bē-su lí iû-goân teng-ji̍p tiong; che chi-iàu piàⁿ tiāu lí ê browser ê cache chiū ē chèng-siông.",
+       "logouttext": "'''Lí í-keng teng-chhut.'''\nChhiaⁿ chù-ì: ū-kóa ia̍h ū khó-lêng khoàⁿ-tio̍h bē-su lí iáu teng-ji̍p tī leh; che chi-iàu piàⁿ tiāu liû-lám-khì ê khoài-chhú-khu, tiō ē chèng-siông.",
        "welcomeuser": "Hoan-gêng, $1!",
        "yourname": "Lí ê iōng-chiá miâ-chheng:",
        "userlogin-yourname": "Iōng-chiá miâ-chheng",
        "yourpassword": "Lí ê bi̍t-bé:",
        "userlogin-yourpassword": "Bi̍t-bé",
        "yourpasswordagain": "Têng phah bi̍t-bé:",
-       "remembermypassword": "Kì tiâu góa ê bi̍t-bé (āu-chhiú teng-ji̍p iōng) (siōng chē kì $1 {{PLURAL:$1|kang|kang}})",
+       "remembermypassword": "Tī chit ê liû-lám-khì kì góa ê teng-ji̍p chu-liāu.(siōng chē kì $1 {{PLURAL:$1|kang|kang}})",
+       "password-change-forbidden": "佇這个維基,你袂當改密碼。",
+       "externaldberror": "這可能是資料庫驗證錯誤,抑是無允准你改外部的口座。",
        "login": "Teng-ji̍p",
        "nav-login-createaccount": "Teng-ji̍p / khui sin kháu-chō",
        "loginprompt": "Thiⁿ ē-kha ê chu-liāu thang khui sin hō·-thâu a̍h-sī teng-ji̍p {{SITENAME}}.",
        "logout": "Teng-chhut",
        "userlogout": "Teng-chhut",
        "notloggedin": "Bô teng-ji̍p",
+       "userlogin-noaccount": "敢無口座?",
+       "userlogin-joinproject": "加入 {{SITENAME}}",
        "nologin": "Bô kháu-chō thang teng-ji̍p? $1",
        "nologinlink": "Khui 1 ê kháu-chō",
        "createaccount": "Khui sin kháu-chō",
        "gotaccount": "Í-keng ū kháu-chō? '''$1'''.",
        "gotaccountlink": "Teng-ji̍p",
-       "createaccountmail": "Thàu koè tiān-chú-phoe",
+       "createaccountmail": "Iōng chi̍t-ê lîm-sî loān-sò͘ sán-seng ê bi̍t-bé , kià khì goá chí-tēng ê tiān-chú-phoe tē-chí.",
        "createaccountreason": "Lí-iû:",
        "badretype": "Lí su-ji̍p ê 2-cho· bi̍t-bé bô tùi.",
-       "userexists": "Lí beh ti̍h ê iōng-chiá miâ-chheng í-keng ū lâng iōng. Chhiáⁿ kéng pa̍t-ê miâ.",
+       "userexists": "Lí phah ê iōng-chiá miâ-chheng í-keng ū lâng iōng. Chhiáⁿ lí iōng pa̍t-ê miâ.",
        "loginerror": "Teng-ji̍p chhò-gō·",
        "createaccounterror": "Bô hoat-tō͘ khui kháu-chō: $1",
        "loginsuccesstitle": "Teng-ji̍p sêng-kong",
        "loginsuccess": "Lí hiān-chhú-sî í-keng teng-ji̍p {{SITENAME}} chò \"$1\".",
-       "nosuchuser": "Chia bô iōng-chiá hō-chò \"$1\". Chhiáⁿ kiám-cha lí ê phèng-im, a̍h-sī iōng ē-kha ê pió lâi khui sin iōng-chiá ê kháu-chō.",
+       "nosuchuser": "Chia bô iōng-chiá hō-chò \"$1\".\nIiōng-chiá hō-chò ū hun toā-jī sè-jī.\nChhiáⁿ kiám-cha lí ê phèng-im, a̍h-sī  [[Special:UserLogin/signup|khui sin iōng-chiá ê kháu-chō.]]",
        "nosuchusershort": "Bô \"$1\" chit ê iōng-chiá miâ.\nTùi khoàⁿ-māi,  lí phah--ê.",
        "nouserspecified": "Lí ài chí-tēng chi̍t ê iōng-chiá miâ.",
        "wrongpassword": "Lí su-ji̍p ê bi̍t-bé ū têng-tâⁿ. Chhiáⁿ têng chhì.",
        "noemail": "Kì-lo̍k bô iōng-chiá \"$1\" ê e-mail chū-chí.",
        "passwordsent": "Ū kià sin bi̍t-bé khì \"$1\" chù-chheh ê e-mail chū-chí. Siu--tio̍h liáu-āu chhiáⁿ têng teng-ji̍p.",
        "mailerror": "Kià phoe tú tio̍h chhò-gō·: $1",
-       "acct_creation_throttle_hit": "Pháiⁿ-sè, lí taⁿ í-keng khui $1 ê kháu-chō ā. Bē-sái koh-chài khui.",
-       "emailauthenticated": "Lí ê e-mail chū-chí tī $1 khak-jīn sêng-kong.",
+       "acct_creation_throttle_hit": "你這馬用的網路地址有佇最近一工開{{PLURAL:$1|1 个口座|$1 个口座}},這已經超過系統允准的數目。\n所以,這馬無法度予用這个網路地址的儂,閣開口座。",
+       "emailauthenticated": "Lí ê e-mail chū-chí tī $2 $3  khak-jīn sêng-kong.",
        "emailnotauthenticated": "Lí ê e-mail chū-chí iáu-bōe khak-jīn ū-hāu, só·-í ē--kha ê e-mail kong-lêng bē-ēng-tit.",
        "noemailprefs": "Tī lí ê siat-piān chí-tēng chi̍t ê tiān-chú-phoe tē-chí thang hō͘ chia ê kong-lêng ē-tàng ēng.",
        "emailconfirmlink": "Chhiáⁿ khak-jīn lí ê e-mail chū-chí ū-hāu",
        "passwordreset-username": "Lí ê iōng-chiá miâ-chheng:",
        "passwordreset-email": "Tiān-chú-phoe tē-chí:",
        "passwordreset-emailelement": "Iōng-chiá: $1\nLîm-sî ê bi̍t-bé: $2",
-       "passwordreset-emailsent": "Chit hong thê-chhíⁿ ê  tiān-chú-phoe í-keng kià chhut.",
+       "passwordreset-emailsent": "Têng siat bi̍t-bé ê tiān-chú-phoe í-keng kià chhut-khì ah.",
        "changeemail": "Kái tiān-chú-phoe ê tē-chí",
        "changeemail-oldemail": "Chit-má ê E-mail tē-chí:",
        "changeemail-newemail": "Sin E-mail ê chū-chí:",
        "loginreqlink": "Teng-ji̍p",
        "loginreqpagetext": "Lí ài $1 chiah thang khoàⁿ pat ia̍h.",
        "accmailtitle": "Bi̍t-bé kià chhut khì ah.",
-       "accmailtext": "$1 ê bi̍t-bé í-keng kìa khì $2.",
+       "accmailtext": "Chi̍t ê iōng loān-sò͘ sán-seng ê  bi̍t-bé, beh hō͘ [[User talk:$1|$1]] ê, í-keng kìa khì $2.",
        "newarticle": "(Sin)",
        "newarticletext": "Lí tòe 1 ê liân-kiat lâi kàu 1 bīn iáu-bōe chûn-chāi ê ia̍h. Beh khai-sí pian-chi̍p chit ia̍h, chhiáⁿ tī ē-kha ê bûn-jī keh-á lāi-té phah-jī. ([$1 Bo̍k-lio̍k] kà lí án-choáⁿ chìn-hêng.) Ká-sú lí bô-tiuⁿ-tî lâi kàu chia, ē-sai chhi̍h liû-lám-khì ê '''téng-1-ia̍h''' tńg--khì.",
        "anontalkpagetext": "----''Pún thó-lūn-ia̍h bô kò·-tēng ê kháu-chō/hō·-thâu, kan-na ū 1 ê IP chū-chí (chhin-chhiūⁿ 123.456.789.123). In-ūi bô kāng lâng tī bô kāng sî-chūn ū khó-lêng tú-hó kong-ke kāng-ê IP, lâu tī chia ê oē ū khó-lêng hō· bô kāng lâng ê! Beh pī-bián chit khoán būn-tê, ē-sái khì [[Special:UserLogin|khui 1 ê hō·-thâu a̍h-sī teng-ji̍p]].''",
        "shown-title": "Múi ia̍h hián-sī $1 {{PLURAL:$1|kiat-kó|kiat-kó}}",
        "viewprevnext": "Khoàⁿ ($1 {{int:pipe-separator}} $2) ($3)",
        "searchprofile-articles": "Loē-iông ia̍h",
-       "searchprofile-project": "幫助佮事工的頁",
        "searchprofile-images": "To-mûi-thé",
        "searchprofile-everything": "Só͘-ū ê",
        "searchprofile-advanced": "chìn-chi̍t-pō͘",
        "searchprofile-articles-tooltip": "Tī $1 chhoé",
-       "searchprofile-project-tooltip": "Tī $1 chhoé",
        "searchprofile-images-tooltip": "Chhoé tóng-àn",
        "searchprofile-everything-tooltip": "揣全部(包括討論頁)",
        "searchprofile-advanced-tooltip": "佇你家己設的名空間內底揣",
        "servertime": "Server sî-kan hiān-chāi sī",
        "guesstimezone": "Tùi liû-lám-khì chhau--lâi",
        "allowemail": "Ún-chún pa̍t-ê iōng-chiá kià email kòe-lâi",
-       "defaultns": "Tī chiah ê miâ-khong-kan chhiau-chhōe:",
        "prefs-files": "Tóng-àn",
        "youremail": "Lí ê email:",
        "yourrealname": "Lí ê chin miâ:",
index 9d0feae..f3908ec 100644 (file)
        "nextn-title": "{{PLURAL:$1|Risultato successivo|$1 risultate successive}}",
        "shown-title": "Fa vere {{PLURAL:$1|'nu risultato|$1 risultate}} ppe paggena",
        "viewprevnext": "Vere($1 {{int:pipe-separator}} $2) ($3).",
-       "searchmenu-new": "'''Cria a paggena \"[[:$1]]\" ncopp'â chisto wiki!'''",
+       "searchmenu-new": "<strong>'''Cria a paggena \"[[:$1]]\" ncopp'â chisto wiki!'''</strong> {{PLURAL:$2|0=|Vede anche 'a paggena truovata cu 'a recerca tuja|Vede anche 'e risultate d\"a recerca}}",
        "searchprofile-articles": "Paggene 'e contenute",
-       "searchprofile-project": "Paggene 'e ajùto e relative 'o prugietto",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Tutto",
        "searchprofile-advanced": "Avanzate",
        "searchprofile-articles-tooltip": "Circa dint'ô $1",
-       "searchprofile-project-tooltip": "Circa dint'ô $1",
        "searchprofile-images-tooltip": "Circa file",
        "searchprofile-advanced-tooltip": "Circa dint'e namespace perzonalizzate",
        "search-result-size": "$1 ({{PLURAL:$2|'na parola|$2 parole}})",
        "booksources-go": "Vàje",
        "log": "Logs",
        "allpages": "Tutte 'e ppaggene",
-       "alphaindexline": "da $1 a $2",
        "allarticles": "Tutt' 'e vvoce",
        "allinnamespace": "Tutt' 'e ppaggene d''o namespace $1",
        "allpagessubmit": "Vàje",
        "whatlinkshere-hideimages": "$1 links ddo file",
        "whatlinkshere-filters": "Filtre",
        "blockip": "Ferma utelizzatóre",
-       "ipadressorusername": "Nnerizzo IP o nomme utente",
+       "ipaddressorusername": "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",
        "ipblocklist": "Utenti bloccate",
index e49fb90..811cb5b 100644 (file)
        "qbmyoptions": "Egne innstillinger",
        "faq": "Ofte stilte spørsmål",
        "faqpage": "Project:Ofte stilte spørsmål",
-       "vector-action-addsection": "Nytt emne",
-       "vector-action-delete": "Slett",
-       "vector-action-move": "Flytt",
-       "vector-action-protect": "Beskytt",
-       "vector-action-undelete": "Gjenopprett",
-       "vector-action-unprotect": "Endre beskyttelse",
-       "vector-view-create": "Opprett",
-       "vector-view-edit": "Rediger",
-       "vector-view-history": "Vis historikk",
-       "vector-view-view": "Les",
-       "vector-view-viewsource": "Vis kilden",
        "actions": "Handlinger",
        "namespaces": "Navnerom",
        "variants": "Varianter",
        "editwarning-warning": "Ved å forlate siden kan du miste alle endringer du har gjort.\nHvis du er innlogget, kan du slå av denne advarselen under \"{{int:prefs-editing}}\"-avsnittet i dine innstillinger.",
        "editpage-notsupportedcontentformat-title": "Innholdsformatet er ikke støttet",
        "editpage-notsupportedcontentformat-text": "Innholdsformatet $1 er ikke støttet av innholdsmodellen $2.",
-       "content-model-wikitext": "WikiTekst",
+       "content-model-wikitext": "wikitekst",
        "content-model-text": "Ren tekst",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
        "node-count-exceeded-category": "Sider hvor antallet noder er overskredet",
        "node-count-exceeded-category-desc": "En kategori for sider der antallet noder er overskredet.",
        "node-count-exceeded-warning": "Siden har overskredet antallet noder",
-       "expansion-depth-exceeded-category": "Sider hvor hvor ekspansjonsdybden er overskredet",
+       "expansion-depth-exceeded-category": "Sider hvor ekspansjonsdybden er overskredet",
        "expansion-depth-exceeded-category-desc": "Dette er en kategori for sider hvor ekspansjonsdybden er overskredet.",
        "expansion-depth-exceeded-warning": "Sida har overskredet ekspansjonsdybden",
        "parser-unstrip-loop-warning": "«Unstrip»-loop påvist",
        "currentrev": "Nåværende versjon",
        "currentrev-asof": "Nåværende revisjon fra $1",
        "revisionasof": "Revisjonen fra $1",
-       "revision-info": "Revisjon per $1 av $2",
+       "revision-info": "Revisjon per $1 av {{GENDER:$6|$2}}$7",
        "previousrevision": "← Eldre revisjon",
        "nextrevision": "Nyere revisjon →",
        "currentrevisionlink": "Nåværende revisjon",
        "difference-missing-revision": "{{PLURAL:$2|En revisjon|$2 revisjoner}} av denne forskjellen ($1) {{PLURAL:$2|ble|ble}} ikke funnet.\n\nDette skyldes som regel at en gammel forskjell-lenke er fulgt til en side som er slettet.\nDetaljer kan finnes i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sletteloggen].",
        "searchresults": "Søkeresultater",
        "searchresults-title": "Søkeresultater for «$1»",
-       "toomanymatches": "For mange mulige svar, prøv med en annen spørring",
        "titlematches": "Artikkeltitler med treff på forespørselen",
        "textmatches": "Artikkeltekster med treff på forespørselen",
        "notextmatches": "Inden sidetekst samsvarte med søket",
        "search-interwiki-default": "Resultater fra $1:",
        "search-interwiki-more": "(mer)",
        "search-relatedarticle": "Relatert",
-       "searcheverything-enable": "Søk i alle navnerom",
        "searchrelated": "relatert",
        "searchall": "alle",
        "showingresults": "Nedenfor vises opptil {{PLURAL:$1|'''ett''' resultat|'''$1''' resultater}} fra og med nummer <b>$2</b>.",
        "powersearch-togglelabel": "Merk:",
        "powersearch-toggleall": "Alle",
        "powersearch-togglenone": "Ingen",
+       "powersearch-remember": "Husk valgene for fremtidige søk",
        "search-external": "Eksternt søk",
        "searchdisabled": "Søkefunksjonen er slått av. Du kan søke via Google i mellomtiden. Merk at Googles indeksering av {{SITENAME}} muligens er utdatert.",
        "search-error": "En feil oppsto under søk: $1",
        "allowemail": "Tillat andre å sende meg e-post",
        "prefs-searchoptions": "Søk",
        "prefs-namespaces": "Navnerom",
-       "defaultns": "Søk ellers i disse navnerommene:",
        "default": "standard",
        "prefs-files": "Filer",
        "prefs-custom-css": "Personlig CSS",
        "recentchanges-label-unpatrolled": "Denne redigeringen har ikke blitt patruljert ennå",
        "recentchanges-label-plusminus": "Sidestørrelsen kan endres med dette antallet bytes",
        "recentchanges-legend-heading": "'''Tegnforklaring:'''",
-       "recentchanges-legend-newpage": "(se også [[Special:NewPages|liste av nye sider]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (se også [[Special:NewPages|liste av nye sider]])",
        "recentchanges-legend-plusminus": "«(±123)»",
        "rcnotefrom": "Nedenfor er endringene gjort siden <strong>$2</strong> (frem til <strong>$1</strong> vises).",
        "rclistfrom": "Vis nye endringer fra og med $3 $2",
        "largefileserver": "Denne filen er større enn det tjeneren er satt opp til å tillate.",
        "emptyfile": "Filen du lastet opp ser ut til å være tom. Dette kan komme av en skrivefeil i filnavnet. Sjekk om du virkelig vil laste opp denne filen.",
        "windows-nonascii-filename": "Denne wikien støtter ikke filnavn med spesialtegn.",
-       "fileexists": "Ei fil med dette navnet finnes allerede.\nSjekk <strong>[[:$1]]</strong> hvis du ikke er sikker på at du vil forandre den.\n[[$1|thumb]]",
+       "fileexists": "En fil med dette navnet finnes allerede.\nSjekk <strong>[[:$1]]</strong> hvis {{GENDER:|du}} ikke er sikker på at du vil forandre den.\n[[$1|thumb]]",
        "filepageexists": "Beskrivelsessiden for denne filen finnes allerede på <strong>[[:$1]]</strong>, men ingen filer med dette navnet finnes. Sammendraget du skriver inn vil ikke vises på beskrivelsessiden. For at det skal dukke opp der må du skrive det inn manuelt etter å ha lastet opp filen.\n[[$1|thumb]]",
-       "fileexists-extension": "En fil med et lignende navn finnes: [[$2|thumb]]\n* Navnet på din fil: <strong>[[:$1]]</strong>\n* Navn på eksisterende fil: <strong>[[:$2]]</strong>\nVelg et annet filnavn.",
+       "fileexists-extension": "En fil med et lignende navn finnes: [[$2|thumb]]\n* Navnet på din fil: <strong>[[:$1]]</strong>\n* Navn på eksisterende fil: <strong>[[:$2]]</strong>\nØnsker du å bruke et mer særegent filnavn?",
        "fileexists-thumbnail-yes": "Filen ser ut til å være et bilde av redusert størrelse. [[$1|thumb]]\nVennligst sjekk filen <strong>[[:$1]]</strong>.\nOm filen du sjekket er det samme bildet, men i opprinnelig størrelse, er det ikke nødvendig å laste opp en ekstra fil.",
        "file-thumbnail-no": "Filnavnet begynner med <strong>$1</strong>.\nDet virker som om det er et bilde av redusert størrelse ''(miniatyrbilde)''.\nOm du har dette bildet i stor utgave, last opp det, eller endre filnavnet på denne filen.",
        "fileexists-forbidden": "En fil med dette navnet finnes fra før, og kan ikke erstattes.\nOm du fortsatt ønsker å laste opp filen, gå tilbake og last den opp under et nytt navn. [[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Sletting og gjenoppretting av filer er midlertidig slått av på grunn av vedlikehold.",
        "filedelete-maintenance-title": "Kan ikke slette fil",
        "mimesearch": "MIME-søk",
-       "mimesearch-summary": "Denne siden muliggjør filtrering av filer per MIME-type. Skriv inn: innholdstype/undertype, for eksempel <code>image/jpeg</code>.",
+       "mimesearch-summary": "Denne siden muliggjør filtrering av filer per MIME-type. Skriv inn: innholdstype/undertype eller innholdstype/*, for eksempel <code>image/jpeg</code>.",
        "mimetype": "MIME-type:",
        "download": "last ned",
        "unwatchedpages": "Sider som ikke er overvåket",
        "delete-edit-reasonlist": "Rediger begrunnelser for sletting",
        "delete-toobig": "Denne siden har en stor redigeringshistorikk, med over {{PLURAL:$1|$1&nbsp;revisjon|$1&nbsp;revisjoner}}. Muligheten til å slette slike sider er begrenset for å unngå utilsiktet forstyrring av {{SITENAME}}.",
        "delete-warning-toobig": "Denne siden har en stor redigeringshistorikk, med over {{PLURAL:$1|$1&nbsp;revisjon|$1&nbsp;revisjoner}}. Sletting av denne siden kan forstyrre databasen til {{SITENAME}}; vær varsom.",
-       "deleting-backlinks-warning": "'''Advarsel:''' [[Special:WhatLinksHere/{{FULLPAGENAME}|Andre sider]] lenker til eller inkluderer siden du er i ferd med å slette.",
+       "deleting-backlinks-warning": "'''Advarsel:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Andre sider]] lenker til eller inkluderer siden du er i ferd med å slette.",
        "rollback": "Fjern redigeringer",
        "rollback_short": "Tilbakestill",
        "rollbacklink": "tilbakestill",
        "tooltip-summary": "Skriv et kort sammendrag",
        "interlanguage-link-title": "$1 – $2",
        "common.css": "/* CSS plassert i denne fila vil gjelde for alle utseender. */",
-       "monobook.css": "/* CSS i denne fila vil gjelde alle som bruker drakta Monobook */",
        "common.js": "/* Javascript i denne fila vil gjelde for alle drakter. */",
-       "monobook.js": "/* Javascript i denne fila vil gjelde for brukere av drakta Monobook */",
        "anonymous": "{{PLURAL:$1|Anonym bruker|Anonyme brukere}} av {{SITENAME}}",
        "siteuser": "{{SITENAME}}-bruker $1",
        "anonuser": "{{SITENAME}}s anonyme bruker $1",
        "pageinfo-category-pages": "Antall sider",
        "pageinfo-category-subcats": "Antall underkategorier",
        "pageinfo-category-files": "Antall filer",
-       "skinname-monobook": "Monobook",
        "markaspatrolleddiff": "Merk som patruljert",
        "markaspatrolledtext": "Merk denne siden som patruljert",
        "markedaspatrolled": "Merket som patruljert",
index 1fc788b..34b82a0 100644 (file)
@@ -14,7 +14,8 @@
                        "Urhixidur",
                        "Ævar Arnfjörð Bjarmason <avarab@gmail.com>",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Kolega2357"
                ]
        },
        "tog-underline": "Verwiezingen onderstrepen",
        "qbmyoptions": "Veurkeuren",
        "faq": "Vragen die vake esteld wörden",
        "faqpage": "Project:Vragen die vake esteld wörden",
-       "vector-action-addsection": "Niej onderwarp",
-       "vector-action-delete": "Vortdoon",
-       "vector-action-move": "Herneumen",
-       "vector-action-protect": "Beveiligen",
-       "vector-action-undelete": "Weerummeplaotsen",
-       "vector-action-unprotect": "Beveiliging wiezigen",
-       "vector-view-create": "Anmaken",
-       "vector-view-edit": "Bewarken",
-       "vector-view-history": "Geschiedenisse bekieken",
-       "vector-view-view": "Lezen",
-       "vector-view-viewsource": "Brontekste bekieken",
        "actions": "Haandeling",
        "namespaces": "Naamruumtes",
        "variants": "Variaanten",
        "currentrev": "Leste versie",
        "currentrev-asof": "Leste versie van $1",
        "revisionasof": "Versie op $1",
-       "revision-info": "Versie op $1 van $2",
+       "revision-info": "Versie op $1 van {{GENDER:$6|$2}}$7",
        "previousrevision": "&larr; eerdere versie",
        "nextrevision": "niejere versie &rarr;",
        "currentrevisionlink": "versie zo as t noen is",
        "difference-missing-revision": "{{PLURAL:$2|Eén versie|$2 versies}} van disse verschillen ($1) {{PLURAL:$2|is|bin}} niet evunnen.\n\nDit kömp meestentieds deur t volgen van n verouwerde verwiezing naor n zied die vortedaon is.\nWaorschienlik ku'j der meer gegevens over vienen in t [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} vortdologboek].",
        "searchresults": "Zeukresultaoten",
        "searchresults-title": "Zeukresultaoten veur \"$1\"",
-       "toomanymatches": "Der waren te veule resultaoten. Probeer n aandere zeukopdrachte.",
        "titlematches": "Overeenkomst mit t onderwarp",
        "textmatches": "Overeenkomst mit teksten",
        "notextmatches": "Gien overeenstemming",
        "searchmenu-exists": "'''Der is n zied mit de naam \"[[:$1]]\" op disse wiki.'''",
        "searchmenu-new": "<strong>De zied \"[[:$1]]\" op disse wiki anmaken!</strong> \n{{PLURAL:$2|0=|Zie oek de zied mit joew zeukresultaoten.|Zie oek de lieste mit evunnen zeukresultaoten.}}",
        "searchprofile-articles": "Artikels",
-       "searchprofile-project": "Hulp- en projektziejen",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Alles",
        "searchprofile-advanced": "Uutebreid",
        "searchprofile-articles-tooltip": "Zeuken in $1",
-       "searchprofile-project-tooltip": "Zeuken in $1",
        "searchprofile-images-tooltip": "Zeuken naor bestaanden",
        "searchprofile-everything-tooltip": "Alle inhoud deurzeuken (oek overlegziejen)",
        "searchprofile-advanced-tooltip": "Zeuken in de an-egeven naamruumtes",
        "search-interwiki-default": "Resultaoten van $1:",
        "search-interwiki-more": "(meer)",
        "search-relatedarticle": "Verwaant",
-       "searcheverything-enable": "In alle naamruumten zeuken",
        "searchrelated": "verwaant",
        "searchall": "alles",
        "showingresults": "Hieronder {{PLURAL:$1|steet '''1''' resultaot|staon '''$1''' resultaoten}}  <b>$1</b> vanaof nummer <b>$2</b>.",
        "allowemail": "Berichten van aandere gebrukers toestaon",
        "prefs-searchoptions": "Zeukinstellingen",
        "prefs-namespaces": "Naamruumtes",
-       "defaultns": "Aanders in de volgende naamruumten zeuken:",
        "default": "standard",
        "prefs-files": "Bestaanden",
        "prefs-custom-css": "Persoonlike CSS",
        "recentchanges-label-bot": "Disse bewarking is uutevoerd deur n bot",
        "recentchanges-label-unpatrolled": "Disse bewarking is nog niet nao-ekeken",
        "recentchanges-label-plusminus": "Disse ziedgrootte is mit dit antal bytes ewiezigd",
-       "recentchanges-legend-newpage": "(zie oek de [[Special:NewPages|lieste mit nieje ziejen]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (zie oek de [[Special:NewPages|lieste mit nieje ziejen]])",
        "rcnotefrom": "Dit bin de wiezigingen sinds <strong>$2</strong> (maximum van <strong>$1</strong> wiezigingen).",
        "rclistfrom": "Bekiek wiezigingen vanaof $3 $2",
        "rcshowhideminor": "$1 kleine wiezigingen",
        "cantrollback": "De wiezigingen konnen niet hersteld wörden; der is mer 1 auteur.",
        "alreadyrolled": "Kan de leste wieziging van de zied [[:$1]] deur [[User:$2|$2]] ([[User talk:$2|Overleg]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); niet weerummedreien.\nn Aander hef disse zied al bewarkt of hersteld naor n eerdere versie.\n\nDe leste bewarking op disse zied is edaon deur [[User:$3|$3]] ([[User talk:$3|Overleg]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "De bewarkingssamenvatting was: ''$1''.",
-       "revertpage": "Wiezigingen deur [[Special:Contributions/$2|$2]] hersteld tot de versie nao de leste wieziging deur $1",
+       "revertpage": "Wiezigingen deur [[Special:Contributions/$2|$2]] hersteld tot de versie nao de leste wieziging deur [[User:$1|$1]]",
        "revertpage-nouser": "Wiezigingen deur n verbörgen gebruker weerummedreid naor de leste versie deur {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Wiezigingen van $1; weerummedreid naor de leste versie van $2.",
        "sessionfailure-title": "Sessiefout",
        "pageinfo-category-pages": "Antal ziejen",
        "pageinfo-category-subcats": "Antal onderkategorieën",
        "pageinfo-category-files": "Antal bestaanden",
-       "skinname-cologneblue": "Keuls blauw",
-       "skinname-monobook": "Monobook",
-       "skinname-modern": "Niejmoeds",
        "markaspatrolleddiff": "Zet op nao-ekeken",
        "markaspatrolledtext": "Disse zied is op nao-ekeken ezet",
        "markedaspatrolled": "Op nao-ekeken ezet",
        "weeks": "{{PLURAL:$1|één weke|$1 weken}}",
        "months": "{{PLURAL:$1|een maond|$1 maonden}}",
        "years": "{{PLURAL:$1|één jaor|$1 jaor}}",
-       "ago": "$1 eleen",
+       "ago": "$1 elejen",
        "just-now": "onderlest",
        "hours-ago": "$1 {{PLURAL:$1|uur}} elejen",
        "minutes-ago": "$1 {{PLURAL:$1|minuut|minuten}} elejen",
index a2f5334..dfdeed7 100644 (file)
@@ -10,7 +10,8 @@
                        "Urhixidur",
                        "Zylbath",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Kolega2357"
                ]
        },
        "tog-underline": "Verwies ünnerstrieken",
        "diff-multi-manyusers": "({{PLURAL:$1|Een Twischenversion|$1 Twischenversionen}} von mehr as $2 {{PLURAL:$2|Bruker|Brukers}} warrt nich wiest)",
        "searchresults": "Söökresultaten",
        "searchresults-title": "Söökresultaten för „$1“",
-       "toomanymatches": "To veel Sieden funnen för de Söök, versöök en annere Affraag.",
        "titlematches": "Övereenstimmen mit Överschriften",
        "textmatches": "Övereenstimmen mit Texten",
        "notextmatches": "Kene Övereenstimmen",
        "searchmenu-exists": "* Sied '''[[$1]]'''",
        "searchmenu-new": "'''Stell de Sied „[[:$1]]“ in dit Wiki nee op!'''",
        "searchprofile-articles": "Inholdsieden",
-       "searchprofile-project": "Hülp- un Projektsieden",
        "searchprofile-images": "Datein",
        "searchprofile-everything": "Allens",
        "searchprofile-advanced": "Verwiedert",
        "searchprofile-articles-tooltip": "Söken in $1",
-       "searchprofile-project-tooltip": "Söken in $1",
        "searchprofile-images-tooltip": "Na Datein söken",
        "searchprofile-everything-tooltip": "Allen Inholt dörsöken (inklusiv Diskuschoonssieden)",
        "searchprofile-advanced-tooltip": "Söök in angevene Naamrüüm",
        "search-interwiki-default": "$1 Resultaten:",
        "search-interwiki-more": "(mehr)",
        "search-relatedarticle": "Verwandt",
-       "searcheverything-enable": "In all Naamrüüm söken",
        "searchrelated": "verwandt",
        "searchall": "all",
        "showingresults": "Hier {{PLURAL:$1|is een Resultat|sünd '''$1''' Resultaten}}, anfungen mit #'''$2'''.",
        "allowemail": "Nettbreven vun annere Brukers annehmen",
        "prefs-searchoptions": "Söökopschonen",
        "prefs-namespaces": "Naamrüüm",
-       "defaultns": "Anners söök in disse Naamrüüm:",
        "default": "Standard",
        "prefs-files": "Datein",
        "prefs-custom-css": "Anpasst CSS",
        "prefs-emailconfirm-label": "E-Mail-Bestätigung:",
        "youremail": "Dien E-Mail (kene Plicht) *",
        "username": "Brukernaam:",
-       "uid": "Bruker-ID:",
        "prefs-memberingroups": "Liddmaten vun de {{PLURAL:$1|Grupp|Gruppen}}:",
        "prefs-registration": "Tied vun dat Anmellen:",
        "yourrealname": "Dien echten Naam (kene Plicht)",
        "logempty": "In’e Logböker nix funnen, wat passt.",
        "log-title-wildcard": "Titel fangt an mit …",
        "allpages": "Alle Sieden",
-       "alphaindexline": "$1 bet $2",
        "nextpage": "tokamen Siet ($1)",
        "prevpage": "Vörige Siet ($1)",
        "allpagesfrom": "Sieden wiesen, de mit disse Bookstaven anfangt:",
        "cantrollback": "De Ännern kann nich trüchnahmen warrn; de letzte Autor is de eenzige.",
        "alreadyrolled": "Dat Trüchnehmen vun de Ännern an de Siet [[:$1]] vun [[User:$2|$2]] ([[User talk:$2|Diskuschoonssiet]]{{int:pipe-separator}}[[Special:Contributions/$2|Bidrääg]]) is nich mööglich, vun wegen dat dor en annere Ännern oder Trüchnahm wesen is.\n\nDe letzte Ännern is vun [[User:$3|$3]] ([[User talk:$3|Diskuschoon]]{{int:pipe-separator}}[[Special:Contributions/$3|Bidrääg]]).",
        "editcomment": "De Ännerkommentar weer: „''$1''“.",
-       "revertpage": "Ännern vun [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskuschoon]]) rut un de Version vun [[User:$1]] wedderhaalt",
+       "revertpage": "Ännern vun [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskuschoon]]) rut un de Version vun [[User:$1|$1]] wedderhaalt",
        "rollback-success": "Ännern vun $1 trüchsett op letzte Version vun $2.",
        "sessionfailure": "Dor weer en Problem mit diene Brukersitzung.\nDisse Akschoon is nu ut Sekerheitsgrünn afbraken, dat de Ännern nich verkehrt en annern Bruker toornt warrt.\nGah een Sied trüch un versöök dat noch wedder.",
        "protectlogpage": "Sietenschuul-Logbook",
        "blockip": "IP-Adress blocken",
        "blockip-legend": "Bruker blocken",
        "blockiptext": "Bruuk dat Formular, ene IP-Adress to blocken.\nDit schall blots maakt warrn, Vandalismus to vermasseln, aver jümmer in Övereenstimmen mit uns [[{{MediaWiki:Policy-url}}|Leidlienen]].\nOk den Grund för dat Blocken indregen.",
-       "ipadressorusername": "IP-Adress oder Brukernaam:",
+       "ipaddressorusername": "IP-Adress oder Brukernaam:",
        "ipbexpiry": "Aflooptiet",
        "ipbreason": "Grund:",
        "ipbreason-dropdown": "* Allgemene Sperrgrünn\n** Tofögen vun verkehrte Infos\n** Leddigmaken vun Sieden\n** Schrifft Tüdelkraam in Sieden\n** Bedroht annere\n** Brukernaam nich akzeptabel",
        "pageinfo-category-info": "Kategorieinformatschoon",
        "pageinfo-category-pages": "Tall vun Sied",
        "pageinfo-category-subcats": "TAll vun Ünnerkategorien",
-       "skinname-cologneblue": "Kölsch Blau",
        "markaspatrolleddiff": "As nakeken marken",
        "markaspatrolledtext": "Disse Siet as nakeken marken",
        "markedaspatrolled": "As nakeken marken",
        "newimages-summary": "Disse Spezialsiet wiest de Datein, de toletzt hoochladen worrn sünd.",
        "newimages-legend": "Filter",
        "newimages-label": "Dateinaam (oder Deel dorvun):",
-       "showhidebots": "($1 Bots)",
        "noimages": "Kene Biller.",
        "ilsubmit": "Söken",
        "bydate": "na Datum",
index c05c0dd..a9afdab 100644 (file)
        "qbmyoptions": "मेरो पेज",
        "faq": "धैरै सोधिएका प्रश्नहरु",
        "faqpage": "Project:FAQ",
-       "vector-action-addsection": "विषय थप्नुहोस",
-       "vector-action-delete": "हटाउने",
-       "vector-action-move": "सार्ने",
-       "vector-action-protect": "सुरक्षित गर्ने",
-       "vector-action-undelete": "हटाएको रद्द गर्ने",
-       "vector-action-unprotect": "सुरक्षा परिवर्तन गर्ने",
-       "vector-view-create": "सृजना गर्ने",
-       "vector-view-edit": "सम्पादन",
-       "vector-view-history": "इतिहास हेर्ने",
-       "vector-view-view": "पढ्ने",
-       "vector-view-viewsource": "स्रोत हेर्ने",
        "actions": "कार्यहरु",
        "namespaces": "नेमस्पेस",
        "variants": "बहुरुपहरु",
        "diff-multi-manyusers": "($2 {{PLURAL:$2|भन्दा अधिक प्रयोगकर्ता|भन्दा अधिक प्रयोगकर्ताहरु}}द्वारा {{PLURAL:$1|एउटा मध्यवर्ती संशोधन|$1 मध्यवर्ती संशोधनहरु}} नदेखाइएको)",
        "searchresults": "खोज नतिजाहरू",
        "searchresults-title": " \"$1\"को लागि खोज नतिजाहरु",
-       "toomanymatches": "अति धेरै मिल्ने नतिजाहरु भेटियो , कृपया फरक क्वेरी प्रयोग गर्नुहोस",
        "titlematches": "पृष्ठ शिर्षक मिल्छ",
        "textmatches": "पृष्ठ पाठ मिल्छ",
        "notextmatches": "अक्षरस् पेज भेटिएन",
        "searchmenu-exists": "''' \"[[:$1]]\" नाम गरेको पृष्ठ  यो विकीमा रहेको छ'''",
        "searchmenu-new": "'''यस विकिमा  \"[[:$1]]\" शीर्षक भएको पृष्ठ बनाउनुहोस् !'''",
        "searchprofile-articles": "सामग्री पृष्ठहरू",
-       "searchprofile-project": "सहायता र आयोजना पृष्ठहरु",
        "searchprofile-images": "मल्टिमिडिया(श्रव्य दृश्य)",
        "searchprofile-everything": "सब थोक",
        "searchprofile-advanced": "उन्नत",
        "searchprofile-articles-tooltip": "$1 मा खोज्ने",
-       "searchprofile-project-tooltip": "$1 मा खोज्ने",
        "searchprofile-images-tooltip": "फाइलहरु खोज्ने",
        "searchprofile-everything-tooltip": "सबै सामग्री खोज्ने(वार्तालाप समेत )",
        "searchprofile-advanced-tooltip": "अनुकुल नेमस्पेसमा खोज्ने",
        "search-interwiki-default": "$1देखिका नतिजाहरू:",
        "search-interwiki-more": "(अझै)",
        "search-relatedarticle": "सम्बन्धित",
-       "searcheverything-enable": "सबै नेमस्पेसेजहरुमा खोज्नुहोस्",
        "searchrelated": "सम्बन्धित",
        "searchall": "सबै",
        "showingresults": "देखाउँदै  {{PLURAL:$1|'''१''' नतिजा|'''$1''' नतिजाहरू }} , #'''$2''' बाट सुरुहुने ।",
        "allowemail": "अरु प्रयोगकर्ताहरुबाट प्राप्त हुने ईमेल enable गर्नुहोस् ।",
        "prefs-searchoptions": "खोज्ने",
        "prefs-namespaces": "नेमस्पेसेज",
-       "defaultns": "अन्यथा यी नेमस्पेसेजमा खोज्ने :",
        "default": "पूर्वनिर्धारित",
        "prefs-files": "फाइलहरु",
        "prefs-custom-css": "अनुकुलित CSS",
        "recentchanges-label-minor": "यो साधारण सम्पादन हो",
        "recentchanges-label-bot": "यो सम्पादन बोटद्वारा गरिएको थियो",
        "recentchanges-label-unpatrolled": "यो सम्पादन अहिले सम्म पट्रोल गरिएको छैन",
-       "recentchanges-legend-newpage": "([[Special:NewPages|list of new pages]] यो पनि हेर्नुहोस्)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|list of new pages]] यो पनि हेर्नुहोस्)",
        "recentchanges-legend-plusminus": "(''±१२३'')",
        "rcnotefrom": "'''$2''' देखिका परिवर्तनहरु तल ('''$1''' सम्मका देखाइन्छ)।",
        "rclistfrom": "$3 $2 देखिका नयाँ परिवर्तनहरू देखाउनु",
        "addedwatchtext": "\"[[:$1]]\" पृष्ठ [[Special:Watchlist|अवलोकनसूची]]मा थपियो\nयो पृष्ठ र यससित सम्बद्ध वार्तालाप पृष्ठमा भविष्यमा हुने परिवर्तन सूचिबद्ध गरिनेछ र यो पृष्ठ [[Special:RecentChanges|नयाँ परिवर्तनहरू]]मा छान्न सजिलोकोलागि गाढा अक्षरमा देखा पर्नेछ।",
        "removewatch": "निगरानी सुचीबाट हटाउने",
        "removedwatchtext": "पृष्ठ \"[[:$1]]\" [[Special:Watchlist|तपाईको निगरानी सूची]]बाट हटाइएको छ।",
+       "removedwatchtext-short": "पृष्ठ \"$1\" तपाईंको अवलोकनसूची बाट हटाइयो",
        "watch": "अवलोकन",
        "watchthispage": "यो पृष्ठ अवलोकन गर्नुहोस्",
        "unwatch": "निगरानीबाट हटाउने",
        "tooltip-preferences-save": "अभिरुचिहरु संग्रह गर्नुहोस्",
        "tooltip-summary": "छोटो सारांश हाल्नुहोस्",
        "common.css": "/* यहाँ राखिएका CSS सबै खोलहरुमा लागु हुनेछन् */",
-       "cologneblue.css": "/* यहाँ राखिएको CSS ले कोलोग्ने ब्लु स्किनको प्रयोगकर्ताहरुलाई प्रभावित गर्ने छ  */",
-       "monobook.css": "/* यहाँ राखिएको CSS ले मोनोबुक स्किनको प्रयोगकर्ताहरुलाई प्रभावित गर्ने छ  */",
-       "modern.css": "/* यहाँ राखिएको CSS ले मोनोबुक मोडर्न प्रयोगकर्ताहरुलाई प्रभावित गर्ने छ  */",
-       "vector.css": "/* यहाँ राखिएको CSS ले भेक्टर स्किनको प्रयोगकर्ताहरुलाई प्रभावित गर्ने छ  */",
        "print.css": "/* यहाँ राखिएको CSS मुद्रण नतिजालाई प्रभावित गर्छ  */",
        "anonymous": "{{SITENAME}} का {{PLURAL:$1||}} नाम नभएका सदस्य",
        "siteuser": "{{SITENAME}} प्रयोगकर्ता $1",
        "pageinfo-category-pages": "पृष्ठहरूको संख्या",
        "pageinfo-category-subcats": "उपश्रेणीहरूको संख्या",
        "pageinfo-category-files": "फाइलहरूको संख्या",
-       "skinname-cologneblue": "कोलोग्ने निलो",
-       "skinname-monobook": "मोनोबुक",
-       "skinname-modern": "मोडर्न",
-       "skinname-vector": "भेक्टर",
        "markaspatrolleddiff": "गस्ती गरिएको(patrolled) को रुपमा चिनो लगाउने",
        "markaspatrolledtext": "यस पृष्ठलाई गस्ती गरिएको(patrolled) को रुपमा चिनो लगाउने",
        "markedaspatrolled": "गस्ती गरिएको(patrolled) को रुपमा चिनो लगाइयो",
        "watchlistedit-raw-done": "तपाईको निगरानी सुची अद्यावधिक गरिएको छ।",
        "watchlistedit-raw-added": "{{PLURAL:$1|१ शिर्षक|$1 शिर्षकरु}} थपियो:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|१ शिर्षक|$1 शिर्षकरु}} हटाइयो:",
+       "watchlistedit-clear-title": "अवलोकन सूची खाली गरियो",
+       "watchlistedit-clear-legend": "अवलोकन सूची खाली गर्ने",
        "watchlistedit-clear-titles": "शीर्षकहरू :",
+       "watchlistedit-clear-submit": "अवलोकनबाट हटाउने (यो स्थायी हुन्छ!)",
        "watchlistedit-clear-done": "तपाईको निगरानी सुची हटाइएको छ।",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|१ शिर्षक|$1 शिर्षकरु}} हटाइयो:",
+       "watchlistedit-too-many": "यहाँ देखाउनका लागि अति धेरै पृष्ठहरू छन्",
+       "watchlisttools-clear": "अवलोकन सूची खाली गर्ने",
        "watchlisttools-view": "मिल्दो परिवर्तनहरु हेर्ने",
        "watchlisttools-edit": "निगरानी सूची हेर्नुहोस् र सम्पादन गर्नुहोस्",
        "watchlisttools-raw": "कच्चा निगरानी सूची सम्पादन गर्नुहोस् ।",
index 2620837..1ec5f12 100644 (file)
@@ -56,7 +56,8 @@
                        "Wolf Lambert",
                        "לערי ריינהארט",
                        "아라",
-                       "Mar(c)"
+                       "Mar(c)",
+                       "Calak"
                ]
        },
        "tog-underline": "Koppelingen onderstrepen:",
        "qbmyoptions": "Mijn pagina's",
        "faq": "Veelgestelde vragen",
        "faqpage": "Project:Veelgestelde vragen",
-       "vector-action-addsection": "Kopje toevoegen",
-       "vector-action-delete": "Verwijderen",
-       "vector-action-move": "Hernoemen",
-       "vector-action-protect": "Beveiligen",
-       "vector-action-undelete": "Terugplaatsen",
-       "vector-action-unprotect": "Beveiliging wijzigen",
-       "vector-view-create": "Aanmaken",
-       "vector-view-edit": "Bewerken",
-       "vector-view-history": "Geschiedenis weergeven",
-       "vector-view-view": "Lezen",
-       "vector-view-viewsource": "Brontekst bekijken",
-       "actions": "Handelingen",
+       "actions": "Acties",
        "namespaces": "Naamruimten",
        "variants": "Varianten",
        "navigation-heading": "Navigatiemenu",
        "currentrev": "Huidige versie",
        "currentrev-asof": "Huidige versie van $2 om $3",
        "revisionasof": "Versie van $2 om $3",
-       "revision-info": "Versie door $2 op $4 om $5",
+       "revision-info": "Versie door {{GENDER:$6|$2}} op $4 om $5 $7",
        "previousrevision": "← Oudere versie",
        "nextrevision": "Nieuwere versie →",
        "currentrevisionlink": "Huidige versie",
        "logdelete-text": "Verwijderde logboekregels zijn nog zichtbaar in de logboeken, maar delen van de inhoud zijn niet openbaar.",
        "revdelete-text-others": "Andere beheerders van {{SITENAME}} kunnen de verborgen inhoud nog steeds inzien en weer zichtbaar maken via deze interface, tenzij er aanvullende beperkingen zijn ingesteld.",
        "revdelete-confirm": "Bevestig dat u dit wilde doen, dat u de consequenties begrijpt en dat u dit doet in overeenstemming met het geldende [[{{MediaWiki:Policy-url}}|beleid]].",
-       "revdelete-suppress-text": "Gebruik versies verbergen '''alleen''' in de volgende gevallen:\n* Mogelijk smadelijke informatie;\n* Ongepaste persoonlijke gegevens, zoals:\n*: ''adres, telefoonnummers, Burger Service Nummers, enzovoort.''",
+       "revdelete-suppress-text": "Gebruik versies verbergen '''alleen''' in de volgende gevallen:\n* Mogelijk smadelijke informatie;\n* Ongepaste persoonlijke gegevens, zoals:\n*: ''adres, telefoonnummers, identificatienummer, enzovoort.''",
        "revdelete-legend": "Zichtbaarheidsbeperkingen instellen",
        "revdelete-hide-text": "Versietekst",
        "revdelete-hide-image": "Bestandsinhoud verbergen",
        "difference-missing-revision": "{{PLURAL:$2|Eén versie|$2 versies}} van deze verschillen ($1) {{PLURAL:$2|is|zijn}} niet aangetroffen.\n\nDit wordt meestal veroorzaakt door het volgen van een verouderde koppeling verschillen voor een pagina die is verwijderd.\nMeer gegevens zijn mogelijk te vinden in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].",
        "searchresults": "Zoekresultaten",
        "searchresults-title": "Zoekresultaten voor \"$1\"",
-       "toomanymatches": "Er waren te veel resultaten.\nProbeer een andere zoekopdracht.",
        "titlematches": "Overeenkomst met onderwerp",
        "textmatches": "Overeenkomst met inhoud",
        "notextmatches": "Geen pagina's gevonden",
        "search-interwiki-default": "Resultaten van $1:",
        "search-interwiki-more": "(meer)",
        "search-relatedarticle": "Gerelateerd",
-       "searcheverything-enable": "In alle naamruimten zoeken",
        "searchrelated": "gerelateerd",
        "searchall": "alle",
        "showingresults": "Hieronder {{PLURAL:$1|staat '''1''' resultaat|staan '''$1''' resultaten}} vanaf #'''$2'''.",
        "powersearch-togglelabel": "Selecteren:",
        "powersearch-toggleall": "Alle",
        "powersearch-togglenone": "Geen",
+       "powersearch-remember": "Selectie onthouden voor toekomstige zoekopdrachten",
        "search-external": "Extern zoeken",
        "searchdisabled": "Zoeken in {{SITENAME}} is niet mogelijk.\nU kunt gebruik maken van Google.\nDe gegevens over {{SITENAME}} zijn mogelijk niet bijgewerkt.",
        "search-error": "Er is een fout opgetreden tijdens het zoeken: $1",
        "allowemail": "E-mail van andere gebruikers toestaan",
        "prefs-searchoptions": "Zoeken",
        "prefs-namespaces": "Naamruimten",
-       "defaultns": "Anders in de volgende naamruimten zoeken:",
        "default": "standaard",
        "prefs-files": "Bestanden",
        "prefs-custom-css": "aangepaste CSS",
        "recentchanges-label-unpatrolled": "Deze bewerking is nog niet gecontroleerd",
        "recentchanges-label-plusminus": "Deze paginagrootte is met dit aantal bytes gewijzigd",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "Zie ook de [[Special:NewPages|Lijst met nieuwe pagina's]].",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (zie ook de [[Special:NewPages|Lijst met nieuwe pagina's]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Wijzigingen sinds <strong>$3 om $4</strong> (maximaal <strong>$1</strong> {{PLURAL:$1|wijziging|wijzigingen}}).",
        "rclistfrom": "Wijzigingen bekijken vanaf $3 $2",
        "windows-nonascii-filename": "Deze wiki ondersteunt geen bestandsnamen met speciale tekens.",
        "fileexists": "Er bestaat al een bestand met deze naam.\nControleer <strong>[[:$1]]</strong> als u niet zeker weet of u het huidige bestand wilt overschrijven.\n[[$1|thumb]]",
        "filepageexists": "De beschrijvingspagina voor dit bestand bestaat al op <strong>[[:$1]]</strong>, maar er bestaat geen bestand met deze naam.\nDe samenvatting die u hebt opgegeven verschijnt niet op de beschrijvingspagina.\nBewerk de pagina handmatig om uw beschrijving daar weer te geven.\n[[$1|miniatuur]]",
-       "fileexists-extension": "Een bestand met dezelfde naam bestaat al: [[$2|thumb]]\n* Naam van het geüploade bestand: <strong>[[:$1]]</strong>\n* Naam van het bestaande bestand: <strong>[[:$2]]</strong>\nKies een andere naam.",
+       "fileexists-extension": "Een bestand met dezelfde naam bestaat al: [[$2|thumb]]\n* Naam van het geüploade bestand: <strong>[[:$1]]</strong>\n* Naam van het bestaande bestand: <strong>[[:$2]]</strong>\nWilt u misschien een meer onderscheidende naam gebruiken?",
        "fileexists-thumbnail-yes": "Het bestand lijkt een verkleinde versie te zijn ''(miniatuurafbeelding)''. [[$1|thumb]]\nControleer het bestand <strong>[[:$1]]</strong>.\nAls het gecontroleerde bestand dezelfde afbeelding van oorspronkelijke grootte is, is het niet noodzakelijk een extra miniatuurafbeelding te uploaden.",
        "file-thumbnail-no": "De bestandsnaam begint met <strong>$1</strong>.\nHet lijkt een verkleinde afbeelding te zijn ''(miniatuurafbeelding)''.\nAls u deze afbeelding in volledige resolutie hebt, upload die afbeelding dan.\nWijzig anders de bestandsnaam.",
        "fileexists-forbidden": "Er bestaat al een bestand met deze naam, en dat kan niet overschreven worden.\nUpload uw bestand onder een andere naam.\n[[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Het verwijderen en terugplaatsen is tijdelijk niet mogelijk wegens onderhoudswerkzaamheden.",
        "filedelete-maintenance-title": "Bestand verwijderen is niet mogelijk",
        "mimesearch": "Zoeken op MIME-type",
-       "mimesearch-summary": "Deze pagina maakt het filteren van bestanden voor het MIME-type mogelijk.\nInvoer: inhoudstype/subtype, bijvoorbeeld <code>image/jpeg</code>.",
+       "mimesearch-summary": "Deze pagina maakt het filteren van bestanden voor het MIME-type mogelijk.\nInvoer: inhoudstype/subtype of inhoudstype/*, bijvoorbeeld <code>image/jpeg</code>.",
        "mimetype": "MIME-type:",
        "download": "downloaden",
        "unwatchedpages": "Pagina's die niet op een volglijst staan",
        "tooltip-summary": "Voer een korte samenvatting in",
        "interlanguage-link-title": "$1 – $2",
        "common.css": "/** CSS die hier wordt geplaatst heeft invloed op alle skins */",
-       "monobook.css": "/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Monobook */",
-       "vector.css": "/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Vector */",
        "print.css": "/* CSS die hier wordt geplaatst heeft alleen invloed op de printuitvoer */",
        "noscript.css": "/ * CSS die hier wordt geplaatst heeft invloed voor gebruikers die JavaScript hebben uitgeschakeld * /",
        "group-autoconfirmed.css": "/* CSS die hier wordt geplaatst heeft alleen invloed op automatisch bevestigde gebruikers */",
        "group-sysop.css": "/* CSS die hier wordt geplaatst heeft alleen invloed op beheerders */",
        "group-bureaucrat.css": "/* CSS die hier wordt geplaatst heeft alleen invloed op bureaucraten */",
        "common.js": "/* JavaScript die hier wordt geplaatst heeft invloed op alle pagina's voor alle gebruikers */",
-       "monobook.js": "/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Monobook gebruiken */",
-       "vector.js": "/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Vector gebruiken */",
        "group-autoconfirmed.js": "/* JavaScript die hier wordt geplaatst heeft alleen invloed op automatisch bevestigde gebruikers */",
        "group-user.js": "/* JavaScript die hier wordt geplaatst heeft alleen invloed op geregistreerde gebruikers */",
        "group-bot.js": "/* JavaScript die hier wordt geplaatst heeft alleen invloed op robots */",
        "pageinfo-category-pages": "Aantal pagina's",
        "pageinfo-category-subcats": "Aantal subcategorieën",
        "pageinfo-category-files": "Aantal bestanden",
-       "skinname-monobook": "Monobook",
-       "skinname-vector": "Vector",
        "markaspatrolleddiff": "Als gecontroleerd markeren",
        "markaspatrolledtext": "Deze pagina als gecontroleerd markeren",
        "markedaspatrolled": "Gemarkeerd als gecontroleerd",
        "watchlistedit-raw-done": "Uw volglijst is bijgewerkt.",
        "watchlistedit-raw-added": "Er {{PLURAL:$1|is 1 pagina|zijn $1 pagina's}} toegevoegd:",
        "watchlistedit-raw-removed": "Er {{PLURAL:$1|is 1 pagina|zijn $1 pagina's}} verwijderd:",
-       "watchlistedit-clear-title": "Volglijst wissen",
+       "watchlistedit-clear-title": "Volglijst gewist",
        "watchlistedit-clear-legend": "Volglijst wissen",
        "watchlistedit-clear-explain": "Alle titels zullen van uw volglijst worden verwijderd",
        "watchlistedit-clear-titles": "Titels:",
index 73132c3..7ffb521 100644 (file)
        "qbmyoptions": "Sidene mine",
        "faq": "OSS",
        "faqpage": "Project:OSS",
-       "vector-action-addsection": "Nytt emne",
-       "vector-action-delete": "Slett",
-       "vector-action-move": "Flytt",
-       "vector-action-protect": "Vern",
-       "vector-action-undelete": "Gjenopprett",
-       "vector-action-unprotect": "Endra vern",
-       "vector-view-create": "Opprett",
-       "vector-view-edit": "Endre",
-       "vector-view-history": "Sjå historikken",
-       "vector-view-view": "Les",
-       "vector-view-viewsource": "Sjå kjelda",
        "actions": "Handlingar",
        "namespaces": "Namnerom",
        "variants": "Variantar",
        "permalink": "Fast lenkje",
        "print": "Skriv ut",
        "view": "Sjå",
+       "view-foreign": "Vis på $1",
        "edit": "Endre",
+       "edit-local": "Endre lokal skildring",
        "create": "Opprett",
+       "create-local": "Legg til lokal skildring",
        "editthispage": "Endre sida",
        "create-this-page": "Opprett sida",
        "delete": "Slett",
        "difference-missing-revision": "{{PLURAL:$2|Éin versjon|$2 versjonar}} av skilnaden ($1) vart ikkje {{PLURAL:$2|funnen|funne}}.\n\nDette skriv seg som oftast frå at ein har fylgt ei forelda versjonslenkje til ei side som er sletta.\nDetaljar kan ein finna i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sletteloggen].",
        "searchresults": "Søkjeresultat",
        "searchresults-title": "Søkjeresultat for «$1»",
-       "toomanymatches": "Søket gav for mange treff, prøv ei anna spørjing",
        "titlematches": "Sidetitlar med treff på førespurnaden",
        "textmatches": "Sider med treff på førespurnaden",
        "notextmatches": "Ingen sider hadde treff på førespurnaden",
        "searchmenu-exists": "* Sida '''[[$1]]'''",
        "searchmenu-new": "'''Opprett sida «[[:$1|$1]]» på denne wikien.'''",
        "searchprofile-articles": "Innhaldssider",
-       "searchprofile-project": "Hjelp- og prosjektsider",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Alt",
        "searchprofile-advanced": "Avansert",
        "searchprofile-articles-tooltip": "Søk i $1",
-       "searchprofile-project-tooltip": "Søk i $1",
        "searchprofile-images-tooltip": "Søk etter filer",
        "searchprofile-everything-tooltip": "Søk i alt innhald (inkludert diskusjonssider)",
        "searchprofile-advanced-tooltip": "Søk i visse namnerom",
        "search-interwiki-default": "$1-resultat:",
        "search-interwiki-more": "(meir)",
        "search-relatedarticle": "Relatert",
-       "searcheverything-enable": "Søk i alle namneroma",
        "searchrelated": "relatert",
        "searchall": "alle",
        "showingresults": "Nedanfor er opp til {{PLURAL:$1|'''eitt'''|'''$1'''}} resultat som byrjar med nummer '''$2''' vist{{PLURAL:$1||e}}.",
        "allowemail": "Tillat e-post frå andre brukarar",
        "prefs-searchoptions": "Søk",
        "prefs-namespaces": "Namnerom",
-       "defaultns": "Søk elles i desse namneromma:",
        "default": "standard",
        "prefs-files": "Filer",
        "prefs-custom-css": "Eigendefinert CSS",
        "prefs-emailconfirm-label": "Stadfesting av e-post:",
        "youremail": "E-post:",
        "username": "{{GENDER:$1|Brukarnamn}}:",
-       "uid": "{{GENDER:$1|Brukar-ID}}:",
        "prefs-memberingroups": "{{GENDER:$2|Medlem}} av {{PLURAL:$1|gruppa|gruppene}}:",
        "prefs-registration": "Registreringstid:",
        "yourrealname": "Verkeleg namn:",
        "recentchanges-label-unpatrolled": "Endringa er ikkje patruljert enno",
        "recentchanges-label-plusminus": "Storleiken til sida vart endra med så mange byte",
        "recentchanges-legend-heading": "'''Tyding:'''",
-       "recentchanges-legend-newpage": "(sjå dessutan [[Special:NewPages|lista over nye sider]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sjå dessutan [[Special:NewPages|lista over nye sider]])",
        "rcnotefrom": "Nedanfor er endringane gjorde sidan <strong>$2</strong> viste (opp til <strong>$1</strong> stykke)",
        "rclistfrom": "Vis nye endringar sidan $3 $2",
        "rcshowhideminor": "$1 småplukk",
        "filehist-deleteall": "slett alle",
        "filehist-deleteone": "slett",
        "filehist-revert": "rulla attende",
-       "filehist-current": "noverande",
+       "filehist-current": "gjeldande",
        "filehist-datetime": "Dato/klokkeslett",
        "filehist-thumb": "Miniatyrbilete",
        "filehist-thumbtext": "Miniatyrbilete av versjonen frå $1",
        "log-title-wildcard": "Søk i titlar som byrjar med denne teksten",
        "showhideselectedlogentries": "Vis/gøym valde loggoppføringar",
        "allpages": "Alle sider",
-       "alphaindexline": "$1 til $2",
        "nextpage": "Neste side ($1)",
        "prevpage": "Førre sida ($1)",
        "allpagesfrom": "Vis sider frå:",
        "watchlistanontext": "Du lyt $1 for å vise eller endre sider på overvakingslista di.",
        "watchnologin": "Ikkje innlogga",
        "addwatch": "↓Legg til i overvakingslista",
-       "addedwatchtext": "Sida «[[:$1]]» er lagd til i [[Special:Watchlist|overvakingslista]] di. Framtidige endringar av henne og den tilhøyrande diskusjonssida hennar vil bli oppførde der.",
+       "addedwatchtext": "Sida «[[:$1]]» er lagd til i [[Special:Watchlist|overvakingslista]] di. Framtidige endringar av henne og den tilhøyrande diskusjonssida hennar vil bli oppførte der.",
        "removewatch": "Fjerna frå overvakingslista",
        "removedwatchtext": "Sida «[[:$1]]» er fjerna frå [[Special:Watchlist|overvakingslista di]].",
        "watch": "Overvak",
        "tooltip-preferences-save": "Lagra innstillingar",
        "tooltip-summary": "Skriv inn eit kort samandrag",
        "common.css": "/* CSS plassert i denne fila vil gjelde for alle utsjånader. */",
-       "cologneblue.css": "/* CSS i denne fila vil gjelde alle som nyttar drakta Kølnerblå */",
-       "monobook.css": "/* CSS-tekst som vert plassert her, endrar utsjånaden til sidedrakta Monobook */",
-       "modern.css": "/* CSS i denne fila vil gjelde alle som nyttar drakta Modern */",
        "print.css": "/* CSS i denne fila vil påverke utskriftsversjonen */",
        "common.js": "/* Javascript i denne fila vil gjelde for alle drakter. */",
-       "cologneblue.js": "/* Javascript i denne fila vil gjelde for brukarar av drakta Kølnerblå */",
-       "monobook.js": "/* Javascript i denne fila vil gjelde for brukarar av drakta Monobook */",
-       "modern.js": "* Javascript i denne fila vil gjelde for brukarar av drakta Modern */",
        "anonymous": "{{PLURAL:$1|anonym brukar|anonyme brukarar}} av {{SITENAME}}",
        "siteuser": "{{SITENAME}}-brukaren $1",
        "anonuser": "{{SITENAME}} anonym brukar $1",
        "pageinfo-category-pages": "Tal sider",
        "pageinfo-category-subcats": "Tal underkategoriar",
        "pageinfo-category-files": "Tal filer",
-       "skinname-cologneblue": "Kölnerblå",
-       "skinname-monobook": "MonoBook",
-       "skinname-modern": "Moderne",
        "markaspatrolleddiff": "Merk som patruljert",
        "markaspatrolledtext": "Merk innhaldssida som patruljert",
        "markedaspatrolled": "Merk som patruljert",
        "exif-artist": "Skapar",
        "exif-copyright": "Opphavsrettsleg eigar",
        "exif-exifversion": "Exif-versjon",
-       "exif-flashpixversion": "Støtta Flashpix versjon",
+       "exif-flashpixversion": "Støtta Flashpix-versjon",
        "exif-colorspace": "Fargerom",
        "exif-componentsconfiguration": "Komponentanalyse",
        "exif-compressedbitsperpixel": "Komprimerte bits pr. pixel",
index a7dafa9..2c07442 100644 (file)
        "qbmyoptions": "Mas opcions",
        "faq": "FAQ",
        "faqpage": "Project:FAQ",
-       "vector-action-addsection": "Apondre un subjècte",
-       "vector-action-delete": "Suprimir",
-       "vector-action-move": "Tornar nomenar",
-       "vector-action-protect": "Protegir",
-       "vector-action-undelete": "Restablir",
-       "vector-action-unprotect": "Suprimir la proteccion",
-       "vector-view-create": "Crear",
-       "vector-view-edit": "Modificar",
-       "vector-view-history": "Veire l'istoric",
-       "vector-view-view": "Legir",
-       "vector-view-viewsource": "Veire la font",
        "actions": "Accions",
        "namespaces": "Espacis de noms",
        "variants": "Variantas",
        "difference-missing-revision": "{{PLURAL:$2|Una revision|$2 revisions}} d'aquesta diferéncia ($1) {{PLURAL:$2|es pas estada trobada|son pas estadas trobadas}}.\n\nAquò se produtz en general en seguent un ligam de diferéncia obsolèta cap a una pagina qu'es estada suprimada.\nPodètz trobar de detalhs dins lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de las supressions].",
        "searchresults": "Resultats de la recèrca",
        "searchresults-title": "Resultats de la recèrca per « $1 »",
-       "toomanymatches": "Tròp d’ocuréncias son estadas trobadas, sètz pregat de sometre una requèsta diferenta.",
        "titlematches": "Correspondéncias dins los títols d'articles",
        "textmatches": "Correspondéncias dins los tèxtes d'articles",
        "notextmatches": "Cap de tèxte d'article correspond pas a la recèrca",
        "searchmenu-exists": "* Pagina '''[[$1]]'''",
        "searchmenu-new": "<strong>Crear la pagina « [[:$1|$1]] » sus aqueste wiki !</strong> {{PLURAL:$2|0=|Vejatz tanben la pagina trobada amb vòstra recèrca.|Vejatz tanben los resultats de vòstra recèrca.}}",
        "searchprofile-articles": "Paginas de contengut",
-       "searchprofile-project": "Paginas d'ajuda e del projècte",
        "searchprofile-images": "Multimèdia",
        "searchprofile-everything": "Tot",
        "searchprofile-advanced": "Avançat",
        "searchprofile-articles-tooltip": "Recercar dins $1",
-       "searchprofile-project-tooltip": "Recercar dins $1",
        "searchprofile-images-tooltip": "Recercar de fichièrs",
        "searchprofile-everything-tooltip": "Recercar dins tot lo contengut (tot incluissent las paginas de discussion)",
        "searchprofile-advanced-tooltip": "Recercar dins d'espacis de noms personalizats",
        "search-interwiki-default": "Resultats de $1 :",
        "search-interwiki-more": "(mai)",
        "search-relatedarticle": "Relatat",
-       "searcheverything-enable": "Recercar dins totes los espacis de noms",
        "searchrelated": "relatat",
        "searchall": "Totes",
        "showingresults": "Afichatge de <b>$1</b> resultat{{PLURAL:$1||s}} a partir del n°<b>$2</b>.",
        "allowemail": "Autorizar lo mandadís de corrièr electronic venent d’autres utilizaires",
        "prefs-searchoptions": "Recèrca",
        "prefs-namespaces": "Noms d’espacis",
-       "defaultns": "Autrament recercar dins aquestes espacis de noms :",
        "default": "defaut",
        "prefs-files": "Fichièrs",
        "prefs-custom-css": "CSS personalizat",
        "prefs-emailconfirm-label": "Confirmacion del corrièr electronic :",
        "youremail": "Adreça de corrièr electronic :",
        "username": "{{GENDER:$1|Nom d'utilizaire|Nom d'utilizaira}}:",
-       "uid": "Numèro d'{{GENDER:$1|utilizaire|utilizaira}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membre|Membra}} {{PLURAL:$1|del grop|dels gropes}}:",
        "prefs-registration": "Data de creacion del compte :",
        "yourrealname": "Nom vertadièr :",
        "recentchanges-label-unpatrolled": "Aqueste cambiament es pas estat verificat encara.",
        "recentchanges-label-plusminus": "La talha de la pagina a cambiat d'aqueste nombre d’octets.",
        "recentchanges-legend-heading": "'''Legenda :'''",
-       "recentchanges-legend-newpage": "(veire tanben la [[Special:NewPages|lista de las paginas novèlas]]).",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (veire tanben la [[Special:NewPages|lista de las paginas novèlas]]).",
        "rcnotefrom": "Çaijós las modificacions efectuadas dempuèi lo <strong>$2</strong> (fins a <strong>$1</strong> afichats).",
        "rclistfrom": "Afichar las modificacions novèlas dempuèi lo $3 $2",
        "rcshowhideminor": "$1 los cambiaments menors",
        "tooltip-preferences-save": "Salvar las preferéncias",
        "tooltip-summary": "Apondètz un brèu resumit",
        "common.css": "/** Lo CSS plaçat aicí serà aplicat a totas las aparéncias. */",
-       "cologneblue.css": "/* Lo CSS plaçat aicí afectarà los utilizaires de l’abilhatge Cologne Blue */",
-       "monobook.css": "/* Lo CSS plaçat aicí afectarà los utilizaires del skin Monobook */",
-       "modern.css": "/* Lo CSS plaçat aicí afectarà los utilizaires de l’abilhatge Modern */",
-       "vector.css": "/* Lo CSS plaçat aicí afectarà los utilizaires de l’abilhatge Vector */",
        "print.css": "/* Lo CSS plaçat aicí afectarà las impressions */",
        "common.js": "/* Tot JavaScript serà cargat amb cada pagina accedida per un utilizaire quin que siá. */",
-       "cologneblue.js": "/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge Cologne Blue unicament. */",
-       "monobook.js": "/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge MonoBook unicament. */",
-       "modern.js": "/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge Modern unicament. */",
-       "vector.js": "/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge Vector unicament. */",
        "anonymous": "{{PLURAL:$1|Utilizaire anonim|Utilizaires anonims}} de {{SITENAME}}",
        "siteuser": "Utilizaire $1 de {{SITENAME}}",
        "anonuser": "l'utilizaire anonim $1 de {{SITENAME}}",
        "pageinfo-category-pages": "Nombre de paginas",
        "pageinfo-category-subcats": "Nombre de soscategorias",
        "pageinfo-category-files": "Nombre de fichièrs",
-       "skinname-cologneblue": "Colonha Blau",
-       "skinname-monobook": "Monobook",
-       "skinname-modern": "Modèrne",
        "markaspatrolleddiff": "Marcar coma essent pas un vandalisme",
        "markaspatrolledtext": "Marcar aqueste article coma pas vandalizat",
        "markedaspatrolled": "Marcat coma pas vandalizat",
index 15f95f9..12937ed 100644 (file)
        "page_first": "ପ୍ରଥମ",
        "page_last": "ଶେଷ",
        "histlegend": "ଭିନ୍ନ ବଛା: ବାଛିବା ପାଇଁ ଗୋଲ ବାଛିବା ଘରେ କ୍ଲିକ କରି ଏଣ୍ଟର ଅଥବା ତଳେ ଥିବା ବଟନ ଦବାନ୍ତୁ ।<br />\nନିର୍ଦ୍ଦେଶିକା: <strong>({{int:cur}})</strong> = ଗତ ସଂସ୍ମରଣମାନଙ୍କ ମଧ୍ୟରେ ତଫାତ, <strong>({{int:last}})</strong> = ଆଗର ସଂସ୍ମରଣମାନଙ୍କ ମଧ୍ୟରେ ତଫାତ, <strong>{{int:minoreditletter}}</strong> = ଛୋଟମୋଟ ସମ୍ପାଦନା ।",
-       "history-fieldset-title": "ଇତିହାସ ଖୋଜିବା",
+       "history-fieldset-title": "ଇତିହାସରେ ଖୋଜନ୍ତୁ",
        "history-show-deleted": "କେବଳ ଲିଭାଯାଇଥିବା",
        "histfirst": "ସବୁଠୁ ପୁରୁଣା",
        "histlast": "ନଗଦ",
        "search-interwiki-default": "$1 ରୁ ଫଳାଫଳ:",
        "search-interwiki-more": "(ଅଧିକ)",
        "search-relatedarticle": "ଯୋଡ଼ା",
-       "searcheverything-enable": "ସବୁଗୁଡ଼ିକ ନେମସ୍ପେସରେ ଖୋଜିବେ",
        "searchrelated": "ଯୋଡ଼ା",
        "searchall": "ସବୁ",
        "showingresults": "ତଳେ {{PLURAL:$1|'''ଗୋଟିଏ'''  ଫଳାଫଳ|'''$1'''ଟି ଫଳାଫଳ}} ଦେଖାଉଛୁ ଯାହା #'''$2'''ରେ ଆରମ୍ଭ ହୋଇଅଛି ।",
        "prefs-editing": "ସମ୍ପାଦନା",
        "rows": "ଧାଡ଼ି:",
        "columns": "ସ୍ତମ୍ଭସବୁ:",
-       "searchresultshead": "à¬\96à­\8bà¬\9cିବା",
+       "searchresultshead": "à¬\96à­\8bà¬\9cନà­\8dତà­\81",
        "stub-threshold": "<a href=\"#\" class=\"stub\">ଅସମ୍ପୂର୍ଣ ପୃଷ୍ଠା ଲିଙ୍କ</a> ସଜାଣି (ବାଇଟ) ପାଇଁ ସୀମା:",
        "stub-threshold-disabled": "ଅଚଳ କରିଦିଆଯାଇଛି",
        "recentchangesdays": "ନଗଦ ବଦଳରେ ଦେଖାଇବା ପାଇଁ ବାକିଥିବା ଦିନ:",
        "allowemail": "ବାକି ସଭ୍ୟମାନଙ୍କ ଠାରୁ ଆସିଥିବା ଇ-ମେଲ ସଚଳ କରାଇବେ",
        "prefs-searchoptions": "ଖୋଜିବେ",
        "prefs-namespaces": "ନେମସ୍ପେସ",
-       "defaultns": "ନଚେତ ଏହି ନେମସ୍ପେସ ଗୁଡ଼ିକରେ ଖୋଜନ୍ତୁ:",
        "default": "ପୂର୍ବ ନିର୍ଦ୍ଧାରିତ",
        "prefs-files": "ଫାଇଲ",
        "prefs-custom-css": "ମନମୁତାବକ CSS",
        "deletedcontributions-title": "ଲିଭାଇ ଦିଆଯାଇଥିବା ସଭ୍ୟଙ୍କ ଅବଦାନସମୂହ",
        "sp-deletedcontributions-contribs": "ଅବଦାନସମୂହ",
        "linksearch": "ବାହାର ଲିଙ୍କ ଖୋଜା",
-       "linksearch-pat": "à¬\96à­\8bà¬\9cିବା à¬ªà­\8dରଣାଳà­\80:",
+       "linksearch-pat": "ଖୋଜା ପ୍ରଣାଳୀ:",
        "linksearch-ns": "ନେମସ୍ପେସ:",
-       "linksearch-ok": "à¬\96à­\8bà¬\9cିବା",
+       "linksearch-ok": "à¬\96à­\8bà¬\9cନà­\8dତà­\81",
        "linksearch-text": "\"*.wikipedia.org\" ପରି ୱାଇଲ୍ଡକାର୍ଡ଼ର ବ୍ୟବହାର କରାଯାଇଥାଇ ପାରେ ।\nଏକ ଉଚ୍ଚକୋଟୀର ଡୋମେନ ଲୋଡ଼ା, ଯଥା \"*.org\".<br />\nଅନୁମୋଦିତ {{PLURAL:$2|protocol|protocols}}: <code>$1</code> (ଯଦି କୌଣସି ପ୍ରୋଟୋକଲ ଦିଆଯାଇନଥାଏ ତେବେ ଆପେ ଆପେ http:// ହୋଇଯାଇଥାଏ) ।",
        "linksearch-line": "$1 ଟି $2ରୁ ଯୋଡ଼ାଯାଇଅଛି ।",
        "linksearch-error": "କେବଳ ହୋଷ୍ଟ ନାମର ଆରମ୍ଭରେ ୱାଇଲ୍ଡକାର୍ଡ଼ ଦେଖାଯିବ ।",
        "sp-contributions-search": "ଅବଦାନ ପାଇଁ ଖୋଜନ୍ତୁ",
        "sp-contributions-username": "ବ୍ୟବହାରକାରୀଙ୍କର IP ଠିକଣା ବା ଇଉଜର ନାମ:",
        "sp-contributions-toponly": "ନଗଦ ବଦଳଗୁଡ଼ିକ ଦେଖାଇବେ",
-       "sp-contributions-submit": "à¬\96à­\8bà¬\9cିବା",
+       "sp-contributions-submit": "à¬\96à­\8bà¬\9cନà­\8dତà­\81",
        "whatlinkshere": "ଏଠାରେ ଥିବା ଲିଙ୍କ",
        "whatlinkshere-title": "\"$1\" କୁ ପୃଷ୍ଠା ଲିଙ୍କ",
        "whatlinkshere-page": "ପୃଷ୍ଠା:",
        "blocklist-by": "ଅଟକାଇବା ପରିଛା",
        "blocklist-params": "ଅଟକାଇବା ପାରାମିଟର",
        "blocklist-reason": "କାରଣ",
-       "ipblocklist-submit": "à¬\96à­\8bà¬\9cିବା",
+       "ipblocklist-submit": "à¬\96à­\8bà¬\9cନà­\8dତà­\81",
        "ipblocklist-localblock": "ସ୍ଥାନୀୟ ଅଟକ",
        "ipblocklist-otherblocks": "ବାକି {{PLURAL:$1|ଗୋଟି ଅଟକ|ଗୋଟି ଅଟକ}}",
        "infiniteblock": "ଅସିମୀତ",
        "tooltip-ca-move": "ଏହି ପୃଷ୍ଠାଟିକୁ ଘୁଞ୍ଚାଇବେ",
        "tooltip-ca-watch": "ଆପଣଙ୍କ ଦେଖାତାଲିକାରେ ଏଇ ପୃଷ୍ଠାଟି ମିଶାଇବେ",
        "tooltip-ca-unwatch": "ନିଜ ଦେଖଣାତାଲିକାରୁ ଏହି ପୃଷ୍ଠାଟି ବାହାର କରିଦେବେ",
-       "tooltip-search": "{{SITENAME}} à¬°à­\87 à¬\96à­\8bà¬\9cିବା",
+       "tooltip-search": "{{SITENAME}} à¬°à­\87 à¬\96à­\8bà¬\9cନà­\8dତà­\81",
        "tooltip-search-go": "ଏହି ଅବିକଳ ନାଆଁଟି ଥିଲେ ସେହି ପୃଷ୍ଠାକୁ ଯିବା",
-       "tooltip-search-fulltext": "ଏହି ଲେଖାଟି ପାଇଁ ପୃଷ୍ଠାସବୁକୁ ଖୋଜିବା",
+       "tooltip-search-fulltext": "ଏ ପୃଷ୍ଠାରେ ଥିବା ଲେଖା ପାଇଁ ପୃଷ୍ଠାମାନ ଖୋଜନ୍ତୁ",
        "tooltip-p-logo": "ପ୍ରଧାନ ପୃଷ୍ଠା",
        "tooltip-n-mainpage": "ପ୍ରଧାନ ପୃଷ୍ଠା",
        "tooltip-n-mainpage-description": "ପ୍ରଧାନ ପୃଷ୍ଠା",
        "newimages-legend": "ଛାଣିବା",
        "newimages-label": "ଫାଇଲ ନାମ (କିମ୍ବା ତାହାର ଏକ ଭାଗ):",
        "noimages": "ଦେଖିବାକୁ କିଛି ନାହିଁ ।",
-       "ilsubmit": "à¬\96à­\8bà¬\9cିବା",
+       "ilsubmit": "à¬\96à­\8bà¬\9cନà­\8dତà­\81",
        "bydate": "ତାରିଖ ଅନୁସାରେ",
        "sp-newimages-showfrom": "$2, $1 ରେ ଆରମ୍ଭ ହେଉଥିବା ନୂଆ ଫାଇଲ ସବୁ ଦେଖାଇବେ",
        "seconds": "{{PLURAL:$1|$1 ସେକେଣ୍ଡ|$1 ସେକେଣ୍ଡ}}",
        "fileduplicatesearch-summary": "ହାସ୍ ମୂଲ୍ୟକୁ ନେଇ ଦୁଇଥର ଥିବା ଫାଇଲ ଖୋଜନ୍ତୁ ।",
        "fileduplicatesearch-legend": "ନକଲ ପାଇଁ ଖୋଜନ୍ତୁ ।",
        "fileduplicatesearch-filename": "ଫାଇଲ ନାମ:",
-       "fileduplicatesearch-submit": "à¬\96à­\8bà¬\9cିବା",
+       "fileduplicatesearch-submit": "à¬\96à­\8bà¬\9cନà­\8dତà­\81",
        "fileduplicatesearch-info": "$1 × $2 pixel<br />ଫାଇଲ ପ୍ରକାର: $3<br />MIME ପ୍ରକାର: $4",
        "fileduplicatesearch-result-1": "\"$1\"ର କୌଣସି ଏକାଭଳି ଥିବା ଫାଇଲ ନାହିଁ ।",
        "fileduplicatesearch-result-n": "\"$1\" ଫାଇଲର {{PLURAL:$2|1 ଗୋଟି ଏକାଭଳି|$2 ଗୋଟି ଏକାଭଳି}} ଫାଇଲ ଅଛି ।",
        "feedback-close": "ହୋଇଗଲା",
        "feedback-bugcheck": "ବହୁତ ଭଲ ! ଖାଲି ଦେଖିଦିଅନ୍ତୁ ଯେ ଏହା ଆଗରୁ ଥିବା [$1 known bugs] ମଧ୍ୟରୁ ନୁହେଁ ତ ।",
        "feedback-bugnew": "ମୁଁ ଯାଞ୍ଚ କରିଦେଲି । ନୂତନ ଅସୁବିଧାର ବିବରଣ କରନ୍ତୁ ।",
-       "searchsuggest-search": "à¬\96à­\8bà¬\9cିବା",
+       "searchsuggest-search": "à¬\96à­\8bà¬\9cନà­\8dତà­\81",
        "searchsuggest-containing": "ଖୋଜୁଛି...",
        "api-error-badaccess-groups": "ଆପଣଙ୍କୁ ଏହି ଉଇକିରେ ଅପଲୋଡ଼ କରିବାକୁ ଅନୁମତି ଦିଆଯାଇନାହିଁ ।",
        "api-error-badtoken": "ଭିତର ଅସୁବିଧା: ଖରାପ ଟୋକନ ।",
index e9f3e3f..83a5b24 100644 (file)
        "category_header": "Strony w kategorii „$1”",
        "subcategories": "Podkategorie",
        "category-media-header": "Pliki w kategorii „$1”",
-       "category-empty": "''Obecnie w tej kategorii brak stron oraz plików.''",
-       "hidden-categories": "{{PLURAL:$1|Ukryta kategoria|Ukryte kategorie|Ukrytych kategorii}}",
+       "category-empty": "<em>Obecnie w tej kategorii brak stron oraz plików.</em>",
+       "hidden-categories": "{{PLURAL:$1|Ukryta kategoria|Ukryte kategorie}}",
        "hidden-category-category": "Ukryte kategorie",
        "category-subcat-count": "{{PLURAL:$2|Ta kategoria ma tylko jedną podkategorię.|Poniżej wyświetlono $1 spośród wszystkich $2 podkategorii tej kategorii.}}",
        "category-subcat-count-limited": "Ta kategoria ma {{PLURAL:$1|1 podkategorię|$1 podkategorie|$1 podkategorii}}.",
        "qbmyoptions": "Moje strony",
        "faq": "FAQ",
        "faqpage": "Project:FAQ",
-       "vector-action-addsection": "Dodaj temat",
-       "vector-action-delete": "Usuń",
-       "vector-action-move": "Przenieś",
-       "vector-action-protect": "Zabezpiecz",
-       "vector-action-undelete": "Odtwórz",
-       "vector-action-unprotect": "Zmień zabezpieczenie",
-       "vector-view-create": "Utwórz",
-       "vector-view-edit": "Edytuj",
-       "vector-view-history": "Wyświetl historię",
-       "vector-view-view": "Czytaj",
-       "vector-view-viewsource": "Tekst źródłowy",
        "actions": "Działania",
        "namespaces": "Przestrzenie nazw",
        "variants": "Warianty",
        "unexpected": "Nieoczekiwana wartość „$1”=„$2”.",
        "formerror": "Błąd – nie można wysłać formularza",
        "badarticleerror": "Dla tej strony ta operacja nie może być wykonana.",
-       "cannotdelete": "Strona lub plik „$1” nie mogą zostać usunięte.\nMożliwe, że zostały już usunięte przez kogoś innego.",
-       "cannotdelete-title": "Nie można usunąć strony „$1”.",
+       "cannotdelete": "Nie można usunąć strony lub pliku „$1”.\nMożliwe, że zostało to już zrobione przez kogoś innego.",
+       "cannotdelete-title": "Strona „$1” nie może być usunięta.",
        "delete-hook-aborted": "Usuwanie przerwane przez hak.\nPrzyczyna nieokreślona.",
        "no-null-revision": "Nie można utworzyć zerowej wersji strony \"$1\"",
        "badtitle": "Niepoprawny tytuł",
        "node-count-exceeded-category-desc": "Kategoria dla stron, na których przekroczono liczbę węzłów.",
        "node-count-exceeded-warning": "Strona przekroczyła liczbę węzłów",
        "expansion-depth-exceeded-category": "Strony z przekroczoną głębokością rozbudowy",
+       "expansion-depth-exceeded-category-desc": "Kategoria dla stron, na których przekroczona jest głębokość rozbudowy.",
        "expansion-depth-exceeded-warning": "Strona przekroczyła głębokość rozbudowy",
        "parser-unstrip-loop-warning": "Wykryto nieskończoną pętlę",
        "parser-unstrip-recursion-limit": "Przekroczono maksymalną głębokość zagnieżdżania ($1)",
        "currentrev": "Aktualna wersja",
        "currentrev-asof": "Aktualna wersja na dzień $1",
        "revisionasof": "Wersja z $1",
-       "revision-info": "Wersja $2 z dnia $1",
+       "revision-info": "Wersja z dnia $1 autorstwa {{GENDER:$6|$2}}$7",
        "previousrevision": "← poprzednia wersja",
        "nextrevision": "następna wersja →",
        "currentrevisionlink": "przejdź do aktualnej wersji",
        "difference-missing-revision": "{{PLURAL:$2|Wersja|$2 wersje|$2 wersji}} #$1 strony \"{{PAGENAME}}\" nie {{PLURAL:$2|została znaleziona|zostały znalezione|zostało znalezionych}}.\n\nZazwyczaj jest to spowodowane przestarzałym linkiem do usuniętej strony. Powód usunięcia znajduje się w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejestrze].",
        "searchresults": "Wyniki wyszukiwania",
        "searchresults-title": "Wyniki wyszukiwania „$1”",
-       "toomanymatches": "Zbyt wiele elementów pasujących do wzorca, spróbuj innego zapytania",
        "titlematches": "Znaleziono w tytułach",
        "textmatches": "Znaleziono w treści stron",
        "notextmatches": "Nie znaleziono w treści stron",
        "search-interwiki-default": "Wyniki od $1:",
        "search-interwiki-more": "(więcej)",
        "search-relatedarticle": "Pokrewne",
-       "searcheverything-enable": "Szukaj we wszystkich przestrzeniach nazw",
        "searchrelated": "pokrewne",
        "searchall": "wszystkie",
        "showingresults": "Poniżej znajduje się lista {{PLURAL:$1|z '''1''' wynikiem|'''$1''' wyników}}, rozpoczynając od wyniku numer '''$2'''.",
        "powersearch-togglelabel": "Zaznacz",
        "powersearch-toggleall": "wszystko",
        "powersearch-togglenone": "nic",
+       "powersearch-remember": "Zapamiętaj wybór dla kolejnych wyszukiwań",
        "search-external": "Wyszukiwanie zewnętrzne",
        "searchdisabled": "Wyszukiwanie w {{GRAMMAR:MS.lp|{{SITENAME}}}} zostało wyłączone.\nW międzyczasie możesz skorzystać z wyszukiwania Google.\nJednak informacje o treści {{GRAMMAR:D.lp|{{SITENAME}}}} mogą być w Google nieaktualne.",
        "search-error": "Wystąpił błąd podczas wyszukiwania:$1",
        "allowemail": "Zgadzam się, by inni użytkownicy mogli przesyłać do mnie e‐maile",
        "prefs-searchoptions": "Wyszukiwanie",
        "prefs-namespaces": "Przestrzenie nazw",
-       "defaultns": "Albo przeszukuj przestrzenie nazw:",
        "default": "domyślnie",
        "prefs-files": "Pliki",
        "prefs-custom-css": "własny CSS",
        "recentchanges-label-unpatrolled": "Ta edycja nie została jeszcze sprawdzona",
        "recentchanges-label-plusminus": "Zmieniony rozmiar strony (liczba bajtów)",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "(zobacz też [[Special:NewPages|listę nowych stron]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (zobacz też [[Special:NewPages|listę nowych stron]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Poniżej pokazano zmiany wykonane po '''$2''' (nie więcej niż '''$1''' pozycji).",
        "rclistfrom": "Pokaż nowe zmiany od $3 $2",
        "largefileserver": "Plik jest większy niż maksymalny dozwolony rozmiar.",
        "emptyfile": "Przesłany plik wydaje się być pusty. Może być to spowodowane literówką w nazwie pliku.\nSprawdź, czy nazwa jest prawidłowa.",
        "windows-nonascii-filename": "Na tej wiki nie można używać znaków specjalnych w nazwach plików.",
-       "fileexists": "Plik o takiej nazwie już istnieje.\nSprawdź <strong>[[:$1]]</strong>, jeśli nie jesteś pewien czy chcesz go zastąpić.\n[[$1|thumb]]",
+       "fileexists": "Plik o takiej nazwie już istnieje.\nSprawdź <strong>[[:$1]]</strong>, jeśli nie jesteś {{GENDER:|pewien|pewna}} czy chcesz go zastąpić.\n[[$1|thumb]]",
        "filepageexists": "Istnieje już strona opisu tego pliku, została utworzona <strong>[[:$1]]</strong>, ale brak jest pliku o tej nazwie.\nInformacje, które wprowadzasz o przesyłanym pliku, nie pojawią się na jego stronie opisu.\nJeśli chcesz, by się tam pojawiły, musisz później, ręcznie przeredagować stronę opisu.\n[[$1|thumb]]",
-       "fileexists-extension": "Plik o podobnej nazwie już istnieje: [[$2|thumb]]\n* Nazwa przesyłanego pliku: <strong>[[:$1]]</strong>\n* Nazwa istniejącego pliku: <strong>[[:$2]]</strong>\nWybierz inną nazwę.",
+       "fileexists-extension": "Plik o podobnej nazwie już istnieje: [[$2|thumb]]\n* Nazwa przesyłanego pliku: <strong>[[:$1]]</strong>\n* Nazwa istniejącego pliku: <strong>[[:$2]]</strong>\nMoże chcesz użyć bardziej zróżnicowanej nazwy?",
        "fileexists-thumbnail-yes": "Plik wydaje się być pomniejszoną grafiką ''(miniaturką)''. [[$1|thumb]]\nSprawdź plik <strong>[[:$1]]</strong>.\nJeśli wybrany plik jest tą samą grafiką co ta w rozmiarze pierwotnym, nie musisz przesyłać dodatkowej miniaturki.",
        "file-thumbnail-no": "Nazwa pliku zaczyna się od <strong>$1</strong>.\nWydaje się, że jest to pomniejszona grafika ''(miniaturka)''.\nJeśli posiadasz tę grafikę w pełnym rozmiarze – prześlij ją. Jeśli chcesz wysłać tę – zmień nazwę przesyłanego obecnie pliku.",
        "fileexists-forbidden": "Plik o tej nazwie już istnieje i nie może zostać nadpisany.\nJeśli chcesz przesłać plik cofnij się i prześlij go pod inną nazwą. [[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Usuwanie i odtwarzanie plików zostało tymczasowo wyłączone z powodu konserwacji.",
        "filedelete-maintenance-title": "Nie można usunąć pliku",
        "mimesearch": "Wyszukiwanie MIME",
-       "mimesearch-summary": "Ta strona umożliwia wyszukiwanie plików ze względu na ich typ MIME.\nUżycie: typ_treści/podtyp, np. <code>image/jpeg</code>.",
+       "mimesearch-summary": "Ta strona umożliwia wyszukiwanie plików ze względu na ich typ MIME.\nUżycie: typ_treści/podtyp albo typ_treści/*, np. <code>image/jpeg</code>.",
        "mimetype": "Typ MIME",
        "download": "pobierz",
        "unwatchedpages": "Nieobserwowane strony",
        "wantedtemplates": "Potrzebne szablony",
        "mostlinked": "Najczęściej linkowane strony",
        "mostlinkedcategories": "Kategorie o największej liczbie stron",
-       "mostlinkedtemplates": "Najczęściej linkowane szablony",
+       "mostlinkedtemplates": "Najczęściej transkludowane strony",
        "mostcategories": "Strony z największą liczbą kategorii",
        "mostimages": "Najczęściej linkowane pliki",
        "mostinterwikis": "Strony z największą liczbą linków interwiki",
        "trackingcategories-name": "Nazwa komunikatu",
        "trackingcategories-desc": "Kryteria włączenia kategorii",
        "noindex-category-desc": "Ta strona nie jest indeksowana przez roboty, ponieważ ma wpisane magiczne słowo <code><nowiki>__NOINDEX__</nowiki></code> i znajduje się w przestrzeni nazw, w której ta flaga jest dozwolona.",
+       "index-category-desc": "Na stronie znajduje się magiczne słowo <code><nowiki>__INDEX__</nowiki></code> (i strona znajduje się w przestrzeni nazw, w której jest ono dozwolone), więc jest indeksowana przez wyszukiwarki nawet wtedy, gdy normalnie by się to nie działo.",
        "post-expand-template-inclusion-category-desc": "Po rozwinięciu wszystkich szablonów, rozmiar strony jest większe niż <code>$wgMaxArticleSize</code>, więc niektóre szablony nie zostały rozwinięte.",
+       "post-expand-template-argument-category-desc": "Po rozwinięciu argumentu szablonu (coś w potrójnych nawiasach, np. <code>{{{Foo}}}</code>) długość strony przekracza <code>$wgMaxArticleSize</code>.",
        "expensive-parserfunction-category-desc": "Na stronie używanych jest zbyt wiele wymagających funkcji parsera (takich jak <code>#ifexist</code>). Więcej informacji na stronie [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
        "broken-file-category-desc": "Kategoria dodawana do stron zawierających nieprawidłowe odwołania do plików (odwołania do nieistniejących plików).",
        "hidden-category-category-desc": "To jest kategoria z <code><nowiki>__HIDDENCAT__</nowiki></code>, co zapobiega wyświetlaniu jej w sekcji z kategoriami na stronie.",
        "movepagetalktext": "Powiązana strona dyskusji, jeśli istnieje, będzie przeniesiona automatycznie, chyba że:\n*niepusta strona dyskusji już jest pod nową nazwą\n*usuniesz zaznaczenie z poniższego pola wyboru\n\nW takich przypadkach treść dyskusji można przenieść tylko ręcznie.",
        "movearticle": "Przeniesienie strony",
        "moveuserpage-warning": "'''Uwaga!''' Masz zamiar przenieść stronę użytkownika. Miej na uwadze, że zostanie przeniesiona tylko strona, a '''nazwa użytkownika pozostanie niezmieniona'''.",
-       "movecategorypage-warning": "<strong>Uwaga!</strong> Masz zamiar przenieść stronę opisu kategorii. Miej na uwadze, że strony, które należały do starej kategorii, <em>nie</em> zostaną przeniesione do nowej.",
+       "movecategorypage-warning": "<strong>Uwaga!</strong> Masz zamiar przenieść stronę kategorii. Miej na uwadze, że strony, które należały do starej kategorii, <em>nie</em> zostaną przeniesione do nowej.",
        "movenologintext": "Przenoszenie stron jest możliwe dopiero po zarejestrowaniu się i [[Special:UserLogin|zalogowaniu]].",
        "movenotallowed": "Nie masz uprawnień do przenoszenia stron.",
        "movenotallowedfile": "Nie masz uprawnień do przenoszenia plików.",
        "tooltip-summary": "Wpisz krótki opis",
        "interlanguage-link-title": "$1 – $2",
        "common.css": "/* Umieszczony tutaj kod CSS zostanie zastosowany we wszystkich skórkach */",
-       "monobook.css": "/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Książka */",
-       "vector.css": "/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Wektor */",
        "print.css": "/* Umieszczony tutaj kod CSS wpłynie na wygląd wydruku */",
        "noscript.css": "/* Umieszczony tu arkusz stylów CSS będzie wykorzystywany dla użytkowników z wyłączoną obsługą JavaScript */",
        "group-autoconfirmed.css": "/* CSS tutaj umieszczony będzie dotyczyć tylko automatycznie zatwierdzonych użytkowników */",
        "group-sysop.css": "/* Umieszczony tutaj kod CSS dotyczyć będzie tylko administratorów */",
        "group-bureaucrat.css": "/* Umieszczony tutaj kod CSS dotyczyć będzie tylko biurokratów */",
        "common.js": "/* Umieszczony tutaj kod JavaScript zostanie załadowany przez każdego użytkownika, podczas każdego ładowania strony. */",
-       "monobook.js": "/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Książka */",
-       "vector.js": "/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Wektor */",
        "anonymous": "{{PLURAL:$1|Anonimowy użytkownik|Anonimowi użytkownicy}} {{GRAMMAR:D.lp|{{SITENAME}}}}",
        "siteuser": "{{GENDER:$2|użytkownik|użytkowniczka}} {{GRAMMAR:D.lp|{{SITENAME}}}} – $1",
        "anonuser": "niezalogowany użytkownik {{GRAMMAR:D.lp|{{SITENAME}}}} – $1",
        "pageinfo-category-pages": "Liczba stron",
        "pageinfo-category-subcats": "Liczba podkategorii",
        "pageinfo-category-files": "Liczba plików",
-       "skinname-monobook": "Książka",
-       "skinname-vector": "Wektor",
        "markaspatrolleddiff": "oznacz edycję jako „sprawdzoną”",
        "markaspatrolledtext": "Oznacz tę stronę jako „sprawdzoną”",
        "markedaspatrolled": "Sprawdzone",
        "version-hook-name": "Nazwa haka (ang. hook name)",
        "version-hook-subscribedby": "Zapotrzebowany przez",
        "version-version": "(Wersja $1)",
+       "version-no-ext-name": "[bez nazwy]",
        "version-license": "Licencja MediaWiki",
        "version-ext-license": "Licencja",
        "version-ext-colheader-name": "Rozszerzenie",
index 64e3008..6ba8004 100644 (file)
        "qbmyoptions": "Mie pàgine",
        "faq": "Chestion frequente",
        "faqpage": "Project:Soèns An Ciamo",
-       "vector-action-addsection": "Gionté n'argoment",
-       "vector-action-delete": "Scancelé",
-       "vector-action-move": "Tramudé",
-       "vector-action-protect": "Protege",
-       "vector-action-undelete": "Arcuperé",
-       "vector-action-unprotect": "Cangé la protession",
-       "vector-view-create": "Creé",
-       "vector-view-edit": "Modifiché",
-       "vector-view-history": "Smon-e la stòria",
-       "vector-view-view": "Lese",
-       "vector-view-viewsource": "Vëdde la sorgiss",
        "actions": "Assion",
        "namespaces": "Spassi nominaj",
        "variants": "Variant",
        "difference-missing-revision": "{{PLURAL:$2|Na revision|$2 revision}} dë sta diferensa ($1) a {{PLURAL:$2|l'é pa stàita|son pa stàite}} trovà.\n\n\n\nSòn a l'é normalment causà da l'andèje dapress a na veja liura stòrica a na pàgina ch'a l'é stàita scancelà. Ij detaj a peulo esse trovà ant ël [registr ëd jë scanselament ëd {{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}].",
        "searchresults": "Arzultà dl'arserca",
        "searchresults-title": "Arzultà dl'arserca për «$1»",
-       "toomanymatches": "Parèj a-i ven fòra tròpa ròba, për piasì, ch'a preuva n'arserca diferenta.",
        "titlematches": "Ant ij tìtoj dj'artìcoj",
        "textmatches": "Ant ël test ëd j'artìcoj",
        "notextmatches": "La vos che a l'ha ciamà a l'é pa trovasse antrames aj test dj'artìcoj",
        "searchmenu-exists": "'''A-i é na pàgina ciamà \"[[:$1]]\" dzora a costa wiki'''",
        "searchmenu-new": "<strong>Creé la pàgina «[[:$1]]» ansima a costa wiki!</strong> {{PLURAL:$2|0=|Vëdde ëdcò la pàgina trovà con larserca.|Vëdde ëdcò j'arzultà d'arserca trovà.}}",
        "searchprofile-articles": "Pàgine ëd contnù",
-       "searchprofile-project": "Pàgine d'agiut e ëd proget",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Tut",
        "searchprofile-advanced": "Avansà",
        "searchprofile-articles-tooltip": "Sërché an $1",
-       "searchprofile-project-tooltip": "Sërché an $1",
        "searchprofile-images-tooltip": "Sërché dj'archivi",
        "searchprofile-everything-tooltip": "Sërché daspërtut (ëdcò ant le pàgine ëd discussion)",
        "searchprofile-advanced-tooltip": "Sërché ant jë spassi nominaj përsonalisà",
        "search-interwiki-default": "Arzultà da $1:",
        "search-interwiki-more": "(ëd pì)",
        "search-relatedarticle": "Corelà",
-       "searcheverything-enable": "Sërché ant tùit jë spassi nominaj",
        "searchrelated": "corelà",
        "searchall": "tuti",
        "showingresults": "Ambelessì-sota a treuva fin a {{PLURAL:$1|'''1'''|'''$1'''}} arzultà, a parte dal nùmer #'''$2'''.",
        "allowemail": "Lassa che j'àutri utent am mando ëd mëssagi ëd pòsta eletrònica",
        "prefs-searchoptions": "Sërca",
        "prefs-namespaces": "Spassi nominaj",
-       "defaultns": "Dësnò, sërché an costi spassi nominaj-sì:",
        "default": "stàndard",
        "prefs-files": "Archivi",
        "prefs-custom-css": "CSS përsonaj",
        "prefs-emailconfirm-label": "Conferma dl'adrëssa ëd pòsta eletrònica:",
        "youremail": "Soa adrëssa ëd pòsta eletrònica:",
        "username": "{{GENDER:$1|Stranòm}}:",
-       "uid": "Identificativ dl'{{GENDER:$1|utent}}:",
        "prefs-memberingroups": "{{GENDER:$2|Mèmber}} {{PLURAL:$1|dla partìa|dle partìe}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Data ëd registrassion:",
        "recentchanges-label-unpatrolled": "Sta modìfica-sì a l'é pa ancó stàita verificà",
        "recentchanges-label-plusminus": "La taja dla pàgina a l'é cangià d'un nùmer ëd bytes",
        "recentchanges-legend-heading": "'''Legend:'''",
-       "recentchanges-legend-newpage": "(vëdde ëdcò [[Special:NewPages|lista dle pàgine neuve]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vëdde ëdcò la [[Special:NewPages|lista dle pàgine neuve]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Ambelessì sota a-i é la lista dle modìfiche da <strong>$2</strong> (mostrà fin-a a <strong>$1</strong>).",
        "rclistfrom": "Mostré le modìfiche a parte da $3 $2",
        "log-title-wildcard": "Sërché ant ij tìtoj ch'as anandio për",
        "showhideselectedlogentries": "Smon-e/stërmé le vos ëd registr selessionà",
        "allpages": "Tute le pàgine",
-       "alphaindexline": "$1 a $2",
        "nextpage": "Pàgina che a-i ven ($1)",
        "prevpage": "Pàgina anans ($1)",
        "allpagesfrom": "Smon-e le pàgine ën partend da:",
        "tooltip-preferences-save": "Salvé ij sò gust",
        "tooltip-summary": "Anserì un curt resumé",
        "common.css": "/** Ël còdes CSS che as buta ambelessì a resta dovrà ant tute le \"facie\" */",
-       "monobook.css": "/* cangé st'archivi-sì për modifiché la formatassion dël sit antregh */",
        "common.js": "/* Ël còdes JavaScript ch'as buta ambelessì a ven carià da vira utent për vira pàgina */",
-       "monobook.js": "/* Ës messagi-sì as dovrìa pa pì dovrelo; a sò pòst ch'a dòvra [[MediaWiki:common.js]] */",
        "anonymous": "{{PLURAL:$1|Utent|Utent}} anònim ëd {{SITENAME}}",
        "siteuser": "$1, utent ëd {{SITENAME}}",
        "anonuser": "l'utent anònim $1 ëd {{SITENAME}}",
index 1212ab8..7ca0e55 100644 (file)
        "qbmyoptions": "زما پاڼې",
        "faq": "ډ-ځ-پ",
        "faqpage": "Project:ډ-ځ-پ",
-       "vector-action-addsection": "سرليکونه ورگډول",
-       "vector-action-delete": "ړنگول",
-       "vector-action-move": "لېږدول",
-       "vector-action-protect": "ژغورل",
-       "vector-action-undelete": "ناړنگول",
-       "vector-action-unprotect": "ژغورنه بدلول",
-       "vector-view-create": "جوړول",
-       "vector-view-edit": "سمول",
-       "vector-view-history": "پېښليک کتل",
-       "vector-view-view": "لوستل",
-       "vector-view-viewsource": "سرچينه کتل",
        "actions": "کړنې",
        "namespaces": "نوم-تشيالونه",
        "variants": "ډولونه",
        "searchmenu-exists": "'''په دې ويکي يو مخ د \"[[:$1]]\" په نامه دی'''",
        "searchmenu-new": "<strong>په دې ويکي د \"[[:$1]]\" مخ جوړول!</strong> {{PLURAL:$2|0=|See also the page found with your search.|د پلټنو موندل شوې پايلې هم وگورئ.}}",
        "searchprofile-articles": "مېنځپانگيز مخونه",
-       "searchprofile-project": "د لارښود او پروژې مخونه",
        "searchprofile-images": "گڼرسنۍ",
        "searchprofile-everything": "هرڅه",
        "searchprofile-advanced": "پرمختللی",
        "searchprofile-articles-tooltip": "په $1 کې پلټل",
-       "searchprofile-project-tooltip": "په $1 کې پلټل",
        "searchprofile-images-tooltip": "د دوتنو پلټنه",
        "searchprofile-everything-tooltip": "د ټولې مېنځپانگې پلټنه (د خبرو اترو مخونو سره)",
        "searchprofile-advanced-tooltip": "د خپل خوښې په نوم-تشيالونو کې پلټل",
        "search-interwiki-default": "پايلې له $1 څخه:",
        "search-interwiki-more": "(نور)",
        "search-relatedarticle": "اړونده",
-       "searcheverything-enable": "په ټولو نوم-تشيالونو کې پلټل",
        "searchrelated": "اړونده",
        "searchall": "ټول",
        "showingresults": "دلته لاندې تر {{PLURAL:$1|'''1''' پايله|'''$1''' پايلې}} ښکاره شوي پيل له #'''$2''' شوی.",
        "allowemail": "د نورو کارنانو لخوا د برېښليک رالېږل چارن کړه",
        "prefs-searchoptions": "پلټنه",
        "prefs-namespaces": "نوم-تشيالونه",
-       "defaultns": "او يا هم په دغو نوم-تشيالونو کې پلټل:",
        "default": "تلواليز",
        "prefs-files": "دوتنې",
        "prefs-custom-css": "ځاني CSS",
        "prefs-emailconfirm-label": "د برېښليک باورتيا:",
        "youremail": "برېښليک *",
        "username": "{{GENDER:$1|کارن نوم}}:",
-       "uid": "{{GENDER:$1|کارن}} پېژندنه:",
        "prefs-memberingroups": "د {{PLURAL:$1|ډله|ډلې}} {{GENDER:$2|غړی}}:",
        "prefs-registration": "د نومليکنې وخت:",
        "yourrealname": "اصلي نوم:",
        "recentchanges-label-unpatrolled": "دغه سمون تر اوسه پورې نه دی څارل شوی",
        "recentchanges-label-plusminus": "د بايټونو د شمېر له مخې د مخ د بدلون کچه",
        "recentchanges-legend-heading": "'''لنډونونه:'''",
-       "recentchanges-legend-newpage": "([[Special:NewPages|د نويو مخونو لړليک]] هم وگورئ)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|د نويو مخونو لړليک]] هم وگورئ)",
        "rcnotefrom": "دلته لاندې د <strong>$2</strong> څخه راپدېخوا پېښ شوي بدلونونه راغلي (تر <strong>$1</strong> پورې ښکاري).",
        "rclistfrom": "هغه نوي بدلونونه ښکاره کول چې له $3 $2 نه پيلېږي",
        "rcshowhideminor": "وړې سمونې $1",
        "tooltip-undo": "\"ناکړ\" همدا سمون پر شا گرځوي او د سمون کړکۍ د مخکتنې په بڼه پرانيزي.\nدا کړنه د لنډيز په برخه کې د سمونونو د سببونو د ورگډولو آسانتيا برابروي.",
        "tooltip-preferences-save": "غوره توبونه خوندي کول",
        "tooltip-summary": "يو لنډ لنډيز کښل",
-       "vector.css": "/* د CSS هره بڼه چې دلته ځای پر ځای کېږي هغه به د وېکټور د پوښ ټولو کارنانو لپاره کار کوي */",
-       "vector.js": "/* د جاوا هر يو سکرېپټ چې دلته ځای پر ځای کېږي هغه به د وېکټور د پوښ ټولو کارنانو لپاره کار کوي */",
        "anonymous": "د {{SITENAME}} {{PLURAL:$1|ورکنومی کارن|ورکنومي کارنان}}",
        "siteuser": "د {{SITENAME}} کارن $1",
        "anonuser": "د {{SITENAME}} ورکنومی کارن $1",
        "pageinfo-category-pages": "د مخونو شمېر",
        "pageinfo-category-subcats": "د څېرمه وېشنيزو شمېر",
        "pageinfo-category-files": "د دوتنو شمېر",
-       "skinname-cologneblue": "شين کلون",
-       "skinname-monobook": "مونوبوک",
-       "skinname-modern": "نوی",
-       "skinname-vector": "وېکټور",
        "markaspatrolleddiff": "دا مخ څارل شوی په نخښه کول",
        "markaspatrolledtext": "دا مخ څارل شوی په نخښه کول",
        "markedaspatrolled": "دا مخ څارل شوی په نخښه کول",
index 9593b2b..9fdfa5b 100644 (file)
        "qbmyoptions": "Minhas páginas",
        "faq": "FAQ",
        "faqpage": "Project:FAQ",
-       "vector-action-addsection": "Adicionar tópico",
-       "vector-action-delete": "Eliminar",
-       "vector-action-move": "Mover",
-       "vector-action-protect": "Proteger",
-       "vector-action-undelete": "Restaurar",
-       "vector-action-unprotect": "Alterar a proteção",
-       "vector-view-create": "Criar",
-       "vector-view-edit": "Editar",
-       "vector-view-history": "Ver histórico",
-       "vector-view-view": "Ler",
-       "vector-view-viewsource": "Ver código-fonte",
        "actions": "Ações",
        "namespaces": "Espaços nominais",
        "variants": "Variantes",
        "jumptonavigation": "navegação",
        "jumptosearch": "pesquisa",
        "view-pool-error": "Desculpe-nos, os servidores estão sobrecarregados neste momento.\nMuitos usuários estão tentando ver esta página.\nAguarde um instante antes de tentar acessar esta página novamente.\n\n$1",
+       "generic-pool-error": "Desculpe-nos, os servidores estão sobrecarregados neste momento.\nMuitos usuários estão tentando ver esta página.\nAguarde um instante antes de tentar acessar esta página novamente.",
        "pool-timeout": "Tempo limite de espera para o bloqueio excedido",
        "pool-queuefull": "A fila de processos está cheia",
        "pool-errorunknown": "Erro desconhecido",
        "edit-gone-missing": "Não foi possível atualizar a página.\nEla parece ter sido eliminada.",
        "edit-conflict": "Conflito de edição.",
        "edit-no-change": "A sua edição foi ignorada, uma vez que o texto não sofreu alterações.",
+       "postedit-confirmation-restored": "Esta página foi restaurada.",
        "postedit-confirmation-saved": "Sua edição foi salva",
        "edit-already-exists": "Não foi possível criar uma nova página.\nEla já existia.",
        "defaultmessagetext": "Texto da mensagem padrão",
        "parser-template-recursion-depth-warning": "O limite de profundidade de recursividade de predefinição foi ultrapassado ($1)",
        "language-converter-depth-warning": "O limite de profundidade do conversor de línguas excedeu a ($1)",
        "node-count-exceeded-category": "Páginas em que o total de nós é excedido",
+       "node-count-exceeded-category-desc": "Uma categoria para páginas onde a contagem de nós é ultrapassada.",
        "node-count-exceeded-warning": "A página excedeu o total de nós",
        "expansion-depth-exceeded-category": "Páginas em que a profundidade de expansão é excedida",
+       "expansion-depth-exceeded-category-desc": "Esta é uma categoria para as páginas onde a profundidade de expansão é ultrapassada.",
        "expansion-depth-exceeded-warning": "A página excedeu a profundidade de expansão",
        "parser-unstrip-loop-warning": "Foi detectado um ciclo infinito unstrip",
        "parser-unstrip-recursion-limit": "Limite de recursão do unstrip excedido ($1)",
        "currentrev": "Revisão atual",
        "currentrev-asof": "Edição atual tal como às $1",
        "revisionasof": "Edição das $1",
-       "revision-info": "Edição feita às $1 por $2",
+       "revision-info": "Revisão de $1 por {{GENDER:$6|$2}}$7",
        "previousrevision": "← Edição anterior",
        "nextrevision": "Versão posterior →",
        "currentrevisionlink": "Revisão atual",
        "difference-missing-revision": "{{PLURAL:$2|Uma revisão|$2 revisões}} desta diferença ($1) não {{PLURAL:$2|foi encontrada|foram encontradas}}.\n\nIsto é geralmente causado por seguir um link de histórico desatualizado para uma página que foi eliminada.\nOs detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de eliminação].",
        "searchresults": "Resultados da pesquisa",
        "searchresults-title": "Resultados da pesquisa por \"$1\"",
-       "toomanymatches": "Foram retornados muitos resultados. Por favor, tente um filtro de pesquisa diferente",
        "titlematches": "Resultados nos títulos das páginas",
        "textmatches": "Resultados nos textos das páginas",
        "notextmatches": "Não foi possível localizar, no conteúdo das páginas, o termo pesquisado",
        "search-interwiki-default": "Resultados de $1:",
        "search-interwiki-more": "(mais)",
        "search-relatedarticle": "Relacionado",
-       "searcheverything-enable": "Procurar em todos os espaços nominais",
        "searchrelated": "relacionados",
        "searchall": "todos",
        "showingresults": "A seguir {{PLURAL:$1|é mostrado '''um''' resultado|são mostrados até '''$1''' resultados}}, iniciando no '''$2'''º.",
        "powersearch-togglelabel": "Selecionar:",
        "powersearch-toggleall": "Todos",
        "powersearch-togglenone": "Nenhum",
+       "powersearch-remember": "Lembrar seleção para futuras pesquisas",
        "search-external": "Pesquisa externa",
        "searchdisabled": "A busca em {{SITENAME}} se encontra desativada.\nVocê poderá pesquisar através do Google enquanto isso.\nNote que os índices do sistema de busca externo poderão conter referências desatualizadas a {{SITENAME}}.",
        "search-error": "Ocorreu um erro ao buscar por: $1",
        "allowemail": "Permitir que outros usuários me enviem e-mails",
        "prefs-searchoptions": "Busca",
        "prefs-namespaces": "Espaços nominais",
-       "defaultns": "Caso contrário pesquisar nestes espaços nominais:",
        "default": "padrão",
        "prefs-files": "Arquivos",
        "prefs-custom-css": "CSS personalizada",
        "right-move": "Mover páginas",
        "right-move-subpages": "Mover páginas com as suas subpáginas",
        "right-move-rootuserpages": "Mover páginas raiz de usuários",
+       "right-move-categorypages": "Mover páginas de categorias",
        "right-movefile": "Mover arquivos",
        "right-suppressredirect": "Não criar um redirecionamento do nome antigo quando uma página é movida",
        "right-upload": "Enviar arquivos",
        "action-createpage": "criar páginas",
        "action-createtalk": "criar páginas de discussão",
        "action-createaccount": "criar esta conta de usuário",
+       "action-history": "Ver o histórico desta página",
        "action-minoredit": "marcar esta edição como uma edição menor",
        "action-move": "mover esta página",
        "action-move-subpages": "mover esta página e suas subpáginas",
        "action-move-rootuserpages": "mover páginas raiz de usuários",
+       "action-move-categorypages": "Mover páginas de categorias",
        "action-movefile": "mover este arquivo",
        "action-upload": "enviar este arquivo",
        "action-reupload": "sobrescrever o arquivo existente",
        "recentchanges-label-unpatrolled": "Esta edição ainda não foi patrulhada",
        "recentchanges-label-plusminus": "Alteração no tamanho da página, em bytes",
        "recentchanges-legend-heading": "'''Legenda''':",
-       "recentchanges-legend-newpage": "(veja também a [[Special:NewPages|lista de páginas novas]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (veja também a [[Special:NewPages|lista de páginas novas]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Abaixo estão mostradas as alterações desde <strong>$2</strong> (até <strong>$1</strong>).",
        "rclistfrom": "Mostrar as novas alterações a partir das $3 $2",
        "wantedtemplates": "Predefinições pedidas",
        "mostlinked": "Páginas com mais afluentes",
        "mostlinkedcategories": "Categorias com mais membros",
-       "mostlinkedtemplates": "Predefinições com mais afluentes",
+       "mostlinkedtemplates": "Páginas com mais transclusões",
        "mostcategories": "Páginas de conteúdo com mais categorias",
        "mostimages": "Imagens com mais afluentes",
        "mostinterwikis": "Páginas com mais interwikis",
        "protectedpages-timestamp": "Data e hora",
        "protectedpages-page": "Página",
        "protectedpages-expiry": "Expira",
-       "protectedpages-performer": "Protegendo usuário",
+       "protectedpages-performer": "Usuário que protegeu",
        "protectedpages-params": "Parâmetros de proteção.",
        "protectedpages-reason": "Motivo",
        "protectedpages-unknown-timestamp": "Desconhecido",
        "protectedpages-unknown-performer": "Usuário desconhecido",
        "protectedtitles": "Títulos protegidos",
-       "protectedtitles-summary": "Está página lista os títulos já protegidos desde a criação. Para ver a lista de páginas existentes que estão protegidas, consulte [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
+       "protectedtitles-summary": "Esta página lista títulos cuja criação está impossibilitada. Para ver uma lista de páginas protegidas, consulte [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Neste momento, nenhum dos títulos está protegido com estes parâmetros.",
        "listusers": "Lista de usuários",
        "listusers-editsonly": "Mostrar apenas usuários com edições",
        "listgrouprights-removegroup-self": "Pode remover {{PLURAL:$2|grupo|grupos}} da própria conta: $1",
        "listgrouprights-addgroup-self-all": "Pode adicionar todos os grupos à própria conta",
        "listgrouprights-removegroup-self-all": "Pode remover todos os grupos da própria conta",
+       "listgrouprights-namespaceprotection-header": "Restrições de namespace",
+       "listgrouprights-namespaceprotection-namespace": "Namespace",
+       "listgrouprights-namespaceprotection-restrictedto": "Direito(s) permitindo edições do usuário",
        "trackingcategories": "Monitorando categorias",
+       "trackingcategories-summary": "Esta página lista categorias de monitoramento que são preenchidas automaticamente pelo software MediaWiki. Seus nomes podem ser alterados através da alteração das mensagens de sistema relevantes no namespace {{ns: 8}}.",
+       "trackingcategories-msg": "Categoria de monitoramento",
+       "trackingcategories-desc": "Critérios de inclusão de categoria",
+       "noindex-category-desc": "A página não é indexada por robôs, porque possui a palavra mágica <code><nowiki>__NOINDEX__</nowiki></code> e está em um namespace onde a flag é permitida.",
+       "post-expand-template-inclusion-category-desc": "Após expandir todos as predefinições, o tamanho da página é maior que o valor permitido na variável <code>$wgMaxArticleSize</code>, por isso algumas predefinições não foram expandidas.",
+       "trackingcategories-disabled": "A categoria está desabilitada",
        "mailnologin": "Nenhum endereço de envio",
        "mailnologintext": "Necessita de estar [[Special:UserLogin|autenticado]] e de possuir um endereço de e-mail válido nas suas [[Special:Preferences|preferências]] para poder enviar um e-mail a outros usuários.",
        "emailuser": "Enviar-lhe um e-mail",
        "watchnologin": "Não está autenticado",
        "addwatch": "Adicionar às páginas vigiadas",
        "addedwatchtext": "A página \"[[:$1]]\" foi adicionada à sua [[Special:Watchlist|lista de páginas vigiadas]].\nFuturas modificações em tal página e páginas de discussão relacionadas serão listadas lá.",
+       "addedwatchtext-short": "A página \"$1\" foi adicionada à sua lista de páginas vigiadas.",
        "removewatch": "Remover das páginas vigiadas",
        "removedwatchtext": "A página \"[[:$1]]\" foi removida de sua [[Special:Watchlist|lista de páginas vigiadas]].",
+       "removedwatchtext-short": "A página \"$1\" foi removida de sua lista de páginas vigiadas.",
        "watch": "Vigiar",
        "watchthispage": "Vigiar esta página",
        "unwatch": "Desinteressar-se",
        "unwatchthispage": "Parar de vigiar esta página",
        "notanarticle": "Não é uma página de conteúdo",
        "notvisiblerev": "Edição eliminada",
-       "watchlist-details": "{{PLURAL:$1|$1 página|$1 páginas}} na sua lista de páginas vigiadas, excluindo páginas de discussão.",
+       "watchlist-details": "{{PLURAL:$1|$1 página|$1 páginas}} na sua lista de páginas vigiadas, excluindo as páginas de discussão.",
        "wlheader-enotif": "A notificação por email encontra-se ativada.",
        "wlheader-showupdated": "Páginas modificadas desde a sua última visita são mostradas em '''negrito'''",
        "wlnote2": "A seguir estão as mudanças nas últimas {{PLURAL:$1|hora|<strong>$1</strong> horas}}, a partir de $2, $3.",
        "contributions-title": "Contribuições {{GENDER:$1|do usuário|da usuária}} $1",
        "mycontris": "Contribuições",
        "contribsub2": "Para {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "A conta de usuário \"$1\" não está registrada.",
        "nocontribs": "Não foram encontradas mudanças com este critério.",
        "uctop": "(atual)",
        "month": "Mês (inclusive anteriores):",
        "movenotallowedfile": "Você não possui permissão para mover arquivos.",
        "cant-move-user-page": "Você não possui permissão de mover páginas principais de usuários.",
        "cant-move-to-user-page": "Você não tem permissão para mover uma página para uma página de usuários (exceto para uma subpágina de usuário).",
+       "cant-move-category-page": "Você não possui permissão para mover páginas de categorias.",
+       "cant-move-to-category-page": "Você não tem permissão para mover uma página para uma categoria de páginas.",
        "newtitle": "Para novo título",
        "move-watch": "Vigiar esta página",
        "movepagebtn": "Mover página",
        "tooltip-preferences-save": "Salvar preferências",
        "tooltip-summary": "Forneça um breve resumo",
        "common.css": "/** o código CSS colocado aqui será aplicado a todos os temas */",
-       "monobook.css": "/* o código CSS colocado aqui terá efeito nos usuários do tema Monobook */",
        "common.js": "/* Códigos JavaScript aqui colocados serão carregados por todos aqueles que acessarem alguma página deste wiki */",
-       "monobook.js": "/* Qualquer JavaScript aqui colocado afetará os usuários do skin MonoBook */",
-       "vector.js": "/* Qualquer JavaScript aqui colocado afetará os usuários do skin Vector */",
        "anonymous": "{{PLURAL:$1|Usuário anônimo|Usuários anônimos}} da {{SITENAME}}",
        "siteuser": "{{GENDER:$2|um usuário|uma usuária|um usuário}} da {{SITENAME}} ($1)",
        "anonuser": "usuário anônimo $1 da {{SITENAME}}",
        "pageinfo-category-pages": "Número de páginas",
        "pageinfo-category-subcats": "Número de subcategorias",
        "pageinfo-category-files": "Número de arquivos",
-       "skinname-monobook": "MonoBook",
        "markaspatrolleddiff": "Marcar como patrulhada",
        "markaspatrolledtext": "Marcar esta página como patrulhada",
        "markedaspatrolled": "Marcado como verificado",
        "newimages-summary": "Esta página especial mostra os arquivos mais recentemente enviados",
        "newimages-legend": "Filtrar",
        "newimages-label": "Nome de arquivo (ou parte dele):",
+       "newimages-showbots": "Mostrar uploads realizados por bots",
        "noimages": "Nada para ver.",
        "ilsubmit": "Pesquisar",
        "bydate": "por data",
        "watchlistedit-raw-done": "Sua lista de páginas vigiadas foi atualizada.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Foi adicionado um título|Foram adicionados $1 títulos}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Foi removido um título|Foram removidos $1 títulos}}:",
+       "watchlistedit-clear-legend": "Limpar a lista de páginas vigiadas",
+       "watchlistedit-clear-explain": "Todos os títulos serão removidos da sua lista de páginas vigiadas",
+       "watchlistedit-clear-titles": "Títulos:",
+       "watchlistedit-clear-submit": "Limpar a lista de páginas vigiadas (Esta ação é permanente!)",
+       "watchlistedit-clear-done": "Sua lista de páginas vigiadas foi limpa.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Foi removido um título|Foram removidos $1 títulos}}:",
+       "watchlistedit-too-many": "Há muitas páginas para exibir aqui.",
+       "watchlisttools-clear": "Limpar a lista de páginas vigiadas",
        "watchlisttools-view": "Ver alterações relevantes",
        "watchlisttools-edit": "Ver e editar a lista de páginas vigiadas",
        "watchlisttools-raw": "Edição crua da lista de páginas vigiadas",
        "htmlform-no": "Não",
        "htmlform-yes": "Sim",
        "htmlform-chosen-placeholder": "Selecione uma opção",
+       "htmlform-cloner-required": "Pelo menos um valor é requerido",
        "sqlite-has-fts": "$1 com suporte de pesquisa de texto completo",
        "sqlite-no-fts": "$1 sem suporte de pesquisa de texto completo",
        "logentry-delete-delete": "$1 apagou a página $3",
index 01a2aaf..21a6d15 100644 (file)
@@ -85,8 +85,8 @@
        "tog-enotifminoredits": "Notificar-me por correio electrónico também sobre edições menores de páginas ou ficheiros",
        "tog-enotifrevealaddr": "Revelar o meu endereço de correio electrónico nas notificações",
        "tog-shownumberswatching": "Mostrar o número de utilizadores a vigiar",
-       "tog-oldsig": "Assinatura existente:",
-       "tog-fancysig": "Tratar assinatura como texto wiki (sem link automático)",
+       "tog-oldsig": "Assinatura atual:",
+       "tog-fancysig": "Tratar assinatura como texto wiki (sem hiperligações automáticas)",
        "tog-uselivepreview": "Usar a antevisão ao vivo (experimental)",
        "tog-forceeditsummary": "Avisar-me se deixar o resumo da edição vazio",
        "tog-watchlisthideown": "Esconder as minhas edições ao listar mudanças às páginas vigiadas",
        "tog-showhiddencats": "Mostrar categorias ocultas",
        "tog-norollbackdiff": "Omitir diferenças depois de reverter edições em bloco",
        "tog-useeditwarning": "Avisar-me ao abandonar uma página editada sem gravar as alterações.",
-       "tog-prefershttps": "Usar sempre uma ligação segura quando estiver autenticado",
+       "tog-prefershttps": "Usar sempre uma ligação segura enquanto tiver sessão iniciada",
        "underline-always": "Sempre",
        "underline-never": "Nunca",
        "underline-default": "Usar opção padrão do tema ou do navegador",
        "feb": "Fev.",
        "mar": "Mar.",
        "apr": "Abr.",
-       "may": "maio",
+       "may": "Maio",
        "jun": "Jun.",
        "jul": "Jul.",
        "aug": "Ago.",
        "qbmyoptions": "As minhas páginas",
        "faq": "Perguntas frequentes",
        "faqpage": "Project:FAQ",
-       "vector-action-addsection": "Adicionar&nbsp;tópico",
-       "vector-action-delete": "Eliminar",
-       "vector-action-move": "Mover",
-       "vector-action-protect": "Proteger",
-       "vector-action-undelete": "Restaurar",
-       "vector-action-unprotect": "Alterar protecção",
-       "vector-view-create": "Criar",
-       "vector-view-edit": "Editar",
-       "vector-view-history": "Ver histórico",
-       "vector-view-view": "Ler",
-       "vector-view-viewsource": "Ver fonte",
        "actions": "Acções",
-       "namespaces": "Espaços nominais",
+       "namespaces": "Domínios",
        "variants": "Variantes",
        "navigation-heading": "Menu de navegação",
        "errorpagetitle": "Erro",
        "help": "Ajuda",
        "search": "Pesquisa",
        "searchbutton": "Pesquisar",
-       "go": "Prosseguir",
+       "go": "Ir",
        "searcharticle": "Ir",
        "history": "Histórico",
        "history_short": "Histórico",
        "userpage": "Ver página de utilizador",
        "projectpage": "Ver página de projeto",
        "imagepage": "Ver página de ficheiro",
-       "mediawikipage": "Ver página da mensagem",
-       "templatepage": "Ver página da predefinição",
+       "mediawikipage": "Ver página de mensagem",
+       "templatepage": "Ver página de predefinição",
        "viewhelppage": "Ver página de ajuda",
-       "categorypage": "Ver página da categoria",
+       "categorypage": "Ver página de categoria",
        "viewtalkpage": "Ver discussão",
        "otherlanguages": "Noutros idiomas",
        "redirectedfrom": "(Redireccionado de $1)",
        "jumpto": "Ir para:",
        "jumptonavigation": "navegação",
        "jumptosearch": "pesquisa",
-       "view-pool-error": "Desculpe, mas de momento os servidores estão sobrecarregados.\nHá demasiados utilizadores a tentar visionar esta página.\nEspere um pouco antes de tentar aceder à página novamente, por favor.\n\n$1",
-       "generic-pool-error": "Desculpe, os servidores estão sobrecarregados nesse momento.\nDemasiados utilizadores estão tentando visualizar este recurso.\nPor favor, espere um pouco antes de tentar acessar este recurso novamente.",
+       "view-pool-error": "Desculpe, mas de momento os servidores estão sobrecarregados.\nHá demasiados utilizadores a tentar visualizar esta página.\nEspere um pouco antes de tentar aceder à página novamente, por favor.\n\n$1",
+       "generic-pool-error": "Desculpe, os servidores estão sobrecarregados nesse momento.\nDemasiados utilizadores estão tentando visualizar este recurso.\nPor favor, espere um pouco antes de tentar aceder a este recurso novamente.",
        "pool-timeout": "Tempo limite de espera para o bloqueio excedido",
        "pool-queuefull": "A fila de processos está cheia",
        "pool-errorunknown": "Erro desconhecido",
+       "pool-servererror": "O serviço ''pool counter'' não está disponível ($1).",
        "aboutsite": "Sobre a {{SITENAME}}",
        "aboutpage": "Project:Sobre",
        "copyright": "Conteúdo disponibilizado nos termos da $1, salvo indicação em contrário.",
        "nstab-user": "Página d{{GENDER:{{#titleparts:{{PAGENAME}}|1|1}}|o utilizador|a utilizadora|e utilizador(a)}}",
        "nstab-media": "Multimédia",
        "nstab-special": "Página especial",
-       "nstab-project": "Página do projeto",
+       "nstab-project": "Página de projeto",
        "nstab-image": "Ficheiro",
        "nstab-mediawiki": "Mensagem",
        "nstab-template": "Predefinição",
        "databaseerror": "Erro na base de dados",
        "databaseerror-text": "Ocorreu um erro na consulta à base de dados.\nIsto pode indicar um defeito no programa.",
        "databaseerror-textcl": "Ocorreu um erro na consulta à base de dados.",
-       "databaseerror-query": "Consulta:$1",
+       "databaseerror-query": "Consulta: $1",
        "databaseerror-function": "Função: $1",
        "databaseerror-error": "Erro: $1",
        "laggedslavemode": "'''Aviso:''' A página pode não conter as atualizações mais recentes.",
        "protectedinterface": "Esta página fornece o texto da interface ao software, e está protegida para prevenir abusos.",
        "editinginterface": "'''Aviso:''' Está a editar uma página usada para fornecer texto de interface ao software. Alterações a esta página afetarão a aparência da interface de utilizador para os outros utilizadores. Para traduções, considere utilizar a [//translatewiki.net/wiki/Main_Page?setlang=pt translatewiki.net], um projeto destinado à tradução do MediaWiki.",
        "cascadeprotected": "Esta página foi protegida contra edições por estar incluída {{PLURAL:$1|na página listada|nas páginas listadas}} a seguir, ({{PLURAL:$1|página essa que está protegida|páginas essas que estão protegidas}} com a opção de proteção \"em cascata\" ativada):\n$2",
-       "namespaceprotected": "Não tem permissão para editar páginas no espaço nominal '''$1'''.",
+       "namespaceprotected": "Não tem permissão para editar páginas no domínio '''$1'''.",
        "customcssprotected": "Não tem permissão para editar esta página de CSS porque esta contém as configurações pessoais de outro utilizador.",
        "customjsprotected": "Não tem permissão para editar esta página de JavaScript porque esta contém as configurações pessoais de outro utilizador.",
        "mycustomcssprotected": "Não tem permissão para editar esta página de CSS.",
        "myprivateinfoprotected": "Não tem permissão para editar a sua informação privada.",
        "mypreferencesprotected": "Não tem permissão para editar as suas preferências.",
        "ns-specialprotected": "Não é possível editar páginas especiais.",
-       "titleprotected": "Este título foi protegido contra criação por [[User:$1|$1]].\nA justificação foi \"''$2''\".",
+       "titleprotected": "Este título foi protegido contra criação por [[User:$1|$1]].\nA justificação dada foi \"''$2''\".",
        "filereadonlyerror": "Não é possível modificar o ficheiro \"$1\" porque o repositório de ficheiros \"$2\" está em modo de leitura.\n\nO administrador que efetuou o bloqueio deu a seguinte explicação: \"$3\".",
-       "invalidtitle-knownnamespace": "Título inválido com o espaço nominal \"$2\" e texto \"$3\"",
-       "invalidtitle-unknownnamespace": "Título inválido com número de espaço nominal $1 desconhecido e texto \"$2\"",
+       "invalidtitle-knownnamespace": "Título inválido com o domínio \"$2\" e texto \"$3\"",
+       "invalidtitle-unknownnamespace": "Título inválido com número de domínio $1 desconhecido e texto \"$2\"",
        "exception-nologin": "Não está autenticado",
-       "exception-nologin-text": "Por favor, [[Special:Userlogin|entre]] para poder acessar esta página ou acção.",
-       "exception-nologin-text-manual": "Por favor  $1  para poder aceder a esta página ou acção.",
+       "exception-nologin-text": "Por favor, [[Special:Userlogin|inicie sessão]] para poder aceder a esta página ou acção.",
+       "exception-nologin-text-manual": "Por favor $1, para poder aceder a esta página ou acção.",
        "virus-badscanner": "Má configuração: antivírus desconhecido: ''$1''",
        "virus-scanfailed": "a verificação falhou (código $1)",
        "virus-unknownscanner": "antivírus desconhecido:",
-       "logouttext": "'''Já não está autenticado.'''\n\nTenha 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.",
+       "logouttext": "'''Já não está autenticado.'''\n\nTenha em atenção que algumas páginas poderão continuar a ser apresentadas como se ainda estivesse autenticado até limpar a cache do seu navegador.",
        "welcomeuser": "Bem-vindo, $1!",
        "welcomecreation-msg": "A sua conta foi criada.\nNão se esqueça de personalizar as suas [[Special:Preferences|preferências]].",
-       "yourname": "Nome de utilizador:",
+       "yourname": "Nome de utilizador(a):",
        "userlogin-yourname": "Nome de utilizador(a):",
        "userlogin-yourname-ph": "Digite o seu nome de utilizador(a)",
        "createacct-another-username-ph": "Digite o nome de utilizador(a)",
-       "yourpassword": "Palavra-chave:",
-       "userlogin-yourpassword": "Palavra-chave",
-       "userlogin-yourpassword-ph": "Digite a sua palavra-chave",
-       "createacct-yourpassword-ph": "Digite uma palavra-chave",
-       "yourpasswordagain": "Repita a palavra-chave:",
-       "createacct-yourpasswordagain": "Confirme a palavra-chave",
-       "createacct-yourpasswordagain-ph": "Digite a palavra-chave novamente",
+       "yourpassword": "Palavra-passe:",
+       "userlogin-yourpassword": "Palavra-passe",
+       "userlogin-yourpassword-ph": "Digite a sua palavra-passe",
+       "createacct-yourpassword-ph": "Digite uma palavra-passe",
+       "yourpasswordagain": "Repita a palavra-passe:",
+       "createacct-yourpasswordagain": "Confirme a palavra-passe",
+       "createacct-yourpasswordagain-ph": "Digite a palavra-passe novamente",
        "remembermypassword": "Recordar os meus dados neste computador (no máximo, por $1 {{PLURAL:$1|dia|dias}})",
        "userlogin-remembermypassword": "Manter-me autenticado",
-       "userlogin-signwithsecure": "Use uma ligação segura",
+       "userlogin-signwithsecure": "Usar uma ligação segura",
        "yourdomainname": "O seu domínio:",
        "password-change-forbidden": "Não pode alterar palavras-chave nesta wiki.",
        "externaldberror": "Ocorreu um erro externo à base de dados durante a autenticação ou não lhe é permitido atualizar a sua conta externa.",
-       "login": "Autenticação",
+       "login": "Entrar",
        "nav-login-createaccount": "Entrar / criar conta",
-       "loginprompt": "É necessário ter os ''cookies'' ativados no seu browser para poder autenticar-se na {{SITENAME}}.",
+       "loginprompt": "É necessário ter os ''cookies'' ativados no seu navegador para poder autenticar-se em {{SITENAME}}.",
        "userlogin": "Criar uma conta ou entrar",
-       "userloginnocreate": "Autenticação",
+       "userloginnocreate": "Entrar",
        "logout": "Sair",
        "userlogout": "Sair",
        "notloggedin": "Não autenticado",
        "nologin": "Não possui uma conta? $1.",
        "nologinlink": "Criar uma conta",
        "createaccount": "Criar conta",
-       "gotaccount": "Já possui uma conta? '''$1'''.",
-       "gotaccountlink": "Autentique-se",
-       "userlogin-resetlink": "Esqueceu-se do seu nome de utilizador ou da palavra-chave?",
-       "userlogin-resetpassword-link": "Esqueceu a sua palavra-chave?",
-       "userlogin-helplink2": "Ajuda na autenticação",
-       "userlogin-loggedin": "Já está {{GENDER:$1|autenticado|autenticada|autenticado}} com o nome $1.\nUse o formulário abaixo para iniciar uma sessão com outro nome.",
+       "gotaccount": "Já possui uma conta? $1.",
+       "gotaccountlink": "Entrar",
+       "userlogin-resetlink": "Esqueceu-se do seu nome de utilizador ou da palavra-passe?",
+       "userlogin-resetpassword-link": "Esqueceu-se da sua palavra-passe?",
+       "userlogin-helplink2": "Ajuda para iniciar sessão",
+       "userlogin-loggedin": "Já está {{GENDER:$1|autenticado|autenticada|autenticado}} com o nome $1.\nUse o formulário abaixo para iniciar sessão com outro nome.",
        "userlogin-createanother": "Criar outra conta",
-       "createacct-emailrequired": "Endereço de email",
-       "createacct-emailoptional": "Endereço de email (opcional)",
-       "createacct-email-ph": "Digite o seu endereço de correio electrónico",
-       "createacct-another-email-ph": "Digite o endereço de correio electrónico",
+       "createacct-emailrequired": "Endereço de correio eletrónico",
+       "createacct-emailoptional": "Endereço de correio eletrónico (opcional)",
+       "createacct-email-ph": "Digite o seu endereço de correio eletrónico",
+       "createacct-another-email-ph": "Digite o endereço de correio eletrónico",
        "createaccountmail": "Usar uma palavra passe aleatória e temporária e enviar para o endereço de correio eletrónico especificado",
        "createacct-realname": "Nome verdadeiro (opcional)",
        "createaccountreason": "Motivo:",
-       "createacct-reason": "Razão",
+       "createacct-reason": "Motivo",
        "createacct-reason-ph": "Porque está a criar outra conta",
-       "createacct-captcha": "Verificar segurança",
+       "createacct-captcha": "Verificação de segurança",
        "createacct-imgcaptcha-ph": "Digite o texto que vê acima",
        "createacct-submit": "Crie a sua conta",
        "createacct-another-submit": "Criar uma outra conta",
        "createacct-benefit-body1": "{{PLURAL:$1|edição|edições}}",
        "createacct-benefit-body2": "{{PLURAL:$1|página|páginas}}",
        "createacct-benefit-body3": "{{PLURAL:$1|contribuidor|contribuidores}} recentes",
-       "badretype": "As palavras-chave que introduziu não são iguais.",
+       "badretype": "As palavras-passe que introduziu não coincidem.",
        "userexists": "O nome de utilizador introduzido já existe.\nPor favor escolha um nome diferente.",
-       "loginerror": "Erro de autenticação",
+       "loginerror": "Erro ao iniciar sessão",
        "createacct-error": "Erro na criação da conta",
        "createaccounterror": "Não foi possível criar a conta: $1",
-       "nocookiesnew": "A conta de utilizador foi criada, mas neste momento não está autenticado.\nA {{SITENAME}} utiliza ''cookies'' para autenticar os utilizadores.\nOs ''cookies'' estão desativados no seu browser.\nAtive-os e autentique-se com o seu nome de utilizador e a sua palavra-chave, por favor.",
-       "nocookieslogin": "A {{SITENAME}} utiliza ''cookies'' para autenticar os utilizadores.\nOs ''cookies'' estão desativados no seu browser.\nAtive-os e tente novamente, por favor.",
-       "nocookiesfornew": "A conta de utilizador não foi criada, porque não foi possível confirmar a sua origem.\nCertifique-se de que tem os cookies ativados, recarregue esta página e tente novamente.",
+       "nocookiesnew": "A conta de utilizador foi criada, mas neste momento não tem sessão iniciada.\nA {{SITENAME}} utiliza ''cookies'' para autenticar os utilizadores.\nOs ''cookies'' estão desativados no seu navegador.\nAtive-os e inicie sessão com o seu nome de utilizador e a sua palavra-passe, por favor.",
+       "nocookieslogin": "A {{SITENAME}} utiliza ''cookies'' para autenticar os utilizadores.\nOs ''cookies'' estão desativados no seu navegador.\nAtive-os e tente novamente, por favor.",
+       "nocookiesfornew": "A conta de utilizador não foi criada, porque não foi possível confirmar a sua origem.\nCertifique-se de que tem os ''cookies'' ativados, recarregue esta página e tente novamente.",
        "noname": "Não especificou um nome de utilizador válido.",
-       "loginsuccesstitle": "Login bem sucedido",
+       "loginsuccesstitle": "Início de sessão bem sucedido",
        "loginsuccess": "'''Encontra-se agora ligado à {{SITENAME}} como \"$1\"'''.",
        "nosuchuser": "Não existe nenhum utilizador com o nome \"$1\".\nOs nomes de utilizador são sensíveis à capitalização.\nVerifique a ortografia, ou [[Special:UserLogin/signup|crie uma nova conta]].",
        "nosuchusershort": "Não existe um utilizador com o nome \"$1\". Verifique o nome que introduziu.",
        "nouserspecified": "Precisa de especificar um nome de utilizador.",
        "login-userblocked": "Este utilizador está bloqueado. Não é permitido o acesso.",
-       "wrongpassword": "A palavra-chave que introduziu é inválida. Tente novamente, por favor.",
-       "wrongpasswordempty": "A palavra-chave não foi introduzida. Introduza-a, por favor.",
-       "passwordtooshort": "A palavra-chave deve ter no mínimo $1 {{PLURAL:$1|carácter|caracteres}}.",
-       "password-name-match": "A sua palavra-chave tem de ser diferente do seu nome de utilizador.",
-       "password-login-forbidden": "Foi proibido o uso deste nome de utilizador e palavra-chave.",
-       "mailmypassword": "Reiniciar a palavra-chave",
-       "passwordremindertitle": "Nova palavra-chave temporária na {{SITENAME}}",
-       "passwordremindertext": "Alguém (provavelmente você, a partir do endereço IP $1) solicitou uma palavra-chave nova para a sua conta na {{SITENAME}} ($4).\nFoi criada a palavra-chave temporária \"$3\" para o utilizador \"$2\".\nSe o pedido foi feito por si, entre agora na sua conta e escolha uma palavra-chave nova.\nA palavra-chave temporária expira após {{PLURAL:$5|um dia|$5 dias}}.\n\nCaso outra pessoa tenha feito o pedido, ou se entretanto se recordou da sua palavra-chave e já não deseja alterá-la, ignore esta mensagem e continue a utilizar a palavra-chave antiga.",
+       "wrongpassword": "A palavra-passe que introduziu é inválida. Tente novamente, por favor.",
+       "wrongpasswordempty": "A palavra-passe não foi introduzida. \nIntroduza-a, por favor.",
+       "passwordtooshort": "A palavra-passe deve ter no mínimo $1 {{PLURAL:$1|carácter|caracteres}}.",
+       "password-name-match": "A sua palavra-passe tem de ser diferente do seu nome de utilizador.",
+       "password-login-forbidden": "Foi proibido o uso deste nome de utilizador e palavra-passe.",
+       "mailmypassword": "Reiniciar a palavra-passe",
+       "passwordremindertitle": "Nova palavra-passe temporária na {{SITENAME}}",
+       "passwordremindertext": "Alguém (provavelmente você, a partir do endereço IP $1) solicitou uma palavra-passe nova para a sua conta na {{SITENAME}} ($4).\nFoi criada a palavra-passe temporária \"$3\" para o utilizador \"$2\".\nSe o pedido foi feito por si, entre agora na sua conta e escolha uma palavra-passe nova.\nA palavra-passe temporária expira após {{PLURAL:$5|um dia|$5 dias}}.\n\nCaso outra pessoa tenha feito o pedido, ou se entretanto se recordou da sua palavra-passe e já não deseja alterá-la, ignore esta mensagem e continue a utilizar a palavra-passe antiga.",
        "noemail": "Não foi registado um endereço de correio eletrónico para o utilizador \"$1\".",
        "noemailcreate": "Tem de fornecer um endereço de correio eletrónico válido.",
-       "passwordsent": "Foi enviada uma palavra-chave nova para o endereço de correio eletrónico do utilizador \"$1\".\nVolte a autenticar-se após recebê-la, por favor.",
-       "blocked-mailpassword": "O seu endereço IP foi bloqueado e, portanto, não será possível utilizar a função de recuperação da palavra-chave, para prevenir o uso abusivo.",
+       "passwordsent": "Foi enviada uma palavra-passe nova para o endereço de correio eletrónico do utilizador \"$1\".\nVolte a iniciar sessão após recebê-la, por favor.",
+       "blocked-mailpassword": "O seu endereço IP foi bloqueado e, portanto, não será possível utilizar a função de recuperação da palavra-passe, para prevenir o uso abusivo.",
        "eauthentsent": "Foi enviada uma mensagem de confirmação para o endereço de correio eletrónico que especificou.\nAntes que seja enviada qualquer outra mensagem para a conta, terá de seguir as instruções na mensagem enviada, de modo a confirmar que a conta lhe pertence.",
-       "throttled-mailpassword": "Já foi enviada um email de recuperação de palavra-chave {{PLURAL:$1|na última hora|nas últimas $1 horas}}.\nPara prevenir abusos, só um email de recuperação de palavra-chave pode ser enviado a cada {{PLURAL:$1|hora|$1 horas}}.",
-       "mailerror": "Erro ao enviar correio: $1",
+       "throttled-mailpassword": "Já foi enviada um email de recuperação de palavra-passe {{PLURAL:$1|na última hora|nas últimas $1 horas}}.\nPara prevenir abusos, só um email de recuperação de palavra-passe pode ser enviado a cada {{PLURAL:$1|hora|$1 horas}}.",
+       "mailerror": "Erro ao enviar correio electrónico: $1",
        "acct_creation_throttle_hit": "Visitantes desta wiki com o seu endereço IP criaram $1 {{PLURAL:$1|conta|contas}} no último dia, o que é o máximo permitido neste período de tempo.\nEm resultado, visitantes com este endereço IP não podem criar mais nenhuma conta neste momento.",
        "emailauthenticated": "O seu endereço de correio eletrónico foi confirmado a $2, às $3.",
        "emailnotauthenticated": "O seu endereço de correio eletrónico ainda não foi confirmado.\nNão lhe serão enviadas mensagens por nenhuma das seguintes funcionalidades.",
        "emailconfirmlink": "Confirme o seu endereço de correio eletrónico",
        "invalidemailaddress": "O endereço de correio eletrónico não pode ser aceite porque parece ter um formato inválido.\nIntroduza um endereço formatado corretamente ou deixe o campo vazio.",
        "cannotchangeemail": "Os endereços de correio eletrónico das contas não podem ser alterados nesta wiki.",
-       "emaildisabled": "Este site não consegue enviar mensagens de correio eletrónico.",
+       "emaildisabled": "Este sítio não consegue enviar mensagens de correio eletrónico.",
        "accountcreated": "Conta criada",
        "accountcreatedtext": "A conta de utilizador para [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) foi criada.",
        "createaccount-title": "Criação de conta na {{SITENAME}}",
-       "createaccount-text": "Alguém criou uma conta com o nome $2 para o seu endereço de correio eletrónico, na wiki {{SITENAME}} ($4), com a palavra-chave \"$3\".\nDeve agora autenticar-se e alterar a sua palavra-chave.\n\nSe a conta foi criada por engano, pode ignorar esta mensagem.",
-       "login-throttled": "Realizou demasiadas tentativas de autenticação com esta conta.\nAguarde $1 antes de tentar novamente, por favor.",
-       "login-abort-generic": "A sua autenticação não teve êxito - Cancelada",
+       "createaccount-text": "Alguém criou uma conta com o nome $2 para o seu endereço de correio eletrónico, na wiki {{SITENAME}} ($4), com a palavra-passe \"$3\".\nDeve agora iniciar sessão e alterar a sua palavra-passe.\n\nSe a conta foi criada por engano, pode ignorar esta mensagem.",
+       "login-throttled": "Realizou demasiadas tentativas de início de sessão com esta conta.\nAguarde $1 antes de tentar novamente, por favor.",
+       "login-abort-generic": "O início de sessão não teve êxito - Cancelado",
        "loginlanguagelabel": "Língua: $1",
-       "suspicious-userlogout": "O seu pedido para sair foi negado porque parece ter sido enviado por um browser danificado ou por um proxy com cache.",
+       "suspicious-userlogout": "O seu pedido para sair foi negado porque parece ter sido enviado por um navegador danificado ou por um proxy com cache.",
        "createacct-another-realname-tip": "O fornecimento do nome verdadeiro é opcional.\nSe optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu trabalho.",
-       "pt-login": "Autenticação",
-       "pt-login-button": "Iniciar sessão",
+       "pt-login": "Entrar",
+       "pt-login-button": "Entrar",
        "pt-createaccount": "Criar uma conta",
        "pt-userlogout": "Sair",
        "php-mail-error-unknown": "Erro desconhecido na função mail() do PHP",
        "user-mail-no-addy": "Tentou enviar uma mensagem sem um endereço de correio eletrónico.",
        "user-mail-no-body": "Tentou enviar uma mensagem sem conteúdo ou com um conteúdo demasiado pequeno.",
-       "changepassword": "Alterar palavra-chave",
-       "resetpass_announce": "Para completar a autenticação, tem de definir uma palavra-chave nova.",
+       "changepassword": "Alterar palavra-passe",
+       "resetpass_announce": "Para completar a autenticação, tem de definir uma palavra-passe nova.",
        "resetpass_text": "<!-- Adicionar texto aqui -->",
-       "resetpass_header": "Alterar palavra-chave da conta",
-       "oldpassword": "Palavra-chave anterior:",
-       "newpassword": "Palavra-chave nova:",
-       "retypenew": "Repita a palavra-chave nova:",
-       "resetpass_submit": "Definir palavra-chave e entrar",
-       "changepassword-success": "A sua palavra-chave foi alterada!",
-       "changepassword-throttled": "Realizou demasiadas tentativas de autenticação com esta conta.\nAguarde $1 antes de tentar novamente, por favor.",
-       "resetpass_forbidden": "Não é possível alterar palavras-chave",
-       "resetpass-no-info": "Precisa estar autenticado para aceder diretamente a esta página.",
-       "resetpass-submit-loggedin": "Alterar palavra-chave",
+       "resetpass_header": "Alterar palavra-passe da conta",
+       "oldpassword": "Palavra-passe anterior:",
+       "newpassword": "Palavra-passe nova:",
+       "retypenew": "Repita a palavra-passe nova:",
+       "resetpass_submit": "Definir palavra-passe e entrar",
+       "changepassword-success": "A sua palavra-passe foi alterada!",
+       "changepassword-throttled": "Realizou demasiadas tentativas de início de sessão com esta conta.\nAguarde $1 antes de tentar novamente, por favor.",
+       "resetpass_forbidden": "Não é possível alterar palavras-passe",
+       "resetpass-no-info": "Precisa de iniciar sessão para aceder diretamente a esta página.",
+       "resetpass-submit-loggedin": "Alterar palavra-passe",
        "resetpass-submit-cancel": "Cancelar",
-       "resetpass-wrong-oldpass": "Palavra-chave temporária ou atual inválida.\nPode ter já alterado com sucesso a sua palavra-chave ou solicitado uma nova palavra-chave temporária.",
-       "resetpass-recycled": "Redefina a sua palavra-chave para uma diferente da atual, por favor.",
-       "resetpass-temp-emailed": "Autenticou-se usando um código temporário.\nPara completar a autenticação, tem de definir uma palavra-chave nova aqui:",
-       "resetpass-temp-password": "Palavra-chave temporária:",
-       "resetpass-abort-generic": "A alteração da palavra-chave foi cancelada por uma extensão.",
-       "resetpass-expired": "A sua palavra-chave expirou. Para autenticar-se, defina uma nova.",
-       "resetpass-expired-soft": "A sua palavra-chave expirou e tem de ser redefinida. Escolha uma nova agora ou clique \"{{int:resetpass-submit-cancel}}\" para redefini-la mais tarde.",
-       "resetpass-validity-soft": "Sua palavra-chave não é válida: $1\n\nPor favor, escolha uma nova palavra-chave agora, ou clique em \"{{int:resetpass-submit-cancel}}\" para redefini-la mais tarde.",
-       "passwordreset": "Redefinir palavra-chave",
+       "resetpass-wrong-oldpass": "Palavra-passe temporária ou atual inválida.\nPode ter já alterado com sucesso a sua palavra-passe ou solicitado uma nova palavra-passe temporária.",
+       "resetpass-recycled": "Redefina a sua palavra-passe para uma diferente da atual, por favor.",
+       "resetpass-temp-emailed": "Iniciou a sessão com um código temporário.\nPara completar a autenticação, tem de definir uma palavra-passe nova aqui:",
+       "resetpass-temp-password": "Palavra-passe temporária:",
+       "resetpass-abort-generic": "A alteração da palavra-passe foi cancelada por uma extensão.",
+       "resetpass-expired": "A sua palavra-passe expirou. Por favor, defina uma nova para iniciar a sessão.",
+       "resetpass-expired-soft": "A sua palavra-passe expirou e tem de ser redefinida. Escolha uma nova agora ou clique \"{{int:resetpass-submit-cancel}}\" para redefini-la mais tarde.",
+       "resetpass-validity-soft": "A sua palavra-passe não é válida: $1\n\nPor favor, escolha uma nova palavra-passe agora, ou clique em \"{{int:resetpass-submit-cancel}}\" para redefini-la mais tarde.",
+       "passwordreset": "Redefinir palavra-passe",
        "passwordreset-text-one": "Preencha este formulário para receber uma palavra-passe temporária por correio eletrónico.",
-       "passwordreset-text-many": "{{PLURAL:$1|Preencha um dos campos para receber uma palavra-chave temporária por correio eletrónico.}}",
-       "passwordreset-legend": "Redefinir palavra-chave",
-       "passwordreset-disabled": "A redefinição da palavra-chave foi impossibilitada nesta wiki.",
+       "passwordreset-text-many": "{{PLURAL:$1|Preencha um dos campos para receber uma palavra-passe temporária por correio eletrónico.}}",
+       "passwordreset-legend": "Redefinir palavra-passe",
+       "passwordreset-disabled": "A redefinição da palavra-passe foi impossibilitada nesta wiki.",
        "passwordreset-emaildisabled": "A funcionalidade de correio eletrónico foi desativada nesta wiki.",
-       "passwordreset-username": "Nome de utilizador:",
+       "passwordreset-username": "Nome de utilizador(a):",
        "passwordreset-domain": "Domínio:",
        "passwordreset-capture": "Ver a mensagem resultante?",
-       "passwordreset-capture-help": "Se marcar esta caixa, a mensagem (com a palavra-chave temporária) ser-lhe-á mostrada e enviada ao utilizador.",
+       "passwordreset-capture-help": "Se marcar esta caixa, a mensagem (com a palavra-passe temporária) ser-lhe-á mostrada e enviada ao utilizador.",
        "passwordreset-email": "Correio eletrónico:",
        "passwordreset-emailtitle": "Detalhes da conta na {{SITENAME}}",
        "passwordreset-emailtext-ip": "Alguém (provavelmente você, a partir do endereço IP $1) pediu a recuperação da palavra-passe no projeto {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta de utilizador está associada|As seguintes contas de utilizador estão associadas}} a este correio eletrónico:\n\n$2\n\n{{PLURAL:$3|Esta palavra-passe temporária irá|Estas palavras-passes temporárias irão}} expirar dentro de {{PLURAL:$5|um dia|$5 dias}}.\nDeve autenticar-se e escolher uma palavra-passe nova agora. Se outra pessoa fez este pedido, ou se entretanto se recordou da sua palavra-passe original e já não deseja alterá-la, pode ignorar esta mensagem e continuar a usar a palavra-passe antiga.",
        "passwordreset-emailtext-user": "O utilizador $1 do projeto {{SITENAME}} pediu a recuperação da sua palavra-passe no projeto {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta de utilizador está associada|As seguintes contas de utilizador estão associadas}} a este endereço de correio eletrónico:\n\n$2\n\n{{PLURAL:$3|Esta palavra-passe temporária irá|Estas palavras-passes temporárias irão}} expirar dentro de {{PLURAL:$5|um dia|$5 dias}}.\nDeve autenticar-se e escolher uma palavra-passe nova agora. Se outra pessoa fez este pedido, ou se entretanto se recordou da sua palavra-passe original e já não deseja alterá-la, pode ignorar esta mensagem e continuar a usar a palavra-passe antiga.",
-       "passwordreset-emailelement": "Utilizador: $1\nPalavra-chave temporária: $2",
+       "passwordreset-emailelement": "Utilizador: $1\nPalavra-passe temporária: $2",
        "passwordreset-emailsent": "Foi enviado um correio eletrónico para recuperação da palavra-passe.",
        "passwordreset-emailsent-capture": "Foi enviado um correio eletrónico para recuperação da palavra-passe, que é mostrado abaixo.",
-       "passwordreset-emailerror-capture": "Foi gerado um correio eletrónico para redefinição da palavra-chave, mostrado abaixo, mas o seu envio para {{GENDER:$2|o utilizador|a utilizadora}} falhou: $1",
+       "passwordreset-emailerror-capture": "Foi gerado um correio eletrónico para redefinição da palavra-passe, mostrado abaixo, mas o seu envio para {{GENDER:$2|o utilizador|a utilizadora}} falhou: $1",
        "changeemail": "Alterar o endereço de correio eletrónico",
        "changeemail-header": "Alterar o endereço de correio eletrónico da conta",
-       "changeemail-text": "Preencha este formulário para alterar o endereço de correio eletrónico. Para confirmar esta alteração terá de introduzir a sua palavra-chave.",
-       "changeemail-no-info": "Tem de autenticar-se para aceder diretamente a esta página.",
+       "changeemail-text": "Preencha este formulário para alterar o endereço de correio eletrónico. Para confirmar esta alteração terá de introduzir a sua palavra-passe.",
+       "changeemail-no-info": "Precisa de iniciar sessão para aceder diretamente a esta página.",
        "changeemail-oldemail": "Correio eletrónico atual:",
        "changeemail-newemail": "Novo endereço de correio eletrónico:",
        "changeemail-none": "(nenhum)",
-       "changeemail-password": "A sua senha na wiki {{SITENAME}}:",
+       "changeemail-password": "A sua palavra-passe em {{SITENAME}}:",
        "changeemail-submit": "Alterar correio eletrónico",
        "changeemail-cancel": "Cancelar",
-       "changeemail-throttled": "Realizou demasiadas tentativas de autenticação com esta conta.\nAguarde $1 antes de tentar novamente, por favor.",
+       "changeemail-throttled": "Realizou demasiadas tentativas de início de sessão.\nAguarde $1 antes de tentar novamente, por favor.",
        "resettokens": "Redefinir chaves",
        "resettokens-text": "Pode redefinir as chaves de acesso a certos dados privados associados à sua conta aqui.\n\nDeve fazê-lo se as divulgou acidentalmente a alguém ou se a sua conta tiver sido comprometida.",
        "resettokens-no-tokens": "Não há chaves para redefinir.",
        "preview": "Antevisão",
        "showpreview": "Antever resultado",
        "showdiff": "Mostrar alterações",
-       "anoneditwarning": "'''Aviso''': Não se encontra autenticado.\nO seu endereço IP será registado no histórico de edições desta página.",
-       "anonpreviewwarning": "''Não está autenticado. Gravar registará o seu endereço IP no histórico de edições da página.''",
+       "anoneditwarning": "'''Aviso''': Não iniciou sessão.\nO seu endereço IP será registado no histórico de edições desta página.",
+       "anonpreviewwarning": "''Não iniciou sessão. Ao gravar, registará o seu endereço IP no histórico de edições da página.''",
        "missingsummary": "'''Atenção:''' Não introduziu um resumo da edição.\nSe clicar novamente \"Gravar página\" a sua edição será gravada sem resumo.",
        "missingcommenttext": "Introduza um comentário abaixo, por favor.",
        "missingcommentheader": "'''Atenção:''' Não introduziu um assunto ou cabeçalho para este comentário.\nSe clicar novamente \"{{int:savearticle}}\", a sua edição será gravada sem assunto ou cabeçalho.",
        "confirmedittext": "Precisa de confirmar o seu endereço de correio eletrónico antes de começar a editar páginas.\nIntroduza e valide o endereço através das [[Special:Preferences|preferências do utilizador]], por favor.",
        "nosuchsectiontitle": "Não foi possível encontrar a secção",
        "nosuchsectiontext": "Tentou editar uma secção que não existe.\nEla pode ter sido movida ou removida enquanto estava a ver a página.",
-       "loginreqtitle": "Autenticação necessária",
-       "loginreqlink": "autenticar-se",
+       "loginreqtitle": "Início de sessão necessário",
+       "loginreqlink": "entrar",
        "loginreqpagetext": "Precisa de $1 para ver outras páginas.",
-       "accmailtitle": "Palavra-chave enviada.",
-       "accmailtext": "Uma palavra-chave gerada aleatoriamente para [[User talk:$1|$1]] foi enviada para $2.\n\nEla pode ser alterada na página [[Special:ChangePassword|de alteração da palavra-chave]] após autenticação.",
+       "accmailtitle": "Palavra-passe enviada.",
+       "accmailtext": "Uma palavra-passe gerada aleatoriamente para [[User talk:$1|$1]] foi enviada para $2.\n\nEla pode ser alterada na página [[Special:ChangePassword|de alteração da palavra-passe]] após iniciar sessão.",
        "newarticle": "(Nova)",
        "newarticletext": "Seguiu uma ligação para uma página que ainda não existe.\nPara criá-la, escreva o seu conteúdo na caixa abaixo (consulte a [$1 página de ajuda] para mais detalhes).\nSe chegou aqui por engano, clique o botão '''voltar''' (ou ''back'') do seu navegador.",
-       "anontalkpagetext": "----''Esta é a página de discussão de um utilizador anónimo que ainda não criou uma conta ou não a utiliza, pelo que temos de utilizar o endereço IP para identificá-lo(a).\nUm endereço IP pode ser partilhado por vários utilizadores.\nSe é um utilizador anónimo e sente que lhe foram direccionados comentários irrelevantes, por favor [[Special:UserLogin/signup|crie uma conta]] ou [[Special:UserLogin|autentique-se]] para evitar futuras confusões com outros utilizadores anónimos.''",
+       "anontalkpagetext": "----''Esta é a página de discussão de um utilizador anónimo que ainda não criou uma conta ou não a utiliza, pelo que temos de utilizar o endereço IP para identificá-lo(a).\nUm endereço IP pode ser partilhado por vários utilizadores.\nSe é um utilizador anónimo e sente que lhe foram direccionados comentários irrelevantes, por favor [[Special:UserLogin/signup|crie uma conta]] ou [[Special:UserLogin|inicie sessão]] para evitar futuras confusões com outros utilizadores anónimos.''",
        "noarticletext": "Ainda não existe texto nesta página.\nPode [[Special:Search/{{PAGENAME}}|pesquisar o título desta página]] noutras páginas,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} procurar registos relacionados]\nou [{{fullurl:{{FULLPAGENAME}}|action=edit}} editar esta página]</span>.",
        "noarticletext-nopermission": "Ainda não existe texto nesta página.\nPode [[Special:Search/{{PAGENAME}}|pesquisar o título desta página]] noutras páginas, ou <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} procurar nos registos relacionados]</span>, mas não tem permissão para criar esta página.",
        "missing-revision": "A revisão #$1 da página denominada \"{{FULLPAGENAME}}\" não existe.\n\nIsto é geralmente causado por seguir uma ligação de histórico desatualizada para uma página que foi eliminada.\nOs detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminação].",
        "userpage-userdoesnotexist": "A conta \"<nowiki>$1</nowiki>\" não se encontra registada.\nVerifique se deseja realmente criar ou editar esta página, por favor.",
        "userpage-userdoesnotexist-view": "A conta de utilizador \"$1\" não está registada.",
        "blocked-notice-logextract": "Este utilizador está bloqueado.\nPara referência, o último registo de bloqueio é apresentado abaixo:",
-       "clearyourcache": "'''Nota:''' Após gravar, terá de limpar a ''cache'' do seu browser para ver as alterações.\n*'''Firefox / Safari:''' Pressione ''Shift'' enquanto clica ''Recarregar'', ou pressione ''Ctrl-F5'' ou ''Ctrl-R'' (''⌘-R'' no Mac)\n*'''Google Chrome:''' Pressione ''Ctrl-Shift-R'' (''⌘-Shift-R'' no Mac)\n*'''Internet Explorer:''' Pressione ''Ctrl'' enquanto clica ''Recarregar'', ou pressione ''Ctrl-F5''\n*'''Opera:''' Limpe a ''cache'' em ''Ferramentas → Preferências'' (''Tools → Preferences'')",
+       "clearyourcache": "'''Nota:''' Após gravar, terá de limpar a ''cache'' do seu navegador para ver as alterações.\n*'''Firefox / Safari:''' Pressione ''Shift'' enquanto clica ''Recarregar'', ou pressione ''Ctrl-F5'' ou ''Ctrl-R'' (''⌘-R'' no Mac)\n*'''Google Chrome:''' Pressione ''Ctrl-Shift-R'' (''⌘-Shift-R'' no Mac)\n*'''Internet Explorer:''' Pressione ''Ctrl'' enquanto clica ''Recarregar'', ou pressione ''Ctrl-F5''\n*'''Opera:''' Limpe a ''cache'' em ''Ferramentas → Preferências'' (''Tools → Preferences'')",
        "usercssyoucanpreview": "'''Dica:''' Use o botão \"{{int:showpreview}}\" para testar o seu novo CSS antes de gravar.",
        "userjsyoucanpreview": "'''Dica:''' Use o botão \"{{int:showpreview}}\" para testar o seu novo JavaScript antes de gravar.",
        "usercsspreview": "'''Lembre-se de que está apenas a antever o seu CSS particular.\nEste ainda não foi gravado!'''",
        "previewconflict": "Esta antevisão do resultado apresenta o texto da caixa de edição acima tal como este aparecerá se escolher gravá-lo.",
        "session_fail_preview": "'''Não foi possível processar a edição devido à perda dos dados da sua sessão.\nTente novamente, por favor.\nCaso continue a não funcionar, tente [[Special:UserLogout|sair]] e voltar a entrar na sua conta.'''",
        "session_fail_preview_html": "'''Não foi possível processar a edição devido à perda dos dados da sua sessão.'''\n\n''Como a wiki {{SITENAME}} possibilita o uso de HTML bruto, a antevisão está oculta por precaução contra ataques com JavaScript.''\n\n'''Se esta é uma tentativa legítima de edição tente novamente, por favor.'''\nCaso continue a não funcionar, tente [[Special:UserLogout|sair]] e voltar a entrar na sua conta.",
-       "token_suffix_mismatch": "'''A edição foi rejeitada porque o seu browser alterou os sinais de pontuação no editor.'''\nA edição foi rejeitada para evitar perdas no texto da página.\nIsso acontece ocasionalmente quando se usa um serviço de proxy anonimizador mal configurado.'''",
+       "token_suffix_mismatch": "'''A edição foi rejeitada porque o seu navegador alterou os sinais de pontuação no editor.'''\nA edição foi rejeitada para evitar perdas no texto da página.\nIsso acontece ocasionalmente quando se usa um serviço de proxy anonimizador mal configurado.'''",
        "edit_form_incomplete": "'''Algumas partes do formulário de edição não chegaram ao servidor; verifique que a sua edição continua intacta e tente novamente, por favor.'''",
        "editing": "A editar $1",
        "creating": "A criar $1",
        "editconflict": "Conflito de edição: $1",
        "explainconflict": "A página foi alterada por alguém desde que começou a editá-la.\nA caixa de texto abaixo mostra o texto existente neste momento.\nAs suas mudanças são mostradas na área ao fundo da página.\nTerá de reintegrar as suas mudanças no texto da caixa abaixo.\n'''Só''' o texto desta caixa será gravado quando clicar \"{{int:savearticle}}\".",
        "yourtext": "O seu texto",
-       "storedversion": "Versão guardada",
+       "storedversion": "Versão gravada",
        "nonunicodebrowser": "'''Aviso: O seu navegador não é compatível com as especificações Unicode.\nFoi activado um sistema de edição alternativo que lhe permite editar as páginas com segurança: os caracteres não-ASCII aparecerão na caixa de edição no formato de códigos hexadecimais.'''",
        "editingold": "'''Aviso: Está a editar uma revisão desactualizada desta página.'''\nSe gravar, todas as mudanças feitas a partir desta revisão serão perdidas.",
        "yourdiff": "Diferenças",
        "template-semiprotected": "(semi-protegida)",
        "hiddencategories": "Esta página pertence a {{PLURAL:$1|uma categoria oculta|$1 categorias ocultas}}:",
        "edittools": "<!-- O texto colocado aqui será mostrado abaixo dos formulários de edição e de envio de ficheiros. -->",
-       "nocreatetext": "A {{SITENAME}} restringe a criação de páginas novas por utilizadores anónimos.\nPode voltar atrás e editar uma página já existente, ou [[Special:UserLogin|autenticar-se ou criar uma conta]].",
+       "nocreatetext": "A {{SITENAME}} restringe a criação de páginas novas por utilizadores anónimos.\nPode voltar atrás e editar uma página já existente, ou [[Special:UserLogin|inicie sessão ou criar uma conta]].",
        "nocreate-loggedin": "Não possui permissão para criar novas páginas.",
-       "sectioneditnotsupported-title": "Edição de seções não é suportada",
+       "sectioneditnotsupported-title": "Edição de seções não suportada",
        "sectioneditnotsupported-text": "A edição de seções não é suportada nesta página de edição.",
        "permissionserrors": "Erro de permissão",
        "permissionserrorstext": "Não possui permissão para fazer isso, {{PLURAL:$1|pelo seguinte motivo|pelos seguintes motivos}}:",
        "content-failed-to-parse": "Falha ao analisar conteúdo $2 para modelo $1:$3",
        "invalid-content-data": "Dados de conteúdo inválidos",
        "content-not-allowed-here": "Conteúdo do tipo \"$1\" não é permitido na página [[$2]]",
-       "editwarning-warning": "Sair desta página fará com que você perca quaisquer alterações feitas por si.\nSe você se autenticou, pode desativar este aviso na secção \"{{int:prefs-editing}}\" das suas preferências.",
+       "editwarning-warning": "Sair desta página fará com que perca quaisquer alterações feitas por si.\nSe iniciou sessão, pode desativar este aviso na secção \"{{int:prefs-editing}}\" das suas preferências.",
        "editpage-notsupportedcontentformat-title": "Formato de conteúdo não suportado",
        "editpage-notsupportedcontentformat-text": "O formato de conteúdo $1 não é suportado pelo modelo de conteúdo $2.",
        "content-model-wikitext": "wikitexto",
        "converter-manual-rule-error": "Erro detetado na regra de conversão de língua manual",
        "undo-success": "É possível desfazer a edição.\nVerifique a comparação abaixo, para se certificar que corresponde ao que pretende fazer.\nDepois grave as alterações, para finalizar e desfazer a edição.",
        "undo-failure": "Não foi possível desfazer a edição por conflito com alterações intermédias.",
-       "undo-norev": "Não foi possível desfazer a edição porque ela não existe ou foi apagada.",
+       "undo-norev": "Não foi possível desfazer a edição porque não existe ou foi apagada.",
        "undo-nochange": "A edição parece já ter sido desfeita.",
        "undo-summary": "Desfez a edição $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussão]])",
        "undo-summary-username-hidden": "Desfez a edição $1 de um utilizador oculto",
        "currentrev": "Revisão atual",
        "currentrev-asof": "Edição atual desde as $1",
        "revisionasof": "Revisão das $1",
-       "revision-info": "Revisão das $1 por $2",
+       "revision-info": "Revisão em $1 por {{GENDER:$6|$2}}$7",
        "previousrevision": "← Revisão anterior",
        "nextrevision": "Revisão seguinte →",
        "currentrevisionlink": "Revisão atual",
        "revdelete-text-file": "Versões eliminadas do ficheiro ainda aparecerão no histórico da página, mas parte do seu conteúdo estará inacessível para o público.",
        "logdelete-text": "Os eventos eliminados ainda aparecerão no histórico da página, mas pare de seu conteúdo será inacessível ao público.",
        "revdelete-text-others": "Outros administradores em {{SITENAME}} podem aceder ao conteúdo oculto e torná-lo visível novamente através desta mesma interface, a menos que sejam definidas restrições adicionais.",
-       "revdelete-confirm": "Por favor confirme que pretende executar esta operação, que compreende as suas consequências e que o faz em concordância com as [[{{MediaWiki:Policy-url}}|políticas e recomendações]].",
+       "revdelete-confirm": "Por favor, confirme que pretende executar esta operação, que compreende as suas consequências e que o faz em concordância com as [[{{MediaWiki:Policy-url}}|políticas e recomendações]].",
        "revdelete-suppress-text": "A supressão '''só''' deverá ser usada nos seguintes casos:\n* Informação potencialmente caluniosa, difamatória ou injuriosa\n* Informação pessoal imprópria\n*: ''endereços de domicílio e números de telefone, números de identificação nacional, etc''",
        "revdelete-legend": "Definir restrições de visibilidade",
        "revdelete-hide-text": "Revisão do texto",
        "revdelete-hide-user": "Nome de utilizador/endereço de IP",
        "revdelete-hide-restricted": "Ocultar dados dos administradores e de todos os outros",
        "revdelete-radio-same": "(manter)",
-       "revdelete-radio-set": "Escondido",
+       "revdelete-radio-set": "Oculto",
        "revdelete-radio-unset": "Visível",
        "revdelete-suppress": "Ocultar dados dos administradores e de todos os outros",
        "revdelete-unsuppress": "Remover restrições das revisões restauradas",
        "revdelete-edit-reasonlist": "Editar motivos de eliminação",
        "revdelete-offender": "Autor da revisão:",
        "suppressionlog": "Registo de supressões",
-       "suppressionlogtext": "Abaixo está uma lista das eliminações e bloqueios envolvendo conteúdo ocultado para administradores.\nVeja a [[Special:BlockList|lista de bloqueios]] para uma lista de banimentos e bloqueios em efeito neste momento.",
+       "suppressionlogtext": "Abaixo está uma lista das eliminações e bloqueios envolvendo conteúdo oculto para administradores.\nVeja a [[Special:BlockList|lista de bloqueios]] para uma lista de banimentos e bloqueios em efeito neste momento.",
        "mergehistory": "Fundir histórico de páginas",
        "mergehistory-header": "Esta página permite fundir o histórico de revisões de uma página no de outra.\nCertifique-se de que esta alteração manterá a continuidade histórica da página.",
        "mergehistory-box": "Fundir edições de duas páginas:",
        "difference-missing-revision": "{{PLURAL:$2|Uma revisão|$2 revisões}} desta diferença ($1) não {{PLURAL:$2|foi encontrada|foram encontradas}}.\n\nIsto é geralmente causado por seguir uma ligação de histórico desatualizada para uma página que foi eliminada.\nOs detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminação].",
        "searchresults": "Resultados da pesquisa",
        "searchresults-title": "Resultados da pesquisa de \"$1\"",
-       "toomanymatches": "Foram devolvidos demasiados resultados; tente outro termo de pesquisa, por favor",
        "titlematches": "Resultados no título das páginas",
        "textmatches": "Resultados no conteúdo das páginas",
        "notextmatches": "Não foi possível localizar, no conteúdo das páginas, o termo pesquisado",
        "searchprofile-articles-tooltip": "Pesquisar em $1",
        "searchprofile-images-tooltip": "Pesquisar ficheiros",
        "searchprofile-everything-tooltip": "Pesquisar em todo o conteúdo (incluindo páginas de discussão)",
-       "searchprofile-advanced-tooltip": "Personalizar os espaços nominais onde pesquisar",
+       "searchprofile-advanced-tooltip": "Personalizar os domínios onde pesquisar",
        "search-result-size": "$1 ({{PLURAL:$2|1 palavra|$2 palavras}})",
        "search-result-category-size": "{{PLURAL:$1|1 membro|$1 membros}} ({{PLURAL:$2|1 subcategoria|$2 subcategorias}}, {{PLURAL:$3|1 ficheiro|$3 ficheiros}})",
        "search-result-score": "Relevancia: $1%",
        "search-redirect": "(redirecionamento de $1)",
        "search-section": "(seção $1)",
        "search-file-match": "(coincide com o conteúdo do ficheiro)",
-       "search-suggest": "Será que você quis dizer: $1",
+       "search-suggest": "Será que quis dizer: $1",
        "search-interwiki-caption": "Projetos irmãos",
        "search-interwiki-default": "Resultados de $1:",
        "search-interwiki-more": "(mais)",
        "search-relatedarticle": "Relacionado",
-       "searcheverything-enable": "Pesquisar em todos os espaços nominais",
        "searchrelated": "relacionados",
        "searchall": "todos",
        "showingresults": "{{PLURAL:$1|É apresentado '''um''' resultado|São apresentados até '''$1''' resultados}} abaixo{{PLURAL:$1||, começando pelo '''$2'''º}}.",
        "showingresultsheader": "{{PLURAL:$5|Resultado '''$1''' de '''$3'''|Resultados '''$1–$2''' de '''$3'''}} para '''$4'''",
        "search-nonefound": "A pesquisa não produziu resultados.",
        "powersearch-legend": "Pesquisa avançada",
-       "powersearch-ns": "Pesquisar nos espaços nominais:",
+       "powersearch-ns": "Pesquisar nos domínios:",
        "powersearch-togglelabel": "Marcar:",
        "powersearch-toggleall": "Todos",
        "powersearch-togglenone": "Nenhum",
+       "powersearch-remember": "Lembrar seleção para pesquisas futuras",
        "search-external": "Pesquisa externa",
        "searchdisabled": "Foi impossibilitada a realização de pesquisas na {{SITENAME}}.\nEntretanto, pode realizar pesquisas através do Google.\nNote, no entanto, que a indexação da {{SITENAME}} neste motor de busca pode estar desatualizada.",
-       "search-error": "Um erro ocorreu enquanto se efectuava a busca: $1",
+       "search-error": "Um erro ocorreu enquanto se efectuava a pesquisa: $1",
        "preferences": "Preferências",
        "mypreferences": "Preferências",
        "prefs-edits": "Número de edições:",
        "prefs-watchlist-edits-max": "Máximo: 1000",
        "prefs-watchlist-token": "Chave secreta da lista de páginas vigiadas:",
        "prefs-misc": "Diversos",
-       "prefs-resetpass": "Alterar palavra-chave",
+       "prefs-resetpass": "Alterar palavra-passe",
        "prefs-changeemail": "Alterar correio eletrónico",
        "prefs-setemail": "Definir um endereço de correio eletrónico",
        "prefs-email": "Opções do correio eletrónico",
        "timezoneuseserverdefault": "Usar padrão da wiki ($1)",
        "timezoneuseoffset": "Outro (especificar diferença)",
        "servertime": "Hora do servidor:",
-       "guesstimezone": "Preencher a partir do browser",
+       "guesstimezone": "Preencher a partir do navegador",
        "timezoneregion-africa": "África",
        "timezoneregion-america": "América",
        "timezoneregion-antarctica": "Antártida",
        "timezoneregion-pacific": "Oceano Pacífico",
        "allowemail": "Aceitar correio eletrónico de outros utilizadores",
        "prefs-searchoptions": "Pesquisa",
-       "prefs-namespaces": "Espaços nominais",
-       "defaultns": "Por omissão, pesquisar nestes espaços nominais:",
+       "prefs-namespaces": "Domínios",
        "default": "padrão",
        "prefs-files": "Ficheiros",
        "prefs-custom-css": "CSS personalizada",
        "prefs-custom-js": "JS personalizado",
        "prefs-common-css-js": "CSS/JS partilhado por todos os temas:",
        "prefs-reset-intro": "Pode usar esta página para repor as configurações padrão das preferências.\nAs suas preferências serão modificadas para os valores predefinidos do site.\nEsta operação não pode ser desfeita.",
-       "prefs-emailconfirm-label": "Confirmação do endereço:",
+       "prefs-emailconfirm-label": "Confirmação do endereço eletrónico:",
        "youremail": "Correio eletrónico:",
        "username": "Nome de {{GENDER:$1|utilizador|utilizadora}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membro}} {{PLURAL:$1|do grupo|dos grupos}}:",
        "yourrealname": "Nome verdadeiro:",
        "yourlanguage": "Língua:",
        "yourvariant": "Variante da língua de conteúdo:",
-       "prefs-help-variant": "A tua variante preferida ou ortografia para mostrar no conteúdo das páginas desta wiki.",
-       "yournick": "Assinatura:",
+       "prefs-help-variant": "A sua variante preferida ou ortografia para mostrar no conteúdo das páginas desta wiki.",
+       "yournick": "Nova assinatura:",
        "prefs-help-signature": "Ao inserir comentários em páginas de discussão, assine-os colocando quatro tiles \"<nowiki>~~~~</nowiki>\" no fim dos comentários. Ao gravar, estes serão convertidos na sua assinatura mais a data e a hora da edição.",
        "badsig": "Assinatura inválida; verifique o código HTML utilizado.",
        "badsiglength": "A sua assinatura é demasiado longa.\nNão deverá conter mais de $1 {{PLURAL:$1|carácter|caracteres}}.",
        "prefs-help-gender": "Esta preferência é opcional.\nO software usa o seu valor para o endereçar e para o mencionar a outros usando o género gramatical apropriado.\nEsta informação será pública.",
        "email": "Correio eletrónico",
        "prefs-help-realname": "O fornecimento do nome verdadeiro é opcional.\nSe optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu trabalho.",
-       "prefs-help-email": "Opcional: o endereço de correio eletrónico é opcional, mas será necessário para redefinir a palavra-chave caso esqueça a antiga.",
+       "prefs-help-email": "Opcional: o endereço de correio eletrónico é opcional, mas será necessário para redefinir a palavra-passe caso esqueça a antiga.",
        "prefs-help-email-others": "Também pode optar por permitir que outros entrem em contacto consigo por correio eletrónico, através de uma ligação nas suas páginas de utilizador ou de discussão, sem revelar o seu endereço de correio eletrónico.",
        "prefs-help-email-required": "É necessário o endereço de correio eletrónico.",
        "prefs-info": "Informações básicas",
        "prefs-advancedrendering": "Opções avançadas",
        "prefs-advancedsearchoptions": "Opções avançadas",
        "prefs-advancedwatchlist": "Opções avançadas",
-       "prefs-displayrc": "Opções de visionamento",
-       "prefs-displaywatchlist": "Opções de apresentação",
+       "prefs-displayrc": "Opções de visualização",
+       "prefs-displaywatchlist": "Opções de visualização",
        "prefs-tokenwatchlist": "Chave",
        "prefs-diffs": "Diferenças",
        "prefs-help-prefershttps": "Esta preferência terá efeito no seu próximo início de sessão.",
        "prefs-tabs-navigation-hint": "Dica: Pode usar as setas direita e esquerda do teclado para navegar entre os separadores.",
-       "email-address-validity-valid": "Parece válido",
-       "email-address-validity-invalid": "Endereço válido necessário!",
+       "email-address-validity-valid": "O endereço de correio eletrónico parece válido",
+       "email-address-validity-invalid": "É necessário um endereço de correio eletrónico válido!",
        "userrights": "Gestão de privilégios do utilizador",
        "userrights-lookup-user": "Gerir grupos de utilizadores",
        "userrights-user-editname": "Introduza um nome de utilizador:",
        "userrights-reason": "Motivo:",
        "userrights-no-interwiki": "Não tem permissões para alterar os privilégios de utilizadores noutras wikis.",
        "userrights-nodatabase": "A base de dados $1 não existe ou não é uma base de dados local.",
-       "userrights-nologin": "Precisa [[Special:UserLogin|autenticar-se]] com uma conta de administrador para atribuir privilégios aos utilizadores.",
+       "userrights-nologin": "Precisa de [[Special:UserLogin|iniciar sessão]] com uma conta de administrador para atribuir privilégios aos utilizadores.",
        "userrights-notallowed": "A sua conta não tem permissão para adicionar ou remover privilégios a utilizadores.",
        "userrights-changeable-col": "Grupos que pode alterar",
        "userrights-unchangeable-col": "Grupos que não pode alterar",
-       "userrights-conflict": "Conflito entre alterações de privilégios de utilizador! Por favor, revise e confirme as suas mudanças.",
-       "userrights-removed-self": "Você removeu com sucesso os seus privilégios. Como resultado disso, já não consegue aceder a esta página.",
+       "userrights-conflict": "Conflito entre alterações de privilégios de utilizador! Por favor, reveja e confirme as suas mudanças.",
+       "userrights-removed-self": "Removeu com sucesso os seus privilégios. Como resultado disso, já não consegue aceder a esta página.",
        "group": "Grupo:",
        "group-user": "Utilizadores",
-       "group-autoconfirmed": "Utilizadores auto-confirmados",
+       "group-autoconfirmed": "Utilizadores autoconfirmados",
        "group-bot": "Robôs",
        "group-sysop": "Administradores",
        "group-bureaucrat": "Burocratas",
        "group-bureaucrat-member": "{{GENDER:$1|burocrata}}",
        "group-suppress-member": "{{GENDER:$1|supressor|supressora}}",
        "grouppage-user": "{{ns:project}}:Utilizadores",
-       "grouppage-autoconfirmed": "{{ns:project}}:Auto-confirmados",
+       "grouppage-autoconfirmed": "{{ns:project}}:Autoconfirmados",
        "grouppage-bot": "{{ns:project}}:Robôs",
        "grouppage-sysop": "{{ns:project}}:Administradores",
        "grouppage-bureaucrat": "{{ns:project}}:Burocratas",
        "right-reupload-own": "Sobrescrever um ficheiro existente carregado pelo mesmo utilizador",
        "right-reupload-shared": "Sobrescrever localmente ficheiros no repositório partilhado de imagens",
        "right-upload_by_url": "Carregar um ficheiro de um endereço URL",
-       "right-purge": "Purgar a ''cache'' de uma página no servidor sem confirmação",
+       "right-purge": "Limpar a ''cache'' de uma página no servidor sem confirmação",
        "right-autoconfirmed": "Editar páginas semi-protegidas",
        "right-bot": "Ser tratado como um processo automatizado",
        "right-nominornewtalk": "Não despoletar o aviso de mensagens novas ao fazer edições menores a páginas de discussão",
        "right-deletedtext": "Ver texto eliminado e mudanças entre revisões eliminadas",
        "right-browsearchive": "Pesquisar páginas eliminadas",
        "right-undelete": "Restaurar uma página",
-       "right-suppressrevision": "Rever e restaurar revisões ocultadas dos administradores",
+       "right-suppressrevision": "Rever e restaurar revisões ocultas dos administradores",
        "right-suppressionlog": "Ver registos privados",
        "right-block": "Impedir outros utilizadores de editarem",
        "right-blockemail": "Impedir um utilizador de enviar correio eletrónico",
        "right-hideuser": "Bloquear um nome de utilizador, escondendo-o do público",
-       "right-ipblock-exempt": "Contornar bloqueios de IP, bloqueios automáticos e bloqueios de gamas de IPs",
+       "right-ipblock-exempt": "Contornar bloqueios de IP, bloqueios automáticos e bloqueios de gamas de IP",
        "right-proxyunbannable": "Contornar bloqueios automáticos de proxies",
        "right-unblockself": "Desbloquearem-se a si próprios",
        "right-protect": "Mudar níveis de proteção e editar páginas protegidas em cascata",
        "right-edituserjs": "Editar os ficheiros JS de outros utilizadores",
        "right-editmyusercss": "Editar os seus próprios ficheiros CSS de utilizador",
        "right-editmyuserjs": "Editar os seus próprios ficheiros JavaScript de utilizador",
-       "right-viewmywatchlist": "Ver sua própria lista de páginas vigiadas",
-       "right-editmywatchlist": "Editar sua própria lista de páginas vigiadas. Observe que algumas ações seguirão adicionando páginas, mesmo sem este direito.",
-       "right-viewmyprivateinfo": "Ver os seus próprios dados privados (ex.: endereço de e-mail, nome real)",
-       "right-editmyprivateinfo": "Editar os seus próprios dados privados (ex.: endereço de e-mail, nome real)",
+       "right-viewmywatchlist": "Ver a sua lista de vigiados",
+       "right-editmywatchlist": "Editar a sua própria lista de páginas vigiadas. Observe que algumas ações continuaram a adicionar páginas, mesmo sem este direito.",
+       "right-viewmyprivateinfo": "Ver os seus próprios dados privados (ex.: endereço de correio eletrónico, nome real)",
+       "right-editmyprivateinfo": "Editar os seus próprios dados privados (ex.: endereço de correio eletrónico, nome real)",
        "right-editmyoptions": "Editar as suas próprias preferências",
        "right-rollback": "Reverter rapidamente as edições do último utilizador que editou uma página em particular",
-       "right-markbotedits": "Marcar edições revertidas como edições de bot",
+       "right-markbotedits": "Marcar edições revertidas como edições de robô",
        "right-noratelimit": "Não ser afetado pelos limites de velocidade de operação",
        "right-import": "Importar páginas de outras wikis",
        "right-importupload": "Importar páginas de um ficheiro xml",
        "right-siteadmin": "Bloquear e desbloquear a base de dados",
        "right-override-export-depth": "Exportar páginas incluindo páginas ligadas até uma profundidade de 5",
        "right-sendemail": "Enviar correio eletrónico a outros utilizadores",
-       "right-passwordreset": "Ver mensagens de redefinição da palavra-chave",
+       "right-passwordreset": "Ver mensagens de redefinição da palavra-passe",
        "newuserlogpage": "Registo de criação de utilizadores",
        "newuserlogpagetext": "Este é um registo de novas contas de utilizador",
        "rightslog": "Registo de privilégios de utilizador",
        "action-move-categorypages": "mover categorias",
        "action-movefile": "mover este ficheiro",
        "action-upload": "enviar este ficheiro",
-       "action-reupload": "sobrepor este ficheiro existente",
+       "action-reupload": "sobrescrever este ficheiro existente",
        "action-reupload-shared": "sobrepor este ficheiro num repositório partilhado",
        "action-upload_by_url": "enviar este ficheiro através de uma URL",
        "action-writeapi": "utilizar o modo de escrita da API",
        "action-userrights": "editar os privilégios de utilizadores",
        "action-userrights-interwiki": "editar privilégios de utilizadores de outras wikis",
        "action-siteadmin": "bloquear ou desbloquear a base de dados",
-       "action-sendemail": "enviar e-mails",
-       "action-editmywatchlist": "Editar sua lista de páginas vigiadas",
-       "action-viewmywatchlist": "Ver sua lista de páginas vigiadas",
-       "action-viewmyprivateinfo": "Ver sua informação privada",
-       "action-editmyprivateinfo": "Editar sua informação privada",
+       "action-sendemail": "enviar correio eletrónico",
+       "action-editmywatchlist": "editar a sua lista de páginas vigiadas",
+       "action-viewmywatchlist": "ver a sua lista de páginas vigiadas",
+       "action-viewmyprivateinfo": "ver a sua informação privada",
+       "action-editmyprivateinfo": "editar a sua informação privada",
        "nchanges": "$1 {{PLURAL:$1|alteração|alterações}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|desde a última visita}}",
        "enhancedrc-history": "histórico",
        "recentchanges-label-unpatrolled": "Esta edição ainda não foi patrulhada",
        "recentchanges-label-plusminus": "Alteração no tamanho da página, em bytes",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "([[Special:NewPages|lista de páginas novas]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|lista de páginas novas]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "rcnotefrom": "Abaixo estão as mudanças desde <strong>$2</strong> (mostradas até <strong>$1</strong>).",
        "rclistfrom": "Mostrar as novas mudanças a partir das $3 $2",
        "rcshowhideminor": "$1 edições menores",
        "rcshowhideminor-show": "Mostrar",
-       "rcshowhideminor-hide": "Esconder",
+       "rcshowhideminor-hide": "Ocultar",
        "rcshowhidebots": "$1 robôs",
        "rcshowhidebots-show": "Mostrar",
-       "rcshowhidebots-hide": "Esconder",
+       "rcshowhidebots-hide": "Ocultar",
        "rcshowhideliu": "$1 utilizadores registados",
        "rcshowhideliu-show": "Mostrar",
-       "rcshowhideliu-hide": "Esconder",
+       "rcshowhideliu-hide": "Ocultar",
        "rcshowhideanons": "$1 utilizadores anónimos",
        "rcshowhideanons-show": "Mostrar",
-       "rcshowhideanons-hide": "Esconder",
+       "rcshowhideanons-hide": "Ocultar",
        "rcshowhidepatr": "$1 edições patrulhadas",
        "rcshowhidepatr-show": "Mostrar",
-       "rcshowhidepatr-hide": "Esconder",
+       "rcshowhidepatr-hide": "Ocultar",
        "rcshowhidemine": "$1 as minhas edições",
        "rcshowhidemine-show": "Mostrar",
-       "rcshowhidemine-hide": "Esconder",
+       "rcshowhidemine-hide": "Ocultar",
        "rclinks": "Mostrar as últimas $1 mudanças nos últimos $2 dias<br />$3",
        "diff": "dif",
        "hist": "his",
-       "hide": "Esconder",
+       "hide": "Ocultar",
        "show": "Mostrar",
        "minoreditletter": "m",
        "newpageletter": "N",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} após mudança",
        "newsectionsummary": "/* $1 */ nova seção",
        "rc-enhanced-expand": "Mostrar detalhes",
-       "rc-enhanced-hide": "Esconder detalhes",
+       "rc-enhanced-hide": "Ocultar detalhes",
        "rc-old-title": "originalmente criado como \"$1\"",
        "recentchangeslinked": "Alterações relacionadas",
        "recentchangeslinked-feed": "Alterações relacionadas",
        "recentchangeslinked-toolbox": "Alterações relacionadas",
        "recentchangeslinked-title": "Alterações relacionadas com \"$1\"",
-       "recentchangeslinked-summary": "Lista das mudanças recentes a todas as páginas para as quais a página fornecida contém ligações (ou de todas as que pertencem à categoria fornecida).\nAs suas [[Special:Watchlist|páginas vigiadas]] aparecem a '''negrito'''.",
+       "recentchangeslinked-summary": "Esta é uma lista de mudanças recentes a todas as páginas para as quais a página fornecida contém ligações (ou de todas as que pertencem à categoria fornecida).\nAs suas [[Special:Watchlist|páginas vigiadas]] aparecem a '''negrito'''.",
        "recentchangeslinked-page": "Nome da página:",
        "recentchangeslinked-to": "Inversamente, mostrar mudanças às páginas que contêm ligações para esta",
        "upload": "Carregar ficheiro",
        "uploadnologin": "Não autenticado",
        "uploadnologintext": "Tem de $1 para enviar ficheiros.",
        "upload_directory_missing": "O diretório de carregamento de ficheiros ($1) não existe e o servidor de internet não conseguiu criá-lo.",
-       "upload_directory_read_only": "O servidor de internet não possui permissão de escrita no diretório de carregamento de ficheiros ($1).",
+       "upload_directory_read_only": "O servidor de Internet não possui permissão de escrita no diretório de carregamento de ficheiros ($1).",
        "uploaderror": "Erro ao carregar",
        "upload-recreate-warning": "'''Aviso: Um ficheiro com esse nome foi eliminado ou movido.'''\n\nPara sua conveniência, é apresentado de seguida o registo de eliminação e de movimento da página:",
-       "uploadtext": "Utilize o formulário abaixo para fazer o carregamento de novos ficheiros.\nPara ver ou pesquisar ficheiros anteriormente enviados, consulte a [[Special:FileList|lista de ficheiros]].\nOs reenvios de um ficheiro são também registados no [[Special:Log/upload|registo de carregamentos]] e as eliminações no [[Special:Log/delete|registo de eliminações]].\n\nPara utilizar um ficheiro numa página, depois de ter feito o upload, insira uma ligação com um dos seguintes formatos:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ficheiro.jpg]]</nowiki></code>''' para mostrar uma imagem nas suas dimensões originais;\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ficheiro.png|200px|thumb|left|texto]]</nowiki></code>''' para mostrar uma imagem com a dimensão horizontal de 200 pixels, dentro de uma caixa, na margem esquerda, contendo 'texto' como descrição (pode usar subconjuntos destas características);\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:ficheiro.ogg]]</nowiki></code>''' para apresentar uma ligação direta para o ficheiro em vez de mostrá-lo, quer este tenha por conteúdo uma imagem ou outros dados.",
+       "uploadtext": "Utilize o formulário abaixo para fazer o carregamento de novos ficheiros.\nPara ver ou pesquisar ficheiros anteriormente enviados, consulte a [[Special:FileList|lista de ficheiros]].\nOs reenvios de um ficheiro são também registados no [[Special:Log/upload|registo de carregamentos]] e as eliminações no [[Special:Log/delete|registo de eliminações]].\n\nPara utilizar um ficheiro numa página, depois de ter feito o carregamento, insira uma ligação com um dos seguintes formatos:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ficheiro.jpg]]</nowiki></code>''' para mostrar uma imagem nas suas dimensões originais;\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ficheiro.png|200px|thumb|left|texto]]</nowiki></code>''' para mostrar uma imagem com a dimensão horizontal de 200 pixels, dentro de uma caixa, na margem esquerda, contendo 'texto' como descrição (pode usar subconjuntos destas características);\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:ficheiro.ogg]]</nowiki></code>''' para apresentar uma ligação direta para o ficheiro em vez de mostrá-lo, quer este tenha por conteúdo uma imagem ou outros dados.",
        "upload-permitted": "Tipos de ficheiro permitidos: $1.",
        "upload-preferred": "Tipos de ficheiro preferidos: $1.",
        "upload-prohibited": "Tipos de ficheiro proibidos: $1.",
        "largefileserver": "O tamanho deste ficheiro é superior ao permitido pela configuração do servidor.",
        "emptyfile": "O ficheiro que enviou parece estar vazio.\nIsto pode dever-se a um erro no nome do ficheiro.\nVerifique se é realmente este o ficheiro que deseja carregar, por favor.",
        "windows-nonascii-filename": "A wiki não aceita nomes de ficheiros com caracteres especiais.",
-       "fileexists": "Já existe um ficheiro com este nome.\nVerifique <strong>[[:$1]]</strong> caso não tenha a certeza de que quer alterar o ficheiro atual, por favor.\n[[$1|thumb]]",
+       "fileexists": "Já existe um ficheiro com este nome. Verifique <strong>[[:$1]]</strong> caso não tenha a certeza de que quer alterá-lo.\n[[$1|thumb]]",
        "filepageexists": "A página de descrição deste ficheiro já foi criada em <strong>[[:$1]]</strong>, mas neste momento não existe nenhum ficheiro com este nome.\nO resumo que introduzir não aparecerá na página de descrição.\nPara fazê-lo aparecer, terá de editar a página manualmente.\n[[$1|thumb]]",
-       "fileexists-extension": "Já existe um ficheiro de nome semelhante: [[$2|thumb]]\n* Nome do ficheiro que está sendo carregado: <strong>[[:$1]]</strong>\n* Nome do ficheiro existente: <strong>[[:$2]]</strong>\nEscolha um nome diferente, por favor.",
+       "fileexists-extension": "Já existe um ficheiro de nome semelhante: [[$2|thumb]]\n* Nome do ficheiro que está a ser carregado: <strong>[[:$1]]</strong>\n* Nome do ficheiro existente: <strong>[[:$2]]</strong>\nTalvez prefira definir um nome mais distinto?",
        "fileexists-thumbnail-yes": "O ficheiro aparenta ser uma imagem de tamanho reduzido (''miniatura'', ou ''thumbnail)''. [[$1|thumb]]\nVerifique o ficheiro <strong>[[:$1]]</strong>, por favor.\nSe este ficheiro é a mesma imagem mas no tamanho original, não é necessário carregar uma miniatura.",
        "file-thumbnail-no": "O nome do ficheiro começa por <strong>$1</strong>.\nParece ser uma imagem de tamanho reduzido (uma ''miniatura'' ou ''thumbnail)''.\nSe tiver a imagem original de maior dimensão, envie-a em vez desta. Se não, altere o nome do ficheiro, por favor.",
        "fileexists-forbidden": "Já existe um ficheiro com este nome, e não pode ser reescrito.\nSe ainda pretende carregar o seu ficheiro volte atrás e use outro nome, por favor. [[File:$1|thumb|center|$1]]",
        "savefile": "Gravar ficheiro",
        "uploadedimage": "carregou \"[[$1]]\"",
        "overwroteimage": "enviou uma nova versão de \"[[$1]]\"",
-       "uploaddisabled": "Carregamentos impossibilitados",
-       "copyuploaddisabled": "Upload por URL impossibilitado.",
-       "uploaddisabledtext": "O carregamento de ficheiros está impossibilitado.",
-       "php-uploaddisabledtext": "O carregamento de ficheiros está impossibilitado no PHP.\nVerifique a configuração file_uploads, por favor.",
-       "uploadscripted": "Este ficheiro contém HTML ou código que pode ser erradamente interpretado por um browser.",
-       "uploadscriptednamespace": "Este ficheiro SVG contém um espaço nominal que não é permitido '$1'",
+       "uploaddisabled": "Carregamentos desativados",
+       "copyuploaddisabled": "Carregamento por URL desativado.",
+       "uploaddisabledtext": "O carregamento de ficheiros está desativado.",
+       "php-uploaddisabledtext": "O carregamento de ficheiros está desativado no PHP.\nVerifique a configuração file_uploads, por favor.",
+       "uploadscripted": "Este ficheiro contém HTML ou código que pode ser erradamente interpretado por um navegador.",
+       "uploadscriptednamespace": "Este ficheiro SVG contém um domínio que não é permitido \"$1\".",
        "uploadinvalidxml": "Erro detectado na análise do XML do ficheiro carregado.",
-       "uploadvirus": "O ficheiro contém um vírus! Detalhes: $1",
-       "uploadjava": "Este é um ficheiro ZIP que contém um ficheiro .class de Java.\nNão é permitido o upload de ficheiros Java, porque estes podem contornar as restrições de segurança.",
+       "uploadvirus": "O ficheiro contém um vírus! \nDetalhes: $1",
+       "uploadjava": "Este é um ficheiro ZIP que contém um ficheiro .class de Java.\nNão é permitido o carregamento de ficheiros Java, porque estes podem contornar as restrições de segurança.",
        "upload-source": "Ficheiro de origem",
        "sourcefilename": "Nome do ficheiro de origem:",
        "sourceurl": "URL fonte:",
        "filename-bad-prefix": "O nome do ficheiro que está a enviar começa por '''\"$1\"''', um nome pouco explicativo, normalmente originado de forma automática por câmaras digitais. Escolha um nome de ficheiro mais explicativo, por favor.",
        "filename-prefix-blacklist": " #<!-- deixe esta linha exactamente como está --> <pre>\n# A sintaxe é a seguinte:\n#   * Tudo a partir do carácter \"#\" até ao fim da linha é um comentário\n#   * Todas as linhas não vazias são um prefixo para nomes de ficheiros típicos atribuídos automaticamente por câmaras digitais\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # alguns telefones móveis\nIMG # genérico\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #</pre> <!-- deixe esta linha exactamente como está -->",
        "upload-success-subj": "Envio efetuado com sucesso",
-       "upload-success-msg": "O seu upload de [$2] foi bem sucedido. Está disponível aqui: [[:{{ns:file}}:$1]]",
-       "upload-failure-subj": "Problema no upload",
-       "upload-failure-msg": "Ocorreu um problema com o seu upload de [$2]:\n\n$1",
-       "upload-warning-subj": "Aviso de upload",
-       "upload-warning-msg": "Ocorreu um problema no seu upload de [$2]. Pode voltar ao [[Special:Upload/stash/$1|formulário de upload]] para resolver o problema.",
+       "upload-success-msg": "O seu carregamento de [$2] foi bem sucedido. Está disponível aqui: [[:{{ns:file}}:$1]]",
+       "upload-failure-subj": "Problema no carregamento",
+       "upload-failure-msg": "Ocorreu um problema com o seu carregamento de [$2]:\n\n$1",
+       "upload-warning-subj": "Aviso de carregamento",
+       "upload-warning-msg": "Ocorreu um problema no seu carregamento de [$2]. Pode voltar ao [[Special:Upload/stash/$1|formulário de carregamento]] para resolver o problema.",
        "upload-proto-error": "Protocolo incorreto",
        "upload-proto-error-text": "O carregamento remoto de ficheiros requer endereços URL começados por <code>http://</code> ou <code>ftp://</code>.",
        "upload-file-error": "Erro interno",
        "upload-too-many-redirects": "A URL continha demasiados redirecionamentos",
        "upload-http-error": "Ocorreu um erro HTTP: $1",
        "upload-copy-upload-invalid-domain": "Não é possível realizar carregamentos remotos neste domínio.",
-       "backend-fail-stream": "Não foi possível transmitir o ficheiro $1.",
-       "backend-fail-backup": "Não foi possível fazer backup do ficheiro $1.",
+       "backend-fail-stream": "Não foi possível transmitir o ficheiro \"$1\".",
+       "backend-fail-backup": "Não foi possível fazer cópia de segurança do ficheiro \"$1\".",
        "backend-fail-notexists": "O ficheiro $1 não existe.",
        "backend-fail-hashes": "Não foi possível obter os hashes do ficheiro para comparação.",
-       "backend-fail-notsame": "Já existe um ficheiro não idêntico em $1 .",
-       "backend-fail-invalidpath": "$1 não é um caminho de armazenamento válido.",
-       "backend-fail-delete": "Não foi possível excluir o ficheiro $1.",
+       "backend-fail-notsame": "Já existe um ficheiro não idêntico em \"$1\" .",
+       "backend-fail-invalidpath": "\"$1\" não é um caminho de armazenamento válido.",
+       "backend-fail-delete": "Não foi possível eliminar o ficheiro \"$1\".",
        "backend-fail-describe": "Não foi possível mudar metadados para o ficheiro \"$1\".",
-       "backend-fail-alreadyexists": "O ficheiro $1 já existe.",
-       "backend-fail-store": "Não foi possível armazenar o ficheiro $1 em $2.",
-       "backend-fail-copy": "Não foi possível copiar o ficheiro $1 para $2.",
-       "backend-fail-move": "Não é possível mover o ficheiro $1 para $2.",
+       "backend-fail-alreadyexists": "O ficheiro \"$1\" já existe.",
+       "backend-fail-store": "Não foi possível armazenar o ficheiro \"$1\" em \"$2\".",
+       "backend-fail-copy": "Não foi possível copiar o ficheiro \"$1\" para \"$2\".",
+       "backend-fail-move": "Não é possível mover o ficheiro \"$1\" para \"$2\".",
        "backend-fail-opentemp": "Não foi possível abrir o ficheiro temporário.",
        "backend-fail-writetemp": "Não foi possível escrever no ficheiro temporário.",
        "backend-fail-closetemp": "Não foi possível fechar o ficheiro temporário.",
-       "backend-fail-read": "Não foi possível ler o ficheiro $1.",
-       "backend-fail-create": "Não foi possível gravar o ficheiro $1.",
-       "backend-fail-maxsize": "Não foi possível gravar o ficheiro $1 porque tem mais do que {{PLURAL:$2|um byte|$2 bytes}}.",
+       "backend-fail-read": "Não foi possível ler o ficheiro \"$1\".",
+       "backend-fail-create": "Não foi possível gravar o ficheiro \"$1\".",
+       "backend-fail-maxsize": "Não foi possível gravar o ficheiro \"$1\" porque tem mais do que {{PLURAL:$2|um byte|$2 bytes}}.",
        "backend-fail-readonly": "O servidor de armazenamento \"$1\" está atualmente no modo \"somente leitura\". A razão dada foi: \"$2\"",
        "backend-fail-synced": "O ficheiro \"$1\" está num estado inconsistente nos servidores de armazenamento interno",
        "backend-fail-connect": "Não foi possível estabelecer ligação com o servidor de armazenamento \"$1\".",
        "img-auth-nopathinfo": "PATH_INFO em falta.\nO seu servidor não está configurado para passar esta informação.\nPode ser baseado em CGI e não consegue suportar img_auth.\nConsulte a documentação em https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "O endereço especificado não conduz ao diretório de carregamento de ficheiros configurado.",
        "img-auth-badtitle": "Não é possível construir um título válido a partir de \"$1\".",
-       "img-auth-nologinnWL": "Não está autenticado e o ficheiro \"$1\" não está na lista branca.",
+       "img-auth-nologinnWL": "Não tem a sessão iniciada e o ficheiro \"$1\" não está na lista branca.",
        "img-auth-nofile": "O ficheiro \"$1\" não existe.",
        "img-auth-isdir": "Está tentando aceder ao diretório \"$1\".\nSó é permitido o acesso a ficheiros.",
-       "img-auth-streaming": "A fazer o ''streaming'' de \"$1\".",
+       "img-auth-streaming": "A fazer a transmissão de \"$1\".",
        "img-auth-public": "A função do img_auth.php é produzir ficheiros a partir de uma wiki privada.\nEsta wiki está configurada como uma wiki pública.\nPara optimizar a segurança, o img_auth.php está impossibilitado de executar.",
        "img-auth-noread": "O utilizador não tem acesso de leitura ao ficheiro \"$1\".",
        "http-invalid-url": "URL inválida: $1",
-       "http-invalid-scheme": "URLs iniciadas pelo prefixo \"$1\" não são aceites.",
+       "http-invalid-scheme": "URL iniciadas pelo prefixo \"$1\" não são aceites.",
        "http-request-error": "O pedido HTTP falhou devido a um erro desconhecido.",
        "http-read-error": "Erro de leitura HTTP.",
        "http-timed-out": "O pedido HTTP expirou.",
        "http-curl-error": "Ocorreu um erro ao aceder à URL: $1",
        "http-bad-status": "Ocorreu um problema durante o pedido HTTP: $1 $2",
        "upload-curl-error6": "Não foi possível aceder à URL",
-       "upload-curl-error6-text": "Não foi possível aceder à URL.\nVerifique se o endereço está correto e o site disponível, por favor.",
+       "upload-curl-error6-text": "Não foi possível aceder à URL.\nVerifique se o endereço está correto e o sítio disponível, por favor.",
        "upload-curl-error28": "Tempo limite para o envio do ficheiro excedido",
-       "upload-curl-error28-text": "O site demorou muito tempo a responder. Verifique que o site está disponível, aguarde alguns momentos e tente novamente, por favor. Talvez queira tentar num horário menos congestionado.",
+       "upload-curl-error28-text": "O sítio demorou muito tempo a responder. Verifique que o sítio está disponível, aguarde alguns momentos e tente novamente, por favor. Talvez queira tentar num horário menos congestionado.",
        "license": "Licença:",
        "license-header": "Licenciamento",
        "nolicense": "Nenhuma selecionada",
        "filehist-current": "atual",
        "filehist-datetime": "Data/Hora",
        "filehist-thumb": "Miniatura",
-       "filehist-thumbtext": "Miniatura ''(thumbnail)'' da versão das $1",
+       "filehist-thumbtext": "Miniatura da versão das $1",
        "filehist-nothumb": "Miniatura indisponível",
        "filehist-user": "Utilizador",
        "filehist-dimensions": "Dimensões",
        "uploadnewversion-linktext": "Carregar uma nova versão deste ficheiro",
        "shared-repo-from": "de $1",
        "shared-repo": "um repositório partilhado",
-       "upload-disallowed-here": "Você não pode substituir este ficheiro.",
+       "upload-disallowed-here": "Não pode substituir este ficheiro.",
        "filerevert": "Reverter $1",
        "filerevert-legend": "Reverter ficheiro",
        "filerevert-intro": "Está prestes a reverter o ficheiro '''[[Media:$1|$1]]''' para a [$4 versão de $2 às $3].",
        "mimesearch": "Pesquisa MIME",
        "mimesearch-summary": "Esta página permite pesquisar os ficheiros da wiki, filtrando-os a partir do seu tipo MIME. O tipo MIME deve ser especificado na forma: tipo/subtipo. Alguns exemplos de tipos frequentes: <code>image/jpeg</code>, <code>image/gif</code>, <code>image/png</code>, <code>application/pdf</code>, <code>application/vnd.ms-excel</code>, <code>application/zip</code>, <code>application/vnd.ms-powerpoint</code>.",
        "mimetype": "Tipo MIME:",
-       "download": "download",
+       "download": "descarregar",
        "unwatchedpages": "Páginas não vigiadas",
        "listredirects": "Lista de redirecionamentos",
        "listduplicatedfiles": "Lista de ficheiros com duplicatas",
        "listduplicatedfiles-summary": "Esta é uma lista de ficheiros cuja suas versões mais recentes são duplicatas da versão mais recente de outros ficheiros. Somente os ficheiros locais são considerados.",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] possui [[$3|{{PLURAL:$2|uma duplicata|$2 duplicatas}}]].",
        "unusedtemplates": "Predefinições não utilizadas",
-       "unusedtemplatestext": "Esta página lista todas as páginas no espaço nominal {{ns:template}} que não são incluídas em nenhuma outra página. Lembre-se de verificar a existência de outras ligações para as predefinições, antes de eliminá-las.",
+       "unusedtemplatestext": "Esta página lista todas as páginas no domínio {{ns:template}} que não são incluídas em nenhuma outra página. Lembre-se de verificar a existência de outras ligações para as predefinições, antes de eliminá-las.",
        "unusedtemplateswlh": "outras ligações",
        "randompage": "Página aleatória",
-       "randompage-nopages": "Não há páginas {{PLURAL:$2|no seguinte espaço nominal|nos seguintes espaços nominais}}: $1.",
+       "randompage-nopages": "Não há páginas {{PLURAL:$2|no seguinte domínio|nos seguintes domínios}}: $1.",
        "randomincategory": "Página aleatória na categoria",
        "randomincategory-invalidcategory": "\"$1\" não é um nome de categoria válido",
        "randomincategory-nopages": "Não há páginas na categoria [[:Category:$1|$1]].",
        "randomincategory-selectcategory": "Obter página aleatória da categoria: $1 $2",
        "randomincategory-selectcategory-submit": "Ir",
        "randomredirect": "Redirecionamento aleatório",
-       "randomredirect-nopages": "Não há redirecionamentos no espaço nominal \"$1\".",
+       "randomredirect-nopages": "Não há redirecionamentos no domínio \"$1\".",
        "statistics": "Estatísticas",
        "statistics-header-pages": "Estatísticas de páginas",
        "statistics-header-edits": "Estatísticas de edições",
        "fewestrevisions": "Páginas com menos revisões",
        "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
        "ncategories": "$1 {{PLURAL:$1|categoria|categorias}}",
-       "ninterwikis": "$1 {{PLURAL:$1|interwiki|interwikis}}",
+       "ninterwikis": "$1 {{PLURAL:$1|interlíngua|interlínguas}}",
        "nlinks": "$1 {{PLURAL:$1|ligação|ligações}}",
        "nmembers": "$1 {{PLURAL:$1|membro|membros}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|membro|membros}}",
        "wantedtemplates": "Predefinições desejadas",
        "mostlinked": "Páginas com mais afluentes",
        "mostlinkedcategories": "Categorias com mais membros",
-       "mostlinkedtemplates": "Predefinições com mais afluentes",
+       "mostlinkedtemplates": "Páginas com mais afluentes",
        "mostcategories": "Páginas com mais categorias",
        "mostimages": "Ficheiros com mais afluentes",
-       "mostinterwikis": "Páginas com mais interwikis",
+       "mostinterwikis": "Páginas com mais interlínguas",
        "mostrevisions": "Páginas com mais revisões",
        "prefixindex": "Todas as páginas iniciadas por",
-       "prefixindex-namespace": "Todas as páginas com prefixo (espaço nominal $1)",
+       "prefixindex-namespace": "Todas as páginas com prefixo (domínio $1)",
        "prefixindex-strip": "Remover prefixo",
        "shortpages": "Páginas curtas",
        "longpages": "Páginas longas",
        "protectedpages-indef": "Apenas proteções indefinidas",
        "protectedpages-summary": "Esta página lista páginas existentes que estão protegidas. Para ver os títulos cuja criação está impossibilitada, consulte [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Apenas proteções em cascata",
-       "protectedpages-noredirect": "Esconder redirecionamentos",
+       "protectedpages-noredirect": "Ocultar redirecionamentos",
        "protectedpagesempty": "Neste momento, nenhuma das páginas está protegida com estes parâmetros.",
        "protectedpages-timestamp": "Data e hora",
        "protectedpages-page": "Página",
        "usereditcount": "$1 {{PLURAL:$1|edição|edições}}",
        "usercreated": "{{GENDER:$3|Criado|Criada}} em $1 às $2",
        "newpages": "Páginas recentes",
-       "newpages-username": "Nome de utilizador:",
+       "newpages-username": "Nome de utilizador(a):",
        "ancientpages": "Páginas mais antigas",
        "move": "Mover",
        "movethispage": "Mover esta página",
        "querypage-disabled": "Esta página especial está desativada para não prejudicar o desempenho.",
        "booksources": "Fontes bibliográficas",
        "booksources-search-legend": "Pesquisar referências bibliográficas",
-       "booksources-go": "Prosseguir",
+       "booksources-go": "Ir",
        "booksources-text": "É apresentada abaixo uma lista de ligações para outros sítios na Internet que vendem livros novos e usados e talvez possuam informações adicionais sobre os livros que procura:",
        "booksources-invalid-isbn": "O número ISBN fornecido não parece ser válido; verifique a existência de erros ao copiar da fonte original.",
        "specialloguserlabel": "Executante:",
        "allpagesfrom": "Apresentar páginas desde:",
        "allpagesto": "Apresentar páginas até:",
        "allarticles": "Todas as páginas",
-       "allinnamespace": "Todas as páginas (espaço nominal $1)",
+       "allinnamespace": "Todas as páginas (domínio $1)",
        "allpagessubmit": "Ver",
        "allpagesprefix": "Apresentar páginas iniciadas por:",
        "allpagesbadtitle": "O título de página fornecido era inválido ou tinha um prefixo interlínguas ou interwikis.\nTalvez contenha um ou mais caracteres que não podem ser usados nos títulos.",
-       "allpages-bad-ns": "A {{SITENAME}} não possui o espaço nominal \"$1\".",
+       "allpages-bad-ns": "{{SITENAME}} não possui o domínio \"$1\".",
        "allpages-hide-redirects": "Ocultar redirecionamentos",
        "cachedspecial-viewing-cached-ttl": "Está a ver uma versão desta página guardada na cache há pelo menos $1.",
        "cachedspecial-viewing-cached-ts": "Está a ver uma versão da página guardada na cache, que pode estar desatualizada.",
        "cachedspecial-refresh-now": "Ver mais recente.",
        "categories": "Categorias",
        "categoriespagetext": "{{PLURAL:$1|A seguinte categoria contém páginas ou ficheiros multimédia|As seguintes categorias contêm páginas ou ficheiros multimédia}}.\nAs [[Special:UnusedCategories|categorias não utilizadas]] não são apresentadas nesta lista.\nVeja também as [[Special:WantedCategories|categorias desejadas]].",
-       "categoriesfrom": "Listar categorias começando por:",
+       "categoriesfrom": "Mostrar categorias que comecem por:",
        "special-categories-sort-count": "ordenar por contagem",
        "special-categories-sort-abc": "ordenar alfabeticamente",
        "deletedcontributions": "Edições eliminadas",
        "deletedcontributions-title": "Edições eliminadas",
        "sp-deletedcontributions-contribs": "contribuições",
        "linksearch": "Pesquisa de ligações externas",
-       "linksearch-pat": "Padrão de busca:",
-       "linksearch-ns": "Espaço nominal:",
-       "linksearch-ok": "Prosseguir",
+       "linksearch-pat": "Padrão de pesquisa:",
+       "linksearch-ns": "Domínio:",
+       "linksearch-ok": "Pesquisar",
        "linksearch-text": "É possível usar caracteres de substituição ''(wildcards)'', tais como \"*.wikipedia.org\".\nÉ necessário, pelo menos, um domínio de topo, por exemplo \"*.org\".<br />\n{{PLURAL:$2|Protocolo suportado|Protocolos suportados}}: <code>$1</code> (será utilizado http:// se não for especificado um protocolo).",
        "linksearch-line": "Ligação para $1 na página $2",
        "linksearch-error": "Caracteres de substituição ''(wildcards)'' só podem ser usados no início do endereço.",
-       "listusersfrom": "Mostrar utilizadores começando por:",
+       "listusersfrom": "Mostrar utilizadores começados por:",
        "listusers-submit": "Mostrar",
        "listusers-noresult": "Não foram encontrados utilizadores.",
        "listusers-blocked": "(bloqueado)",
        "activeusers": "Lista de utilizadores ativos",
        "activeusers-intro": "Esta é uma lista dos utilizadores com qualquer tipo de atividade {{PLURAL:$1|no último dia|nos últimos $1 dias}}.",
        "activeusers-count": "$1 {{PLURAL:$1|ação|ações}} {{PLURAL:$3|no último dia|nos últimos $3 dias}}",
-       "activeusers-from": "Mostrar utilizadores começando por:",
-       "activeusers-hidebots": "Esconder robôs",
-       "activeusers-hidesysops": "Esconder administradores",
+       "activeusers-from": "Mostrar utilizadores começados por:",
+       "activeusers-hidebots": "Ocultar robôs",
+       "activeusers-hidesysops": "Ocultar administradores",
        "activeusers-noresult": "Nenhum utilizador encontrado.",
        "listgrouprights": "Privilégios dos grupos de utilizadores",
        "listgrouprights-summary": "A seguinte lista contém os grupos de utilizadores definidos nesta wiki, com os respectivos privilégios de acesso.\nEncontram-se disponíveis [[{{MediaWiki:Listgrouprights-helppage}}|informações adicionais]] sobre privilégios individuais.",
        "listgrouprights-removegroup-self": "Remover a própria conta {{PLURAL:$2|do grupo|dos grupos}}: $1",
        "listgrouprights-addgroup-self-all": "Adicionar a própria conta a todos os grupos",
        "listgrouprights-removegroup-self-all": "Remover a própria conta de todos os grupos",
-       "listgrouprights-namespaceprotection-header": "Restrições do campo nominal",
-       "listgrouprights-namespaceprotection-namespace": "Campo nominal",
+       "listgrouprights-namespaceprotection-header": "Restrições do domínio",
+       "listgrouprights-namespaceprotection-namespace": "Domínio",
        "listgrouprights-namespaceprotection-restrictedto": "Direito(s) do utilizador para editar",
        "trackingcategories": "Monitoramento de categorias",
-       "trackingcategories-summary": "Esta página lista as categorias monitoradas que foram geradas automaticamente pelo software MediaWiki. Seus nomes podem ser alterados ao editar sua mensagem correspondente no domínio {{ns:8}}.",
+       "trackingcategories-summary": "Esta página lista as categorias monitoradas que foram geradas automaticamente pelo software MediaWiki. Os seus nomes podem ser alterados ao editar sua mensagem correspondente no domínio {{ns:8}}.",
        "trackingcategories-msg": "Categoria monitorada",
        "trackingcategories-name": "Nome da mensagem",
        "trackingcategories-desc": "Critérios de inclusão",
        "noindex-category-desc": "A página não é indexada por robôs porque contém a palavra mágica <code><nowiki>__NOINDEX__</nowiki></code> e está num domínio onde o estatuto é permitido.",
+       "index-category-desc": "A página contém a palavra mágica <code><nowiki>__INDEX__</nowiki></code> (e está num domínio em que essa marca é permitida) e, portanto, será indexada pelos robôs mesmo quando normalmente não o seria.",
+       "post-expand-template-inclusion-category-desc": "A expansão de todas as predefinições faria com que o tamanho da página ultrapassasse <code>$wgMaxArticleSize</code>, pelo que algumas predefinições não foram expandidas.",
+       "post-expand-template-argument-category-desc": "A expansão de um argumento de prefefinição (algo em chavetas triplas, como <code>{{{Foo}}}</code> ) torna a página maior do que <code>$wgMaxArticleSize</code>.",
+       "expensive-parserfunction-category-desc": "Demasiadas funções do analisador custosas (como <code>#ifexist</code>) incluídas numa página. Consulte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Categoria adicionada se a página contém um link quebrado para um ficheiro (um link para incorporar um ficheiro que não existe).",
+       "hidden-category-category-desc": "Esta é uma categoria com a marca <code><nowiki>__HIDDENCAT__</nowiki></code>, que faz com que ela não apareça na caixa de links de categoria nas páginas, por omissão.",
        "trackingcategories-nodesc": "Nenhuma descrição disponível.",
        "trackingcategories-disabled": "A categoria está desactivada.",
        "mailnologin": "Não existe endereço de envio",
        "emailccsubject": "Cópia da sua mensagem para $1: $2",
        "emailsent": "Mensagem enviada",
        "emailsenttext": "A sua mensagem foi enviada.",
-       "emailuserfooter": "Esta mensagem foi enviada por $1 para $2 usando a opção \"Contactar este utilizador\" da {{SITENAME}}.",
+       "emailuserfooter": "Esta mensagem foi enviada por $1 para $2 através da opção \"Contactar este utilizador\" em {{SITENAME}}.",
        "usermessage-summary": "Deixar mensagem de sistema.",
        "usermessage-editor": "Editor de mensagens de sistema",
        "watchlist": "Páginas vigiadas",
        "wlshowlast": "Ver últimas $1 horas $2 dias $3",
        "watchlist-options": "Opções da lista de páginas vigiadas",
        "watching": "A vigiar...",
-       "unwatching": "Deixando de vigiar...",
+       "unwatching": "A deixar de vigiar...",
        "watcherrortext": "Ocorreu um erro ao alterar a configuração da sua lista de páginas vigiadas para \"$1\".",
        "enotif_reset": "Marcar todas as páginas como visitadas",
-       "enotif_impersonal_salutation": "Utilizador da \"{{SITENAME}}\"",
+       "enotif_impersonal_salutation": "Utilizador de {{SITENAME}}",
        "enotif_subject_deleted": "A página  $1 de {{SITENAME}} foi {{GENDER:$2|eliminada}} por $2",
        "enotif_subject_created": "A página $1 de {{SITENAME}} foi {{GENDER:$2|criada}} por $2",
        "enotif_subject_moved": "A página $1 de {{SITENAME}} foi {{GENDER:$2|movida}} por $2",
        "delete-warning-toobig": "Esta página tem um histórico de edições longo, com mais de $1 {{PLURAL:$1|edição|edições}}.\nEliminá-la poderá causar problemas na base de dados da {{SITENAME}};\nprossiga com precaução.",
        "deleting-backlinks-warning": "'''Aviso:''' Há [[Special:WhatLinksHere/{{FULLPAGENAME}}|páginas]] que contêm ligações para a página que está prestes a eliminar ou que a transcluem.",
        "rollback": "Reverter edições",
-       "rollback_short": "Voltar",
-       "rollbacklink": "voltar",
-       "rollbacklinkcount": "reverter $1 {{PLURAL:$1|edição|edições}}",
-       "rollbacklinkcount-morethan": "reverter mais do que $1 {{PLURAL:$1|edição|edições}}",
+       "rollback_short": "Desfazer",
+       "rollbacklink": "desfazer",
+       "rollbacklinkcount": "desfazer $1 {{PLURAL:$1|edição|edições}}",
+       "rollbacklinkcount-morethan": "desfazer mais do que $1 {{PLURAL:$1|edição|edições}}",
        "rollbackfailed": "A reversão falhou",
        "cantrollback": "Não foi possível reverter a edição; o último contribuidor é o único autor desta página",
        "alreadyrolled": "Não foi possível reverter as edições de [[:$1]] por [[User:$2|$2]] ([[User talk:$2|discussão]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nalguém editou ou já reverteu a página.\n\nA última edição foi de [[User:$3|$3]] ([[User talk:$3|discussão]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "revertpage-nouser": "Foram revertidas as edições de um utilizador oculto para a última revisão de {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Foram revertidas as edições de $1, com o conteúdo passando a estar como na última edição de $2.",
        "sessionfailure-title": "Erro de sessão",
-       "sessionfailure": "Foram detectados problemas com a sua sessão;\na operação foi cancelada como medida de proteção contra a interceptação de sessões.\nVolte à página anterior, refresque-a e tente novamente.",
+       "sessionfailure": "Foram detectados problemas com a sua sessão;\na operação foi cancelada como medida de proteção contra a interceptação de sessões.\nVolte à página anterior, recarregue-a e tente novamente.",
        "protectlogpage": "Registo de proteção",
        "protectlogtext": "Encontra abaixo o registo de proteção e desproteção de páginas.\nConsulte a [[Special:ProtectedPages|lista de páginas protegidas]] para ver as páginas que se encontram protegidas neste momento.",
        "protectedarticle": "protegeu \"[[$1]]\"",
        "protect-title": "Alterar o nível de proteção de \"$1\"",
        "protect-title-notallowed": "Ver o nível de proteção de \"$1\"",
        "prot_1movedto2": "moveu [[$1]] para [[$2]]",
-       "protect-badnamespace-title": "Espaço nominal não passível de proteção",
-       "protect-badnamespace-text": "Páginas neste espaço nominal não podem ser protegidas.",
+       "protect-badnamespace-title": "Domínio não passível de proteção",
+       "protect-badnamespace-text": "Páginas neste domínio não podem ser protegidas.",
        "protect-norestrictiontypes-text": "Esta página não pode ser protegida porque não há nenhum tipo de restrição disponível.",
        "protect-norestrictiontypes-title": "Página não passível de proteção",
        "protect-legend": "Confirmar proteção",
        "protectcomment": "Motivo:",
-       "protectexpiry": "Expiração:",
+       "protectexpiry": "Expira a:",
        "protect_expiry_invalid": "O tempo de expiração fornecido é inválido.",
        "protect_expiry_old": "O tempo de expiração fornecido situa-se no passado.",
        "protect-unchain-permissions": "Desbloquear outras opções de proteção",
        "protect-cascadeon": "Esta página está atualmente protegida porque está incluída {{PLURAL:$1|na página listada a seguir, a qual|nas páginas listadas a seguir, as quais}} têm a proteção em cascata ativada.\nAlterações feitas ao nível de proteção desta página não afetarão a proteção em cascata.",
        "protect-default": "Permitir todos os utilizadores",
        "protect-fallback": "Permitir apenas utilizadores com o privilégio de \"$1\"",
-       "protect-level-autoconfirmed": "Permitir apenas utilizadores auto-confirmados",
+       "protect-level-autoconfirmed": "Permitir apenas utilizadores autoconfirmados",
        "protect-level-sysop": "Permitir apenas administradores",
        "protect-summary-cascade": "em cascata",
        "protect-expiring": "expira a $1 (UTC)",
        "undelete-error-long": "Foram encontrados erros ao tentar restaurar o ficheiro:\n\n$1",
        "undelete-show-file-confirm": "Tem a certeza de que quer ver a revisão eliminada do ficheiro \"<nowiki>$1</nowiki>\" de $2 às $3?",
        "undelete-show-file-submit": "Sim",
-       "namespace": "Espaço nominal:",
+       "namespace": "Domínio:",
        "invert": "Inverter seleção",
-       "tooltip-invert": "Marque esta caixa para esconder as alterações a páginas no espaço nominal selecionado (e no espaço nominal associado, se escolheu fazê-lo)",
-       "namespace_association": "Espaço nominal associado",
-       "tooltip-namespace_association": "Marque esta caixa para incluir também o espaço nominal de conteúdo ou de discussão associado à sua seleção",
+       "tooltip-invert": "Marque esta caixa para esconder as alterações a páginas no domínio selecionado (e no domínio associado, se escolheu fazê-lo)",
+       "namespace_association": "Domínio associado",
+       "tooltip-namespace_association": "Marque esta caixa para incluir também o domínio de conteúdo ou de discussão associado à sua seleção",
        "blanknamespace": "(Principal)",
        "contributions": "Contribuições {{GENDER:$1|do utilizador|da utilizadora}}",
        "contributions-title": "Contribuições {{GENDER:$1|do utilizador|da utilizadora}} $1",
        "mycontris": "Contribuições",
        "contribsub2": "Para {{GENDER:$3|$1}} ($2)",
-       "contributions-userdoesnotexist": "A conta de utilizador \"$1\" não está registrada.",
+       "contributions-userdoesnotexist": "A conta de utilizador \"$1\" não está registada.",
        "nocontribs": "Não foram encontradas alterações com este critério.",
        "uctop": "(atual)",
        "month": "Até o mês:",
        "sp-contributions-blocked-notice": "Este utilizador está bloqueado neste momento.\nPara referência é apresentado abaixo o último registo de bloqueio:",
        "sp-contributions-blocked-notice-anon": "Este endereço IP está bloqueado neste momento.\nPara referência é apresentado abaixo o último registo de bloqueio:",
        "sp-contributions-search": "Pesquisar contribuições",
-       "sp-contributions-username": "Endereço IP ou utilizador:",
+       "sp-contributions-username": "Endereço de IP ou utilizador(a):",
        "sp-contributions-toponly": "Mostrar somente as revisões mais recentes",
        "sp-contributions-newonly": "Mostrar só edições que são criações de páginas",
        "sp-contributions-submit": "Pesquisar",
        "whatlinkshere-page": "Página:",
        "linkshere": "As seguintes páginas têm ligação a '''[[:$1]]''':",
        "nolinkshere": "Não existem afluentes para '''[[:$1]]''' com as condições especificadas.",
-       "nolinkshere-ns": "Não existem ligações para '''[[:$1]]''' no espaço nominal selecionado.",
+       "nolinkshere-ns": "Não existem ligações para <strong>[[:$1]]</strong> no domínio selecionado.",
        "isredirect": "página de redirecionamento",
        "istemplate": "inclusão",
        "isimage": "ligação para ficheiro",
        "blockip": "Bloquear utilizador",
        "blockip-legend": "Bloquear utilizador",
        "blockiptext": "Utilize o formulário abaixo para bloquear o acesso de escrita a um endereço IP específico ou a um nome de utilizador.\nIsto só deve ser feito para prevenir vandalismo e de acordo com a [[{{MediaWiki:Policy-url}}|política]]. Indique a seguir um motivo de bloqueio específico (por exemplo, indicando as páginas que foram alvo de vandalismo).",
-       "ipaddressorusername": "Endereço IP ou nome de utilizador:",
-       "ipbexpiry": "Expiração:",
+       "ipaddressorusername": "Endereço de IP ou utilizador(a):",
+       "ipbexpiry": "Validade:",
        "ipbreason": "Motivo:",
        "ipbreason-dropdown": "*Razões comuns para um bloqueio\n** Inserção de informações falsas\n** Remoção de conteúdos de páginas\n** Inserção de \"spam\" para sítios externos\n** Inserção de conteúdo sem sentido/incompreensível nas páginas\n** Comportamento intimidador/inoportuno\n** Uso abusivo de contas múltiplas\n** Nome de utilizador inaceitável",
        "ipb-hardblock": "Impedir que utilizadores autenticados editem a partir deste endereço IP",
        "blocklist": "Utilizadores bloqueados",
        "ipblocklist": "Utilizadores bloqueados",
        "ipblocklist-legend": "Procurar um utilizador bloqueado",
-       "blocklist-userblocks": "Esconder bloqueios de contas",
-       "blocklist-tempblocks": "Esconder bloqueios temporários",
-       "blocklist-addressblocks": "Esconder bloqueios de IP único",
+       "blocklist-userblocks": "Ocultar bloqueios de contas",
+       "blocklist-tempblocks": "Ocultar bloqueios temporários",
+       "blocklist-addressblocks": "Ocultar bloqueios de IP único",
        "blocklist-rangeblocks": "Ocultar bloqueios de faixas",
        "blocklist-timestamp": "Data e hora",
        "blocklist-target": "Destinatário",
        "anononlyblock": "apenas anón.",
        "noautoblockblock": "bloqueio automático desativado",
        "createaccountblock": "criação de conta bloqueada",
-       "emailblock": "correio electrónico desactivado",
+       "emailblock": "correio electrónico desativado",
        "blocklist-nousertalk": "impedido de editar a própria página de discussão",
        "ipblocklist-empty": "A lista de bloqueios encontra-se vazia.",
        "ipblocklist-no-results": "O endereço IP ou nome de utilizador procurado não se encontra bloqueado.",
        "block-log-flags-nousertalk": "impossibilitado de editar a própria página de discussão",
        "block-log-flags-angry-autoblock": "ativado o bloqueio automático melhorado",
        "block-log-flags-hiddenname": "nome de utilizador oculto",
-       "range_block_disabled": "A funcionalidade de administrador para o bloqueio de gamas de IPs está desativada.",
-       "ipb_expiry_invalid": "Tempo de expiração inválido.",
-       "ipb_expiry_temp": "Bloqueios com nome de utilizador ocultado devem ser permanentes.",
+       "range_block_disabled": "A funcionalidade de administrador para o bloqueio de gamas de IP está desativada.",
+       "ipb_expiry_invalid": "Tempo de validade inválido.",
+       "ipb_expiry_temp": "Bloqueios com nome de utilizador oculto devem ser permanentes.",
        "ipb_hide_invalid": "Não foi possível suprimir esta conta; ela possui mais de {{PLURAL:$1|uma edição|$1 edições}}.",
        "ipb_already_blocked": "\"$1\" já se encontra bloqueado",
        "ipb-needreblock": "$1 já se encontra bloqueado. Deseja alterar as configurações?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Outro bloqueio|Outros bloqueios}}",
-       "unblock-hideuser": "Não pode desbloquear o utilizador, porque o nome deste utilizador foi ocultado.",
+       "unblock-hideuser": "Não pode desbloquear o utilizador, porque o nome deste utilizador foi oculto.",
        "ipb_cant_unblock": "Erro: O bloqueio com ID $1 não foi encontrado. Pode já ter sido desbloqueado.",
        "ipb_blocked_as_range": "Erro: O IP $1 não se encontra bloqueado de forma direta e não pode ser desbloqueado deste modo. No entanto, está bloqueado como parte da gama $2, a qual pode ser desbloqueada.",
-       "ip_range_invalid": "Gama de IPs inválida.",
-       "ip_range_toolarge": "Não são permitidas gamas de IPs maiores do que /$1.",
+       "ip_range_invalid": "Gama de IP inválida.",
+       "ip_range_toolarge": "Não são permitidas gamas de IP maiores do que /$1.",
        "proxyblocker": "Bloqueador de proxies",
        "proxyblockreason": "O seu endereço IP foi bloqueado por ser um ''proxy'' público.\nContacte o seu fornecedor de internet ou o serviço de apoio técnico e informe-os deste grave problema de segurança, por favor.",
        "sorbsreason": "O seu endereço IP encontra-se listado como ''proxy'' aberto na DNSBL utilizada pela {{SITENAME}}.",
        "sorbs_create_account_reason": "O seu endereço IP encontra-se listado como ''proxy'' aberto na DNSBL utilizada pela {{SITENAME}}. Não pode criar uma conta",
        "xffblockreason": "Um endereço IP presente no cabeçalho X-Forwarded-For, seja seu ou de um servidor de proxy que estiver a usar, foi bloqueado. A razão do bloqueio original foi: $1",
-       "cant-see-hidden-user": "O utilizador que está tentando bloquear já está bloqueado e oculto.\nComo não tem o privilégio para ocultar utilizadores ''(hideuser)'', não pode ver ou editar o bloqueio deste utilizador.",
+       "cant-see-hidden-user": "O utilizador que está a tentar bloquear já está bloqueado e oculto.\nComo não tem o privilégio para ocultar utilizadores ''(hideuser)'', não pode ver ou editar o bloqueio deste utilizador.",
        "ipbblocked": "Não pode bloquear ou desbloquear outros, porque está bloqueado",
        "ipbnounblockself": "Não lhe é permitido desbloquear-se a si mesmo",
        "lockdb": "Bloquear a base de dados",
        "unlockdbsuccesstext": "A base de dados foi desbloqueada.",
        "lockfilenotwritable": "O ficheiro de bloqueio da base de dados não pode ser escrito.\nPara bloquear ou desbloquear a base de dados, este precisa de poder ser escrito pelo servidor de internet.",
        "databasenotlocked": "A base de dados não está bloqueada.",
-       "lockedbyandtime": "(por $1 em $2 às $3)",
+       "lockedbyandtime": "(por {{GENDER:$1|$1}} em $2 às $3)",
        "move-page": "Mover $1",
        "move-page-legend": "Mover página",
        "movepagetext": "Usando o formulário abaixo pode mover esta página e todo o seu histórico de edições para uma página nova com outro nome.\nA página original será transformada num redirecionamento para a página nova.\nPode corrigir de forma automática os redirecionamentos existentes que apontam para a página original.\nCaso escolha não o fazer, após a operação certifique-se de que dela não resultaram  [[Special:DoubleRedirects|redirecionamentos duplos]] ou [[Special:BrokenRedirects|quebrados]].\nÉ da sua responsabilidade verificar que as ligações continuam a apontar para onde é suposto que apontem.\n\nNote que a página '''não''' será movida se já existir uma página com o novo título, a menos que esta última seja um redirecionamento sem qualquer histórico de edições.\nIsto significa que pode mover uma página de volta para o seu nome original se a tiver movido por engano e que não pode mover uma página para cima de outra já existente.\n\n'''CUIDADO!'''\nNuma página popular esta operação pode representar uma mudança drástica e inesperada;\ncertifique-se de que compreende as consequências da mudança antes de prosseguir, por favor.",
        "movearticle": "Mover página",
        "moveuserpage-warning": "'''Aviso:''' Está prestes a mover uma página de utilizador. Note que a página será apenas movida, ''sem'' alterar o nome do utilizador.",
        "movecategorypage-warning": "<strong>Aviso:</strong> Está prestes a mover uma categoria. Por favor, note que apenas moverá a página da categoria e quaisquer páginas que estejam listadas <em>não</em> serão recategorizadas na nova.",
-       "movenologintext": "Precisa de ser um utilizador registado e [[Special:UserLogin|autenticado]] para poder mover uma página.",
+       "movenologintext": "Precisa de ser um utilizador registado e [[Special:UserLogin|ter sessão iniciada]] para poder mover uma página.",
        "movenotallowed": "Não tem permissão para mover páginas.",
        "movenotallowedfile": "Não possui permissão para mover ficheiros.",
        "cant-move-user-page": "Não tem permissão para mover páginas de utilizador (pode mover sub-páginas).",
        "delete_and_move_confirm": "Sim, eliminar a página",
        "delete_and_move_reason": "Eliminada para poder mover \"[[$1]]\" para este título",
        "selfmove": "Os títulos de origem e destino são iguais;\nnão é possível mover uma página para ela mesma.",
-       "immobile-source-namespace": "Não é possível mover páginas no espaço nominal \"$1\"",
-       "immobile-target-namespace": "Não é possível mover páginas para o espaço nominal \"$1\"",
+       "immobile-source-namespace": "Não é possível mover páginas no domínio \"$1\"",
+       "immobile-target-namespace": "Não é possível mover páginas para o domínio \"$1\"",
        "immobile-target-namespace-iw": "Uma ligação interlíngua não é um destino válido para uma movimentação de página.",
        "immobile-source-page": "Esta página não pode ser movida.",
        "immobile-target-page": "Não é possível mover para esse título de destino.",
        "bad-target-model": "O destino pretendido usa um modelo de conteúdo diferente. Não é possível converter de $1 para $2.",
-       "imagenocrossnamespace": "Não é possível mover imagem para espaço nominal que não de imagens",
-       "nonfile-cannot-move-to-file": "Não é possível mover algo que não é um ficheiro para o espaço nominal de ficheiros",
+       "imagenocrossnamespace": "Não é possível mover imagem para domínio que não de imagens",
+       "nonfile-cannot-move-to-file": "Não é possível mover algo que não é um ficheiro para o domínio de ficheiros",
        "imagetypemismatch": "A extensão do novo ficheiro não corresponde ao seu tipo",
        "imageinvalidfilename": "O nome do ficheiro alvo é inválido",
        "fix-double-redirects": "Atualizar todos os redirecionamentos que apontem para o título original",
        "export-submit": "Exportar",
        "export-addcattext": "Adicionar à lista páginas da categoria:",
        "export-addcat": "Adicionar",
-       "export-addnstext": "Adicionar páginas do espaço nominal:",
+       "export-addnstext": "Adicionar páginas do domínio:",
        "export-addns": "Adicionar",
        "export-download": "Gravar em ficheiro",
        "export-templates": "Incluir predefinições",
        "allmessagesname": "Nome",
        "allmessagesdefault": "Texto padrão",
        "allmessagescurrent": "Texto atual",
-       "allmessagestext": "Esta é a lista das mensagens de sistema disponíveis no espaço nominal MediaWiki.\nSe deseja colaborar na localização genérica do MediaWiki, visite [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] e a [//translatewiki.net translatewiki.net].",
+       "allmessagestext": "Esta é a lista das mensagens de sistema disponíveis no domínio MediaWiki.\nSe deseja colaborar na localização genérica do MediaWiki, visite [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] e a [//translatewiki.net translatewiki.net].",
        "allmessagesnotsupportedDB": "Esta página não pode ser usada porque a <strong>$wgUseDatabaseMessages</strong> foi desativada.",
        "allmessages-filter-legend": "Filtro",
        "allmessages-filter": "Filtrar pelo estado de personalização:",
        "import-interwiki-history": "Copiar todo o histórico de revisões desta página",
        "import-interwiki-templates": "Incluir todas as predefinições",
        "import-interwiki-submit": "Importar",
-       "import-interwiki-namespace": "Espaço nominal de destino:",
+       "import-interwiki-namespace": "Domínio de destino:",
        "import-interwiki-rootpage": "Raiz da página de destino (opcional):",
        "import-upload-filename": "Nome do ficheiro:",
        "import-comment": "Comentário:",
        "importtext": "Exporte o ficheiro da wiki de origem utilizando a página especial [[Special:Export|exportação de páginas]].\nGrave o ficheiro no seu computador e importe-o aqui.",
-       "importstart": "Importando páginas...",
+       "importstart": "A importar páginas...",
        "import-revision-count": "{{PLURAL:$1|uma edição|$1 edições}}",
        "importnopages": "Não existem páginas a importar.",
        "imported-log-entries": "{{PLURAL:$1|Foi importada $1 entrada|Foram importadas $1 entradas}} de registo.",
        "import-upload": "Enviar dados em XML",
        "import-token-mismatch": "Perda dos dados da sessão. Tente novamente, por favor.",
        "import-invalid-interwiki": "Não é possível importar da wiki especificada.",
-       "import-error-edit": "A página \"$1\" não foi importada porque você não tem permissão para editá-la.",
-       "import-error-create": "A página \"$1\" não foi importada porque você não tem permissão para criá-la.",
+       "import-error-edit": "A página \"$1\" não foi importada porque não tem permissão para editá-la.",
+       "import-error-create": "A página \"$1\" não foi importada porque não tem permissão para criá-la.",
        "import-error-interwiki": "A página \"$1\" não pode ser importada pois o seu nome está reservado para um ligação externa (interlíngua).",
-       "import-error-special": "A página \"$1\" não pode ser importada porque ela pertence a um espaço nominal especial que não permite páginas.",
-       "import-error-invalid": "A página \"$1\" não pode ser importada porque seu nome é inválido.",
+       "import-error-special": "A página \"$1\" não pode ser importada porque pertence a um domínio especial que não permite páginas.",
+       "import-error-invalid": "A página \"$1\" não pode ser importada porque seu nome é inválido.",
        "import-error-unserialize": "Revisão $2 da página \"$1\" não pode ser desserializada. Foi relatado que a revisão usava o modelo de conteúdo $3 serializado como $4.",
        "import-error-bad-location": "A revisão $2, que usa o modelo de conteúdo $3, não pode ser gravada em \"$1\" nesta wiki, porque o modelo não é suportado nessa página.",
        "import-options-wrong": "{{PLURAL:$2|Opção errada|Opções erradas}}: <nowiki>$1</nowiki>",
        "import-rootpage-nosubpage": "O domínio \"$1\" da página de raiz não permite subpáginas.",
        "importlogpage": "Registo de importações",
        "importlogpagetext": "Importações administrativas de páginas com a preservação do histórico de edição de outras wikis.",
-       "import-logentry-upload": "importou [[$1]] por upload de ficheiro",
+       "import-logentry-upload": "importou [[$1]] por carregamento de ficheiro",
        "import-logentry-upload-detail": "{{PLURAL:$1|uma edição|$1 edições}}",
        "import-logentry-interwiki": "transwikis $1",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|$1 edição|$1 edições}} de $2",
        "javascripttest": "Teste de JavaScript",
-       "javascripttest-title": "Executando os testes $1",
+       "javascripttest-title": "A executar 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\" desconhecida.",
        "javascripttest-pagetext-frameworks": "Escolha, por favor, uma das seguintes estruturas de teste: $1",
        "tooltip-pt-preferences": "Configuração dos comportamentos que prefere da wiki",
        "tooltip-pt-watchlist": "Lista de mudanças nas páginas que está a vigiar",
        "tooltip-pt-mycontris": "Lista das suas contribuições",
-       "tooltip-pt-login": "É encorajado a autenticar-se, apesar de não ser obrigatório.",
+       "tooltip-pt-login": "É encorajado que inicie sessão, apesar de não ser obrigatório.",
        "tooltip-pt-logout": "Sair da conta",
        "tooltip-ca-talk": "Discussão sobre o conteúdo da página",
-       "tooltip-ca-edit": "Pode editar esta página.\nUtilize o botão \"Antever resultado\" antes de gravar, por favor.",
+       "tooltip-ca-edit": "Pode editar esta página.\nUtilize o botão de antevisão do resultado antes de gravar, por favor.",
        "tooltip-ca-addsection": "Iniciar uma nova seção",
-       "tooltip-ca-viewsource": "Esta página está protegida; só pode ver o conteúdo.",
+       "tooltip-ca-viewsource": "Esta página está protegida.\nApenas pode visualizar o seu conteúdo",
        "tooltip-ca-history": "Edições anteriores desta página.",
        "tooltip-ca-protect": "Proteger esta página",
        "tooltip-ca-unprotect": "Alterar a proteção desta página",
-       "tooltip-ca-delete": "Apagar esta página",
+       "tooltip-ca-delete": "Eliminar esta página",
        "tooltip-ca-undelete": "Restaurar edições feitas a esta página antes da eliminação",
        "tooltip-ca-move": "Mover esta página",
        "tooltip-ca-watch": "Adicionar esta página à lista de páginas vigiadas",
        "tooltip-ca-unwatch": "Remover esta página da lista de páginas vigiadas",
-       "tooltip-search": "Pesquisar nesta wiki",
+       "tooltip-search": "Pesquisar em {{SITENAME}}",
        "tooltip-search-go": "Ir para uma página com este nome exacto, caso exista",
        "tooltip-search-fulltext": "Procurar páginas que contêm este texto",
-       "tooltip-p-logo": "Visite a página principal",
+       "tooltip-p-logo": "Visitar a página principal",
        "tooltip-n-mainpage": "Visitar a página principal",
        "tooltip-n-mainpage-description": "Visitar a página principal",
        "tooltip-n-portal": "Sobre o projeto, o que se pode fazer e onde encontrar as coisas",
        "tooltip-feed-atom": "''Feed'' Atom desta página",
        "tooltip-t-contributions": "Ver as contribuições deste utilizador",
        "tooltip-t-emailuser": "Enviar uma mensagem de correio a este utilizador",
-       "tooltip-t-upload": "Upload de ficheiros",
+       "tooltip-t-upload": "Carregar ficheiros",
        "tooltip-t-specialpages": "Lista de páginas especiais",
        "tooltip-t-print": "Versão para impressão desta página",
-       "tooltip-t-permalink": "Ligação permanente para esta versão desta página",
+       "tooltip-t-permalink": "Ligação permanente para esta versão da página",
        "tooltip-ca-nstab-main": "Ver a página de conteúdo",
        "tooltip-ca-nstab-user": "Ver a página de utilizador",
        "tooltip-ca-nstab-media": "Ver a página de multimédia",
        "tooltip-ca-nstab-special": "Esta é uma página especial, não pode ser editada.",
        "tooltip-ca-nstab-project": "Ver a página de projeto",
-       "tooltip-ca-nstab-image": "Ver a página do ficheiro",
+       "tooltip-ca-nstab-image": "Ver a página de ficheiro",
        "tooltip-ca-nstab-mediawiki": "Ver a mensagem de sistema",
        "tooltip-ca-nstab-template": "Ver a predefinição",
        "tooltip-ca-nstab-help": "Ver a página de ajuda",
-       "tooltip-ca-nstab-category": "Ver a página da categoria",
+       "tooltip-ca-nstab-category": "Ver a página de categoria",
        "tooltip-minoredit": "Marcar como edição menor",
        "tooltip-save": "Gravar as alterações",
        "tooltip-preview": "Antever as suas alterações. Use antes de gravar, por favor!",
        "tooltip-preferences-save": "Gravar preferências",
        "tooltip-summary": "Introduza um resumo breve",
        "interlanguage-link-title": "$1 — $2",
+       "interlanguage-link-title-nonlang": "$1 – $2",
        "common.css": "/* Código CSS colocado aqui será aplicado a todos os temas */",
-       "monobook.css": "/* Código CSS colocado aqui afectará os utilizadores do tema Monobook */",
-       "vector.css": "/* Código CSS colocado aqui afectará os utilizadores do tema Vector */",
        "print.css": "/* Código CSS colocado aqui afectará as impressões */",
        "noscript.css": "/* Os estilos CSS colocados aqui afetarão os utilizadores que tenham o JavaScript desativado em seus navegadores */",
        "common.js": "/* Código Javascript colocado aqui será carregado para todos os utilizadores em cada carregamento de página */",
-       "monobook.js": "/* Código Javascript colocado aqui será carregado para utilizadores do tema Monobook */",
-       "vector.js": "/* Código Javascript colocado aqui será carregado para utilizadores do tema Vector */",
        "anonymous": "{{PLURAL:$1|Utilizador anónimo|Utilizadores anónimos}} da {{SITENAME}}",
        "siteuser": "$1 da {{SITENAME}}",
        "anonuser": "utilizador anónimo $1 da {{SITENAME}}",
        "pageinfo-category-pages": "Número de páginas",
        "pageinfo-category-subcats": "Número de subcategorias",
        "pageinfo-category-files": "Número de ficheiros",
-       "skinname-monobook": "MonoBook",
-       "skinname-vector": "Vector",
        "markaspatrolleddiff": "Marcar como patrulhada",
        "markaspatrolledtext": "Marcar esta página como patrulhada",
        "markedaspatrolled": "Marcada como patrulhada",
        "nextdiff": "Edição posterior →",
        "mediawarning": "<strong>Aviso:</strong> Este tipo de ficheiro pode conter código malicioso.\nSe o executar, o seu sistema pode ficar comprometido.",
        "imagemaxsize": "Tamanho limite da imagem:<br /><em>(para páginas de descrição de ficheiros)</em>",
-       "thumbsize": "Tamanho de miniaturas:",
+       "thumbsize": "Tamanho da miniatura:",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|página|páginas}}",
        "file-info": "tamanho: $1, tipo MIME: $2",
        "file-info-size": "$1 × $2 pixels, tamanho: $3, tipo MIME: $4",
        "metadata": "Metadados",
        "metadata-help": "Este ficheiro contém informação adicional, provavelmente acrescentada pela câmara digital ou pelo digitalizador usados para criá-lo.\nCaso o ficheiro tenha sido modificado a partir do seu estado original, alguns detalhes poderão não refletir completamente as mudanças efetuadas.",
        "metadata-expand": "Mostrar detalhes adicionais",
-       "metadata-collapse": "Esconder detalhes adicionais",
+       "metadata-collapse": "Ocultar detalhes adicionais",
        "metadata-fields": "Os campos de metadados de imagens listados nesta mensagem serão incluídos na página de descrição da imagem quando a tabela de metadados estiver recolhida. Por omissão, outros campos estarão ocultos.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-imagewidth": "Largura",
        "exif-imagelength": "Altura",
        "exif-subjectdistancerange": "Distância de alcance do motivo",
        "exif-imageuniqueid": "Identificação única da imagem",
        "exif-gpsversionid": "Versão de GPS",
-       "exif-gpslatituderef": "Latitude Norte ou Sul",
+       "exif-gpslatituderef": "Latitude norte ou sul",
        "exif-gpslatitude": "Latitude",
-       "exif-gpslongituderef": "Longitude Este ou Oeste",
+       "exif-gpslongituderef": "Longitude este ou oeste",
        "exif-gpslongitude": "Longitude",
        "exif-gpsaltituderef": "Referência de altitude",
        "exif-gpsaltitude": "Altitude",
        "exif-subjectdistancerange-1": "Macro",
        "exif-subjectdistancerange-2": "Vista próxima",
        "exif-subjectdistancerange-3": "Vista distante",
-       "exif-gpslatitude-n": "Latitude Norte",
-       "exif-gpslatitude-s": "Latitude Sul",
-       "exif-gpslongitude-e": "Longitude Este",
-       "exif-gpslongitude-w": "Longitude Oeste",
+       "exif-gpslatitude-n": "Latitude norte",
+       "exif-gpslatitude-s": "Latitude sul",
+       "exif-gpslongitude-e": "Longitude este",
+       "exif-gpslongitude-w": "Longitude oeste",
        "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|metro|metros}} acima do nível do mar",
        "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|metro|metros}} abaixo do nível do mar",
        "exif-gpsstatus-a": "Medição em progresso",
        "exif-gpsspeed-n": "Nós",
        "exif-gpsdestdistance-k": "Quilómetros",
        "exif-gpsdestdistance-m": "Milhas",
-       "exif-gpsdestdistance-n": "Miles náuticas",
+       "exif-gpsdestdistance-n": "Milhas náuticas",
        "exif-gpsdop-excellent": "Excelente ($1)",
        "exif-gpsdop-good": "Bom ($1)",
        "exif-gpsdop-moderate": "Moderado ($1)",
        "scarytranscludefailed": "[Não foi possível obter a predefinição a partir de $1]",
        "scarytranscludefailed-httpstatus": "[Não foi possível obter a predefinição a partir de $1: HTTP $2]",
        "scarytranscludetoolong": "[URL longa demais]",
-       "deletedwhileediting": "<strong>AVISO:</strong> Esta página foi eliminada depois de você ter começado a editá-la!",
-       "confirmrecreate": "Depois de você ter começado a editar esta página, o utilizador [[User:$1|$1]] ([[User talk:$1|conversar]]) eliminou-a pelo seguinte motivo:\n: <em>$2</em>\nPor favor, confirme que você quer realmente recriar esta página.",
-       "confirmrecreate-noreason": "O utilizador [[User:$1|$1]] ([[User talk:$1|discussão]]) eliminou esta página depois de você ter começado a editá-la. Confirme que deseja recriar a página, por favor.",
+       "deletedwhileediting": "<strong>AVISO:</strong> Esta página foi eliminada depois de ter começado a editá-la!",
+       "confirmrecreate": "Depois de ter começado a editar esta página, o utilizador [[User:$1|$1]] ([[User talk:$1|conversar]]) eliminou-a pelo seguinte motivo:\n: <em>$2</em>\nPor favor, confirme que quer realmente recriar esta página.",
+       "confirmrecreate-noreason": "O utilizador [[User:$1|$1]] ([[User talk:$1|discussão]]) eliminou esta página depois de ter começado a editá-la. Confirme que deseja recriar a página, por favor.",
        "recreate": "Recriar",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "Limpar a memória cache desta página?",
-       "confirm-purge-bottom": "Purgar uma página, limpa a cache e força a sua versão mais recente a aparecer.",
+       "confirm-purge-bottom": "Recarregar uma página, limpa a cache e força a sua versão mais recente a aparecer.",
        "confirm-watch-button": "OK",
-       "confirm-watch-top": "Adicionar esta página às suas páginas vigiadas?",
+       "confirm-watch-top": "Adicionar esta página à lista de páginas vigiadas?",
        "confirm-unwatch-button": "OK",
-       "confirm-unwatch-top": "Remover esta página das páginas vigiadas?",
+       "confirm-unwatch-top": "Remover esta página da lista de páginas vigiadas?",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← página anterior",
        "imgmultipagenext": "página seguinte →",
        "table_pager_limit_submit": "Ir",
        "table_pager_empty": "Sem resultados",
        "autosumm-blank": "Limpou toda a página",
-       "autosumm-replace": "Página substituída por '$1'",
+       "autosumm-replace": "Página substituída por \"$1\"",
        "autoredircomment": "Redirecionamento para [[$1]]",
-       "autosumm-new": "Criou página com: '$1'",
+       "autosumm-new": "Criou a página com \"$1\"",
        "lag-warn-normal": "Alterações realizadas {{PLURAL:$1|no último segundo|nos últimos $1 segundos}} podem não constar desta lista.",
        "lag-warn-high": "Devido a latência elevada no acesso ao servidor da base de dados, as alterações realizadas {{PLURAL:$1|no último segundo|nos últimos $1 segundos}} podem não constar desta lista.",
        "watchlistedit-normal-title": "Editar lista de páginas vigiadas",
        "watchlisttools-edit": "Ver e editar a lista de páginas vigiadas",
        "watchlisttools-raw": "Editar a lista de páginas vigiadas em forma de texto",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussão]])",
-       "unknown_extension_tag": "\"$1\" é uma tag de extensão desconhecida",
+       "unknown_extension_tag": "\"$1\" é uma marca de extensão desconhecida",
        "duplicate-defaultsort": "<strong>Aviso:</strong> A chave de ordenação padrão \"$2\" sobrepõe-se à anterior \"$1\".",
        "version": "Versão",
        "version-extensions": "Extensões instaladas",
        "version-hook-name": "Nome do hook",
        "version-hook-subscribedby": "Subscrito por",
        "version-version": "(Versão $1)",
+       "version-no-ext-name": "[sem nome]",
        "version-license": "Licença do MediaWiki",
        "version-ext-license": "Licença",
        "version-ext-colheader-name": "Extensão",
        "version-software": "Software instalado",
        "version-software-product": "Produto",
        "version-software-version": "Versão",
-       "version-entrypoints": "URLs de ponto de entrada",
+       "version-entrypoints": "URL de ponto de entrada",
        "version-entrypoints-header-entrypoint": "Ponto de entrada",
        "version-entrypoints-header-url": "URL",
        "redirect": "Redireccionar pelo ID do ficheiro, do utilizador ou da revisão",
        "redirect-file": "Nome do ficheiro",
        "redirect-not-exists": "Valor não encontrado",
        "fileduplicatesearch": "Ficheiros duplicados",
-       "fileduplicatesearch-summary": "Procure ficheiros duplicados tendo por base o seu resumo criptográfico ''(hash value)''.",
+       "fileduplicatesearch-summary": "Procure ficheiros duplicados tendo por base o seu resumo criptográfico.",
        "fileduplicatesearch-legend": "Procurar duplicados",
        "fileduplicatesearch-filename": "Ficheiro:",
        "fileduplicatesearch-submit": "Pesquisar",
        "compare-invalid-title": "O título que especificou é inválido.",
        "compare-title-not-exists": "O título que especificou não existe.",
        "compare-revision-not-exists": "A revisão que especificou não existe.",
-       "dberr-problems": "Desculpe! Este site está com dificuldades técnicas.",
+       "dberr-problems": "Desculpe! Este sítio está com dificuldades técnicas.",
        "dberr-again": "Experimente esperar alguns minutos e atualizar.",
        "dberr-info": "(Não foi possível contactar o servidor da base de dados: $1)",
        "dberr-info-hidden": "(Não foi possível contactar o servidor de base de dados)",
        "logentry-newusers-newusers": "A conta de utilizador $1 foi {{GENDER:$2|criada}}",
        "logentry-newusers-create": "A conta de utilizador $1 foi criada",
        "logentry-newusers-create2": "A conta de utilizador $3 foi criada por $1",
-       "logentry-newusers-byemail": "A conta de utilizador $3 foi criada por $1 e a senha foi enviada por e-mail",
+       "logentry-newusers-byemail": "A conta de utilizador $3 foi criada por $1 e a palavra-passe foi enviada por correio eletrónico",
        "logentry-newusers-autocreate": "A conta de utilizador $1 foi criada automaticamente",
        "logentry-rights-rights": "$1 modificou os privilégios do utilizador $3 de $4 para $5",
        "logentry-rights-rights-legacy": "$1 alterou os grupos de $3",
        "searchsuggest-containing": "contendo...",
        "api-error-badaccess-groups": "Não tem permissão para enviar ficheiros para esta wiki.",
        "api-error-badtoken": "Erro interno: Chave incorrecta.",
-       "api-error-copyuploaddisabled": "O recebimento de ficheiros por URL não foi possibilitado neste servidor.",
+       "api-error-copyuploaddisabled": "O carregamento de ficheiros por URL não foi possibilitado neste servidor.",
        "api-error-duplicate": "Já {{PLURAL:$1|existe [$2 outro ficheiro]|existem [$2 outros ficheiros]}} na wiki com o mesmo conteúdo.",
        "api-error-duplicate-archive": "Já {{PLURAL:$1|existia no site [$2 outro ficheiro]|existiam no site [$2 alguns outros ficheiros]}} com o mesmo conteúdo, mas {{PLURAL:$1|foi|foram}} eliminados.",
        "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Ficheiro duplicado que já foi eliminado|Ficheiros duplicados que já foram eliminados}}",
        "api-error-invalid-file-key": "Erro interno: O ficheiro não foi encontrado no armazenamento temporário.",
        "api-error-missingparam": "Erro interno: Há parâmetros em falta no pedido.",
        "api-error-missingresult": "Erro interno: Não foi possível determinar se a cópia foi feita.",
-       "api-error-mustbeloggedin": "Tem de estar autenticado para enviar ficheiros.",
+       "api-error-mustbeloggedin": "Tem de iniciar sessão para enviar ficheiros.",
        "api-error-mustbeposted": "Erro interno: O pedido necessita do HTTP POST.",
        "api-error-noimageinfo": "O envio correu bem, mas o servidor não forneceu nenhuma informação sobre o ficheiro.",
-       "api-error-nomodule": "Erro interno: Não está definido nenhum módulo para upload de ficheiros.",
+       "api-error-nomodule": "Erro interno: Não está definido nenhum módulo para o carregamento de ficheiros.",
        "api-error-ok-but-empty": "Erro interno: o servidor não respondeu.",
        "api-error-overwrite": "Não é permitido sobrescrever um ficheiro existente.",
        "api-error-stashfailed": "Erro interno: O servidor não conseguiu armazenar o ficheiro temporário.",
        "api-error-publishfailed": "Erro interno: Servidor não conseguiu publicar ficheiro temporário.",
-       "api-error-stasherror": "Ocorreu um erro no upload do ficheiro escondido.",
+       "api-error-stasherror": "Ocorreu um erro no carregamento do ficheiro escondido.",
        "api-error-timeout": "O servidor não respondeu no prazo esperado.",
        "api-error-unclassified": "Ocorreu um erro desconhecido",
        "api-error-unknown-code": "Erro desconhecido: \"$1\"",
        "expand_templates_html_output": "Resultado HTML puro",
        "expand_templates_ok": "Expandir",
        "expand_templates_remove_comments": "Remover comentários",
-       "expand_templates_remove_nowiki": "Suprimir ''tags'' <nowiki> no resultado",
+       "expand_templates_remove_nowiki": "Suprimir marcações <nowiki> no resultado",
        "expand_templates_generate_xml": "Mostrar a árvore de análise sintáctica do XML",
        "expand_templates_generate_rawhtml": "Mostrar o HTML puro",
        "expand_templates_preview": "Antevisão do resultado"
index e8173ea..9d019f9 100644 (file)
        "mytalk": "In the personal URLs page section - right upper corner.\n\nUsed as link title in your personal toolbox.\n\nSee also:\n* {{msg-mw|Mytalk}}\n* {{msg-mw|Accesskey-pt-mytalk}}\n* {{msg-mw|Tooltip-pt-mytalk}}\n{{Identical|Talk}}",
        "anontalk": "Link to the talk page appearing in [[mw:Help:Navigation#User_Links|user links]] for each anonymous users when [[mw:Manual:$wgShowIPinHeader|$wgShowIPinHeader]] is true.\n\nSee also:\n* {{msg-mw|Anontalk}}\n* {{msg-mw|Accesskey-pt-anontalk}}\n* {{msg-mw|Tooltip-pt-anontalk}}",
        "navigation": "This is shown as a section header in the sidebar of most skins.\n\n{{Identical|Navigation}}",
-       "and": "The translation for \"and\" appears in the [[Special:Version]] page, between the last two items of a list. If a comma is needed, add it at the beginning without a gap between it and the \"&\". <nowiki>&#32;</nowiki> is a blank space, one character long. Please leave it as it is.\n\nThis can also appear in the credits page if the credits feature is enabled,for example [{{canonicalurl:Support|action=credits}} the credits of the support page]. (To view any credits page type <nowiki>&action=credits</nowiki> at the end of any URL in the address bar.)\n{{Identical|And}}",
+       "and": "The translation for \"and\" appears in the [[Special:Version]] page, between the last two items of a list. If a comma is needed, add it at the beginning without a gap between it and the \"&\". &amp;#32; is a blank space, one character long. Please leave it as it is.\n\nThis can also appear in the credits page if the credits feature is enabled,for example [{{canonicalurl:Support|action=credits}} the credits of the support page]. (To view any credits page type <nowiki>&action=credits</nowiki> at the end of any URL in the address bar.)\n{{Identical|And}}",
        "qbfind": "Alternative for \"search\" as used in Cologne Blue skin.\n{{Identical|Find}}",
        "qbbrowse": "Heading in sidebar menu in CologneBlue skin as seen in http://i.imgur.com/I08Y3jW.png\n{{Identical|Browse}}",
        "qbedit": "Heading in sidebar menu in CologneBlue skin as seen in http://i.imgur.com/I08Y3jW.png\n{{Identical|Edit}}",
        "faqpage": "{{doc-important|Do not translate <code>Project:</code> part.}}\n\"FAQ\" is short for \"frequently asked questions\".\n\nThis page is only linked in CologneBlue (an old skin), not in Monobook or Vector.",
        "sitetitle": "{{Ignore}}",
        "sitesubtitle": "{{Ignore}}",
-       "vector-action-addsection": "Used in the Vector skin. See for example {{canonicalurl:Talk:Main_Page|useskin=vector}}",
-       "vector-action-delete": "Used in the Vector skin, as the name of a tab at the top of the page. See for example {{canonicalurl:Main_Page|useskin=vector}}\n\n{{Identical|Delete}}",
-       "vector-action-move": "Used in the Vector skin, on the tabs at the top of the page. See for example {{canonicalurl:Talk:Main_Page|useskin=vector}}\n\n{{Identical|Move}}",
-       "vector-action-protect": "Tab at top of page, in vector skin\n\n{{Identical|Protect}}",
-       "vector-action-undelete": "Tab at top of page, in vector skin.\n{{Identical|Undelete}}",
-       "vector-action-unprotect": "Tab at top of page, in vector skin.\n{{Identical|Change protection}}",
-       "vector-view-create": "Tab label in the Vector skin. See for example {{canonicalurl:Foo|useskin=vector}}\n{{Identical|Create}}",
-       "vector-view-edit": "Tab label in the Vector skin. See for example {{canonicalurl:Main_Page|useskin=vector}}\n{{Identical|Edit}}",
-       "vector-view-history": "Tab label in the Vector skin. See for example {{canonicalurl:Main_Page|useskin=vector}}\n{{Identical|View history}}",
-       "vector-view-view": "Tab label in the Vector skin (verb). See for example {{canonicalurl:Main_Page|useskin=vector}}.\n{{Identical|Read}}",
-       "vector-view-viewsource": "Tab label in the Vector skin.\n{{Identical|View source}}",
        "actions": "{{Identical|Action}}",
        "namespaces": "{{Identical|Namespace}}",
        "variants": "Used by the Vector skin.",
        "userlogin-yourname": "In user login & create account forms, label for username field.\n{{doc-important|<nowiki>{{</nowiki>[[Gender|GENDER]]<nowiki>}}</nowiki> is '''NOT''' supported.}}\n\nSee examples: [[Special:UserLogin]] and [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]\n{{Identical|Username}}",
        "userlogin-yourname-ph": "Placeholder text in login & create account form field.\n\nSee example: [[Special:UserLogin]] and [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]",
        "createacct-another-username-ph": "Placeholder text in create account form field when one user creates an account for another.",
-       "createacct-helpusername": "Message in new create account form providing guidance for username.\n\nRefers to {{msg-mw|createacct-helpusername-url}}.",
+       "createacct-helpusername": "{{Optional}} Optional message in new create account form providing guidance for username.\n\nBlank by default.",
        "yourpassword": "In user preferences\n\n{{Identical|Password}}",
        "userlogin-yourpassword": "In login & create account forms, label for password field.\n\nSee examples: [[Special:UserLogin]] and [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]\n{{Identical|Password}}",
        "userlogin-yourpassword-ph": "Placeholder text in login form for password field.\n\nSee examples: [[Special:UserLogin]] and [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]\n{{Identical|Enter password}}",
        "createacct-reason": "In create account form, label for field to enter reason to create an account when already logged-in.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]\n{{Identical|Reason}}",
        "createacct-reason-ph": "Placeholder in vertical-layout create account form for reason field.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]",
        "createacct-captcha": "Label in vertical-layout create account form for CAPTCHA input field when repositioned by JavaScript.",
-       "createacct-imgcaptcha-help": "Help text in vertical-layout create account form for image CAPTCHA input field when repositioned by JavaScript.\n\nRefers to {{msg-mw|Createacct-captcha-help-url}}.",
+       "createacct-imgcaptcha-help": "{{Optional}} Optional help text in vertical-layout create account form for image CAPTCHA input field when repositioned by JavaScript.\n\nBlank by default.",
        "createacct-imgcaptcha-ph": "Placehodler text in vertical-layout create account form for image CAPTCHA input field when repositioned by JavaScript.",
        "createacct-submit": "Submit button on vertical-layout create account form.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]",
        "createacct-another-submit": "Submit button of  [[Special:UserLogin/signup]] ([[Special:CreateAccount]]) when accessed by a registered user.\n\nThe original means \"create an account in addition to the one you already have\"; sometimes, but not always, it means you are going to \"Create the account on behalf of somebody else\" or \"Create account for another\".\n{{Identical|Create another account}}",
        "currentrev": "Used in Diff Preview page. The diff is between {{msg-mw|currentrev}} and {{msg-mw|yourtext}}.\n{{Identical|Current revision}}",
        "currentrev-asof": "Used on a difference page when comparing the current versions of a page with each other.\n\nSee {{msg-mw|Revisionasof}} for the message for non-current version.\n\nParameters:\n* $1 - a date and time\n* $2 - (Optional) a date\n* $3 - (Optional) a time",
        "revisionasof": "Used on a difference page when comparing different versions of a page or when viewing an non-current version of a page.\n\nSee {{msg-mw|Currentrev-asof}} for the message for the current version.\n\nParameters:\n* $1 - the date/time at which the revision was created. e.g. \"''Revision as of 14:44, 24 January 2008''\".\n* $2 - (Optional) the date at which the revision was created\n* $3 - (Optional) the time at which the revision was created",
-       "revision-info": "Appears just below the page title when an old version of the page is being viewed.\n\nParameters:\n* $1 - date and time of revision\n* $2 - a series of links: to author of the revision, his talk page, etc.\n* $3 - (Optional) revision ID\n* $4 - (Optional) date of revision\n* $5 - (Optional) time of revision\n* $6 - (Optional) author of revision, for GENDER use",
-       "revision-info-current": "{{notranslate}}\n* $1: date and time of revision\n* $2: a series of links: to author of the revision, his talk page, etc. \n* (optional) $3: revision ID\n* (optional) $4: date of revision\n* (optional) $5: time of revision\n* (optional) $6: author of revision, for GENDER use",
+       "revision-info": "Appears just below the page title when an old version of the page is being viewed.\n\nParameters:\n* $1 - date and time of revision\n* $2 - a series of links: to author of the revision, his talk page, etc.\n* $3 - (Optional) revision ID\n* $4 - (Optional) date of revision\n* $5 - (Optional) time of revision\n* $6 - author of revision, for GENDER use\n* $7 - edit summary of revision (with leading space and in parentheses)",
+       "revision-info-current": "{{notranslate}}\n* $1: date and time of revision\n* $2: a series of links: to author of the revision, his talk page, etc. \n* (optional) $3: revision ID\n* (optional) $4: date of revision\n* (optional) $5: time of revision\n* (optional) $6: author of revision, for GENDER use\n* $7 - edit summary of revision (with leading space and in parentheses)",
        "revision-nav": "{{notranslate}}\nRefers to {{msg-mw|Pipe-separator}}.\n\nParameters:\n* $1 - prev diff. link text is {{msg-mw|Diff}}\n* $2 - prev link. link text is {{msg-mw|Previousrevision}}\n* $3 - link. link text is {{msg-mw|Currentrevisionlink}}\n* $4 - cur diff. link text is {{msg-mw|Diff}}\n* $5 - next link. link text is {{msg-mw|Nextrevision}}\n* $6 - next diff. link text is {{msg-mw|Diff}}",
        "previousrevision": "See also:\n* {{msg-mw|Nextrevision}}",
        "nextrevision": "See also:\n* {{msg-mw|Previousrevision}}",
        "revdelete-hide-text": "Option for oversight. This message is a part of the [[mw:RevisionDelete|RevisionDelete]] feature.\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\n{{Related|Revdelete-hide}}",
        "revdelete-hide-image": "Option for <del>oversight</del> [[:mw:RevisionDelete|RevisionDelete]] feature.\n{{Related|Revdelete-hide}}",
        "revdelete-hide-name": "Option for oversight.\n{{Related|Revdelete-hide}}",
-       "revdelete-hide-comment": "Option for oversight. {{RevisionDelete}}\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\n{{Related|Revdelete-hide}}",
+       "revdelete-hide-comment": "Option for oversight. {{RevisionDelete}}\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\n{{Related|Revdelete-hide}}\n{{Identical|Edit summary}}",
        "revdelete-hide-user": "Option for oversight. {{RevisionDelete}}\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\n{{Related|Revdelete-hide}}",
        "revdelete-hide-restricted": "Option for oversight.\n{{Related|Revdelete-hide}}",
        "revdelete-radio-same": "This message is a part of the [[mw:RevisionDelete|RevisionDelete]] feature. The message is a caption for a column of radioboxes inside a box with {{msg-mw|Revdelete-legend}} as a title.\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\nThere are three radio buttons in each row, and the captions above each column read:\n* {{msg-mw|Revdelete-radio-same}}\n* {{msg-mw|Revdelete-radio-set}}\n* {{msg-mw|Revdelete-radio-unset}}",
        "mergehistory-empty": "Used in [[Special:MergeHistory]].",
        "mergehistory-success": "Used in [[Special:MergeHistory]].\n* $1 - target page title\n* $2 - destination page title\n* $3 - number of revisions which succeeded to merge",
        "mergehistory-fail": "Used as error message in [[Special:MergeHistory]].",
+       "mergehistory-fail-toobig": "Used as error message in [[Special:MergeHistory]].\n* $1 - maximum allowed number of revisions that can be moved",
        "mergehistory-no-source": "Used as error message in [[Special:MergeHistory]].\n* $1 - source page title\nSee also:\n* {{msg-mw|mergehistory-invalid-source}}\n* {{msg-mw|mergehistory-invalid-destination}}\n* {{msg-mw|mergehistory-no-destination}}\n* {{msg-mw|mergehistory-same-destination}}",
        "mergehistory-no-destination": "Used as error message in [[Special:MergeHistory]].\n* $1 - destination page title\nSee also:\n* {{msg-mw|mergehistory-invalid-source}}\n* {{msg-mw|mergehistory-no-source}}\n* {{msg-mw|mergehistory-invalid-destination}}\n* {{msg-mw|mergehistory-same-destination}}",
        "mergehistory-invalid-source": "Used as error message in [[Special:MergeHistory]].\n\nSee also:\n* {{msg-mw|mergehistory-no-source}}\n* {{msg-mw|mergehistory-invalid-destination}}\n* {{msg-mw|mergehistory-no-destination}}\n* {{msg-mw|mergehistory-same-destination}}",
        "search-summary": "{{doc-specialpagesummary|search}}",
        "searchresults": "This is the title of the page that contains the results of a search.\n\n{{Identical|Search results}}",
        "searchresults-title": "Appears as page title in the html header of the search result special page.\n\nParameters:\n* $1 - the search term",
-       "toomanymatches": "Used as section header in [[Special:Search]], when there are too many hits.",
        "titlematches": "Used as section header in [[Special:Search]].\n\nThis message is followed by search results.",
        "textmatches": "When displaying search results",
        "notextmatches": "Error message when there are no results",
        "search-interwiki-custom": "#REDIRECT [[MediaWiki:Wmf-search-interwiki-custom/qqq]]",
        "search-interwiki-more": "{{Identical|More}}",
        "search-relatedarticle": "This is a search result (and I guess search engine) dependent messages. I do not know how to trigger the feature. The message is displayed if the search result contains information that related pages can also be provided from the search engine. I assume this is \"More Like This\" functionality. Microsoft glossary defines MLT as \"A way to refine search by identifying the right set of documents and then locating similar documents. This allows the searcher to control the direction of the search and focus on the most fruitful lines of inquiry.\"[http://www.microsoft.com/enterprisesearch/en/us/search-glossary.aspx]\n{{Identical|Related}}",
-       "searcheverything-enable": "Used in [[Special:Preferences]], tab \"Search\".",
        "searchrelated": "This is a search result (and I guess search engine) dependent messages. I do not know how to trigger the feature. The message is displayed if the search result contains information that related pages can also be provided from the search engine. I assume this is \"More Like This\" functionality. Microsoft glossary defines MLT as \"A way to refine search by identifying the right set of documents and then locating similar documents. This allows the searcher to control the direction of the search and focus on the most fruitful lines of inquiry.\"[http://www.microsoft.com/enterprisesearch/en/us/search-glossary.aspx]\n{{Identical|Related}}",
        "searchall": "{{Identical|All}}",
        "showingresults": "This message is used on some special pages such as [[Special:WantedCategories]]. Parameters:\n* $1 - the total number of results in the batch shown\n* $2 - the number of the first item listed\nSee also:\n* {{msg-mw|Showingresultsnum}}",
        "powersearch-togglelabel": "Used in [{{canonicalurl:Special:Search|advanced=1}} Advanced search]. Synonym: \"Select\" as verb.\n{{Identical|Check}}",
        "powersearch-toggleall": "\"All\" refers to namespaces. It is used in Advanced search: {{canonicalurl:Special:Search|advanced=1}}\n{{Identical|All}}",
        "powersearch-togglenone": "\"None\" refers to namespaces. It is used in Advanced search: {{canonicalurl:Special:Search|advanced=1}}\n{{Identical|None}}",
+       "powersearch-remember": "Label for a checkbox to save namespace choice for advanced search to user preferences.",
        "search-external": "Legend of the fieldset for the input form when the internal search is disabled. Inside the fieldset [[MediaWiki:Searchdisabled]] and [[MediaWiki:Googlesearch]] is shown.",
        "searchdisabled": "{{doc-singularthey}}\nIn this sentence, \"their indexes\" refers to \"Google's indexes\".\n\nShown on [[Special:Search]] when the internal search is disabled.",
        "googlesearch": "{{notranslate}}\nShown when [[mw:Manual:$wgDisableTextSearch|$wgDisableTextSearch]] is set to true and no [[mw:Manual:$wgSearchForwardUrl|$wgSearchForwardUrl]] is set.\n\nParameters:\n* $1 - the search term\n* $2 - \"UTF-8\" (hard-coded)\n* $3 - the message {{msg-mw|Searchbutton}}",
        "allowemail": "Used in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}.",
        "prefs-searchoptions": "{{Identical|Search}}",
        "prefs-namespaces": "Shown as legend of the second fieldset of the tab 'Search' in [[Special:Preferences]]\n{{Identical|Namespaces}}",
-       "defaultns": "Used in [[Special:Preferences]], tab \"Search\".",
        "default": "{{Identical|Default}}",
        "prefs-files": "Title of a tab in [[Special:Preferences]].\n{{Identical|File}}",
        "prefs-custom-css": "visible on [[Special:Preferences]] -[Skins].\n{{Identical|Custom CSS}}",
        "group-suppress-member": "{{doc-group|suppress|member}}\nThis is a member of the optional (disabled by default) user group, meant for the [[mw:RevisionDelete|RevisionDelete]] feature, to change the visibility of revisions through [[Special:RevisionDelete]].\n\n{{Identical|Oversight}}",
        "grouppage-user": "{{doc-group|user|page}}",
        "grouppage-autoconfirmed": "{{doc-group|autoconfirmed|page}}",
-       "grouppage-bot": "{{doc-group|bot|page}}",
+       "grouppage-bot": "{{doc-group|bot|page}}\n{{Identical|Bot}}",
        "grouppage-sysop": "{{doc-group|sysop|page}}",
        "grouppage-bureaucrat": "{{doc-group|bureaucrat|page}}",
        "grouppage-suppress": "{{doc-group|suppress|page}}\n{{Identical|Oversight}}",
        "recentchanges-label-unpatrolled": "Tooltip for {{msg-mw|unpatrolledletter}}",
        "recentchanges-label-plusminus": "Legend item for plus/minus.\n\nPreceded by legend example {{msg-mw|Recentchanges-legend-plusminus}}.",
        "recentchanges-legend-heading": "Used as a heading for legend box on [[Special:RecentChanges]] and [[Special:Watchlist]].\n{{Identical|Legend}}",
-       "recentchanges-legend-newpage": "Used as legend in [[Special:RecentChanges]]. Preceded by {{msg-mw|Recentchanges-label-newpage}}.",
+       "recentchanges-legend-newpage": "{{doc-important|Do not translate <code>Special:NewPages</code>.}}\nUsed as legend on [[Special:RecentChanges]] and [[Special:Watchlist]].\n\nRefers to {{msg-mw|Recentchanges-label-newpage}}.",
+       "recentchanges-legend-minor": "Used as legend on [[Special:RecentChanges]] and [[Special:Watchlist]].\n\nRefers to {{msg-mw|Recentchanges-label-minor}}.",
+       "recentchanges-legend-bot": "Used as legend on [[Special:RecentChanges]] and [[Special:Watchlist]].\n\nRefers to {{msg-mw|Recentchanges-label-bot}}.",
+       "recentchanges-legend-unpatrolled": "Used as legend on [[Special:RecentChanges]] and [[Special:Watchlist]].\n\nRefers to {{msg-mw|Recentchanges-label-unpatrolled}}.",
        "recentchanges-legend-plusminus": "{{optional}}\nA plus/minus sign with a number for the legend.",
        "rcnotefrom": "This message is displayed at [[Special:RecentChanges]] when viewing recentchanges from some specific time.\n\nThe corresponding message is {{msg-mw|Rclistfrom}} (split into date and time).\n\nParameters:\n* $1 - the maximum number of changes that are displayed\n* $2 - a date and time\n* $3 - (Optional) a date\n* $4 - (Optional) a time",
        "rclistfrom": "Used on [[Special:RecentChanges]]. Parameters:\n* $1 - (Currently not use) date and time. The date and the time adds to the rclistfrom description.\n* $2 - time. The time adds to the rclistfrom link description (with split of date and time).\n* $3 - date. The date adds to the rclistfrom link description (with split of date and time).\n\nThe corresponding message is {{msg-mw|Rcnotefrom}}.",
        "filename": "{{Identical|Filename}}",
        "filedesc": "Used as section header in [[Special:Upload]].\n\nSee also:\n* {{msg-mw|License-header}}\n* {{msg-mw|Filestatus}}\n* {{msg-mw|Filesource}}\n{{Identical|Summary}}",
        "fileuploadsummary": "{{Identical|Summary}}",
-       "filereuploadsummary": "Label of textearea in [[Special:Upload]] when uploading a new version of existing file.",
+       "filereuploadsummary": "Label of text area in [[Special:Upload]] when uploading a new version of existing file.",
        "filestatus": "Used as section header in [[Special:Upload]].\n\nSee also:\n* {{msg-mw|License-header}}\n* {{msg-mw|Filedesc}}\n* {{msg-mw|Filesource}}",
        "filesource": "On page [[Special:Upload]] if defined $wgUseCopyrightUpload for detailed copyright information forms. This is source of file.\n\nSee also:\n* {{msg-mw|License-header}}\n* {{msg-mw|Filedesc}}\n* {{msg-mw|Filestatus}}\n{{Identical|Source}}",
        "ignorewarning": "Used as button text in the Upload form on [[Special:Upload]].\n\nSee also:\n* {{msg-mw|upload-tryagain|Submit button text}}\n* {{msg-mw|reuploaddesc|button text}}",
        "filehist-dimensions": "Used as label in file description page.\n\nFollowed by length, filesize, and width x height. e.g. \"1.5 s (13 KB)\".",
        "filehist-filesize": "Used in image description page.\n{{Identical|File size}}",
        "filehist-comment": "In file description page\n\n{{Identical|Comment}}",
-       "imagelinks": "In top header of the image description page, see for example [[:Image:Yes.png]]. Shows a list of pages where this file is used.",
+       "imagelinks": "In top header of the image description page, see for example [[:Image:Yes.png]]. Shows a list of pages where this file is used.\n{{Identical|File usage}}",
        "linkstoimage": "Used on image description, see for example [[:Image:Yes.png#filelinks]].\n\nParameters:\n* $1 - the number of pages that link to the file/image\nSee also:\n* {{msg-mw|Linkstoimage-more}}",
        "linkstoimage-more": "Shown on an image description page when a file is used/linked more than 100 times on other pages.\n\nParameters:\n* $1 - limit. At the moment hardcoded at 100\n* $2 - page title of the file\nSee also:\n* {{msg-mw|Linkstoimage}}",
        "nolinkstoimage": "Displayed on image description pages, see for exampe [[:Image:Tournesol.png#filelinks]].",
        "nrevisions": "Used as link text in [[Special:FewestRevisions]].\n\nThe link points to the page history (action=history).\n\nParameters:\n* $1 - number of revisions",
        "nviews": "This message is used on [[Special:PopularPages]] to say how many times each page has been viewed.\n\nPreceded by the page title, like: Page title ($1 views)\n\nParameters:\n* $1 - the number of views",
        "nimagelinks": "Used on [[Special:MostLinkedFiles]] to indicate how often a specific file is used.\n\nParameters:\n* $1 - number of pages\nSee also:\n* {{msg-mw|Ntransclusions}}",
-       "ntransclusions": "Used on [[Special:MostLinkedTemplates]] to indicate how often a template is in use.\n\nParameters:\n* $1 - number of pages\nSee also:\n* {{msg-mw|Nimagelinks}}",
+       "ntransclusions": "Used on [[Special:MostTranscludedPages]] to indicate how often a template is in use.\n\nParameters:\n* $1 - number of pages\nSee also:\n* {{msg-mw|Nimagelinks}}",
        "specialpage-empty": "Used on a special page when there is no data. For example on [[Special:Unusedimages]] when all images are used.",
        "lonelypages": "{{doc-special|LonelyPages}}",
        "lonelypages-summary": "{{doc-specialpagesummary|lonelypages}}",
        "mostlinked-summary": "{{doc-specialpagesummary|mostlinked}}",
        "mostlinkedcategories": "{{doc-special|MostLinkedCategories}}",
        "mostlinkedcategories-summary": "{{doc-specialpagesummary|mostlinkedcategories}}",
-       "mostlinkedtemplates": "{{doc-special|MostLinkedTemplates}}",
+       "mostlinkedtemplates": "{{doc-special|MostTranscludedPages}}",
        "mostlinkedtemplates-summary": "{{doc-specialpagesummary|mostlinkedtemplates}}",
        "mostcategories": "{{doc-special|MostCategories}}",
        "mostcategories-summary": "{{doc-specialpagesummary|mostcategories}}",
        "nolinkshere-ns": "Used in [[Special:WhatLinksHere]] if empty. Parameters:\n* $1 - page title\nSee also:\n* {{msg-mw|Nolinkshere}}",
        "isredirect": "Displayed in [[Special:WhatLinksHere]] (see [{{fullurl:Special:WhatLinksHere/Project:Translator|hidelinks=1}} Special:WhatLinksHere/Project:Translator] for example).\n\n{{Identical|Redirect page}}",
        "istemplate": "Means that a page (a template, specifically) is used as <code><nowiki>{{Page name}}</nowiki></code>.\nDisplayed in [[Special:WhatLinksHere]] (see [[Special:WhatLinksHere/Template:New portal]] for example).\n{{Identical|Transclusion}}",
-       "isimage": "This message is displayed on [[Special:WhatLinksHere]] for images. It means that the image is used on the page (as opposed to just being linked to like an non-image page).",
+       "isimage": "This message is displayed on [[Special:WhatLinksHere]] for images. It means that the image is used on the page (as opposed to just being linked to like an non-image page).\n{{Identical|File link}}",
        "whatlinkshere-prev": "This is part of the navigation message on the top and bottom of Whatlinkshere pages, where it is used as the first argument of {{msg-mw|Viewprevnext}}.\n\nParameters:\n* $1 - the number of items shown per page. It is not used when $1 is zero; not sure what happens when $1 is one.\nSpecial pages use {{msg-mw|Prevn}} instead (still as an argument to {{msg-mw|Viewprevnext}}).\n\nSee also:\n* {{msg-mw|Whatlinkshere-next}}\n{{Identical|Previous}}",
        "whatlinkshere-next": "This is part of the navigation message on the top and bottom of Whatlinkshere pages, where it is used as the second argument of {{msg-mw|Viewprevnext}}.\n\nParameters:\n* $1 - the number of items shown per page. It is not used when $1 is zero; not sure what happens when $1 is one.\nSpecial pages use {{msg-mw|Nextn}} instead (still as an argument to {{msg-mw|Viewprevnext}}).\n\nSee also:\n* {{msg-mw|Whatlinkshere-prev}}\n{{Identical|Next}}",
        "whatlinkshere-links": "Used on [[Special:WhatLinksHere]]. It is a link to the WhatLinksHere page of that page.\n\nExample line:\n* [[Main Page]] ([[Special:WhatLinksHere/Main Page|{{int:whatlinkshere-links}}]])\n{{Identical|Link}}",
        "tooltip-summary": "Used as tooltip for Summary input box in Editor page.\n\nSee also:\n* {{msg-mw|Summary}}\n* {{msg-mw|Accesskey-summary}}\n* {{msg-mw|Tooltip-summary}}",
        "interlanguage-link-title": "{{Optional}}\nFormat of a sidebar interwiki link tooltip. Parameters:\n* $1 - page name in the target wiki\n* $2 - target wiki language autonym",
        "interlanguage-link-title-langonly": "{{ignored}}Interlanguage link title. Parameters: $1 replaced with a language name.",
+       "interlanguage-link-title-nonlang": "{{Optional}}\nFormat of a tooltip for a sidebar interwiki link that points to a specific project. Parameters:\n* $1 - page name in the target wiki\n* $2 - name of the target wiki (probably not a language name)",
+       "interlanguage-link-title-nonlangonly": "{{ignored}}Interlanguage link title. Parameters: $1 replaced with name of the target wiki (probably not a language name).",
        "common.css": "{{optional}}\nCSS applied to all users.",
-       "monobook.css": "{{optional}}\nCSS applied to users using Monobook skin.",
-       "vector.css": "{{optional}}",
        "print.css": "{{optional}}",
        "noscript.css": "{{optional}}",
        "group-autoconfirmed.css": "{{doc-group|autoconfirmed|css}}",
        "group-sysop.css": "{{doc-group|sysop|css}}",
        "group-bureaucrat.css": "{{doc-group|bureaucrat|css}}",
        "common.js": "{{optional}}\nJS for all users.",
-       "monobook.js": "{{optional}}\nJS for users using Monobook skin.",
-       "vector.js": "{{optional}}",
        "group-autoconfirmed.js": "{{doc-group|autoconfirmed|js}}",
        "group-user.js": "{{doc-group|user|js}}",
        "group-bot.js": "{{doc-group|bot|js}}",
        "pageinfo-category-pages": "See also:\n* {{msg-mw|Pageinfo-category-subcats}}\n* {{msg-mw|Pageinfo-category-files}}",
        "pageinfo-category-subcats": "See also:\n* {{msg-mw|Pageinfo-category-pages}}\n* {{msg-mw|Pageinfo-category-files}}",
        "pageinfo-category-files": "See also:\n* {{msg-mw|Pageinfo-category-pages}}\n* {{msg-mw|Pageinfo-category-subcats}}",
-       "skinname-monobook": "{{optional}}",
-       "skinname-vector": "{{optional}}",
-       "markaspatrolleddiff": "{{doc-actionlink}}\nSee also:\n* {{msg-mw|Markaspatrolledtext}}",
+       "markaspatrolleddiff": "{{doc-actionlink}}\nSee also:\n* {{msg-mw|Markaspatrolledtext}}\n{{Identical|Mark as patrolled}}",
        "markaspatrolledlink": "{{notranslate}}\nParameters:\n* $1 - link which has text {{msg-mw|Markaspatrolledtext}}",
        "markaspatrolledtext": "{{doc-actionlink}}\nSee also:\n* {{msg-mw|Markaspatrolleddiff}}",
        "markedaspatrolled": "Used as title of the message {{msg-mw|Markedaspatrolledtext}}, when marking a change as patrolled.\n{{Related|Markedaspatrolled}}",
        "days-abbrev": "{{optional}}\nAbbreviation for \"days\". $1 is the number of days.\n\nSee also {{msg-mw|days}}",
        "seconds": "Full word for \"seconds\". $1 is the number of seconds.\n\nSee also {{msg-mw|seconds-abbrev}}, {{msg-mw|seconds-ago}}.\n{{Identical|Second}}",
        "minutes": "Full word for \"minutes\". $1 is the number of minutes.\n\nSee also {{msg-mw|minutes-abbrev}}, {{msg-mw|minutes-ago}}.\n\n{{Identical|Minute}}",
-       "hours": "Full word for \"hours\". $1 is the number of hours.\n\nSee also {{msg-mw|hours-abbrev}}, {{msg-mw|hours-ago}}.",
+       "hours": "Full word for \"hours\". $1 is the number of hours.\n\nSee also {{msg-mw|hours-abbrev}}, {{msg-mw|hours-ago}}.\n{{Identical|Hour}}",
        "days": "Full word for \"days\". $1 is the number of days.\n\nSee also {{msg-mw|Days-abbrev}}\n\n{{Identical|Day}}",
-       "weeks": "Full word for \"weeks\". Parameters:\n* $1 is the number of weeks",
-       "months": "Full word for \"months\". $1 is the number of months.",
-       "years": "Full word for \"years\".\n\nParameters:\n* $1 - the number of years",
+       "weeks": "Full word for \"weeks\". Parameters:\n* $1 is the number of weeks\n{{Identical|Week}}",
+       "months": "Full word for \"months\".\n* $1 - the number of months.\n{{Identical|Month}}",
+       "years": "Full word for \"years\".\n\nParameters:\n* $1 - the number of years\n{{Identical|Year}}",
        "ago": "Phrase for indicating how long ago something happened. Parameters:\n* $1 - some kind of timestamp\n{{Identical|Ago}}",
-       "just-now": "Phrase for indicating something happened just now.",
+       "just-now": "Phrase for indicating something happened just now.\n{{Identical|Just now}}",
        "hours-ago": "Phrase for indicating that something occurred a certain number of hours ago.\n\nParameters:\n* $1 - number of hours",
        "minutes-ago": "Phrase for indicating that something occurred a certain number of minutes ago.\n\nParameters:\n* $1 - number of minutes",
        "seconds-ago": "Phrase for indicating that something occurred a certain number of seconds ago.\n\nParameters:\n* $1 - number of seconds",
        "exif-meteringmode-2": "{{Related|Exif-meteringmode}}",
        "exif-meteringmode-3": "{{Related|Exif-meteringmode}}",
        "exif-meteringmode-4": "{{Related|Exif-meteringmode}}",
-       "exif-meteringmode-5": "{{Related|Exif-meteringmode}}",
+       "exif-meteringmode-5": "{{Related|Exif-meteringmode}}\n{{Identical|Pattern}}",
        "exif-meteringmode-6": "{{Related|Exif-meteringmode}}",
        "exif-meteringmode-255": "{{Identical|Other}}",
        "exif-lightsource-0": "{{Identical|Unknown}}\n{{Related|Exif-lightsource}}",
        "version-hook-name": "Shown in [[Special:Version]].\n\nFor meaning of hook see [[mw:Special:MyLanguage/Manual:Hooks|mw:Manual:Hooks]] and [[w:Hooking]].",
        "version-hook-subscribedby": "Shown in [[Special:Version]]",
        "version-version": "{{Optional}}\nUsed in [[Special:Version]]. Preceded by the MediaWiki extension name.\n\nParameters:\n* $1 - version number of the extension",
+       "version-no-ext-name": "Used in [[Special:Version]], in the rows of the main table when a name for an extension is not provided.",
        "version-svn-revision": "{{Identical|Revision}}{{optional}}\nUsed in [[Special:Version]], preceeding the Subversion revision numbers of the extensions loaded inside brackets, like this: \"({{int:version-revision}} r012345\"). Parameters:\n* $1 - (Unused) directory revision number or empty string\n* $2 - checkout revision number",
        "version-license": "Used specifically for the MediaWiki software.\n\nUsed as heading in [[Special:Version]].",
        "version-ext-license": "Used in [[Special:Version]].\n\nUsed as label for the link pointing to the extension's license page. e.g. [[Special:Version/License/Maps]]\n{{Identical|License}}",
        "revdelete-logentry": "{{RevisionDelete}}\nThis is the message for the log entry in [[Special:Log/delete]] when changing visibility restrictions for page revisions.\n\nFollowed by the message {{msg-mw|revdelete-log-message}} in brackets.\n\nPreceded by the name of the user doing this task.\n\nParameters:\n* $1 - the page name\nSee also:\n* {{msg-mw|Logdelete-logentry}}",
        "logdelete-logentry": "{{RevisionDelete}}\nThis is the message for the log entry in [[Special:Log/delete]] when changing visibility restrictions for log events.\n\nFollowed by the message {{msg-mw|logdelete-log-message}} in brackets.\n\nPreceded by the name of the user who did this task.\n\nParameters:\n* $1 - the log name in brackets\nSee also:\n* {{msg-mw|Revdelete-logentry}}",
        "revdelete-content": "This message is used as parameter $1 in {{msg-mw|revdelete-hid}} and {{msg-mw|revdelete-unhid}} when hiding or unhiding the content of a revision or event.\n{{Identical|Content}}",
-       "revdelete-summary": "This message is used as parameter $1 in {{msg-mw|revdelete-hid}} and {{msg-mw|revdelete-unhid}} when hiding or unhiding the edit summary of a revision or event.",
+       "revdelete-summary": "This message is used as parameter $1 in {{msg-mw|revdelete-hid}} and {{msg-mw|revdelete-unhid}} when hiding or unhiding the edit summary of a revision or event.\n{{Identical|Edit summary}}",
        "revdelete-uname": "This message is used as parameter $1 in {{msg-mw|revdelete-hid}} and {{msg-mw|revdelete-unhid}} when hiding or unhiding the username for a revision or event.\n\n{{Identical|Username}}",
        "revdelete-hid": "This message is used as <code>$1</code>:\n* in {{msg-mw|revdelete-log-message}} when hiding revisions\n* in {{msg-mw|logdelete-log-message}} when hiding information in the log entry about hiding revisions\nParameters:\n* $1 - any one of the following:\n** {{msg-mw|Revdelete-content}} (when hiding the page content)\n** {{msg-mw|Revdelete-summary}} (when hiding the edit summary)\n** {{msg-mw|Revdelete-uname}} (when hiding the user name)\n** a combination of these three messages\nSee also:\n* {{msg-mw|Revdelete-unhid}}",
        "revdelete-unhid": "This message is used as <code>$1</code>:\n* in {{msg-mw|Revdelete-log-message}} when unhiding revisions\n* in {{msg-mw|Logdelete-log-message}} when unhiding information in the log entry about unhiding revisions\nParameters:\n* $1 - any one of the following:\n** {{msg-mw|Revdelete-content}} (when unhiding the page content)\n** {{msg-mw|Revdelete-summary}} (when unhiding the edit summary)\n** {{msg-mw|Revdelete-uname}} (when unhiding the user name)\n** a combination of these three messages\nSee also:\n* {{msg-mw|Revdelete-hid}}",
index 4cb40b3..c548685 100644 (file)
        "qbmyoptions": "Akllanaykuna",
        "faq": "Pasaq tapuykuna",
        "faqpage": "Project:Pasaq tapuykuna",
-       "vector-action-addsection": "Allwiyta yapay",
-       "vector-action-delete": "Qulluy",
-       "vector-action-move": "Astay",
-       "vector-action-protect": "Amachay",
-       "vector-action-undelete": "Qullusqata paqarichiy",
-       "vector-action-unprotect": "Amachayta wakinchay",
-       "vector-view-create": "Kamariy",
-       "vector-view-edit": "Llamk'apuy",
-       "vector-view-history": "Wiñay kawsayta qhaway",
-       "vector-view-view": "Ñawiriy",
-       "vector-view-viewsource": "Pukyu qillqata qhaway",
        "actions": "Ruraykuna",
        "namespaces": "Suti k'itikuna",
        "variants": "Ñawra rikch'akuykuna",
        "permalink": "Kakuq t'inki",
        "print": "Ch'ipachiy",
        "view": "Qhaway",
+       "view-foreign": "$1 nisqapi qhaway",
        "edit": "qillqay",
+       "edit-local": "Kayllapi t'iktunata llamk'apuy",
        "create": "Kamariy",
+       "create-local": "Kayllapi t'iktunata yapay",
        "editthispage": "Kay p'anqata llamk'apuy",
        "create-this-page": "Kay p'anqata kamariy",
        "delete": "Qulluy",
        "jumptonavigation": "wamp'una",
        "jumptosearch": "maskana",
        "view-pool-error": "Achachaw, sirwiqkunaqa nisyu sasachakuyniyuqmi kachkan.\nNisyu ruraqkunam kay p'anqataqa qhawayta munachkan.\nAma hina kaspa, ratullata suyay kay p'anqata manaraq musuqmanta qhawaykachaspa.\n\n$1",
+       "generic-pool-error": "Achachaw, sirwiqkunaqa nisyu sasachakuyniyuqmi kachkan.\nNisyu ruraqkunam kay kaqtaqa qhawayta munachkan.\nAma hina kaspa, ratullata suyay kay kaqta manaraq musuqmanta qhawaykachaspa.",
        "pool-timeout": "Wichq'aypaq suyaspa mit'a llallisqa",
        "pool-queuefull": "Suyana siq'iqa huntasqañam",
        "pool-errorunknown": "Mana riqsisqa pantasqa",
+       "pool-servererror": "Wayt'ana yupana sirwiyqa manam kanchu ($1).",
        "aboutsite": "{{SITENAME}}manta",
        "aboutpage": "Project:{{SITENAME}}manta",
        "copyright": "Samiqwanqa llamk'ankiman $1 nisqa ruraq hayñikama, mana wakin hina willaptinqa.",
        "invalidtitle-unknownnamespace": "Mana riqsisqa $1 kaq sutisuyu yupay, \"$2\" qillqasqayuq mana allin kaq qillqa suti",
        "exception-nologin": "Manam yaykurqankichu",
        "exception-nologin-text": "Ama hina kaspa [[Special:Userlogin|yaykuy]] kay p'anqaman rinata icha kayta ruranata atinaykipaq.",
+       "exception-nologin-text-manual": "Ama hina kaspa, $1 kay p'anqata icha rurayta atinaykipaq.",
        "virus-badscanner": "Manam allintachu churapusqa: mana riqsisqa añaw maskaq: ''$1''",
        "virus-scanfailed": "manam atinchu añaw maskayta (tuyru: $1)",
        "virus-unknownscanner": "mana riqsisqa añaw qulluna (antivirus):",
        "userlogin-resetlink": "Yaykuna willayniykikunatari qunqarqankichu?",
        "userlogin-resetpassword-link": "Yaykuna rimaykita qunqarqankichu?",
        "userlogin-helplink2": "Yaykuywan yanapay",
+       "userlogin-loggedin": "{{GENDER:$1|$1}} sutiyuq kaspa yaykusqañam kachkanki.\nKay qatiq hunt'ana p'anqata llamk'achiy wakin sutiwan yaykunaykipaq.",
        "userlogin-createanother": "Huk rakiqunata kamariy",
        "createacct-emailrequired": "E-chaski imamayta",
        "createacct-emailoptional": "E-chaski imamayta (munaspayki)",
        "retypenew": "Musuq yaykuna rimaykita takyachiy:",
        "resetpass_submit": "Yaykuna rimata hukchaspa yaykuy",
        "changepassword-success": "Yaykuna rimaykiqa aypalla hukchasqañam.",
+       "changepassword-throttled": "Nisyu kutiñam yaykuykacharqunki.\nAma hina kaspa, $1 suyay manaraq musuqmanta yaykuykachaspayki.",
        "resetpass_forbidden": "Manam saqillanchu yaykuna rimata hukchayta",
        "resetpass-no-info": "Yaykunaykim tiyan kay p'anqata chiqalla aypanaykipaq.",
        "resetpass-submit-loggedin": "Yaykuna rimata hukchay",
        "resetpass-submit-cancel": "Tatiy",
        "resetpass-wrong-oldpass": "Mit'alla icha kunan yaykuna rimaqa manam allinchu.\nYaykuna rimaykitaqa aypalla hukcharqunkiñachá icha huk mit'alla yaykuna rimata mañakurqunkiñachá.",
+       "resetpass-recycled": "Ama hina kaspa, yaykuna rimaykita imamanpas kutichiy, amataq kunan kachkaq yaykuna rimaykimanchu.",
+       "resetpass-temp-emailed": "E-chaskiwan kachamusqa mit'alla yaykuna rimawanmi yaykurqunki. Chay yaykunaykita tukuchinaykipaqqa, kaypi musuq yaykuna rimaykita churay:",
        "resetpass-temp-password": "Mit'alla yaykuna rima:",
        "resetpass-abort-generic": "Yaykuna rima hukchaytaqa yapa wakichim p'itirqan.",
+       "resetpass-expired": "Yaykuna rimaykiqa mawk'ayasqañam. Ama hina kaspa, yaykunaykipaq musuq yaykuna rimaykita churay.",
+       "resetpass-expired-soft": "Yaykuna rimayki mawk'ayasqaña kaspa kutichinam tiyan. Ama hina kaspa, kunallan musuq yaykuna rimaykita akllay icha \"{{int:resetpass-submit-cancel}}\"-ta ñit'iy qhipaqta kutichinaykipaq.",
+       "resetpass-validity-soft": "Yaykuna rimaykiqa manam allinchu: $1.\n\nAma hina kaspa, kunallan musuq yaykuna rimaykita akllay icha \"{{int:resetpass-submit-cancel}}\"-ta ñit'iy qhipaqta kutichinaykipaq.",
        "passwordreset": "Yaykuna rimata kutichiy",
        "passwordreset-text-one": "Kay hunt'ana p'anqata hunt'ay, yaykuna rimaykita kutichinaykipaq.",
        "passwordreset-text-many": "{{PLURAL:$1|Kay k'itichakunamanta hukta hunt'achiy, yaykuna rimaykita kutichinaykipaq.}}",
        "changeemail-password": "{{SITENAME}} yaykuna rimayki:",
        "changeemail-submit": "E-chaskita wakinchay",
        "changeemail-cancel": "Ama niy",
+       "changeemail-throttled": "Nisyu kutiñam yaykuykacharqunki.\nAma hina kaspa, $1 suyay manaraq musuqmanta yaykuykachaspayki.",
        "resettokens": "Llawikunata kutichiy",
        "resettokens-no-tokens": "Manam kanchu kutichina llawikuna.",
        "resettokens-legend": "Llawikunata kutichiy",
        "invalid-content-data": "Samiqmanta willaykunaqa manam allinchu",
        "content-not-allowed-here": "\"$1\" nisqa samiqqa [[$2]] sutiyuq p'anqapi manam saqillasqachu",
        "editwarning-warning": "Kay p'anqata saqispaykiqa lliw rurarqusqayki hukchasqakunatachá chinkachiykiman.\nYaykusqa kaspaykiqa, kay yuyampayta hark'ayta atinki allinkachinaykikunapi \"Llamk'apusqa\" rakipi.",
+       "editpage-notsupportedcontentformat-title": "Samiqpa rikch'ayninqa manam q'imisqachu",
        "content-model-wikitext": "wiki qillqa",
        "content-model-text": "qillqalla",
        "content-model-javascript": "JavaScript",
        "currentrev": "Kunan hukchasqa",
        "currentrev-asof": "Kunan musuqchasqa, $1 pacha",
        "revisionasof": "$1-pa llamk'apusqan",
-       "revision-info": "Kayqa p'anqap mawk'a llamk'apusqa kasqanmi, $1 p'unchawpi $2-pa rurasqan",
+       "revision-info": "Kayqa p'anqap musuqchasqa kasqanmi, $1 p'unchawpi {{GENDER:$6|$2}}$7-pa rurasqan",
        "previousrevision": "← ñawpaq hukchasqa",
        "nextrevision": "Qatiq hukchasqa →",
        "currentrevisionlink": "Kunan hukchasqata qhaway",
        "revdelete-no-file": "Sapaqchasqa willañiqiqa manam kanchu.",
        "revdelete-show-file-confirm": "Allinta yachankichu \"<nowiki>$1</nowiki>\" willañiqimanta qullusqa $2-manta $3-pi musuqchasqata qhawayta munaspayki?",
        "revdelete-show-file-submit": "Arí",
+       "revdelete-selected-text": "{{PLURAL:$1|Akllasqa musuqchasqa|Akllasqa musuqchasqakuna}} [[:$2]]-manta:",
+       "revdelete-selected-file": "{{PLURAL:$1|Akllasqa p'anqa musuqchasqa|Akllasqa p'anqa musuqchasqakuna}} [[:$2]]-manta:",
        "logdelete-selected": "{{PLURAL:$1|Akllasqa tukusqa|Akllasqa tukusqakuna}} hallch'api:",
        "revdelete-confirm": "Ama hina kaspa, takyachiy munayniykita, qatiqninkunata riqsiyniykita, [[{{MediaWiki:Policy-url}}|kawpaykama]] rurayniykitapas.",
        "revdelete-suppress-text": "Pakay ruranata '''kaylla kaptin''' llamk'achiy:\n* K'amiqchá willakuna\n* Runamanta mana allin willakuna\n*: ''wasi tiyay imamaytakuna, karu rimay huchhakuna, mamallaqta sut'inchay huchhakuna, chay hinakunapas.''",
        "difference-missing-revision": "Kay wakin kaymanta ($1) {{PLURAL:$2|huk musuqchasqa|$2 musuqchasqakuna}} manam tarisqachu.\n\nKayqa tukurqanman qullusqa p'anchaman t'inkimuq mawk'ayasqa wiñay kawsay t'inkiraykuchá.\nImaymanata [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} qulluy hallch'apim] tariykiman.",
        "searchresults": "Maskaymanta tarisqakuna",
        "searchresults-title": "\"$1\" nisqapaq maskaspa taripasqakuna",
-       "toomanymatches": "Nisyu taripasqakunam kutisqa, ama hina kaspa, huk taripanawan ruraykachay",
        "titlematches": "P'anqakunap sutinkunapi tarisqa",
        "textmatches": "P'anqakunap qillqankunapi tarisqa",
        "notextmatches": "Manam ima p'anqakunap qillqankunapipas tarisqachu",
        "searchmenu-exists": "'''Kay wikipiqa «[[$1]]» sutiyuq p'anqam kachkan'''",
        "searchmenu-new": "<strong>Kay wikipi \"[[:$1]]\" sutiyuq p'anqata kamariy!</strong> {{PLURAL:$2|0=|Maskayniykiwan tarisqa p'anqatapas qhaway.|Maskaywan taripasqakunatapas qhaway.}}'",
        "searchprofile-articles": "Samiq p'anqakuna",
-       "searchprofile-project": "Yanapanapaq ruraykamaypaqpas p'anqakuna",
        "searchprofile-images": "Multimidya",
        "searchprofile-everything": "Tukuy",
        "searchprofile-advanced": "Ñawparikusqa",
        "searchprofile-articles-tooltip": "$1 nisqapi maskay",
-       "searchprofile-project-tooltip": "$1 nisqapi maskay",
        "searchprofile-images-tooltip": "Willañiqikunata maskay",
        "searchprofile-everything-tooltip": "Tukuy samiqninpi maskay (rimanakuy p'anqakunapipas)",
        "searchprofile-advanced-tooltip": "Akllasqa suti k'itikunapi maskay",
        "search-result-score": "Chaniyuq kaynin: $1%",
        "search-redirect": "(pusapuna $1)",
        "search-section": "(raki $1)",
+       "search-file-match": "(willañiqip samiqninta taripan)",
        "search-suggest": "Kaytachu niyta munanki? - $1",
        "search-interwiki-caption": "Ñaña ruraykamaykuna",
-       "search-interwiki-default": "$1 taripasqakuna:",
+       "search-interwiki-default": "$1-manta taripasqakuna:",
        "search-interwiki-more": "(aswan)",
        "search-relatedarticle": "Apanakuq",
-       "searcheverything-enable": "Tukuy suti k'itikunapi maskay",
        "searchrelated": "apanakuq",
        "searchall": "tukuy",
        "showingresults": "Qhipanpiqa rikuchkanki {{PLURAL:$1|'''1''' tarisqatam|'''$1'''-kama tarisqakunatam}}, '''$2''' huchhawan qallarispa.",
+       "showingresultsinrange": "Qhipanpiqa rikuchkanki {{PLURAL:$1|<strong>1</strong>-kama tarisqatam|<strong>$1</strong>-kama tarisqakunatam}}, #<strong>$2</strong> huchhamanta #<strong>$3</strong> huchhakama.",
        "showingresultsnum": "Qhipanpiqa rikuchkanki {{PLURAL:$3|'''1''' tarisqatam|'''$3''' tarisqakunatam}}, '''$2''' yupaywan qallarispa.",
        "showingresultsheader": "{{PLURAL:$5|Taripasqa: '''$1''', '''$3'''-manta|Taripasqa: '''$1 - $2''', '''$3'''-manta}}, '''$4'''-paq",
        "search-nonefound": "Maskaypaq kay hina kachun nisqakamaqa manam kanchu taripasqakuna.",
        "allowemail": "Huk ruraqkunamanta e-chaskita saqillay",
        "prefs-searchoptions": "Maskay",
        "prefs-namespaces": "Suti k'itikuna",
-       "defaultns": "Mana hinaptintaq kay suti k'itikunapi maskay:",
        "default": "kikinmanta",
        "prefs-files": "Willañiqikuna",
        "prefs-custom-css": "Munakusqa CSS",
        "right-move": "P'anqakunata astay",
        "right-move-subpages": "P'anqakunata urin p'anqankunatawan astay",
        "right-move-rootuserpages": "Ruraqpa saphi p'anqankunata astay",
+       "right-move-categorypages": "Katiguriya p'anqakunata astay",
        "right-movefile": "Willañiqikunata astay",
        "right-suppressredirect": "Huk p'anqata astaspa pusapuna p'anqata mana kamariy",
        "right-upload": "Willañiqikunata churkuy",
        "action-createpage": "p'anqakunata kamariy",
        "action-createtalk": "rimanakuy p'anqakunata kamariy",
        "action-createaccount": "kay ruraqpa rakiqunanta kamariy",
+       "action-history": "kay p'anqap wiñay kawsayninta qhaway",
        "action-minoredit": "kay llamk'apusqata asllalla nispa sananchay",
        "action-move": "kay p'anqata astay",
        "action-move-subpages": "kay p'anqata urin p'anqankunatapas astay",
        "action-move-rootuserpages": "ruraqpa saphi p'anqankunata astay",
+       "action-move-categorypages": "katiguriya p'anqakunata astay",
        "action-movefile": "kay willañiqita astay",
        "action-upload": "kay willañiqita churkuy",
        "action-reupload": "kay kachkaqña willañiqita huknachay",
        "recentchanges-label-minor": "Kayqa aslla llamk'apuymi",
        "recentchanges-label-bot": "Kayqa rurana antachap llamk'apusqanmi",
        "recentchanges-label-unpatrolled": "Kay llamk'apusqaqa manaraqmi patrullasqachu",
+       "recentchanges-label-plusminus": "P'anqap chhikan, kay byte yupaywan wakinchasqa",
        "recentchanges-legend-heading": "'''Sut'ichana:'''",
-       "recentchanges-legend-newpage": "([[Special:NewPages|musuq p'anqakunatapas]] qhaway)",
-       "rcnotefrom": "Kay qatiqpiqa '''$2'''-mantapacha ('''$1'''-kama) hukchasqakunatam rikunki.",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|musuq p'anqakunatapas]] qhaway)",
+       "rcnotefrom": "Kay qatiqpiqa <strong>$2</strong>-mantapacha (<strong>$1</strong>-kama) hukchasqakunatam rikunki.",
        "rclistfrom": "$3 $2-manta musuq hukchasqakunata rikuchiy",
        "rcshowhideminor": "$1 uchuylla llamk'apusqakunata",
+       "rcshowhideminor-show": "Rikuchiy",
+       "rcshowhideminor-hide": "Pakay",
        "rcshowhidebots": "$1 rurana antachakunata",
+       "rcshowhidebots-show": "Rikuchiy",
+       "rcshowhidebots-hide": "Pakay",
        "rcshowhideliu": "$1 hallch'asqa ruraqkunata",
+       "rcshowhideliu-show": "Rikuchiy",
+       "rcshowhideliu-hide": "Pakay",
        "rcshowhideanons": "$1 IP-niyuq ruraqkunata",
+       "rcshowhideanons-show": "Rikuchiy",
+       "rcshowhideanons-hide": "Pakay",
        "rcshowhidepatr": "$1 patrullachasqa llamk'apusqakunata",
+       "rcshowhidepatr-show": "Rikuchiy",
+       "rcshowhidepatr-hide": "Pakay",
        "rcshowhidemine": "$1 llamk'apusqaykunata",
+       "rcshowhidemine-show": "Rikuchiy",
+       "rcshowhidemine-hide": "Pakay",
        "rclinks": "Qhipaq $1 hukchasqata qhipaq $2 p'unchawmanta qhaway.<br />$3",
        "diff": "dif",
        "hist": "wñka",
        "fileexists-shared-forbidden": "Kay sutiyuq willañiqiqa kachkañam rakinakusqa willañiqi qullqapi. Ama hina kaspa, churkuyta munaspaykiraq, ñawpaq p'anqaman kutispa willañiqiykita huk sutiwan churkuy. [[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Kay willañiqiqa kay qatiq {{PLURAL:$1|willañiqip|willañiqikunap}} iskaychasqanmi:",
        "file-deleted-duplicate": "Kay hinalla ([[:$1]]) willañiqiña qullusqam karqa. Qhawariy imarayku qullusqa karqa, manaraq musuqmanta churkuykachaspa.",
+       "file-deleted-duplicate-notitle": "Kay willañiqiwan kaqlla kaq willañiqi qullusqañam karqan, sutintaq uraychasqam karqan. Ama hina kaspa, uraychasqa willañiqikunata qhawayta atiq runata tapuy kay sasachakuyta kuskinaykipaq, willañiqita manaraq churkuspa.",
        "uploadwarning": "Willañiqi churkuymanta paqtataq niy",
        "uploadwarning-text": "Ama hina kaspa, kay qatiqpi kaq willañiqimanta willaykunata hukchaspa musuqmanta ruraykachay.",
        "savefile": "Willañiqita waqaychay",
        "uploaddisabledtext": "Willañiqi churkuyqa manam saqillasqachu.",
        "php-uploaddisabledtext": "PHP-wan willañiqi churkuyqa hark'asqam. Ama hina kaspa, willañiqi churkuy allinkachinakunata llanchiy.",
        "uploadscripted": "Kay willañiqiqa wakichi icha HTML qillqayuqmi, llika wamp'unaqa pantalla unanchanmanchá.",
+       "uploadscriptednamespace": "Kay SVG willañiqiqa mana allin \"$1\" sutisuyuyuqmi.",
        "uploadinvalidxml": "Manam atinichu churkusqa willañiqipi XML-ta kuskiyta.",
        "uploadvirus": "Willañiqipiqa añawmi! Yuyay: $1",
        "uploadjava": "Kay ZIP willañiqiqa Java .class willañiqiyuqmi.\nJava churkuyqa manam saqillasqachu, qasikanapaq saywachasqa kanman karunchana tiyanman.",
        "download": "chaqnamuy",
        "unwatchedpages": "Mana watiqasqa p'anqakuna",
        "listredirects": "Tukuy pusapuykuna",
+       "listduplicatedfiles": "Iskaychasqayuq willañiqikuna",
+       "listduplicatedfiles-summary": "Kaypiqa iskaychasqayuq willañiqikunatam rikunki: paypaq lliwmanta aswan musuq musuqchasqaqa huk willañiqipaq lliwmanta aswan musuq musuqchasqamanta iskaychasqam, kay tiyayllapi kaq willañiqipura.",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]]-manta [[$3|{{PLURAL:$2|huk iskaychasqam|$2 iskaychasqam}}]] kan.",
        "unusedtemplates": "Mana llamk'achisqa plantillakuna",
        "unusedtemplatestext": "Kay p'anqapi tukuy {{ns:template}} suti k'itipi kaq, manataq huk p'anqapi ch'aqtasqa p'anqakunap sutinkunam. Yuyariy, manaraq qulluspayki chay p'anqakunaman t'inkikunata qhaway.",
        "unusedtemplateswlh": "huk t'inkikuna",
        "pageswithprop-submit": "Riy",
        "doubleredirects": "Iskaylla pusapunakuna",
        "doubleredirectstext": "Kay p'anqapiqa huk pusapuna p'anqaman pusapuq p'anqakunap sutinkunatam rikunki. Sapa sinrupiqa ñawpaq ñiqin, iskay ñiqinpas pusapunaman t'inkikunam, iskay ñiqin pusapunap taripananpa qallariyninpas, sapsilla \"chiqap\" allin taripana qillqam, maymanchus ñawpaq ñiqin pusapuna p'anqa pusachun.\n<del>Chakapusqa</del> taripasqakunaqa paskasqañam.",
-       "double-redirect-fixed-move": "[[$1]] nisqaqa astasqam, kunantaq [[$2]] nisqaman pusapunam",
-       "double-redirect-fixed-maintenance": "[[$1]]-manta [[$2]]-man iskaylla pusapunata allinchaspa.",
+       "double-redirect-fixed-move": "[[$1]] nisqaqa astasqam. Kikinmantataq musuqchasqa kaspa kunan [[$2]] nisqaman pusapunam.",
+       "double-redirect-fixed-maintenance": "Hat'alliy llamk'aykuypi [[$1]]-manta [[$2]]-man iskaylla pusapunata kikinmanta allinchaspa.",
        "double-redirect-fixer": "Pusapuna allinchaq",
        "brokenredirects": "P'akisqa pusapunakuna",
        "brokenredirectstext": "Kay pusapuna p'anqakunaqa mana kachkaq p'anqakunamanmi pusapuchkan:",
        "ninterwikis": "{{PLURAL:$1|huk wikipura|$1 wikipura}}",
        "nlinks": "$1 {{PLURAL:$1|t'inki|t'inkikuna}}",
        "nmembers": "$1 {{PLURAL:$1|qillqa|qillqakuna}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|wankurisqa|wankurisqakuna}}",
        "nrevisions": "$1 {{PLURAL:$1|llamk'apusqa|llamk'apusqakuna}}",
        "nviews": "$1 {{PLURAL:$1|rikuy|rikuykuna}}",
        "nimagelinks": "$1 {{PLURAL:$1|p'anqapi|p'anqakunapi}} llamk'achisqa",
        "wantedtemplates": "Munakusqa plantillakuna",
        "mostlinked": "Lliwmanta aswan t'inkimuqniyuq qillqakuna",
        "mostlinkedcategories": "Lliwmanta aswan t'inkimuqniyuq katiguriyakuna",
-       "mostlinkedtemplates": "Lliwmanta aswan t'inkimuqniyuq plantillakuna",
+       "mostlinkedtemplates": "Lliwmanta aswan t'inkimuqniyuq p'anqakuna",
        "mostcategories": "Lliwmanta aswan katiguriyayuq p'anqakuna",
        "mostimages": "Lliwmanta astawan llamk'achisqa rikchakuna",
        "mostinterwikis": "Lliwmanta aswan wikipurayuq p'anqakuna",
        "listgrouprights-removegroup-self": "{{PLURAL:$2|Huñu|Huñukuna}}tam qichuyta atin kikinpa raqiqunanmanta: $1",
        "listgrouprights-addgroup-self-all": "Tukuy huñukunatam yapayta atin kikinpa raqiqunanman",
        "listgrouprights-removegroup-self-all": "Tukuy huñukunatam qichuyta atin kikinpa raqiqunanmanta",
+       "listgrouprights-namespaceprotection-header": "Suti k'iti saywachanakuna",
+       "listgrouprights-namespaceprotection-namespace": "Suti k'iti",
+       "trackingcategories-name": "Willaypa sutin",
+       "trackingcategories-nodesc": "T'iktuna manam kanchu.",
+       "trackingcategories-disabled": "Katiguriyaman ama nisqa",
        "mailnologin": "Imamaytataqa ama kachaychu",
        "mailnologintext": "[[Special:UserLogin|Yaykunaykim]], [[Special:Preferences|allinkachinaykikunapi]] chaniyuq e-chaski imamaytappas kananmi tiyan huk ruraqkunaman e-chaskita kachanaykipaq.",
        "emailuser": "Kay ruraqman e-chaskita kachay",
        "unwatchthispage": "Amaña watiqaychu",
        "notanarticle": "Manam qillqachu",
        "notvisiblerev": "Musuqchasqaqa qullusqam",
-       "watchlist-details": "Watiqana sutisuyuykipiqa {{PLURAL:$1|huk p'anqam|$1 p'anqakunam}}, rimanakuna p'anqakunata mana yupaspa.",
+       "watchlist-details": "Watiqana sutisuyuykipiqa {{PLURAL:$1|$1 p'anqam|$1 p'anqakunam}}, rimanakuna p'anqakunata mana yupaspa.",
        "wlheader-enotif": "E-chaskimanta musyachinaman arí nisqañam.",
        "wlheader-showupdated": "Qayna watukamusqaykimantapacha hukchasqa p'anqakunataqa '''yanasapa''' nisqapim rikunki.",
        "wlshowlast": "$1 ura, $2 p'unchaw $3-mantapacha hukchasqakunata rikuchiy",
        "protect-locked-blocked": "Hark'asqa kaspayki manam atinkichu amachasqa kachkayninta hukchayta. Kay qatiqpiqa '''$1''' sutiyuq p'anqap kunan allinkachinankunatam rikunki:",
        "protect-locked-dblock": "Willañiqintin hark'asqa kachkaptinmi, manam atinkichu amachaypa kachkayninkunata hukchayta.\nKay qatiqpiqa '''$1''' sutiyuq p'anqap kunan allinkachinankunatam rikunki:",
        "protect-locked-access": "Qampa rakiqunaykiwanqa manam p'anqa amachaypa kachkayninkunata hukchayta atinkichu.\nKay qatiqpiqa '''$1''' sutiyuq p'anqap kunan allinkachinankunatam rikunki:",
-       "protect-cascadeon": "Kay p'anqaqa amachasqam kachkan, kay phaqchalla amachasqa {{PLURAL:$1|p'anqapi|p'anqakunapi}} ch'aqtasqa kaspanmi. Kay p'anqap amachasqa kachkayninta hukchaytam atinki, hinaspapas manam phaqcha nisqa amachasqa kaynintachu hukchanki.",
+       "protect-cascadeon": "Kay p'anqaqa amachasqam kachkan, kay phaqchalla amachasqa {{PLURAL:$1|p'anqapi|p'anqakunapi}} ch'aqtasqa kaspanmi.\nKay p'anqap amachasqa kachkayninta hukchaspaykiqa manam phaqcha nisqa amachasqa kaynintachu hukchanki.",
        "protect-default": "Tukuy ruraqkunapaq",
        "protect-fallback": "\"$1\" saqillanayuq ruraqkunallapaq",
        "protect-level-autoconfirmed": "Kikin rakiqunayuq ruraqkunallapaq",
        "contributions-title": "$1 sutiyuq ruraqpa llamk'apusqankuna",
        "mycontris": "Llamk'apusqaykuna",
        "contribsub2": "{{GENDER:$3|$1}}paq ($2)",
+       "contributions-userdoesnotexist": "\"$1\" sutiyuq rakiqunaqa manam hallch'asqachu.",
        "nocontribs": "Manam kay hina hukchasqakuna kanchu.",
        "uctop": "(qhipaq hukchasqa)",
        "month": "Kay killamanta (ñawpaqmantapas):",
        "sp-contributions-newbies-sub": "Musuqkunapaq",
        "sp-contributions-newbies-title": "Musuq ruraqkunap llamk'apusqankuna",
        "sp-contributions-blocklog": "Hark'ay hallch'asqakuna",
+       "sp-contributions-suppresslog": "uraychasqa ruraqpa hukchasqankuna",
        "sp-contributions-deleted": "qullusqa ruraqpa hukchasqankuna",
        "sp-contributions-uploads": "churkuykuna",
        "sp-contributions-logs": "hallch'akuna",
        "sp-contributions-search": "Llamk'apusqakunata maskay",
        "sp-contributions-username": "IP huchha icha ruraqpa sutin:",
        "sp-contributions-toponly": "Pata musuqchasqakunallata rikuchiy",
+       "sp-contributions-newonly": "P'anqa kamarisqakunallata rikuchiy",
        "sp-contributions-submit": "Maskay",
        "whatlinkshere": "Kayman t'inkimuq",
        "whatlinkshere-title": "$1 sutiyuq p'anqaman t'inkimuqkuna",
        "tooltip-preferences-save": "Akllasqakunata waqaychay",
        "tooltip-summary": "Pisichaychata yaykuchiy",
        "common.css": "/* Churamusqa CSS chantakunaqa tukuy qarakunapim llamk'anqa */",
-       "cologneblue.css": "/* Churamusqa CSS chantakunaqa ''Cologne Blue skin'' nisqa qarata llamk'achiq ruraqkunapaq llamk'anqa */",
-       "monobook.css": "/* Kayman churasqa CSS nisqaqa Monobook qaratam hukchanqa tukuy internet tiyanapaq */",
-       "modern.css": "/* Churamusqa CSS chantakunaqa ''Modern skin'' nisqa qarata llamk'achiq ruraqkunapaq llamk'anqa */",
        "print.css": "/* Churamusqa CSS chantakunaqa ch'ipachinap rikch'akuynintam hukchanqa */",
        "common.js": "/* Ima kaypi kaq JavaScript qillqapas tukuy ruraqkunapaq tukuy p'anqakunap tukuy chaqnankunapi chaqnamusqa kanqa. */",
-       "cologneblue.js": "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas ''Cologne Blue skin'' nisqa qarata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
-       "monobook.js": "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas MonoBook nisqata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
-       "modern.js": "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas ''Modern skin'' nisqa qarata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
        "anonymous": "{{SITENAME}}pi sutinnaq {{PLURAL:$1|ruraq|ruraqkuna}}",
        "siteuser": "{{SITENAME}}-pa $1 sutiyuq ruraqnin",
        "anonuser": "{{SITENAME}} rakiqunannaq ruraq $1",
        "confirm-watch-top": "Kay p'anqata watiqayta munankichu?",
        "confirm-unwatch-button": "Arí niy",
        "confirm-unwatch-top": "Kay p'anqata manaña watiqayta munankichu?",
+       "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← ñawpaq p'anqa",
        "imgmultipagenext": "qatiq p'anqa →",
        "imgmultigo": "Riy!",
        "imgmultigoto": "$1 sutiyuq p'anqaman riy",
        "img-lang-default": "(kikinmanta rimay)",
+       "img-lang-info": "Rikchata kaypi rindirisay: $1. $2",
        "img-lang-go": "Riy",
        "ascending_abbrev": "wich",
        "descending_abbrev": "uray",
        "watchlistedit-raw-done": "Watiqana sutisuyuykiqa musuqchasqañam.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Huk yapasqa p'anqa suti|$1 yapasqa p'anqa sutikuna}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Huk qichusqa p'anqa suti|$1 qichusqa p'anqa sutikuna}}:",
+       "watchlistedit-clear-title": "Ch'usaqchasqa watiqana sutisuyu",
+       "watchlistedit-clear-legend": "Watiqana sutisuyuta ch'usaqchay",
+       "watchlistedit-clear-explain": "Tukuy qillqa sutikunam watiqana sutisuyuykimanta qichusqa kanqa",
+       "watchlistedit-clear-titles": "P'anqakuna:",
+       "watchlistedit-clear-submit": "Watiqana sutisuyuta ch'usaqchay (manapunim kutichisqachu kanqa!)",
+       "watchlistedit-clear-done": "Watiqana sutisuyuykiqa ch'usaqchasqañam.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Huk qichusqa p'anqa suti|$1 qichusqa p'anqa sutikuna}}:",
+       "watchlistedit-too-many": "Kaypiqa nisyu qhawana p'anqakunam.",
+       "watchlisttools-clear": "Watiqana sutisuyuta ch'usaqchay",
        "watchlisttools-view": "Hukchasqakunata qhaway",
        "watchlisttools-edit": "Watiqana sutisuyuta qhawaspa llamk'apuy",
        "watchlisttools-raw": "Chawa watiqana sutisuyuta llamk'apuy",
        "htmlform-no": "Mana",
        "htmlform-yes": "Arí",
        "htmlform-chosen-placeholder": "Akllanata akllay",
+       "htmlform-cloner-create": "Astawan yapay",
+       "htmlform-cloner-delete": "Qichuy",
        "sqlite-has-fts": "$1 hunt'a qillqa maskana yanapawan",
        "sqlite-no-fts": "$1 mana hunt'a qillqa maskana yanapawan",
        "logentry-delete-delete": "{{GENDER:$2|}}$1 sutiyuq ruraqqa $3 nisqa p'anqatam qullun",
index b1b19df..d00255d 100644 (file)
        "qbmyoptions": "Mia pagina",
        "faq": "FAQ",
        "faqpage": "Project:FAQ",
-       "vector-action-addsection": "Agiuntar chapitel",
-       "vector-action-delete": "Stizzar",
-       "vector-action-move": "Spustar",
-       "vector-action-protect": "Bloccar",
-       "vector-action-undelete": "Restituir",
-       "vector-action-unprotect": "Midar la protecziun",
-       "vector-view-create": "Crear",
-       "vector-view-edit": "Modifitgar",
-       "vector-view-history": "Cronologia",
-       "vector-view-view": "Leger",
-       "vector-view-viewsource": "Mussar il code",
        "actions": "Acziuns",
        "namespaces": "Tip da pagina",
        "variants": "Variantas",
        "difference-missing-revision": "{{PLURAL:$2|Ina versiun|$2 versiuns}} da questa differenza ($1) {{PLURAL:$2|n'è betg vegnida chattada|n'èn betg vegnidas chattadas}}.\n\nPer ordinari vegn quai chaschunà dad ina colliaziun da diff antiquada ad ina pagian ch'è vegnida stizzada. \nDetagls pon vegnir chattads en il [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protocol da stizzar].",
        "searchresults": "Resultats da tschertga",
        "searchresults-title": "Resultats da tschertga per \"$1\"",
-       "toomanymatches": "Il dumber dals resultats è memia grond. Tschertga per plaschair auters terms.",
        "titlematches": "Titels da paginas che correspundan",
        "textmatches": "Texts da paginas che correspundan",
        "notextmatches": "Nagin text correspunda",
        "searchmenu-exists": "'''Igl exista ina pagina cun il num \"[[:$1]] sin questa vichi\"'''",
        "searchmenu-new": "<strong>Crear la pagina «[[:$1]]» sin quest vichi!</strong> {{PLURAL:$2|0=|Vesair er la pagina chattada cun tia tschertga.|Vesair er las resultats da tia tschertga.}}",
        "searchprofile-articles": "Paginas da cuntegn",
-       "searchprofile-project": "Agid e paginas dal project",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Tut",
        "searchprofile-advanced": "Avanzà",
        "searchprofile-articles-tooltip": "Tschertgar en $1",
-       "searchprofile-project-tooltip": "Tschertgar en $1",
        "searchprofile-images-tooltip": "Tschertgar datotecas",
        "searchprofile-everything-tooltip": "Tschertgar en tut il cuntegn (inclusivamain paginas da discussiun)",
        "searchprofile-advanced-tooltip": "Tschertgar en ulteriurs tips da pagina",
        "search-interwiki-default": "$1 resultats:",
        "search-interwiki-more": "(dapli)",
        "search-relatedarticle": "Sumegliant",
-       "searcheverything-enable": "Tschertgar en tut ils tips da pagina",
        "searchrelated": "sumegliant",
        "searchall": "tuts",
        "showingresults": "Sutvart èn enfin {{PLURAL:$1|'''in''' resultat|'''$1''' resultats}} cumenzond cun il numer '''$2'''.",
        "allowemail": "Retschaiver e-mails dad auters utilisaders",
        "prefs-searchoptions": "Tschertgar",
        "prefs-namespaces": "Tips da pagina",
-       "defaultns": "Uschiglio tschertgar en quests tips da pagina:",
        "default": "Standard",
        "prefs-files": "Datotecas",
        "prefs-custom-css": "CSS persunalisà",
        "prefs-emailconfirm-label": "Confirmaziun per e-mail:",
        "youremail": "Adressa dad e-mail:",
        "username": "{{GENDER:$1|Num d'utilisader|Num da l'utilisadra}}:",
-       "uid": "ID da l'{{GENDER:$1|utilisader|utilisadra}}:",
        "prefs-memberingroups": "{{GENDER:$2|Commember|Commembra}} da {{PLURAL:$1|la gruppa|las gruppas}}:",
        "prefs-registration": "Temp da registraziun:",
        "yourrealname": "Num real:",
        "recentchanges-label-bot": "Questa modificaziun è vegnida exequida dad in bot",
        "recentchanges-label-unpatrolled": "Questa midada n'è anc betg vegnida controllada",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "(vesair era la [[Special:NewPages|glista da novas paginas]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vesair era la [[Special:NewPages|glista da novas paginas]])",
        "rcnotefrom": "I vegnan mussadas las midadas a partir da las <strong>$4</strong> dals <strong>$3</strong> (maximalmain <strong>$1</strong>).",
        "rclistfrom": "Mussar las novas midadas a partir da las $2 dals $3",
        "rcshowhideminor": "$1 midadas pitschnas",
        "log-title-wildcard": "Tschertgar titels che cumenzan cun quest text",
        "showhideselectedlogentries": "Mussar/zuppentar las endataziuns tschernidas dal protocol",
        "allpages": "Tut ils artitgels",
-       "alphaindexline": "$1 enfin $2",
        "nextpage": "proxima pagina ($1)",
        "prevpage": "ultima pagina ($1)",
        "allpagesfrom": "Mussar paginas davent da:",
        "tooltip-preferences-save": "Memorisar las preferenzas",
        "tooltip-summary": "Endatescha ina curta resumaziun",
        "common.css": "",
-       "monobook.css": "/* editescha quest file per adattar il skin momobook per l'entira pagina */",
-       "monobook.js": "",
        "anonymous": "{{PLURAL:$1|In utilisader anonim|Utilisaders anonims}} da {{SITENAME}}",
        "siteuser": "utilisader $1 da {{SITENAME}}",
        "anonuser": "Utilisader anonim $1 da {{SITENAME}}",
index 64676fd..662a388 100644 (file)
                        "TTO",
                        "Urhixidur",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "XXN"
                ]
        },
        "tog-underline": "Sublinierea legăturilor:",
        "tog-hideminor": "Ascunde modificările minore în schimbări recente",
-       "tog-hidepatrolled": "Ascunde modificările patrulate în schimbări recente",
+       "tog-hidepatrolled": "Ascunde modificările patrulate în schimbările recente",
        "tog-newpageshidepatrolled": "Ascunde paginile patrulate din lista de pagini noi",
        "tog-extendwatchlist": "Extinde lista de articole urmărite pentru a arăta toate schimbările efectuate, nu doar pe cele mai recente",
        "tog-usenewrc": "Grupează modificările după pagină în cadrul schimbărilor recente și listei paginilor urmărite",
        "qbmyoptions": "Paginile mele",
        "faq": "Întrebări frecvente",
        "faqpage": "Project:Întrebări frecvente",
-       "vector-action-addsection": "Mesaj nou",
-       "vector-action-delete": "Ștergere",
-       "vector-action-move": "Redenumire",
-       "vector-action-protect": "Protejare",
-       "vector-action-undelete": "Recuperare",
-       "vector-action-unprotect": "Modificare protecție",
-       "vector-view-create": "Creare",
-       "vector-view-edit": "Modificare",
-       "vector-view-history": "Istoric",
-       "vector-view-view": "Lectură",
-       "vector-view-viewsource": "Sursă pagină",
        "actions": "Acțiuni",
        "namespaces": "Spații de nume",
        "variants": "Variante",
        "currentrev": "Versiunea curentă",
        "currentrev-asof": "Versiunea curentă din $1",
        "revisionasof": "Versiunea de la data $1",
-       "revision-info": "Versiunea din $1; autor: $2",
+       "revision-info": "Versiunea din $1; autor: {{GENDER:$6|$2}}$7",
        "previousrevision": "←Versiunea anterioară",
        "nextrevision": "Versiunea următoare →",
        "currentrevisionlink": "Versiunea curentă",
        "mergehistory-empty": "Reviziile nu pot fi combinate.",
        "mergehistory-success": "$3 {{PLURAL:$3|versiune|versiuni|de versiuni}} ale [[:$1]] {{PLURAL:$3|a fost unită|au fost unite|au fost unite}} cu succes în [[:$2]].",
        "mergehistory-fail": "Nu se poate executa combinarea istoricului, te rog verifică parametrii pagină și timp.",
+       "mergehistory-fail-toobig": "Nu s-a putut efectua unirea istoricelor întrucât s-ar fi depășit limita de $1 {{PLURAL:$1|versiune|versiuni|de versiuni}} mutat{{PLURAL:$1|ă|e}}.",
        "mergehistory-no-source": "Pagina sursă $1 nu există.",
        "mergehistory-no-destination": "Pagina de destinație $1 nu există.",
        "mergehistory-invalid-source": "Pagina sursă trebuie să aibă un titlu valid.",
        "difference-missing-revision": "{{PLURAL:$2|O versiune a|$2 versiuni ale|$2 de versiuni ale}} acestei diferențe ($1) nu {{PLURAL:$2|a fost găsită|au fost găsite}}.\n\nAcest lucru se întâmplă de obicei atunci când se accesează o legătură expirată către istoricul unei pagini șterse.\nDetalii se pot găsi în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jurnalul ștergerilor].",
        "searchresults": "Rezultatele căutării",
        "searchresults-title": "Rezultatele căutării pentru „$1”",
-       "toomanymatches": "Prea multe rezultate au fost întoarse, încercă o căutare diferită",
        "titlematches": "Rezultate din titlurile paginilor",
        "textmatches": "Rezultate din conținutul paginilor",
        "notextmatches": "Nici un rezultat în textele articolelor",
        "searchmenu-exists": "'''Există o pagină cu titlul „[[:$1]]'” pe acest site.'''",
        "searchmenu-new": "<strong>'''Creați pagina „[[:$1]]” pe acest wiki!'''</strong> {{PLURAL:$2|0=|Vedeți, de asemenea, pagina găsită în urma căutării dumneavoastră.|Vedeți, de asemenea, rezultatele căutării.}}",
        "searchprofile-articles": "Pagini cu conținut",
-       "searchprofile-project": "Pagini din spațiile Proiect și Ajutor",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Totul",
        "searchprofile-advanced": "Avansat",
        "searchprofile-articles-tooltip": "Caută în $1",
-       "searchprofile-project-tooltip": "Caută în $1",
        "searchprofile-images-tooltip": "Caută fișiere",
        "searchprofile-everything-tooltip": "Caută în tot conținutul (incluzând paginile de discuție)",
        "searchprofile-advanced-tooltip": "Caută în spații de nume personalizate",
        "search-interwiki-default": "Rezultate de la $1:",
        "search-interwiki-more": "(mai mult)",
        "search-relatedarticle": "Relaționat",
-       "searcheverything-enable": "Caută în toate spațiile de nume",
        "searchrelated": "relaționat",
        "searchall": "toate",
        "showingresults": "Mai jos {{PLURAL:$1|apare '''1''' rezultat|apar '''$1''' rezultate|apar '''$1''' de rezultate}} începând cu nr. <b>$2</b>.",
        "powersearch-togglelabel": "Selectare:",
        "powersearch-toggleall": "Tot",
        "powersearch-togglenone": "Nimic",
+       "powersearch-remember": "Reține selecția pentru căutările viitoare",
        "search-external": "Căutare externă",
        "searchdisabled": "<p>Ne pare rău! Căutarea după text a fost dezactivată temporar, din motive de performanță. Între timp puteți folosi căutarea prin Google mai jos, însă aceasta poate să dea rezultate învechite.</p>",
        "search-error": "A apărut o eroare în timpul căutării: $1",
        "allowemail": "Acceptă e-mail de la alți utilizatori",
        "prefs-searchoptions": "Căutare",
        "prefs-namespaces": "Spații de nume",
-       "defaultns": "Altfel, caută în aceste spații de nume:",
        "default": "standard",
        "prefs-files": "Fișiere",
        "prefs-custom-css": "CSS personalizat",
        "recentchanges-label-unpatrolled": "Această modificare nu a fost încă verificată",
        "recentchanges-label-plusminus": "Dimensiunea paginii s-a modificat corespunzător acestui număr de octeți",
        "recentchanges-legend-heading": "'''Legendă:'''",
-       "recentchanges-legend-newpage": "(vedeți și [[Special:NewPages|lista cu pagini noi]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vedeți și [[Special:NewPages|lista cu pagini noi]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Dedesubt sunt modificările începând cu <b>$2</b> (maximum <b>$1</b> afișate).",
        "rclistfrom": "Se afișează modificările începând cu $3, $2",
        "largefileserver": "Fișierul este mai mare decât este configurat serverul să permită.",
        "emptyfile": "Fișierul pe care l-ați încărcat pare a fi gol. Aceasta poate fi datorită unei greșeli în numele fișierului. Verificați dacă într-adevăr doriți să încărcați acest fișier.",
        "windows-nonascii-filename": "Acest wiki nu acceptă nume de fișiere care conțin caractere speciale.",
-       "fileexists": "Un fișier cu același nume există deja, vă rugăm verificați <strong>[[:$1]]</strong> dacă nu sunteți sigur dacă doriți să îl modificați.\n[[$1|thumb]]",
+       "fileexists": "Un fișier cu același nume există deja; vă rugăm să verificați <strong>[[:$1]]</strong> în cazul în care nu sunteți sigur{{GENDER:||ă|}} că doriți să îl modificați.\n[[$1|thumb]]",
        "filepageexists": "Pagina cu descrierea fișierului a fost deja creată la <strong>[[:$1]]</strong>, dar niciun fișier cu acest nume nu există în acest moment.\nSumarul pe care l-ai introdus nu va apărea în pagina cu descriere.\nPentru ca sumarul tău să apară, va trebui să îl adaugi manual.\n[[$1|miniatură]]",
-       "fileexists-extension": "Un fișier cu un nume similar există: [[$2|thumb]]\n* Numele fișierului de încărcat: <strong>[[:$1]]</strong>\n* Numele fișierului existent: <strong>[[:$2]]</strong>\nTe rog alege alt nume.",
+       "fileexists-extension": "Un fișier cu un nume similar există: [[$2|thumb]]\n* Numele fișierului de încărcat: <strong>[[:$1]]</strong>\n* Numele fișierului existent: <strong>[[:$2]]</strong>\nPoate doriți să utilizați un nume mai distinctiv?",
        "fileexists-thumbnail-yes": "Fișierul pare a fi o imagine cu o rezoluție scăzută ''(thumbnail)''. [[$1|thumb]]\nVerifică fișierul<strong>[[:$1]]</strong>.\nDacă fișierul verificat este identic cu imaginea originală nu este necesară încărcarea altui thumbnail.",
        "file-thumbnail-no": "Numele fișierului începe cu <strong>$1</strong>.\nSe pare că este o imagine cu dimensiune redusă''(thumbnail)''.\nDacă ai această imagine la rezoluție mare încarc-o pe aceasta, altfel schimbă numele fișierului.",
        "fileexists-forbidden": "Un fișier cu acest nume există deja și nu poate fi rescris.\nMergeți înapoi și încărcați acest fișier sub un nume nou. [[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Ştergerea sau restaurarea fișierelor este temporar dezactivată pe timpul lucrărilor de mentenanță.",
        "filedelete-maintenance-title": "Fișierul nu a putut fi șters",
        "mimesearch": "Căutare MIME",
-       "mimesearch-summary": "This page enables the filtering of files for its MIME-type.\nInput: contenttype/subtype, e.g. <code>image/jpeg</code>.\n\n\nAceastă pagină specială permite căutarea fișierelor în funcție de tipul MIME (Multipurpose Internet Mail Extensions). Cele mai des întâlnite sunt:\n* Imagini : <code>image/jpeg</code>\n* Diagrame : <code>image/png</code>, <code>image/svg+xml</code>\n* Imagini animate : <code>image/gif</code>\n* Fișiere sunet : <code>audio/ogg</code>, <code>audio/x-ogg</code>\n* Fișiere video : <code>video/ogg</code>, <code>video/x-ogg</code>\n* Fișiere PDF : <code>application/pdf</code>",
+       "mimesearch-summary": "Această pagină permite filtrarea fișierelor în funcție de tipul MIME.\nDate de intrare: tip_de_conținut/subtip sau tip_de_conținut/*; ex. <code>image/jpeg</code>.",
        "mimetype": "Tip MIME:",
        "download": "descarcă",
        "unwatchedpages": "Pagini neurmărite",
        "wantedtemplates": "Formate dorite",
        "mostlinked": "Cele mai căutate articole",
        "mostlinkedcategories": "Cele mai căutate categorii",
-       "mostlinkedtemplates": "Cele mai folosite formate",
+       "mostlinkedtemplates": "Cele mai transcluse pagini",
        "mostcategories": "Articole cu cele mai multe categorii",
        "mostimages": "Cele mai căutate imagini",
        "mostinterwikis": "Pagini cu cele mai multe legături interwiki",
        "tooltip-preferences-save": "Salvează preferințele",
        "tooltip-summary": "Descrieți pe scurt modificarea",
        "interlanguage-link-title": "$1 – $2",
+       "interlanguage-link-title-nonlang": "$1 – $2",
        "common.css": "/** CSS plasate aici vor fi aplicate tuturor aparițiilor */",
-       "cologneblue.css": "/* CSS plasate aici vor afecta utilizatorii stilului Cologne Blue */",
-       "monobook.css": "/* modificați acest fișier pentru a adapta înfățișarea monobook-ului pentru tot situl*/",
-       "modern.css": "/* CSS plasate aici vor afecta utilizatorii stilului Modern */",
-       "vector.css": "/* CSS plasate aici vor afecta utilizatorii stilului Vector */",
        "print.css": "/* CSS plasate aici vor afecta modul în care paginile vor fi imprimate */",
        "anonymous": "{{PLURAL:$1|Utilizator anonim|Utilizatori anonimi}} ai {{SITENAME}}",
        "siteuser": "Utilizator {{SITENAME}} $1",
        "pageinfo-category-pages": "Număr de pagini",
        "pageinfo-category-subcats": "Număr de subcategorii",
        "pageinfo-category-files": "Număr de fișiere",
-       "skinname-cologneblue": "Albastru de Cologne",
-       "skinname-monobook": "Monobook",
-       "skinname-modern": "Modern",
-       "skinname-vector": "Vector",
        "markaspatrolleddiff": "Marchează pagina ca verificată",
        "markaspatrolledtext": "Marchează această pagină ca verificată",
        "markedaspatrolled": "Pagină nouă verificată",
        "version-hook-name": "Nume hook",
        "version-hook-subscribedby": "Subscris de",
        "version-version": "($1)",
+       "version-no-ext-name": "[fără nume]",
        "version-license": "Licență MediaWiki",
        "version-ext-license": "Licență",
        "version-ext-colheader-name": "Extensie",
index dca8ad2..49f05aa 100644 (file)
        "qbmyoptions": "Pàggene mije",
        "faq": "FAQ",
        "faqpage": "Project:FAQ",
-       "vector-action-addsection": "Aggiunge 'na discussiona",
-       "vector-action-delete": "Scangille",
-       "vector-action-move": "Spuèste",
-       "vector-action-protect": "Protegge",
-       "vector-action-undelete": "Repristine",
-       "vector-action-unprotect": "Cange 'a protezione",
-       "vector-view-create": "Ccreje",
-       "vector-view-edit": "Cange",
-       "vector-view-history": "Vide 'u cunde",
-       "vector-view-view": "Ligge",
-       "vector-view-viewsource": "Vide 'u sorgende",
        "actions": "Aziune",
        "namespaces": "Namespace",
        "variants": "Variande",
        "currentrev": "Versione de osce a die",
        "currentrev-asof": "Revisiona corrende de $1",
        "revisionasof": "Versione de $1",
-       "revision-info": "Versione scritte jndr'à $1 da $2",
+       "revision-info": "Revisione de $1 da {{GENDER:$6|$2}}$7",
        "previousrevision": "← Versione Vecchje",
        "nextrevision": "Versione cchiù nova →",
        "currentrevisionlink": "Versione de mò",
        "difference-missing-revision": "{{PLURAL:$2|'Na revisione|$2 revisiune}} de sta differenze ($1) {{PLURAL:$2|non g'onne|non g'onne}} state acchiate.\n\nQuiste succede normalmende purcé 'u cunde jè collegate a 'na pàgene ca ha state scangellate.\nLe dettaglie le puè acchià jndr'à l'[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} archivije de le scangellaziune].",
        "searchresults": "Resultete d'a ricerche",
        "searchresults-title": "Resultete d'a ricerche pe \"$1\"",
-       "toomanymatches": "Troppe combronde sciute bbuene onne state returnete, pe piacere prueve cu 'n'otra inderrogazione",
        "titlematches": "'U titele d'a pàgene se iacchje",
        "textmatches": "'U teste d'a pàgene combacie",
        "notextmatches": "Nisciune teste de pàgene s'accocchie cu 'a recerche",
        "searchmenu-exists": "'''Stè 'na pàgene nnumenete \"[[$1]]\" sus 'a sta Uicchipèdie'''",
        "searchmenu-new": "<strong>[[:$1|Ccreje]] 'a pàgene \"[[:$1|$1]]\" sus 'a sta Uicchipèdie!</strong> 'Ndruche pure {{PLURAL:$2|0=|'a pàgene acchiate cu 'a ricerca toje.|le resultate acchiate da 'a ricerche.}}",
        "searchprofile-articles": "Vôsce",
-       "searchprofile-project": "Pàggene de ajiute e de pruggette",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Tutte",
        "searchprofile-advanced": "Avanzete",
        "searchprofile-articles-tooltip": "Cirche jndr'à $1",
-       "searchprofile-project-tooltip": "Cirche jndr'à $1",
        "searchprofile-images-tooltip": "Cirche pe le fail",
        "searchprofile-everything-tooltip": "Cirche jndr'à tutte le vosce (combrese le vosce de le 'ngazzaminde)",
        "searchprofile-advanced-tooltip": "Cirche jndr'à le namespace personalizzete",
        "search-interwiki-default": "$1 resultete:",
        "search-interwiki-more": "(de cchiù)",
        "search-relatedarticle": "Colleghete",
-       "searcheverything-enable": "Cirche jndr'à tutte le namespace",
        "searchrelated": "colleghete",
        "searchall": "tutte",
        "showingresults": "Stoche a fazze vedè aqquà sotte {{PLURAL:$1|'''1''' resultete|'''$1''' resultete}} ca accumenzene cu #'''$2'''.",
        "powersearch-togglelabel": "Verifiche:",
        "powersearch-toggleall": "Tutte",
        "powersearch-togglenone": "Ninde",
+       "powersearch-remember": "Arrecuèrde 'a selezione pe le prossime ricerche",
        "search-external": "Ricerche esterne",
        "searchdisabled": "'A ricerche sus a {{SITENAME}} ha state disabbilitete.\nTu puè cercà ausanne Google.\nPerò fa attenzione purcè l'indice lore sus a {{SITENAME}} ponne condenè pàggene ca non ge sonde aggiornate.",
        "search-error": "S'ha verificate 'n'errore mendre ste cercave: $1",
        "allowemail": "Abbilite l'e-mail da l'otre utinde",
        "prefs-searchoptions": "Cirche",
        "prefs-namespaces": "Namespaces",
-       "defaultns": "Cirche jndr'à chiste namespace:",
        "default": "defolt",
        "prefs-files": "Fails",
        "prefs-custom-css": "CSS Personalizzete",
        "prefs-emailconfirm-label": "Conferme de l'e-mail:",
        "youremail": "Poste:",
        "username": "{{GENDER:$1|Nome de l'utende}}:",
-       "uid": "{{GENDER:$1|ID Utende}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membre}} {{PLURAL:$1|d'u gruppe|de le gruppe}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Orarie de reggistrazzione:",
        "recentchanges-label-bot": "Stu cangiamende ha state fatte da 'nu bot",
        "recentchanges-label-unpatrolled": "Stu cangiamende non g'à state angore condrollate",
        "recentchanges-legend-heading": "'''Leggende:'''",
-       "recentchanges-legend-newpage": "('ndruche pure [[Special:NewPages|elenghe de le pàggene nuève]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ('ndruche pure [[Special:NewPages|elenghe de le pàggene nuève]])",
        "rcnotefrom": "Sotte stonne le cangiaminde da '''$2''' ('nzigne a '''$1''' fatte vedè).",
        "rclistfrom": "Fà vedè le urteme cangiaminde partenne da $3 $2",
        "rcshowhideminor": "$1 cangiaminde stuèdeche",
        "log-title-wildcard": "Cirche le titele ca accumenzene cu stu teste",
        "showhideselectedlogentries": "Fà vedè/scunne le righe scacchiate de l'archivije",
        "allpages": "Tutte le pàggene",
-       "alphaindexline": "da $1 a $2",
        "nextpage": "Pàgene apprisse ($1)",
        "prevpage": "Pàgene apprime ($1)",
        "allpagesfrom": "Fà vedè le pàggene partenne da:",
        "tooltip-summary": "Mitte 'nu riepileghe piccinne",
        "interlanguage-link-title": "$1 - $2",
        "common.css": "/* 'U CSS ca se iacchie aqquà avène applicate a tutte le masckere */",
-       "cologneblue.css": "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Blu Cologne */",
-       "monobook.css": "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Monobook */",
-       "modern.css": "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Moderne */",
-       "vector.css": "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Vettore */",
        "print.css": "/* 'U CSS ca se iacchie aqquà avène applicate a 'u resultate d'a stambe */",
        "noscript.css": "/* 'U CSS ca se iacchie aqquà l'ausane le utinde cu 'u Javascript disabbilitate */",
        "group-autoconfirmed.css": "/* 'U CSS ca se iacchie aqquà ave effettue seulamende sus a le utinde autoconfirmatarie */",
        "group-sysop.css": "/* 'U CSS ca se iacchie aqquà ave effettue seulamende sus a le utinde amministrature */",
        "group-bureaucrat.css": "/* 'U CSS ca se iacchie aqquà ave effettue seulamende sus a le utinde burocrate */",
        "common.js": "/* Ogne JavaScript aqquà avène carecate pe tutte le utinde sus a ogne pàgene carecate. */",
-       "cologneblue.js": "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Blu Cologne */",
-       "monobook.js": "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere MonoBook */",
-       "modern.js": "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Moderne */",
-       "vector.js": "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Vettore */",
        "group-autoconfirmed.js": "/* Ogne JavaScript aqquà avène carecate pe le utinde autoconfirmatarie */",
        "group-bot.js": "/* Ogne JavaScript aqquà avène carecate pe le bot */",
        "group-sysop.js": "/* Ogne JavaScript aqquà avène carecate pe le utinde amministrature */",
        "pageinfo-category-pages": "Numere de pàggene",
        "pageinfo-category-subcats": "Numere de sottocategorije",
        "pageinfo-category-files": "Numere de file",
-       "skinname-cologneblue": "Blu Cologne",
-       "skinname-monobook": "MonoBook",
-       "skinname-modern": "Moderne",
-       "skinname-vector": "Vettore",
        "markaspatrolleddiff": "Signe cumme condrollate",
        "markaspatrolledtext": "Signe sta pàgene cumme condrollate",
        "markedaspatrolled": "Signate cumme condrollate",
        "version-hook-name": "Nome de l'hook",
        "version-hook-subscribedby": "Sottoscritte da",
        "version-version": "(Versione $1)",
+       "version-no-ext-name": "[nisciune nome]",
        "version-svn-revision": "(r$2)",
        "version-license": "Licenze",
        "version-ext-license": "Licenze",
index 912777f..b89154f 100644 (file)
@@ -65,7 +65,9 @@
                        "לערי ריינהארט",
                        "Meshkov.a",
                        "아라",
-                       "Eroha"
+                       "Eroha",
+                       "Niklem",
+                       "Agilight"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
        "qbmyoptions": "Ваши настройки",
        "faq": "ЧаВО",
        "faqpage": "Project:ЧаВО",
-       "vector-action-addsection": "Добавить тему",
-       "vector-action-delete": "Удалить",
-       "vector-action-move": "Переименовать",
-       "vector-action-protect": "Защитить",
-       "vector-action-undelete": "Восстановить",
-       "vector-action-unprotect": "Изменить защиту",
-       "vector-view-create": "Создание",
-       "vector-view-edit": "Править",
-       "vector-view-history": "История",
-       "vector-view-view": "Читать",
-       "vector-view-viewsource": "Просмотр разметки",
        "actions": "Действия",
        "namespaces": "Пространства имён",
        "variants": "Варианты",
        "currentrev": "Текущая версия",
        "currentrev-asof": "Текущая версия на $1",
        "revisionasof": "Версия $1",
-       "revision-info": "Версия от $1; $2",
+       "revision-info": "Версия от $1; {{GENDER:$6|$2}}$7",
        "previousrevision": "← Предыдущая",
        "nextrevision": "Следующая →",
        "currentrevisionlink": "Текущая версия",
        "difference-missing-revision": "Не {{PLURAL:$2|1=найдена|найдены}} {{PLURAL:$2|$2 версия|$2 версий|$2 версии|1=одна из версий}} для этого сравнения ($1).\n\nТакое обычно случается при переходе по устаревшей ссылке сравнения версий для страницы, которая была удалена.\nПодробности могут быть в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].",
        "searchresults": "Результаты поиска",
        "searchresults-title": "Поиск «$1»",
-       "toomanymatches": "Найдено слишком много соответствий; пожалуйста, попробуйте сформулировать запрос иначе",
        "titlematches": "Совпадения в названиях страниц",
        "textmatches": "Совпадения в текстах страниц",
        "notextmatches": "Нет совпадений в текстах страниц",
        "search-interwiki-default": "Результаты из $1:",
        "search-interwiki-more": "(ещё)",
        "search-relatedarticle": "Связанный",
-       "searcheverything-enable": "Поиск по всем пространствам имён",
        "searchrelated": "связанный",
        "searchall": "все",
        "showingresults": "Ниже {{PLURAL:$1|1=показан результат|показаны  результаты}} с № '''$2''' и вплоть до № '''$1'''.",
        "powersearch-togglelabel": "Отметить:",
        "powersearch-toggleall": "Все",
        "powersearch-togglenone": "Ничего",
+       "powersearch-remember": "Запомнить выбор для будущих поисков",
        "search-external": "Внешний поиск",
        "searchdisabled": "Извините, но встроенный полнотекстовый поиск выключен. Вы можете воспользоваться поиском по сайту через поисковые системы общего назначения, однако имейте в виду, что копия сайта в их кэше может быть несколько устаревшей.",
        "search-error": "Произошла ошибка при поиске: $1",
        "allowemail": "Разрешить получение электронной почты от других участников",
        "prefs-searchoptions": "Поиск",
        "prefs-namespaces": "Пространства имён",
-       "defaultns": "Иначе искать в следующих пространствах имён:",
        "default": "по умолчанию",
        "prefs-files": "Файлы",
        "prefs-custom-css": "Собственный CSS",
        "grouppage-suppress": "{{ns:project}}:Ревизоры",
        "right-read": "просмотр страниц",
        "right-edit": "правка страниц",
-       "right-createpage": "создание страниц (не являющихся обсуждениями)",
+       "right-createpage": "создание страниц, не являющихся обсуждениями",
        "right-createtalk": "создание страниц обсуждений",
        "right-createaccount": "создание новых учётных записей участников",
        "right-minoredit": "простановка отметки «малое изменение»",
        "right-move": "переименование страниц",
        "right-move-subpages": "переименование страниц с их подстраницами",
        "right-move-rootuserpages": "переименование корневых страниц участников",
-       "right-move-categorypages": "Ð\9fереименование страниц категорий",
+       "right-move-categorypages": "переименование страниц категорий",
        "right-movefile": "переименование файлов",
-       "right-suppressredirect": "не Ñ\81оздаваÑ\82Ñ\8c Ð¿ÐµÑ\80енапÑ\80авление Ñ\81о Ñ\81Ñ\82аÑ\80ого Ð¸Ð¼ÐµÐ½Ð¸ Ð¿Ñ\80и Ð¿ÐµÑ\80еименовании Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b",
+       "right-suppressredirect": "пеÑ\80еименование Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b Ð±ÐµÐ· Ñ\81озданиÑ\8f Ð¿ÐµÑ\80енапÑ\80авлениÑ\8f Ñ\81о Ñ\81Ñ\82аÑ\80ого Ð¸Ð¼ÐµÐ½Ð¸",
        "right-upload": "загрузка файлов",
        "right-reupload": "запись файлов поверх существующих",
        "right-reupload-own": "перезапись файлов тем же участником",
        "right-reupload-shared": "подмена файлов из общих хранилищ локальными",
        "right-upload_by_url": "загрузка файлов с адреса URL",
        "right-purge": "очистка кэша страниц без страницы подтверждения",
-       "right-autoconfirmed": "Ð\9dет ограничений по скорости на IP-адрес",
+       "right-autoconfirmed": "нет ограничений по скорости на IP-адрес",
        "right-bot": "считаться автоматическим процессом",
        "right-nominornewtalk": "отсутствие малых правок на страницах обсуждений включает режим новых сообщений",
        "right-apihighlimits": "меньше ограничений на выполнение API-запросов",
        "right-writeapi": "использование API для записи",
        "right-delete": "удаление страниц",
        "right-bigdelete": "удаление страниц с длинными историями изменений",
-       "right-deletelogentry": "удаление и восстановление конкретных записей журнала.",
+       "right-deletelogentry": "удаление и восстановление конкретных записей журнала",
        "right-deleterevision": "удаление и восстановление конкретных версий страниц",
        "right-deletedhistory": "просмотр истории удалённых страниц без доступа к удалённому тексту",
        "right-deletedtext": "просмотр удалённого текста и изменений между удалёнными версиями страниц",
        "right-hideuser": "запрет имени участника и его сокрытие",
        "right-ipblock-exempt": "обход блокировок по IP, автоблокировок и блокировок диапазонов",
        "right-proxyunbannable": "обход автоматической блокировки прокси",
-       "right-unblockself": "Разблокировать себя",
-       "right-protect": "Ð\98зменение уровня защиты страниц и правка каскадно защищённых страниц",
-       "right-editprotected": "Ð\9fравка страниц, защищённых как «{{int:protect-level-sysop}}»",
-       "right-editsemiprotected": "Ð\9fравка страниц, защищённых как «{{int:protect-level-autoconfirmed}}»",
+       "right-unblockself": "разблокировка себя",
+       "right-protect": "изменение уровня защиты страниц и правка каскадно защищённых страниц",
+       "right-editprotected": "правка страниц, защищённых как «{{int:protect-level-sysop}}»",
+       "right-editsemiprotected": "правка страниц, защищённых как «{{int:protect-level-autoconfirmed}}»",
        "right-editinterface": "изменение пользовательского интерфейса",
        "right-editusercssjs": "правка CSS- и JS-файлов других участников",
        "right-editusercss": "правка CSS-файлов других участников",
        "right-edituserjs": "правка JavaScript-файлов других участников",
-       "right-editmyusercss": "Редактирование файлов CSS пользователя",
-       "right-editmyuserjs": "Редактировать свои пользовательские JavaScript-файлы",
-       "right-viewmywatchlist": "Ð\9fоÑ\81моÑ\82Ñ\80еÑ\82Ñ\8c Ñ\81вой Ñ\81пиÑ\81ок наблюдения",
-       "right-editmywatchlist": "Редактировать свой список наблюдения. Обратите внимание, что некоторые действия будут добавлять страницы даже без такого права.",
-       "right-viewmyprivateinfo": "Ð\9fросмотр собственных личных данных (например, адрес электронной почты, настоящее имя)",
-       "right-editmyprivateinfo": "Ð\9fравка собственных личных данных (например, адрес электронной почты, настоящее имя)",
-       "right-editmyoptions": "Редактировать собственные предпочтения",
+       "right-editmyusercss": "редактирование своих пользовательских CSS-файлов",
+       "right-editmyuserjs": "редактирование своих пользовательских JavaScript-файлов",
+       "right-viewmywatchlist": "пÑ\80оÑ\81моÑ\82Ñ\80 Ñ\81воего Ñ\81пиÑ\81ка наблюдения",
+       "right-editmywatchlist": "редактирование своего списка наблюдения; обратите внимание, что некоторые действия будут добавлять страницы даже без такого права",
+       "right-viewmyprivateinfo": "просмотр собственных личных данных (например, адрес электронной почты, настоящее имя)",
+       "right-editmyprivateinfo": "правка собственных личных данных (например, адрес электронной почты, настоящее имя)",
+       "right-editmyoptions": "редактирование собственных предпочтений",
        "right-rollback": "быстрый откат правок последнего участника на определенной странице",
        "right-markbotedits": "отметка откатываемых правок как правок бота",
        "right-noratelimit": "нет ограничений по скорости",
        "right-userrights-interwiki": "изменение прав участников на других вики-сайтах",
        "right-siteadmin": "блокировка и разблокировка базы данных",
        "right-override-export-depth": "экспортирование страниц, включая связанные страницы с глубиной до 5",
-       "right-sendemail": "оÑ\82пÑ\80авлÑ\8fÑ\82Ñ\8c Ñ\8dлекÑ\82Ñ\80оннÑ\83Ñ\8e Ð¿Ð¾Ñ\87Ñ\82Ñ\83 другим участникам",
+       "right-sendemail": "оÑ\82пÑ\80авка Ñ\8dлекÑ\82Ñ\80онной Ð¿Ð¾Ñ\87Ñ\82Ñ\8b другим участникам",
        "right-passwordreset": "просмотр электронных писем с изменением пароля",
        "newuserlogpage": "Журнал регистрации участников",
        "newuserlogpagetext": "Список недавно зарегистрировавшихся участников",
        "recentchanges-label-unpatrolled": "Эта правка ещё никем не патрулировалась",
        "recentchanges-label-plusminus": "Размер страницы изменился на данное количество байт",
        "recentchanges-legend-heading": "'''Легенда:'''",
-       "recentchanges-legend-newpage": "(см. также [[Special:NewPages|список новых страниц]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (см. также [[Special:NewPages|список новых страниц]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Ниже перечислены изменения с <strong>$2</strong> (показано не более <strong>$1</strong>).",
        "rclistfrom": "Показать изменения с $3 $2.",
        "largefileserver": "Размер файла превышает максимально разрешённый.",
        "emptyfile": "Загруженный вами файл, вероятно, пустой. Возможно, это произошло из-за ошибки при наборе имени файла. Пожалуйста, проверьте, действительно ли вы хотите загрузить этот файл.",
        "windows-nonascii-filename": "Эта вики не поддерживает имена файлов с символами, отсутствующими в таблице ASCII.",
-       "fileexists": "Файл с этим именем уже существует, пожалуйста, проверьте <strong>[[:$1]]</strong>, если вы не уверены, что хотите заменить его.\n[[$1|thumb]]",
+       "fileexists": "Файл с этим именем уже существует, пожалуйста, проверьте <strong>[[:$1]]</strong>, если {{GENDER:|вы}} не уверены, что хотите заменить его.\n[[$1|thumb]]",
        "filepageexists": "Страница описания для этого файла уже создана как <strong>[[:$1]]</strong>, но файла с таким именем сейчас нет.\nВведённое описание не появится на странице описания файла.\nЧтобы добавить новое описание, вам придётся изменить его вручную.\n[[$1|thumb]]",
-       "fileexists-extension": "СÑ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82 Ñ\84айл Ñ\81 Ð¿Ð¾Ñ\85ожим Ð¸Ð¼ÐµÐ½ÐµÐ¼: [[$2|thumb]]\n* Ð\98мÑ\8f Ð·Ð°Ð³Ñ\80Ñ\83женного Ñ\84айла: <strong>[[:$1]]</strong>\n* Ð\98мÑ\8f Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83Ñ\8eÑ\89его Ñ\84айла: <strong>[[:$2]]</strong>\nÐ\9fожалÑ\83йÑ\81Ñ\82а, Ð²Ñ\8bбеÑ\80иÑ\82е Ð´Ñ\80Ñ\83гое Ð¸Ð¼Ñ\8f.",
+       "fileexists-extension": "СÑ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82 Ñ\84айл Ñ\81 Ð¿Ð¾Ñ\85ожим Ð¸Ð¼ÐµÐ½ÐµÐ¼: [[$2|thumb]]\n* Ð\98мÑ\8f Ð·Ð°Ð³Ñ\80Ñ\83женного Ñ\84айла: <strong>[[:$1]]</strong>\n* Ð\98мÑ\8f Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83Ñ\8eÑ\89его Ñ\84айла: <strong>[[:$2]]</strong>\nÐ\9cожеÑ\82 Ð±Ñ\8bÑ\82Ñ\8c, Ð²Ñ\8b Ñ\85оÑ\82иÑ\82е Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8c Ð±Ð¾Ð»ÐµÐµ Ð¾Ñ\82лиÑ\87аÑ\8eÑ\89ееÑ\81Ñ\8f Ð¸Ð¼Ñ\8f?",
        "fileexists-thumbnail-yes": "Файл, вероятно, является уменьшенной копией (миниатюрой). [[$1|thumb]]\nПожалуйста, проверьте файл <strong>[[:$1]]</strong>.\nЕсли указанный файл является тем же изображением, не стоит загружать отдельно его уменьшенную копию.",
        "file-thumbnail-no": "Название файла начинается с <strong>$1</strong>.\nВероятно, это уменьшенная копия изображения ''(миниатюра)''.\nЕсли у вас есть данное изображение в полном размере, пожалуйста, загрузите его или измените имя файла.",
        "fileexists-forbidden": "Файл с этим именем уже существует и не может быть перезаписан.\nЕсли всё равно хотите загрузить данный файл, пожалуйста, вернитесь назад и загрузите его под другим именем. [[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Удаление и восстановление файлов временно отключены на время технических работ.",
        "filedelete-maintenance-title": "Не удаётся удалить файл",
        "mimesearch": "Поиск по MIME",
-       "mimesearch-summary": "Эта страница позволяет отбирать файлы по их MIME-типу. Формат ввода: типсодержимого/подтип, например <code>image/jpeg</code>.",
+       "mimesearch-summary": "Эта страница позволяет фильтровать файлы по их MIME-типу. Формат ввода: типсодержимого/подтип или типсодержимого/*, например <code>image/jpeg</code>.",
        "mimetype": "MIME-тип:",
        "download": "загрузить",
        "unwatchedpages": "Страницы, за которыми никто не следит",
        "wantedtemplates": "Требуемые шаблоны",
        "mostlinked": "Страницы, на которые больше всего ссылок",
        "mostlinkedcategories": "Категории, на которые больше всего ссылок",
-       "mostlinkedtemplates": "Самые используемые шаблоны",
+       "mostlinkedtemplates": "Самые частовключаемые страницы",
        "mostcategories": "Страницы, включённые в большое количество категорий",
        "mostimages": "Самые используемые файлы",
        "mostinterwikis": "Страницы с наибольшим числом интервики-ссылок",
        "listgrouprights-members": "(список участников)",
        "listgrouprights-right-display": "<span class=\"listgrouprights-granted\">$1 (<code>$2</code>)</span>",
        "listgrouprights-right-revoked": "<span class=\"listgrouprights-revoked\">$1 (<code>$2</code>)</span>",
-       "listgrouprights-addgroup": "можеÑ\82 Ð´Ð¾Ð±Ð°Ð²Ð»Ñ\8fÑ\82Ñ\8c в {{PLURAL:$2|1=группу|группы}}: $1",
-       "listgrouprights-removegroup": "можеÑ\82 Ð¸Ñ\81клÑ\8eÑ\87аÑ\82Ñ\8c из {{PLURAL:$2|1=группы|групп}}: $1",
-       "listgrouprights-addgroup-all": "можеÑ\82 Ð´Ð¾Ð±Ð°Ð²Ð»Ñ\8fÑ\82Ñ\8c во все группы",
-       "listgrouprights-removegroup-all": "можеÑ\82 Ð¸Ñ\81клÑ\8eÑ\87аÑ\82Ñ\8c из всех групп",
-       "listgrouprights-addgroup-self": "можеÑ\82 Ð´Ð¾Ð±Ð°Ð²Ð»Ñ\8fÑ\82Ñ\8c Ñ\81воÑ\8e Ñ\83Ñ\87Ñ\91Ñ\82нÑ\83Ñ\8e Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8c в {{PLURAL:$2|1=группу|группы}}: $1",
-       "listgrouprights-removegroup-self": "можеÑ\82 Ñ\83далÑ\8fÑ\82Ñ\8c Ñ\81воÑ\8e Ñ\83Ñ\87Ñ\91Ñ\82нÑ\83Ñ\8e Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8c из {{PLURAL:$2|1=группы|групп}}: $1",
+       "listgrouprights-addgroup": "добавление в {{PLURAL:$2|1=группу|группы}}: $1",
+       "listgrouprights-removegroup": "иÑ\81клÑ\8eÑ\87ение из {{PLURAL:$2|1=группы|групп}}: $1",
+       "listgrouprights-addgroup-all": "добавление во все группы",
+       "listgrouprights-removegroup-all": "иÑ\81клÑ\8eÑ\87ение из всех групп",
+       "listgrouprights-addgroup-self": "добавление Ñ\81воей Ñ\83Ñ\87Ñ\91Ñ\82ной Ð·Ð°Ð¿Ð¸Ñ\81и в {{PLURAL:$2|1=группу|группы}}: $1",
+       "listgrouprights-removegroup-self": "иÑ\81клÑ\8eÑ\87ение Ñ\81воей Ñ\83Ñ\87Ñ\91Ñ\82ной Ð·Ð°Ð¿Ð¸Ñ\81и из {{PLURAL:$2|1=группы|групп}}: $1",
        "listgrouprights-addgroup-self-all": "Может добавлять все группы к своей учётной записи",
        "listgrouprights-removegroup-self-all": "может удалять все группы со своей учётной записи",
        "listgrouprights-namespaceprotection-header": "Ограничения пространства имён",
        "movepagetalktext": "Присоединённая страница обсуждения будет также автоматически переименована, '''кроме случаев, когда:'''\n\n*Не пустая страница обсуждения уже существует под таким же именем или\n*Вы не поставили галочку в поле ниже.\n\nВ этих случаях, вы будете вынуждены переместить или объединить страницы вручную, если это нужно.",
        "movearticle": "Переименовать страницу",
        "moveuserpage-warning": "'''Внимание.''' Вы собираетесь переименовать страницу участника. Пожалуйста, обратите внимание, что переименована будет только страница, участник '''не''' будет переименован.",
-       "movecategorypage-warning": "<strong>Ð\9fÑ\80едÑ\83пÑ\80еждение:</strong> Ð\92Ñ\8b Ñ\81обиÑ\80аеÑ\82еÑ\81Ñ\8c Ð¿ÐµÑ\80емеÑ\81Ñ\82иÑ\82Ñ\8c Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 ÐºÐ°Ñ\82егоÑ\80ии. Ð\9fожалÑ\83йÑ\81Ñ\82а, Ð¾Ð±Ñ\80аÑ\82иÑ\82е Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ðµ, Ñ\87Ñ\82о Ð±Ñ\83деÑ\82 Ð¿ÐµÑ\80емеÑ\89ена только эта страница, а все страницы старой категории <em>не</em> будут перекатегоризованы в новую.",
+       "movecategorypage-warning": "<strong>Ð\9fÑ\80едÑ\83пÑ\80еждение:</strong> Ð\92Ñ\8b Ñ\81обиÑ\80аеÑ\82еÑ\81Ñ\8c Ð¿ÐµÑ\80еименоваÑ\82Ñ\8c Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 ÐºÐ°Ñ\82егоÑ\80ии. Ð\9fожалÑ\83йÑ\81Ñ\82а, Ð¾Ð±Ñ\80аÑ\82иÑ\82е Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ðµ, Ñ\87Ñ\82о Ð±Ñ\83деÑ\82 Ð¿ÐµÑ\80еименована только эта страница, а все страницы старой категории <em>не</em> будут перекатегоризованы в новую.",
        "movenologintext": "Вы должны [[Special:UserLogin|представиться системе]],\nчтобы иметь возможность переименовать страницы.",
        "movenotallowed": "У вас нет разрешения переименовывать страницы.",
        "movenotallowedfile": "У вас нет разрешения переименовывать файлы.",
        "tooltip-summary": "Введите краткое описание",
        "interlanguage-link-title": "$1 — $2",
        "common.css": "/* Размещённый здесь CSS будет применяться ко всем темам оформления */",
-       "monobook.css": "/* Размещённый здесь CSS будет применяться к теме оформления Monobook */",
-       "vector.css": "/* Размещённый здесь CSS будет применяться к векторной теме оформления  */",
        "print.css": "/* Размещённый здесь CSS будет применяться к версии для печати */",
        "noscript.css": "/* Размещённый здесь CSS будет применяться для участников с отключенным JavaScript  */",
        "group-autoconfirmed.css": "/* Размещённый здесь CSS будет применяться для автоподтверждённых участников */",
        "group-sysop.css": "/* Размещённый здесь CSS будет применяться только для администраторов */",
        "group-bureaucrat.css": "/* Размещённый здесь CSS будет применяться только для бюрократов */",
        "common.js": "/* Размещённый здесь код JavaScript будет загружаться пользователям при обращении к каждой странице */",
-       "monobook.js": "/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления MonoBook */",
-       "vector.js": "/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Vector */",
        "group-autoconfirmed.js": "/* Размещённый здесь код JavaScript будет загружаться только участникам, имеющим статус автоподтверждённых (autoconfirmed) */",
        "group-bot.js": "/* Размещённый здесь код JavaScript будет загружаться только участникам, имеющим статус ботов (bots) */",
        "group-sysop.js": "/* Размещённый здесь код JavaScript будет загружаться только участникам, имеющим статус администраторов (sysops) */",
        "pageinfo-category-pages": "Количество страниц",
        "pageinfo-category-subcats": "Количество подкатегорий",
        "pageinfo-category-files": "Количество файлов",
-       "skinname-vector": "Векторное",
        "markaspatrolleddiff": "Отметить как проверенную",
        "markaspatrolledtext": "Отметить эту статью как проверенную",
        "markedaspatrolled": "Отмечена как проверенная",
        "watchlistedit-raw-done": "Ваш список наблюдения сохранён.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Была добавлена|Было добавлено|Были добавлены}} $1 {{PLURAL:$1|запись|записей|записи}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Была удалена|Было удалено|Были удалены}} $1 {{PLURAL:$1|запись|записей|записи}}:",
-       "watchlistedit-clear-title": "СпиÑ\81ок Ð½Ð°Ð±Ð»Ñ\8eдениÑ\8f Ð¾Ñ\87иÑ\89ен",
+       "watchlistedit-clear-title": "Ð\9eÑ\87иÑ\89ение Ñ\81пиÑ\81ка Ð½Ð°Ð±Ð»Ñ\8eдениÑ\8f",
        "watchlistedit-clear-legend": "Очистить список наблюдения",
        "watchlistedit-clear-explain": "Все записи будут удалены из вашего списка наблюдения",
        "watchlistedit-clear-titles": "Заголовки:",
index a7784c1..9599d23 100644 (file)
        "search-interwiki-default": "$1 तः परिणामाः :",
        "search-interwiki-more": "(अधिकानि)",
        "search-relatedarticle": "सम्बद्धानि",
-       "searcheverything-enable": "सर्वस्मिन् नामाकाशे अन्विष्यताम्",
        "searchrelated": "सम्बद्धानि",
        "searchall": "सर्वाणि",
        "showingresults": "#'''$2''' क्रमाङ्कात् आरभ्य {{PLURAL:$1|'''$1''' परिणामः अधः प्रदर्शितः|'''$1''' परिणामाः अधः प्रदर्शिताः}}।",
        "allowemail": "अन्ययोजकैः प्रेषितानि ई-पत्राणि अनुमतिं ददातु",
        "prefs-searchoptions": "अन्विष्यताम्",
        "prefs-namespaces": "नामाकाशाः",
-       "defaultns": "अन्यथा एतेषु नामाकाशेषु अन्विषतु :",
        "default": "पूर्वनिर्दिष्टम्",
        "prefs-files": "सञ्चिका:",
        "prefs-custom-css": "स्वानुकुलसम्पादितं CSS",
        "right-reupload-shared": "विभक्तमाध्यमेन (shared media) स्थानीय-उपारोहिताः सञ्चिकाः नवीनसञ्चाकाभिः परिवर्त्यताम्",
        "right-upload_by_url": "सर्वासङ्केतात् (URL) उपारोहिताः सञ्चिकाः",
        "right-purge": "पृष्ठस्य उपस्मृतिं (cache) रिक्तीक्रियताम्",
-       "right-autoconfirmed": "सार्वसङ्केत()आधारितेन मूल्यनियन्त्रणेन सह अस्य सम्बन्धः नास्ति",
+       "right-autoconfirmed": "सार्वसङ्केत(IP)आधारितेन मूल्यनियन्त्रणेन सह अस्य सम्बन्धः नास्ति",
        "right-bot": "स्वसञ्चालितप्रणालित्वेन एतां स्वीक्रियताम्",
        "right-nominornewtalk": "सम्भाषणपृष्ठस्य लघुपरिवर्तनानां विषये मा सूच्यताम्",
        "right-apihighlimits": "API प्रश्नेषु उन्नतसीमाः उपयोज्यताम्",
        "right-editmyusercss": "स्वस्य CSS सञ्चिकाः सम्पाद्यताम्",
        "right-editmyuserjs": "स्वस्य JavaScript सञ्चिकाः सम्पाद्यताम्",
        "right-viewmywatchlist": "स्वस्य अवेक्षणावलिः दृष्यताम्",
-       "right-rollback": "अन्तिमयोजकस्य सम्पादनं शीघ्रं प्रचालयतु यः निर्दिष्टपुटं सम्पादितवान् ।",
-       "right-markbotedits": "प्रतिचालितसम्पादनानि स्वचालितसम्पदनं इव  अङ्कितानिकरोतु ।",
-       "right-noratelimit": "मूल्यनियत्या प्रभावितं नस्यात् ।",
-       "right-import": "अन्यविकितः पुटानाम् आयातं करोतु ।",
-       "right-importupload": "उत्तारितसञ्चिकातः पुटानि आयातानि करोतु ।",
-       "right-patrol": "अन्येषां सम्पादनम् आरक्षितमिव अङ्कयतु ।",
-       "right-autopatrol": "कस्यचित् स्वस्य सम्पादनानि आरक्षितमिव स्वयम् अङ्कयतु ।",
-       "right-patrolmarks": "आरक्षणाङ्कितानां सद्यः परिवर्तनानि अवलोकयतु ।",
-       "right-unwatchedpages": "अपरीक्षितपुटानाम् आवलीम् अवलोकयतु ।",
-       "right-mergehistory": "पुटेतिहासं विलीनं करोतु ।",
-       "right-userrights": "सर्वयोजकाधिकारं सम्पादयतु ।",
-       "right-userrights-interwiki": "योजकाधिकारान् अन्यविकिषु सम्पादयतु ।",
-       "right-siteadmin": "पाठमूलस्य निशेधनम् अनिशेधनं च ।",
+       "right-editmywatchlist": "स्वस्य अवेक्षणावलिः सम्पाद्यताम् । अत्र ध्यातव्यं यत्, अन्यचेष्टाभिः विना अधिकारेण अत्र अन्यपुष्ठानि योजयितुम् अवसरः अस्ति ।",
+       "right-viewmyprivateinfo": "स्वस्य व्यक्तिगतसूचनाः दृश्यताम् (उदा. ई-पत्रसन्देशः, वास्तविकनाम)",
+       "right-editmyprivateinfo": "स्वस्य व्यक्तिगतसूचनाः सम्पाद्यताम् (उदा. ई-पत्रसन्देशः, वास्तविकनाम)",
+       "right-editmyoptions": "स्वस्य इष्टतमानि सम्पाद्यताम्",
+       "right-rollback": "कस्मिंश्चित् पृष्ठे येन अन्तिमयोजकेन परिवर्तनं कृतं, तत् परिवर्तनं शीर्घ्रं पूर्ववत् करोतु",
+       "right-markbotedits": "पूर्ववत् यानि सम्पादनानि कृतानि, तानि बॉट्-सम्पादनत्वेन अङ्कितं करोतु",
+       "right-noratelimit": "वेगस्य सीमायाः कारणेन परिवर्तनं न भवेत्",
+       "right-import": "अन्यस्मात् विकि-जालस्थआनात् पृष्ठानि आयातं करोतु",
+       "right-importupload": "उपारोहिताभ्यः (upload) सञ्चिकाभ्यः पृष्ठानि आयातं करोतु",
+       "right-patrol": "अन्येषां सम्पादनानि निरिक्षितत्वेन अङ्क्यताम्",
+       "right-autopatrol": "स्वस्य सम्पादनानि निरिक्षितत्वेन अङ्क्यताम्",
+       "right-patrolmarks": "नूतनपरिवर्तनेषु निरिक्षित-अङ्कनं दृश्यताम्",
+       "right-unwatchedpages": "अदृष्टपृष्टानाम् आवलिः दृश्यताम्",
+       "right-mergehistory": "पृष्ठानाम् इतिहासम् एकीकरोतु",
+       "right-userrights": "सर्वयोजकाधिकारः सम्पाद्यताम्",
+       "right-userrights-interwiki": "अन्यविकि-जालस्थानानां योजकाधिकारः सम्पाद्यताम्",
+       "right-siteadmin": "दत्तांशनिधिं किलतु, अकिलितं च करोतु",
        "right-override-export-depth": "पञ्चस्तरपर्यन्तं संलग्नपुटानि निर्यातानि करोतु ।",
        "right-sendemail": "अन्ययोजकेभ्यः विद्युन्मानपत्राणि प्रेषयतु ।",
        "right-passwordreset": "निकुञ्चपुनारचितानां विद्युन्मानपत्राणाम् अवलोकनम् ।",
        "listgrouprights-removegroup-self": "स्वस्थाने {{PLURAL:$2|समूहम्}} अपनयतु  $1",
        "listgrouprights-addgroup-self-all": "स्वस्थाने सर्वसमूहान योजयतु ।",
        "listgrouprights-removegroup-self-all": "स्वस्थानात् सर्वसमूहान् अपनयतु ।",
+       "listgrouprights-namespaceprotection-namespace": "नामाकाशः",
        "mailnologin": "सम्प्रेषणस्य सङ्केतः नास्ति ।",
        "mailnologintext": "अस्य योजकेभ्यः विद्युन्मानपत्रप्रेषणार्थम् [[Special:UserLogin|नामाभिलेखनम्]] आवश्यकम् [[Special:Preferences|आद्यता]]यां प्रेषयितुं विद्युन्मानपत्रसङ्केतः आवश्यकः ।",
        "emailuser": "एतस्मै योजकाय ई-पत्रं प्रेष्यताम्",
index 6452b2b..6ec3f12 100644 (file)
        "category-file-count-limited": "Бу категорияҕа  {{PLURAL:$1|соҕотох билэ|$1 билэ}} баар.",
        "listingcontinuesabbrev": "(салгыыта)",
        "index-category": "Индекстэммит сирэйдэр",
-       "noindex-category": "Ð\98ндекÑ\81кÑ\82аммÑ\8bÑ\82 Ñ\81иÑ\80Ñ\8dйдÑ\8dÑ\80 Ñ\81Ñ\83оÑ\85Ñ\82ар",
+       "noindex-category": "Ð\9aÓ©Ñ\80дөммөÑ\82 Ñ\81иÑ\80Ñ\8dйдÑ\8dр",
        "broken-file-category": "Билэҕэ сигэлэрэ алҕастаах сирэйдэр",
        "about": "Бу туһунан",
        "article": "Ыстатыйа",
        "qbmyoptions": "Мин сирэйдэрим",
        "faq": "FAQ",
        "faqpage": "Project:FAQ",
-       "vector-action-addsection": "Тиэмэ эбии",
-       "vector-action-delete": "Сот",
-       "vector-action-move": "Аатын уларыт",
-       "vector-action-protect": "Уларыйбат гын",
-       "vector-action-undelete": "Төннөр",
-       "vector-action-unprotect": "Көмүскэлин уларыт",
-       "vector-view-create": "Ай",
-       "vector-view-edit": "Уларыт",
-       "vector-view-history": "Устуоруйатын көрүү",
-       "vector-view-view": "Ааҕыы",
-       "vector-view-viewsource": "Бэлиэлэрин көрүү",
        "actions": "Дьайыылар",
        "namespaces": "Аат даллара",
        "variants": "Барыллар",
        "logdelete-success": "'''Дьайыы көстүүтэ сөпкө уларыйда.'''",
        "logdelete-failure": "'''Сурунаал дөбөҥө быһаарыллыбата:'''\n$1",
        "revdel-restore": "Көстүүтүн уларытыы",
-       "pagehist": "Ð\98Ñ\81Ñ\82оÑ\80иÑ\8fтын сирэйэ",
-       "deletedhist": "Сотуллубут история",
+       "pagehist": "УÑ\81Ñ\82Ñ\83оÑ\80Ñ\83йатын сирэйэ",
+       "deletedhist": "Сотуллубут устуоруйата",
        "revdelete-hide-current": "Баччаҕа оҥоһуллубут $2, $1 сурук кистээһинигэр алҕас таҕыста: бу билиҥҥи барыл.\nОнон кистэнэр кыаҕа суох.",
        "revdelete-show-no-access": "Баччаҕа оҥоһуллубут суругу $2, $1 көстөр гынарга алҕас таҕыста: бу сурук \"хааччахтаах\" курдук бэлиэтэммит.\nОттон эн оннук суруктары көрөр кыаҕыҥ суох эбит.",
        "revdelete-modify-no-access": "Баччаҕа оҥоһуллубут суругу $2, $1 уларытарга алҕас таҕыста: бу сурук \"хааччахтаах\" курдук бэлиэтэммит.\nОттон эн оннук суруктары көрөр кыаҕыҥ суох эбит.",
        "difference-missing-revision": "$2 барыл бу тэҥнээһиҥҥэ ($1) көстүбэтэ.\n\nБу үксүн хайыы-үйэ сотуллубут сирэйи кытта тэҥнээри эргэрбит сигэнэн кэллэххэ баар буолааччы.\nСиһилии баҕар [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} сотуу сурунаалыгар] баара буолуо.",
        "searchresults": "Булулунна",
        "searchresults-title": "Көрдөөһүн түмүгэ \"$1\"",
-       "toomanymatches": "Наһаа элбэх ыйытыы төнүннэ, бука диэн атыннык көрдөө",
        "titlematches": "Ыстатыйалар ааттара хоһулаһар",
        "textmatches": "Ыстатыйалар истэрэ хатыланар",
        "notextmatches": "Ыстатыйалар истэрэ хатыламмат",
        "search-interwiki-default": "$1 түмүгэ:",
        "search-interwiki-more": "(өссө)",
        "search-relatedarticle": "Сигэнэр",
-       "searcheverything-enable": "Туох баар аат далларыгар көрдөөһүн",
        "searchrelated": "сибээстэммит",
        "searchall": "бары",
        "showingresults": "Манна {{PLURAL:$1|түмүк|түмүктэр}} {{PLURAL:$1|көрдөрүлүннэ|көрдөрүлүннүлэр}} <strong>$1</strong> , мантан саҕалаан №&nbsp;<strong>$2</strong>.",
        "allowemail": "Атын кыттааччылартан сурук тутары көҥүллүүбүн",
        "prefs-searchoptions": "Көрдөөһүн",
        "prefs-namespaces": "Аат дала",
-       "defaultns": "Атын ыйыллыбатаҕына бу аат далларыгар көрдүүргэ:",
        "default": "чопчу ыйыллыбатаҕына маннык",
        "prefs-files": "Билэлэр",
        "prefs-custom-css": "Бэйэ CSS",
        "recentchanges-label-unpatrolled": "Бу уларытыы өссө ботурууллана илик",
        "recentchanges-label-plusminus": "Сирэй кээмэйэ бачча баайтынан уларыйбыт",
        "recentchanges-legend-heading": "'''Легендата:'''",
-       "recentchanges-legend-newpage": "(өссө көр: [[Special:NewPages|Саҥа сирэйдэр тиһиктэрэ]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (өссө көр: [[Special:NewPages|Саҥа сирэйдэр тиһиктэрэ]])",
        "rcnotefrom": "Улартыылар бу кэмтэн ыла көрдөрүлүннүлэр: <strong>$2</strong> (мантан элбэх көрдөрүллүбэтэ: <strong>$1</strong>).",
        "rclistfrom": "Бу кэм $3 $2 кэнниттэн оҥоһуллубуттары көрдөр",
        "rcshowhideminor": "$1 кыра уларыйыылары",
        "rcshowhidemine-hide": "Кистээ",
        "rclinks": "$2 күҥҥэ бүтэһик $1 уларытыыны көрдөр;<br />$3.",
        "diff": "уратыта",
-       "hist": "история",
+       "hist": "устуоруйата",
        "hide": "Кистээ",
        "show": "Көрдөр",
        "minoreditletter": "к",
        "recentchangeslinked-summary": "Бу анал сирэйгэ сигэнэр сирэйдэр бүтэһик уларыйыылара көһүннүлэр. [[Special:Watchlist|Кэтэнэр сирэйдэр]] '''модьу бичигинэн''' бэлиэтэннилэр.",
        "recentchangeslinked-page": "Сирэй аата:",
        "recentchangeslinked-to": "Төттөрүтүн, ыйыллыбыт сирэйгэ сигэнэр сирэйдэри көрдөр",
-       "upload": "Билэни киллэр",
+       "upload": "Билэни угуу",
        "uploadbtn": "Билэни киллэрии",
        "reuploaddesc": "Тохтот уонна киллэрии форматыгар төнүн",
        "upload-tryagain": "Билэ туһунан сурук уларытыытын ыыт",
        "tooltip-preferences-save": "Туруоруулары бигэргэт",
        "tooltip-summary": "Кылгастык бу туһунан суруй",
        "common.css": "/** Манна оҥоһуллубут CSS атын скиннарга эмиэ олохтонуо */",
-       "monobook.css": "/* Манна оҥоһуллубут CSS Monobook диэн скиҥҥа туһаныллыа */",
        "common.js": "/* Оҥоһуллубут JavaScript ханнык баҕарар киһи манна киирдэҕинэ үлэлээн кэлиэ. */",
-       "monobook.js": "/* Эргэрбит; маны туһан:[[MediaWiki:common.js]] */",
        "anonymous": "{{SITENAME}} ааттамматах {{PLURAL:$1|кыттааччыта|кыттааччылара}}",
        "siteuser": "{{SITENAME}} кыттааччыта $1",
        "anonuser": "{{SITENAME}} бэйэтин билиһиннэрбэтэх кыттааччыта $1",
index fd8d734..14ae576 100644 (file)
@@ -6,7 +6,8 @@
                        "Marzedu",
                        "Node ue",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Via maxima"
                ]
        },
        "tog-underline": "Sutalìnea is cullegamentos",
        "tog-hidepatrolled": "Cua is acontzos verificados in is ùrtimas mudàntzias",
        "tog-newpageshidepatrolled": "Cua is pàginas verificadas dae sa lista de is pàginas noas",
        "tog-extendwatchlist": "Ammània sa watchlist pro ammustrare totu is mudàntzias, non feti is prus reghentes",
-       "tog-usenewrc": "Imprea is ùrtimas mudàntzias megioradas (esigit JavaScript)",
+       "tog-usenewrc": "Poni a pari is mudàntzias de dònnia pàgina in is ùrtimas mudàntzias e in watchlist",
        "tog-numberheadings": "Auto-numeratzione de is tìtulos",
-       "tog-showtoolbar": "Ammustra s'amusta de is ainas pro is acontzos (esigit JavaScript)",
-       "tog-editondblclick": "Acontza pàginas cun dòpiu click (esigit JavaScript)",
-       "tog-editsectiononrightclick": "Abilita s'acontzu de is setziones cun dòpiu click in is tìtulos de is setziones (esigit JavaScript)",
-       "tog-watchcreations": "Aciungi is pàginas chi apo creadu a sa watchlist mea",
-       "tog-watchdefault": "Aciungi is pàginas chi apo acontzadu a sa watchlist mea",
-       "tog-watchmoves": "Aciungi is pàginas chi apo mòvidu a sa watchlist mea",
-       "tog-watchdeletion": "Aciungi is pàginas chi apo fuliadu a sa watchlist mea",
+       "tog-showtoolbar": "Amosta s'amusta de is ainas pro is acontzos",
+       "tog-editondblclick": "Acontza pàginas cun dòpiu click",
+       "tog-editsectiononrightclick": "Abilita s'acontzu de is setziones cun click a dereta in is tìtulos de is setziones",
+       "tog-watchcreations": "Aciungi is pàginas chi apo creadu e is files chi apo carrigau a sa watchlist mea",
+       "tog-watchdefault": "Aciungi pàginas e files chi apo acontzadu a sa watchlist mea",
+       "tog-watchmoves": "Aciungi pàginas e files chi apo mòvidu a sa watchlist mea",
+       "tog-watchdeletion": "Aciungi pàginas e files chi apo fuliadu a sa watchlist mea",
        "tog-minordefault": "Signa totu is acontzos comente minores pro difetu",
        "tog-previewontop": "Ammustra s'antiprima a subra sa casella de acontzu e no a suta",
        "tog-previewonfirst": "Ammustra s'antiprima pro su primu acontzu",
-       "tog-enotifwatchlistpages": "Spedi·mi una missada eletrònica cando una pàgina de sa watchlist mea est acontzada",
+       "tog-enotifwatchlistpages": "Spedi·mi una missada eletrònica cando una pàgina o file de sa watchlist mea est acontzada",
        "tog-enotifusertalkpages": "Spedi·mi una missada eletrònica cando sa pàgina de is cuntierras mias est acontzada",
-       "tog-enotifminoredits": "Spedi·mi una missada eletrònica fintzas pro is acontzos minores de is pàginas",
+       "tog-enotifminoredits": "Spedi·mi una missada eletrònica fintzas pro is acontzos minores de is pàginas e files",
        "tog-enotifrevealaddr": "Faghe schire s'indiritzu e-mail miu in is notìficas de is e-mails",
        "tog-shownumberswatching": "Ammustra su nùmeru de is usuàrios ca sunt ponende ogru a sa pàgina",
-       "tog-oldsig": "Antiprima de sa firma atuale:",
+       "tog-oldsig": "Firma atuale:",
        "tog-fancysig": "Trata sa firma comente unu testu wiki (chentza cullegamentos automaticos)",
-       "tog-uselivepreview": "Imprea sa funtzione \"live preview\" (esigit JavaScript) (sperimentale)",
+       "tog-uselivepreview": "Imprea sa funtzione \"live preview\" (sperimentale)",
+       "tog-forceeditsummary": "Avertimì si su campu ogetu est buidu",
        "tog-watchlisthideown": "Cua is acontzos meos dae sa watclist",
        "tog-watchlisthidebots": "Cua is acontzos de is bots dae sa watchlist",
        "tog-watchlisthideminor": "Cua is acontzos minores dae sa watchlist",
@@ -42,6 +44,8 @@
        "tog-watchlisthidepatrolled": "Cua acontzos verificados dae sa watchlist",
        "tog-ccmeonemails": "Spedi·mi is còpias de is e-mails ca spedu a is àteros usuàrios",
        "tog-showhiddencats": "Ammustra is categorias cuadas",
+       "tog-useeditwarning": "Amonestamì si lassu una pagina cun mudantzias chena de sarvai.",
+       "tog-prefershttps": "Impera sempiri una linia segura candu fatzu s'intrada.",
        "underline-always": "Semper",
        "underline-never": "Mai",
        "underline-default": "Definiduras dae su browser tuo",
        "oct": "Stg",
        "nov": "Std",
        "dec": "Nad",
+       "january-date": "Gennàrgiu $1",
+       "february-date": "Friàrgiu $1",
+       "march-date": "Martzu $1",
+       "april-date": "Abrili $1",
+       "may-date": "Maju $1",
+       "june-date": "Làmpadas $1",
+       "july-date": "Trìulas $1",
+       "august-date": "Austu $1",
+       "september-date": "Cabudanni $1",
+       "october-date": "Santuaine $1",
+       "november-date": "Onniassantu $1",
+       "december-date": "Mesi de Nadali $1",
        "pagecategories": "{{PLURAL:$1|Categoria|Categorias}}",
        "category_header": "Pàginas in sa categoria \"$1\"",
        "subcategories": "Subcategorias",
        "newwindow": "(aberit in una bentana noa)",
        "cancel": "Burra",
        "moredotdotdot": "Àteru…",
-       "mypage": "Sa pàgina mea",
+       "morenotlisted": "Sa lista no est cumpreta",
+       "mypage": "Pàgina",
        "mytalk": "Cuntierras meas",
        "anontalk": "Cuntierras pro custu IP",
        "navigation": "Navigadura",
        "vector-view-view": "Leghe",
        "vector-view-viewsource": "Càstia mitza",
        "actions": "Atziones",
+       "vector-more-actions": "Prus",
        "namespaces": "Nùmene-logos",
        "variants": "Variantes",
+       "navigation-heading": "Menu po nàvigu",
        "errorpagetitle": "Faddina",
        "returnto": "Torra a $1.",
        "tagline": "Dae {{SITENAME}}",
        "printableversion": "Versione de imprenta",
        "permalink": "Acàpiu fitianu",
        "print": "Imprenta",
+       "view": "Amosta",
+       "view-foreign": "Amosta in $1",
        "edit": "Acontza",
+       "edit-local": "Acontza sa descridura locali",
        "create": "Crea",
+       "create-local": "Aciungi descridura locali",
        "editthispage": "Acontza custa pàgina",
        "create-this-page": "Crea custa pàgina",
        "delete": "Fùlia",
        "deletethispage": "Fùlia custa pàgina",
+       "undeletethispage": "Torrandi custa pàgina",
        "undelete_short": "Restaurare {{PLURAL:$1|un acontzu|$1 acontzos}}",
+       "viewdeleted_short": "Amosta {{PLURAL:$1|unu acontzu burradu|$1 acontzos burrados}}",
        "protect": "Ampara",
        "protect_change": "mudàntzia",
        "protectthispage": "Ampara custa pàgina",
-       "unprotect": "Disampara",
-       "unprotectthispage": "Disampara custa pàgina",
+       "unprotect": "Muda amparu",
+       "unprotectthispage": "Muda amparu de custa pàgina",
        "newpage": "Pàgina noa",
        "talkpage": "Pàgina de cuntierra",
        "talkpagelinktext": "Cuntierra",
        "jumpto": "Bae a:",
        "jumptonavigation": "navigadura",
        "jumptosearch": "chirca",
+       "view-pool-error": "Teni passièntzia, is servers funt càrrigus de traballu.\nIn medas megant de biri custa pàgina.\nPo praxeri, torra a provai tra unu pagu.\n\n$1",
+       "generic-pool-error": "Teni passièntzia, is servers funt càrrigus de traballu.\nIn medas megant de biri custa risorsa.\nPo praxeri, torra a provai tra unu pagu.",
        "pool-errorunknown": "Faddina disconnota",
        "aboutsite": "A propòsitu de {{SITENAME}}",
        "aboutpage": "Project:Informatziones",
        "toc": "Cuntènnidu",
        "showtoc": "ammustra",
        "hidetoc": "cua",
+       "collapsible-collapse": "Serra e stringi",
+       "collapsible-expand": "Aberi",
        "thisisdeleted": "Càstiare o recuperare $1?",
        "viewdeleted": "Bisi $1?",
        "restorelink": "{{PLURAL:$1|unu acontzu burradu|$1 acontzos burrados}}",
        "actionthrottled": "Atzione rimandada",
        "namespaceprotected": "Non tenes su permissu de acontzare is pàginas in su nùmene-lugu '''$1'''.",
        "ns-specialprotected": "Is pàginas ispetziales non podent èssere acontzadas.",
+       "exception-nologin": "Non ses intrau",
        "virus-scanfailed": "scansione faddida (còdixe $1)",
        "virus-unknownscanner": "antivirus disconnotu:",
        "logouttext": "'''As acabadu sa sessione.'''\n\nImmoe 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.\nTene 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.",
        "accountcreatedtext": "S'account usuàriu pro $1 est stadu creadu.",
        "createaccount-title": "Creatzione de unu account pro {{SITENAME}}",
        "loginlanguagelabel": "Limba: $1",
+       "createacct-another-realname-tip": "Su nomini beru pois fai de mancu de ddu ponni.\nSi sceberas de du ponni, at a essi imperau po arreconnosci a tui su traballu tuu.",
+       "pt-login": "Intra",
+       "pt-login-button": "Intra",
+       "pt-createaccount": "Arregistradì",
+       "pt-userlogout": "Bessida",
        "changepassword": "Càmbia password",
        "resetpass_header": "Càmbia sa password de su account",
        "oldpassword": "Password betza:",
        "shown-title": "Ammustra $1 {{PLURAL:$1|resurtadu|resurtados}} pro pàgina",
        "viewprevnext": "Càstia ($1 {{int:pipe-separator}} $2) ($3).",
        "searchprofile-articles": "Pàginas de càbidu",
-       "searchprofile-project": "Pàginas de agiudu e de su progetu",
        "searchprofile-images": "Multimèdia",
        "searchprofile-everything": "Totu",
        "searchprofile-advanced": "Avantzada",
        "searchprofile-articles-tooltip": "Chirca in $1",
-       "searchprofile-project-tooltip": "Chirca in $1",
        "searchprofile-images-tooltip": "Chirca files",
        "search-result-size": "$1 ({{PLURAL:$2|1 faeddu|$2 faeddos}})",
        "search-result-score": "Rilevàntzia: $1%",
        "search-interwiki-caption": "Progetos frades",
        "search-interwiki-default": "$1 resurtados:",
        "search-interwiki-more": "(àteru)",
-       "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'''.",
        "showingresultsheader": "{{PLURAL:$5|Resultadu '''$1''' de '''$3'''|Resultadus '''$1 - $2''' de '''$3'''}} pro '''$4'''",
        "prefs-files": "Files",
        "youremail": "E-mail:",
        "username": "Nùmene usuàriu:",
-       "uid": "ID usuàriu:",
        "prefs-registration": "Ora de registratzione:",
        "yourrealname": "Nùmene beru:",
        "yourlanguage": "Limba:",
        "rcnotefrom": "Sas chi sighint sunt sas mudàntzias dae '''$2''' (fintzas a '''$1''').",
        "rclistfrom": "Ammustra mudàntzias dae $3 $2",
        "rcshowhideminor": "$1 acontzos minores",
+       "rcshowhideminor-show": "Amosta",
+       "rcshowhideminor-hide": "Cua",
        "rcshowhidebots": "$1 bots",
+       "rcshowhidebots-show": "Amosta",
+       "rcshowhidebots-hide": "Cua",
        "rcshowhideliu": "$1 usuàrios intraus",
+       "rcshowhideliu-show": "Amosta",
+       "rcshowhideliu-hide": "Cua",
        "rcshowhideanons": "$1 usuàrios anònimos",
+       "rcshowhideanons-show": "Amosta",
+       "rcshowhideanons-hide": "Cua",
+       "rcshowhidepatr-show": "Amosta",
+       "rcshowhidepatr-hide": "Cua",
        "rcshowhidemine": "$1 acontzos meos",
+       "rcshowhidemine-show": "Amosta",
+       "rcshowhidemine-hide": "Cua",
        "rclinks": "Ammustra is ùrtimas $1 mudàntzias fatas in is ùrtimas $2 dies<br />$3",
        "diff": "dif",
        "hist": "ist",
        "speciallogtitlelabel": "Tìtulu:",
        "log": "Registros",
        "allpages": "Totu is pàginas",
-       "alphaindexline": "dae $1 a $2",
        "prevpage": "Pàgina in antis ($1)",
        "allpagesfrom": "Ammustra pàginas a partire dae:",
        "allpagesto": "Ammustra pàginas fintzas a:",
        "blockip": "Blocca usuàriu",
        "blockip-legend": "Blocca usuàriu",
        "blockiptext": "Usa il modulo sottostante per bloccare l'accesso con diritto di scrittura da uno specifico indirizzo IP. Questo blocco deve essere operato SOLO per prevenire atti di vandalismo, ed in stretta osservanza dei principi tutti della [[{{MediaWiki:Policy-url}}|policy di {{SITENAME}}]]. Il blocco non può in nessun caso essere applicato per motivi ideologici.\nScrivi un motivo specifico per il quale questo indirizzo IP dovrebbe a tuo avviso essere bloccato (per esempio, cita i titoli di pagine eventualmente già oggetto di vandalismo editoriale).",
-       "ipadressorusername": "Indiritzu IP o nùmene usuàriu:",
+       "ipaddressorusername": "Indiritzu IP o nùmene usuàriu:",
        "ipbexpiry": "Scadèntzia:",
        "ipbreason": "Motivu:",
        "ipbsubmit": "Blocca custu usuàriu",
        "allmessages-filter-all": "Totu",
        "allmessages-language": "Limba:",
        "allmessages-filter-submit": "Bae",
+       "allmessages-filter-translate": "Tradui",
        "thumbnail-more": "Amannia",
        "import-interwiki-namespace": "Nùmene-logu de destinatzione:",
        "import-upload-filename": "Nùmene file:",
index d9f2b27..0fb4ce1 100644 (file)
        "qbmyoptions": "Li mè pàggini",
        "faq": "Dumanni cumuni",
        "faqpage": "Project:Dumanni comuni",
-       "vector-action-addsection": "Agghiunci argumentu",
-       "vector-action-delete": "Elìmina",
-       "vector-action-move": "Sposta",
-       "vector-action-protect": "Pruteggi",
-       "vector-action-undelete": "Riprìstina",
-       "vector-action-unprotect": "Cancia la prutizzioni",
-       "vector-view-create": "Crea",
-       "vector-view-edit": "Cancia",
-       "vector-view-history": "Talìa a storia",
-       "vector-view-view": "Leggi",
-       "vector-view-viewsource": "Talìa la fonti",
        "actions": "Azzioni",
        "namespaces": "Namespace",
        "variants": "Varianti",
        "permalink": "Liami pirmanenti",
        "print": "Stampa",
        "view": "Talìa",
+       "view-foreign": "Talìa supra $1",
        "edit": "cancia",
+       "edit-local": "Cancia la discrizzioni lucali",
        "create": "Crea",
+       "create-local": "Junci na discrizzioni lucali",
        "editthispage": "Cancia sta pàggina",
        "create-this-page": "Crea sta pàggina",
        "delete": "elìmina",
        "jumptonavigation": "navigazzioni",
        "jumptosearch": "Va' cerca",
        "view-pool-error": "Ci spiaci, li server ni stu mumentu sunu troppu carichi. Troppi utenti stannu circannu di taliari sta pàggina. Aspetta n'anticchia prima di pruvari a ritaliari sta pàggina.\n\n$1",
+       "generic-pool-error": "Ni spiaci, li server ni stu mumentu sunu troppu carrichi. Troppi utenti stannu circannu di taliari sta pàggina. Aspetta n'anticchia prima di pruvari a ritaliari sta pàggina.",
        "pool-timeout": "Tempu scadutu aspittannu lu sbloccu",
        "pool-queuefull": "La cuda dû pool è china",
        "pool-errorunknown": "Erruri scanusciutu",
+       "pool-servererror": "Lu sirivzzu di cuntaturi dâ riserva nun è dispunìbbili ($1)",
        "aboutsite": "Àutri nfurmazzioni supra {{SITENAME}}",
        "aboutpage": "Project:Àutri nformazzioni",
-       "copyright": "Lu cuntinutu è utilizzàbbili secunnu la $1.",
+       "copyright": "Lu cuntinutu è utilizzàbbili secunnu la $1, sarvu minzioni cuntraria.",
        "copyrightpage": "{{ns:project}}:Copyright",
        "currentevents": "Nutizzî",
        "currentevents-url": "Project:Nutizzî",
        "youhavenewmessages": "Ricivìsti $1 ($2).",
        "youhavenewmessagesfromusers": "Hai $1 di {{PLURAL:$3|n'àutru utenti|$3 utenti}} ($2).",
        "youhavenewmessagesmanyusers": "Hai $1 di na pocu di utenti ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|Nu missaggiu novu|missaggi novi}}",
-       "newmessagesdifflinkplural": "{{PLURAL:$1|ùrtimu canciamenti|ùrtimi canciamenti}}",
+       "newmessageslinkplural": "{{PLURAL:$1|nu missaggiu novu|999=missaggi novi}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|ùrtimu canciamenti|999=ùrtimi canciamenti}}",
        "youhavenewmessagesmulti": "Hai missaggi novi supra $1",
        "editsection": "cancia",
        "editold": "cancia",
        "nospecialpagetext": "<strong>Hai cercatu na pàggina spiciali nun vàlida.</strong>\n\nL'alencu dî pàggini spiciali vàlidi s'attrova 'n [[Special:SpecialPages|Alencu dî pàggini spiciali]].",
        "error": "Erruri",
        "databaseerror": "Erruri dû database",
+       "databaseerror-text": "Si virificau n'erruri nti na dimanna dû databbasi.\nPutissi siri ca c'è nu bacu ntô prugramma.",
+       "databaseerror-textcl": "Si virificau n'erruri ntâ dimanna dû databasi",
+       "databaseerror-query": "Dumannaä $1",
+       "databaseerror-function": "Funzioni: $1",
+       "databaseerror-error": "Erruri: $1",
        "laggedslavemode": "Accura: La pàggina putissi nun ripurtari l'aggiurnamenti cchiù ricenti.",
        "readonly": "Database bluccatu",
        "enterlockreason": "Ìnnica lu mutivu dû bloccu, spicificannu lu mumentu 'n cui è prisumìbbili ca veni rimossu.",
        "userlogin-resetlink": "T'ascurdasti li dittagli pâ trasuta?",
        "userlogin-resetpassword-link": "Reinizzializza la tò password",
        "userlogin-helplink2": "Aiutu pâ trasuta",
+       "userlogin-loggedin": "Vossia già trasìu comu {{GENDER:$1|$1}}.\nUsassi lu mòdulu ccassutta pi tràsiri comu autru utenti.",
+       "userlogin-createanother": "Crèa n'autru cuntu",
        "createacct-emailrequired": "Nnirizzu e-mail",
        "createacct-emailoptional": "Nnirizzu e-mail (facurtativu)",
        "createacct-email-ph": "Nzirisci lu tò nnirizzu e-mail",
        "createacct-captcha": "Cuntrollu di sicurezza",
        "createacct-imgcaptcha-ph": "Nzirìsci lu testu ca vidi ccassupra",
        "createacct-submit": "Crèa nu cuntu",
-       "createacct-benefit-heading": "{{SITENAME}} è fatta di pirsunu comu a tìa.",
+       "createacct-another-submit": "Crèa n'autru cuntu",
+       "createacct-benefit-heading": "{{SITENAME}} è fatta di pirsuni comu a tìa.",
        "createacct-benefit-body1": "{{PLURAL:$1|cuntribbutu|cuntribbuti}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pàggina|pàggini}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|cuntribbutuori ricenti|cuntribbutura ricenti}}",
        "badretype": "La ''password'' chi mittisti nun è bona.",
        "userexists": "Lu nomu utenti nzeritu è già usatu. Ti prijamu pirciò di vuliri scègghiri nu nomu utenti diversu.",
        "loginerror": "Erruri nta l'accessu",
+       "createacct-error": "Erruri ntâ criazzioni di l'utenza",
        "createaccounterror": "Mpussibbili di criari l'account $1",
        "nocookiesnew": "Lu nomu utenti pi tràsiri fu criatu, ma nun hai effittuatu lu log in. {{SITENAME}} usa li cookies pi gistiri li log in. Lu tò browser havi li cookies disabbilitati. Abbìlita li cookies, appoi effèttua lu login cu li tò username e password novi.",
        "nocookieslogin": "{{SITENAME}} usa li cookies pi gistiri lu log in. Lu tò browser havi li cookies disabbilitati. Abbìlita li cookies, appoi effèttua lu login cu li tò username e password.",
        "editundo": "annulla",
        "searchresults": "Risurtati dâ circata",
        "searchresults-title": "Risurtati dâ circata di \"$1\"",
-       "toomanymatches": "Troppi currispunnenzi. Cancia la richiesta.",
        "titlematches": "Ntê tìtuli di l'artìculi",
        "textmatches": "Ntô testu di l'artìculi",
        "notextmatches": "Nudda currispunnenza ntô testu dî pàggini",
        "search-interwiki-default": "Risultati da $1:",
        "search-interwiki-more": "(cchiù)",
        "search-relatedarticle": "Risultati currilati",
-       "searcheverything-enable": "Cerca ni tutti li namespace",
        "searchrelated": "currilati",
        "searchall": "tutti",
        "showingresults": "Ammustra nzinu a {{PLURAL:$1|'''1''' risurtatu|'''$1''' risurtati}} a pàrtiri dô nùmmuru '''$2'''.",
        "allowemail": "Cunzenti la ricezzioni di e-mail di àutri utenti",
        "prefs-searchoptions": "Opzioni di circata",
        "prefs-namespaces": "Namespace",
-       "defaultns": "In casu cuntrariu cerca ni sti namespace:",
        "default": "pridifinitu",
        "prefs-files": "Mmàggini",
        "prefs-custom-css": "CSS personalizzatu",
        "tooltip-preferences-save": "Sarva prifirenzi",
        "tooltip-summary": "Nsiriri na sintisi curta",
        "common.css": "/* Li stili CSS nziriti ccà s'àpplicanu a tutti li skin */",
-       "monobook.css": "/* Li stili CSS nziriti ccà s'àpplicanu a l'utenti chi usanu la skin Monobook */",
        "common.js": "/* Lu còdici JavaScript nziritu ccà veni carricatu di ognuna pàggina, pi tutti l'utenti. */",
-       "monobook.js": "/* Lu còdici JavaScript nzirutu ccà veni carricatu di l'utenti c'ùsanu la skin MonoBook */",
        "anonymous": "{{PLURAL:$1|Utenti anònimu|Utenti anònimi}} di {{SITENAME}}",
        "siteuser": "$1, utenti di {{SITENAME}}",
        "lastmodifiedatby": "Sta pàggina hà statu canciata pi l'ùrtima vota lu $2, $1 di $3.",
        "spam_reverting": "Ripristinata l'ùrtima virsioni priva di culligamenti a $1",
        "spam_blanking": "Pàggina svacantata, tutti li virsioni cuntinìanu culligamenti a $1",
        "pageinfo-toolboxlink": "Nfurmazzioni ncapu la pàggina",
-       "skinname-monobook": "MonoBook",
        "markaspatrolleddiff": "Segna lu canciamentu comu virificatu",
        "markaspatrolledtext": "Segna sta pàggina comu virificata",
        "markedaspatrolled": "Canciamentu virificatu",
index 1fa5fa8..2ec5dfc 100644 (file)
@@ -16,7 +16,8 @@
                        "Ushanka",
                        "sco.wikipedia.org editors",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "PiRSquared17"
                ]
        },
        "tog-underline": "Unnerline airtins:",
        "qbmyoptions": "Ma pages",
        "faq": "ASS",
        "faqpage": "Project:ASS",
-       "vector-action-addsection": "Eik topic",
-       "vector-action-delete": "Delyte",
-       "vector-action-move": "Muiv",
-       "vector-action-protect": "Fend",
-       "vector-action-undelete": "Ondelyte",
-       "vector-action-unprotect": "Chynge protection",
-       "vector-view-create": "Ceaut",
-       "vector-view-edit": "Eedit",
-       "vector-view-history": "See histerie",
-       "vector-view-view": "Read",
-       "vector-view-viewsource": "See Soorce",
        "actions": "Actions",
        "namespaces": "Namespaces",
        "variants": "Variants",
        "newarticle": "(New)",
        "newarticletext": "Ye'v follaed aen airtin til ae page that disna exeest yet. Tae cræft the page, stairt typin in the kist ablo (see the [$1 heelp page] fer mair info). Gif ye'r here bi mistak, jist clap yer brouser's <strong>back</strong> button.",
        "anontalkpagetext": "----\n<em>This is the discussion page fer aen anonymoos uiser that's naw cræftit aen accoont yet, or that disna uise it.</em>\nWe maun therefore uise the numerical IP address tae identifie him/her.\nSic aen IP address can be shaired bi several uisers.\nGif ye'r aen anonymos uiser n feel that onreelavant comments hae been directed at ye, please [[Special:UserLogin/signup|cræft aen accoont]] or [[Special:UserLogin|log in]] tae avoid futur confusion wi ither anonymoos uisers.",
-       "noarticletext": "Thaur's naw tex oan this page the nou. \nYe can [[Special:Search/{{PAGENAME}}|rake fer this page teitle]] in ither pages,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rake the related logs],\n or [{{fullurl:{{FULLPAGENAME}}|action=edit}} eidit this page].</span>",
+       "noarticletext": "Thaur's naw tex oan this page the nou. \nYe can [[Special:Search/{{PAGENAME}}|rake fer this page teitle]] in ither pages,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rake the related logs],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} eidit this page].</span>",
        "noarticletext-nopermission": "Thaur's nae tex in this page the nou.\nYe can [[Special:Search/{{PAGENAME}}|rake fer this page title]] in ither pages, or <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rake the relatit logs]</span>, but ye dinna hae permeession tae cræft this page.",
        "missing-revision": "The reveesion #$1 o the page named \"{{FULLPAGENAME}}\" disna exeest.\n\nThis is uissuallie caused bi follaein aen ootdated histerie airtin til ae page that haes been delytit.\nDetails can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} delytion log].",
        "userpage-userdoesnotexist": "Uiser accoont \"<nowiki>$1</nowiki>\" hasnae been registerit. Please check gin ye wint tae mak or eidit this page.",
        "mergehistory-empty": "Naw reveesions can be merged.",
        "mergehistory-success": "$3 {{PLURAL:$3|reveesion|reveesions}} o [[:$1]] successfully merged intil [[:$2]].",
        "mergehistory-fail": "Onable tae perform histerie merge, please recheck the page n time parameters.",
+       "mergehistory-fail-toobig": "Canna perform histerie merge cause mair than the leemit o $1 {{PLURAL:$1|reveesion|reveesions}} wid be muivit.",
        "mergehistory-no-source": "Soorce page $1 disna exeest.",
        "mergehistory-no-destination": "Destination page $1 disna exeest.",
        "mergehistory-invalid-source": "Soorce page maun be ae valid title.",
        "difference-missing-revision": "{{PLURAL:$2|Yin reveesion|$2 reveesions}} o this difference ($1) {{PLURAL:$2|wis|were}} na foond.\n\nThis is usuallie caused bi follaein aen ootdated diff airtin til ae page that's been delytit.\nDetails can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} delytion log].",
        "searchresults": "Rake ootcomes",
        "searchresults-title": "Rake ootcome fer \"$1\"",
-       "toomanymatches": "Ower moni matches were returned, please try ae different speirin",
        "titlematches": "Page teetle matches",
        "textmatches": "Page tex matches",
        "notextmatches": "Nae page tex matches",
        "searchmenu-exists": "<strong>Thaur's ae page named \"[[:$1]]\" oan this wiki.</strong> {{PLURAL:$2|0=|See the ither rake ootcomes foond aes weel.}}",
        "searchmenu-new": "<strong>Cræft the page \"[[:$1]]\" oan this wiki!</strong> {{PLURAL:$2|0=|See the page foond wi yer rake ava.|See the rake ootcome foond ava.}}",
        "searchprofile-articles": "Content pages",
-       "searchprofile-project": "Heelp n Waurk pages",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Awthing",
        "searchprofile-advanced": "Advanced",
        "searchprofile-articles-tooltip": "Rake in $1",
-       "searchprofile-project-tooltip": "Rake in $1",
        "searchprofile-images-tooltip": "Rake fer files",
        "searchprofile-everything-tooltip": "Rake aw o content (inclædin tauk pages)",
        "searchprofile-advanced-tooltip": "Rake in custom namespaces",
        "search-interwiki-default": "Ootcomes fae $1:",
        "search-interwiki-more": "(mair)",
        "search-relatedarticle": "Relatit",
-       "searcheverything-enable": "Rake in aw namespaces",
        "searchrelated": "relatit",
        "searchall": "aw",
        "showingresults": "Shawin ablo up tae {{PLURAL:$1|'''1''' ootcome|'''$1''' ootcomes}} stertin wi #'''$2'''.",
        "timezoneregion-pacific": "Paceefic Ocean",
        "allowemail": "Allou email fae ither uisers",
        "prefs-searchoptions": "Rake",
-       "defaultns": "Itherwise rake in thir namespaces:",
        "default": "defaut",
        "prefs-files": "Files",
        "prefs-custom-css": "Custom CSS",
        "recentchanges-label-bot": "This eedit wis performed bi ae bot",
        "recentchanges-label-unpatrolled": "This eedit haes no bin patrolled yet",
        "recentchanges-label-plusminus": "The page size chynged bi this nummer o bytes",
-       "recentchanges-legend-newpage": "(see [[Special:NewPages|leet o new pages]] ava)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (see [[Special:NewPages|leet o new pages]] n aw)",
        "rcnotefrom": "Ablo ar the chynges sin <strong>$2</strong> (up til <strong>$1</strong> shawn).",
        "rclistfrom": "Shaw new chynges stertin fae $3 $2",
        "rcshowhideminor": "$1 smaa eedits",
        "windows-nonascii-filename": "This wiki disna support filenames wi speecial chairacters.",
        "fileexists": "Ae file wi this name exeests aareadies, please check <strong>[[:$1]]</strong> gif ye'r no sair that ye want tae chynge it.\n[[$1|thumb]]",
        "filepageexists": "The descreeption page fer this file haes awreadie been cræftit at <strong>[[:$1]]</strong>, bit nae file wi this name exeests the nou.\nThe ootline that ye enter will na kith oan the descreeption page.\nTae mak yer ootline kith thaur, ye'll need tae manuallie eedit it.\n[[$1|thumb]]",
-       "fileexists-extension": "Ae file wi ae siclike name exeests: [[$2|thumb]]\n* Name o the uplaidin file: <strong>[[:$1]]</strong>\n* Name o the exeestin file: <strong>[[:$2]]</strong>\nPlease chuise ae different name.",
+       "fileexists-extension": "Ae file wi ae siclike name exeests: [[$2|thumb]]\n* Name o the uplaidin file: <strong>[[:$1]]</strong>\n* Name o the exeestin file: <strong>[[:$2]]</strong>\nWid ye lik tae chuise ae mair disteencteeve name?",
        "fileexists-thumbnail-yes": "The file seems tae be aen eemage o reduced size ''(thumbnail)''.\n[[$1|thumb]]\nPlease check the file <strong>[[:$1]]</strong>.\nGif the checked file is the same eemage o oreeginal size it's no necessairie tae uplaid aen extra thumbnail.",
        "file-thumbnail-no": "The filename begins wi <strong>$1</strong>.\nIt seems tae be aen eemage o reduced size ''(thumbnail)''.\nGif ye hae this emage in ful resolution uplaid this yin, itherwise please chynge the filename.",
        "fileexists-forbidden": "Ae file wi this name awreadie exists, n canna be owerwritten.\nGif ye still wish tae uplaid yer file, please gang back n uise ae new name.\n[[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Delytion n restoration o files tempralie disabled during maintenance.",
        "filedelete-maintenance-title": "Canna delyte file",
        "mimesearch": "MIME rake",
-       "mimesearch-summary": "This page enables the filterin o files fer thair MIME type.\nInput: contenttype/subtype, e.g. <code>eemage/jpeg</code>.",
+       "mimesearch-summary": "This page enables the filterin o files fer thair MIME type.\nInput: contenttype/subtype or contenttype/*, e.g. <code>eemage/jpeg</code>.",
        "mimetype": "MIME type:",
        "download": "dounlaid",
        "unwatchedpages": "Onwatched pages",
        "version-parser-function-hooks": "Parser function huiks",
        "version-hook-name": "Huik name",
        "version-hook-subscribedby": "Subscribed bi",
+       "version-no-ext-name": "[no name]",
        "version-ext-colheader-description": "Descreeption",
        "version-ext-colheader-credits": "Writers",
        "version-license-title": "License fer $1",
index 118f7cf..dca11bf 100644 (file)
@@ -79,7 +79,7 @@
        "august": "avgust-коловоз",
        "september": "septembar-рујан",
        "october": "oktobar-листопад",
-       "november": "novembar",
+       "november": "студени-novembar",
        "december": "decembar-просинац",
        "january-gen": "januara-сијечња",
        "february-gen": "februara-вељаче",
@@ -91,7 +91,7 @@
        "august-gen": "augusta-коловоза",
        "september-gen": "septembra-рујна",
        "october-gen": "oktobra-листопада",
-       "november-gen": "novembar",
+       "november-gen": "студенога-novembra",
        "december-gen": "decembra-просинца",
        "jan": "jan-сиј",
        "feb": "feb-вељ",
        "aug": "aug-кол",
        "sep": "sep-руј",
        "oct": "okt-лис",
-       "nov": "nov",
+       "nov": "сту-nov",
        "dec": "dec-про",
        "january-date": "$1. januar",
        "february-date": "$1. februar",
        "qbmyoptions": "Moje opcije",
        "faq": "ČPP",
        "faqpage": "Project:ČPP",
-       "vector-action-addsection": "Dodaj temu",
-       "vector-action-delete": "Brisanje",
-       "vector-action-move": "Preusmjeri",
-       "vector-action-protect": "Zaštiti",
-       "vector-action-undelete": "Vrati obrisano",
-       "vector-action-unprotect": "Promijeni zaštitu",
-       "vector-view-create": "Napravi",
-       "vector-view-edit": "Uredi",
-       "vector-view-history": "Pregled historije",
-       "vector-view-view": "Čitaj",
-       "vector-view-viewsource": "Vidi izvor (source)",
        "actions": "Akcije",
        "namespaces": "Imenski prostori",
        "variants": "Varijante",
        "mediawikipage": "Pogledaj stranicu s porukom",
        "templatepage": "Pogledajte stranicu sa šablonom",
        "viewhelppage": "Pogledajte stranicu za pomoć",
-       "categorypage": "Pogledajte stranicu kategorije",
+       "categorypage": "Pogledaj stranicu kategorije",
        "viewtalkpage": "Pogledajte raspravu",
        "otherlanguages": "Drugi jezici / Други језици",
        "redirectedfrom": "(Preusmjereno sa $1)",
        "loginprompt": "Morate imati kolačiće ('''cookies''') omogućene da biste se prijavili na {{SITENAME}}.",
        "userlogin": "Prijavi se / Пријави се",
        "userloginnocreate": "Prijavi se",
-       "logout": "Odjavi se - Одјави се",
+       "logout": "Odjavi se / Одјави се",
        "userlogout": "Odjavi se / Одјави се",
        "notloggedin": "Niste prijavljeni",
        "userlogin-noaccount": "Nemate račun?",
        "previousrevision": "← Starija revizija",
        "nextrevision": "Novija izmjena →",
        "currentrevisionlink": "Trenutna verzija",
-       "cur": "tren",
+       "cur": "tren - трен",
        "next": "sljed - след",
        "last": "preth - претх",
        "page_first": "prva",
        "difference-title-multipage": "Razlika između stranica \"$1\" i \"$2\"",
        "difference-multipage": "(Razlika između stranica)",
        "lineno": "Linija $1:",
-       "compareselectedversions": "Uporedite označene verzije",
+       "compareselectedversions": "Uporedi označene verzije",
        "showhideselectedversions": "Pokaži/sakrij odabrane verzije",
        "editundo": "ukloni ovu izmjenu - уклони ову измену",
        "diff-empty": "(nema razlike)",
        "difference-missing-revision": "Ne mogu da pronađem {{PLURAL:$2|jednu izmenu|$2 izmene|$2 izmena}} od ove razlike ($1).\n\nOvo se obično dešava kada pratite zastarjelu vezu do stranice koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} evidenciji brisanja].",
        "searchresults": "Rezultati pretrage",
        "searchresults-title": "Rezultati pretrage za \"$1\"",
-       "toomanymatches": "Pronađeno je previše rezultata, molimo pokušajte unijeti konkretniji izraz",
        "titlematches": "Naslov članka odgovara",
        "textmatches": "Tekst stranice odgovara",
        "notextmatches": "Tekst stranice ne odgovara",
        "searchmenu-exists": "'''Postoji stranica pod nazivom \"[[:$1]]\" na ovoj wiki'''",
        "searchmenu-new": "<strong>Napravi stranicu \"[[:$1]]\" na ovoj wiki!</strong> {{PLURAL:$2|0=|Pogledajte također straniu pronađenu vašom pretragom.|Pogledajte također i vaše rezultate pretrage.}}",
        "searchprofile-articles": "Stranice sadržaja",
-       "searchprofile-project": "Stranice pomoći i projekta",
        "searchprofile-images": "Multimedija",
        "searchprofile-everything": "Sve",
        "searchprofile-advanced": "Napredno",
        "searchprofile-articles-tooltip": "Pretraga u $1",
-       "searchprofile-project-tooltip": "Pretraga u $1",
        "searchprofile-images-tooltip": "Traži datoteke",
        "searchprofile-everything-tooltip": "Pretraži sve sadržaje (ukljujući i stranice za razgovor)",
        "searchprofile-advanced-tooltip": "Traži u ostalim imenskim prostorima",
        "search-interwiki-default": "Rezultati od $1:",
        "search-interwiki-more": "(više)",
        "search-relatedarticle": "Povezano",
-       "searcheverything-enable": "Pretraga u svim imenskim prostorima",
        "searchrelated": "povezano",
        "searchall": "sve",
        "showingresults": "Dole {{PLURAL:$1|je prikazan '''1''' rezultat|su prikazana '''$1''' rezultata|je prikazano '''$1''' rezultata}} počev od '''$2'''.",
        "allowemail": "Dozvoli e-mail od ostalih korisnika",
        "prefs-searchoptions": "Pretraga",
        "prefs-namespaces": "Imenski prostori",
-       "defaultns": "Inače tražite u ovim imenskim prostorima:",
        "default": "standardno",
        "prefs-files": "Datoteke",
        "prefs-custom-css": "Prilagođeni CSS",
        "prefs-emailconfirm-label": "E-mail potvrda:",
        "youremail": "Vaša e-pošta / Ваша е-пошта*",
        "username": "Ime {{GENDER:$1|korisnika|korisnice}}:",
-       "uid": "{{GENDER:$1|Korisnički}} ID:",
        "prefs-memberingroups": "{{GENDER:$2|Korisnik|Korisnica}} je član {{PLURAL:$1|grupe|grupâ}}:",
        "prefs-registration": "Vrijeme registracije:",
        "yourrealname": "Vaše ime / Ваше име*",
        "recentchanges-label-unpatrolled": "Ova izmjena još nije patrolirana",
        "recentchanges-label-plusminus": "Veličina stranice promijenila se za ovoliko bajtova",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "(također pogledajte [[Special:NewPages|spisak novih stranica]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (također pogledajte [[Special:NewPages|spisak novih stranica]])",
        "rcnotefrom": "Ispod su izmjene od <strong>$2</strong> (do <strong>$1</strong> prikazano).",
        "rclistfrom": "Prikaži nove poruke od / Прикажи нове поруке од $3 $2",
        "rcshowhideminor": "$1 male izmjene / мале измене",
        "hide": "Sakrij",
        "show": "prikaži / прикажи",
        "minoreditletter": "m/м",
-       "newpageletter": "N",
+       "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|korisnik|korisnika}} koji pregledaju]",
        "rc_categories": "Ograniči na kategorije (razdvojene sa \"|\")",
        "uncategorizedimages": "Slike bez kategorije",
        "uncategorizedtemplates": "Šabloni bez kategorije",
        "unusedcategories": "Neiskorištene kategorije",
-       "unusedimages": "Neupotrebljene datoteke",
+       "unusedimages": "Neiskorišćene slike / Неискоришћене слике",
        "popularpages": "Popularne stranice",
        "wantedcategories": "Tražene kategorije",
        "wantedpages": "Tražene stranice / Тражене странице",
        "log-title-wildcard": "Traži naslove koji počinju s ovim tekstom",
        "showhideselectedlogentries": "Prikaži/sakrij izabrane zapise u evidenciji",
        "allpages": "Sve stranice / Све странице",
-       "alphaindexline": "$1 do $2",
        "nextpage": "Sljedeća strana ($1)",
        "prevpage": "Prethodna stranica ($1)",
        "allpagesfrom": "Prikaži stranice koje počinju od:",
        "deletepage": "Izbrišite stranicu",
        "confirm": "Potvrdi / Потврди",
        "excontent": "sadržaj je bio: '$1'",
-       "excontentauthor": "sadržaj je bio: '$1' (i jedini korisnik koji je mijenjao bio je '[[Special:Contributions/$2|$2]]')",
+       "excontentauthor": "sadržaj je bio: '$1', a jedini urednik '[[Special:Contributions/$2|$2]]'",
        "exbeforeblank": "sadržaj prije brisanja je bio: '$1'",
        "delete-confirm": "Brisanje \"$1\"",
        "delete-legend": "Obriši",
        "rollback-success": "Vraćene su izmjene korisnika $1;\nvraćeno na posljednju verziju koju je snimio $2.",
        "sessionfailure-title": "Greška u sesiji",
        "sessionfailure": "Izgleda da postoji problem sa vašom sesijom; ova akcija je otkazana kao prevencija protiv napadanja sesija. Kliknite \"back\" (''nazad'') i osvježite stranicu sa koje ste došli, i opet pokušajte.",
-       "protectlogpage": "Registar zaštite",
+       "protectlogpage": "Evidencija zaštite",
        "protectlogtext": "Ispod je spisak promjena zaštićenja stranice.\nPogledajte [[Special:ProtectedPages|spisak zaštićenih stranica]] za pregled trenutno operativnih zaštita stranica.",
        "protectedarticle": "\"[[$1]]\" zaštićeno",
        "modifiedarticleprotection": "promijenjen nivo zaštite za \"[[$1]]\"",
        "blocklist-nousertalk": "ne može uređivati vlastitu stranicu za razgovor",
        "ipblocklist-empty": "Spisak blokiranja je prazan.",
        "ipblocklist-no-results": "Tražena IP adresa ili korisničko ime nisu blokirani.",
-       "blocklink": "blokirajte",
+       "blocklink": "blokiraj",
        "unblocklink": "Odblokiraj / Одблокирај",
        "change-blocklink": "promijeni blokadu",
        "contribslink": "doprinosi",
        "blocklogpage": "Evidencija blokiranja",
        "blocklog-showlog": "Ovaj korisnik je ranije blokiran. \nEvidencija blokiranja je prikazana ispod kao referenca:",
        "blocklog-showsuppresslog": "Ovaj korisnik je ranije blokiran i sakriven. \nEvidencija sakrivanja je prikazana ispod kao referenca:",
-       "blocklogentry": "blokiran [[$1]] s rokom: $2 $3",
+       "blocklogentry": "Blokiran \"[[$1]]\" sa vremenom isticanja od $2 $3",
        "reblock-logentry": "promjena postavki blokiranja za [[$1]] sa vremenom isteka u $2 $3",
        "blocklogtext": "Ovo je historija akcija blokiranja i deblokiranja korisnika.\nAutomatski blokirane IP adrese nisu navedene ovdje.\nPogledajte [[Special:BlockList|spisak blokiranja]] za spisak trenutnih zabrana i blokiranja.",
        "unblocklogentry": "Odblokiran / Одблокиран \"$1\"",
        "movepagetalktext": "Odgovarajuća stranica za razgovor, ako postoji, će automatski biti premještena istovremeno '''osim:'''\n*Neprazna stranica za razgovor već postoji pod novim imenom, ili\n*Odznačite donju kutiju.\n\nU tim slučajevima, moraćete ručno da premjestite stranicu ukoliko to želite.",
        "movearticle": "Premjesti stranicu – Премјести страницу",
        "moveuserpage-warning": "'''Upozorenje:''' Premještate korisničku stranicu. Molimo da zapamtite da će se samo stranica premjestiti a korisnik se ''neće'' preimenovati.",
-       "movenologintext": "Morate biti registrovani korisnik i [[Special:UserLogin|prijavljeni]] da biste premjestili stranicu.",
+       "movenologintext": "Morate se registrovati ili [[Special:Userlogin|prijaviti]] kako biste premjestili članak.<br>\nМорате се регистровати или [[Special:Userlogin|пријавити]] како бисте преместили чланак.",
        "movenotallowed": "Nemate dopuštenje za premještanje stranica.",
        "movenotallowedfile": "Nemate dopuštenja da premještate datoteke.",
        "cant-move-user-page": "Nemate dopuštenje da premještate korisničke stranice (osim podstranica).",
        "rcpatroldisabledtext": "Funkcija patroliranja nedavnih izmjena je trenutno isključena.",
        "markedaspatrollederror": "Ne može se označiti kao patrolirano",
        "markedaspatrollederrortext": "Morate naglasiti reviziju koju treba označiti kao patroliranu.",
-       "markedaspatrollederror-noautopatrol": "Nije Vam dopušteno da vlastite izmjene označavate patroliranim.",
+       "markedaspatrollederror-noautopatrol": "Ne možete da označite svoje izmene patroliranim.",
        "markedaspatrollednotify": "Ova izmjena stranice $1 označena je kao patrolirana.",
        "markedaspatrollederrornotify": "Nije uspjelo označavanje ove stranice kao patrolirane.",
        "patrol-log-page": "Evidencija patroliranja",
        "metadata-fields": "Polja metapodataka slika su prikazani ispod slike će biti uključeni u prikaz stranice slike kada je sakrivena tabela metapodataka. U suprotnom će biti sakrivena po postavkama.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-imagewidth": "Širina",
        "exif-imagelength": "Visina",
-       "exif-bitspersample": "Bita po komponenti",
+       "exif-bitspersample": "Dubina boje",
        "exif-compression": "Šema kompresije",
        "exif-photometricinterpretation": "Sastav piksela",
        "exif-orientation": "Orijentacija",
        "exif-exifversion": "Exif verzija",
        "exif-flashpixversion": "Podržana verzija Flashpix",
        "exif-colorspace": "Prostor boje",
-       "exif-componentsconfiguration": "Značenje svake komponente",
-       "exif-compressedbitsperpixel": "Način kompresije slike",
+       "exif-componentsconfiguration": "Značenje pojedine komponente",
+       "exif-compressedbitsperpixel": "Dubina boje poslije sažimanja",
        "exif-pixelydimension": "Širina slike",
        "exif-pixelxdimension": "Visina slike",
        "exif-usercomment": "Korisnički komentari",
        "exif-isospeedratings": "Rejting ISO brzine",
        "exif-shutterspeedvalue": "Brzina APEX okidača",
        "exif-aperturevalue": "Otvor blende",
-       "exif-brightnessvalue": "APEX osvijetljenost",
+       "exif-brightnessvalue": "Osvjetljenost",
        "exif-exposurebiasvalue": "Kompozicija ekspozicije",
        "exif-maxaperturevalue": "Najveći broj otvora blende",
        "exif-subjectdistance": "Udaljenost objekta",
        "exif-personinimage": "Prikazana osoba",
        "exif-originalimageheight": "Visina slike prije nego što je odrezana",
        "exif-originalimagewidth": "Širina slike prije nego što je odrezana",
-       "exif-compression-1": "Nekompresovano",
+       "exif-compression-1": "Nesažeto",
        "exif-compression-2": "CCITT Grupa 3 1 — Dimenzionalno izmijenjeo Huffmanovo šifriranje po dužini",
        "exif-compression-3": "CCITT Group 3 faks kodiranje",
        "exif-compression-4": "CCITT Group 4 faks kodiranje",
        "monthsall": "sve",
        "confirmemail": "Potvrdite adresu e-pošte",
        "confirmemail_noemail": "Niste unijeli tačnu e-mail adresu u Vaše [[Special:Preferences|korisničke postavke]].",
-       "confirmemail_text": "Ova viki zahtjeva da potvrdite adresu Vaše e-pošte prije nego što koristite mogućnosti e-pošte. ž\nAktivirajte dugme ispod kako bi ste poslali poštu za potvrdu na Vašu adresu.\nPošta uključuje poveznicu koja sadrži kod;\nučitajte poveznicu u Vaš brauzer da bi ste potvrdili da je adresa Vaše e-pošte valjana.",
+       "confirmemail_text": "Ova wiki zahtjeva da potvrdite adresu Vaše e-pošte prije nego što koristite mogućnosti e-pošte. \nAktivirajte dugme ispod kako bi ste poslali poštu za potvrdu na Vašu adresu.\nPošta uključuje poveznicu koja sadrži kod;\nučitajte poveznicu u Vaš brauzer da bi ste potvrdili da je adresa Vaše e-pošte valjana.",
        "confirmemail_pending": "Kod za potvrdu Vam je već poslan putem e-maila;\nako ste nedavno otvorili Vaš račun, trebali bi pričekati par minuta da poslana pošta stigne, prije nego što ponovno zahtijevate novi kod.",
        "confirmemail_send": "Pošaljite kod za potvrdu",
        "confirmemail_sent": "E-pošta za potvrđivanje poslata.",
        "table_pager_limit_label": "Stavke po stranici:",
        "table_pager_limit_submit": "Idi",
        "table_pager_empty": "Bez rezultata",
-       "autosumm-blank": "Uklanjanje sadržaja stranice",
+       "autosumm-blank": "Uklanjanje svog sadržaja stranice",
        "autosumm-replace": "Zamjena stranice sa '$1'",
        "autoredircomment": "Preusmjereno na [[$1]]",
        "autosumm-new": "Napravljena stranica sa '$1'",
        "watchlistedit-raw-done": "Vaš spisak praćenja je ažuriran.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 naslov je dodan|$1 naslova su dodana|$1 naslova je dodano}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 naslov je uklonjen|$1 naslova je uklonjeno}}:",
+       "watchlistedit-clear-legend": "Obriši spisak praćenja",
+       "watchlistedit-clear-done": "Vaš spisak praćenja je obrisan. Svi naslovi su uklonjeni.",
        "watchlisttools-view": "Vidi relevantne promjene",
        "watchlisttools-edit": "Vidi i uredi listu praćenja",
        "watchlisttools-raw": "Uredi grubu listu praćenja",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|razgovor]])",
        "unknown_extension_tag": "Nepoznata oznaka ekstenzije \"$1\"",
        "duplicate-defaultsort": "'''Upozorenje''': Postavljeni ključ sortiranja \"$2\" zamjenjuje raniji ključ \"$1\".",
-       "version": "Verzija",
+       "version": "Verzija / Верзија",
        "version-extensions": "Instalirana proširenja (ekstenzije)",
        "version-specialpages": "Posebne stranice",
        "version-parserhooks": "Kuke parsera",
        "specialpages-group-media": "Multimedijalne datoteke \\ fajlovi i njihovo postavljanje / Мултимедијалне датотеке \\ фајлови и њихово постављање",
        "specialpages-group-users": "Korisnici i njihova prava / Корисници и њихова права",
        "specialpages-group-highuse": "Najčešće korištene stranice / Најчешће кориштене странице",
-       "specialpages-group-pages": "Spiskovi stranica",
+       "specialpages-group-pages": "Liste stranica / Листе страна",
        "specialpages-group-pagetools": "Alati za stranice",
-       "specialpages-group-wiki": "Podaci i alati",
+       "specialpages-group-wiki": "Wiki podaci i alati - Вики подаци и алати",
        "specialpages-group-redirects": "Posebne stranice za preusmjeravanje / Посебне стране за преусмеравање",
        "specialpages-group-spam": "Spam alati",
        "blankpage": "Prazna stranica",
index 2b0e7f7..8fdddd6 100644 (file)
        "vector-view-view": "කියවන්න",
        "vector-view-viewsource": "මූලාශ්‍රය නරඹන්න",
        "actions": "කාර්යයන්",
+       "vector-more-actions": "තවත්",
        "namespaces": "නාමඅවකාශයන්",
        "variants": "ප්‍රභේද",
        "navigation-heading": "සංචාලන මෙනුව",
        "searchmenu-exists": "'''මෙම විකියෙහි \"[[:$1]]\" ලෙස නම් කර ඇති පිටුවක් ඇත.'''",
        "searchmenu-new": "<strong>පිටුව තනන්න \"[[:$1]]\" මෙම විකියෙහි!</strong> {{PLURAL:$2|0=|ඔබගේ සෙවුමට හසුවූ පිටුව බලන්න.|සෙවූ ප්‍රතිපල බලන්න.}}",
        "searchprofile-articles": "අන්තර්ගත පිටු",
-       "searchprofile-project": "උදවු හා ව්‍යාපෘති පිටු",
        "searchprofile-images": "බහුමාධ්‍ය",
        "searchprofile-everything": "සියල්ල",
        "searchprofile-advanced": "උසස්",
        "searchprofile-articles-tooltip": "$1 හි ගවේෂණය කරන්න",
-       "searchprofile-project-tooltip": "$1 හි ගවේෂණය කරන්න",
        "searchprofile-images-tooltip": "ගොනු සඳහා ගවේෂණය කරන්න",
        "searchprofile-everything-tooltip": "සියළු අන්තර්ගතය ගවේෂණය කරන්න (සාකච්ඡා පිටුද ඇතුළුව)",
        "searchprofile-advanced-tooltip": "අභිරුචි නාමඅවකාශයන්හි ගවේෂණය කරන්න",
        "search-interwiki-default": "$1 වෙතින් ප්‍රතිඵල:",
        "search-interwiki-more": "(තවත්)",
        "search-relatedarticle": "සහසම්බන්ධිත",
-       "searcheverything-enable": "සියළු නාමඅවකාශයන්හි ගවේෂණය කරන්න",
        "searchrelated": "ආශ්‍රිත",
        "searchall": "සියල්ල",
        "showingresults": "#'''$2''' ගෙන් ආරම්භ කොට, {{PLURAL:$1|ප්‍රතිඵල '''1'''  ක් |ප්‍රතිඵල '''$1''' ක්}} දක්වා පහත පෙන්වා ඇත.",
        "allowemail": "අනෙකුත් පරිශීලකයන්ගෙන් විද්‍යුත්-තැපෑල ලැබීම සක්‍රීය කරන්න",
        "prefs-searchoptions": "සොයන්න",
        "prefs-namespaces": "නාමඅවකාශ",
-       "defaultns": "පෙරනිමියෙන් මෙම නාමඅවකාශයන්හි ගවේෂණය කරන්න:",
        "default": "පෙරනිමි",
        "prefs-files": "ගොනු",
        "prefs-custom-css": "අභිරුචි CSS",
        "tooltip-preferences-save": "අභිරුචීන් සුරකින්න",
        "tooltip-summary": "කෙටි සාරාංශයක් ඇතුළත් කරන්න",
        "common.css": "/* මෙහි CSS  බහාලීම සියළු ඡවියයන් භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */",
-       "cologneblue.css": "/* මෙහි CSS  බහාලීම \"Cologne Blue\" ඡවිය භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */",
        "monobook.css": "/* මෙහි CSS  බහාලීම ඒකායන ඡවිය භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */",
-       "modern.css": "/* මෙහි CSS  බහාලීම නූතන ඡවිය භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */",
        "print.css": "/* මෙහි CSS  බහාලීම මුද්‍රණ ප්‍රතිදානයට බලපෑම් සිදු කල හැක */",
        "common.js": "/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් සෑම පිටු ප්‍රවේශනයකදීම සියළු පරිශීලකයන්හට ප්‍රවේශනය කෙරේ. */",
-       "cologneblue.js": "/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් සිහිල්-සුවඳ-පැන් ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */",
        "monobook.js": "/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් ඒකායන ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */",
-       "modern.js": "/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් නූතන ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */",
        "anonymous": "{{SITENAME}} හි නිර්නාමික {{PLURAL:$1|පරිශීලකයා|පරිශීලකයෝ}}",
        "siteuser": "{{SITENAME}} පරිශීලක $1",
        "anonuser": "{{SITENAME}} නිර්නාමික පරිශීලක $1",
index f9e4885..ae13f91 100644 (file)
        "qbmyoptions": "Moje stránky",
        "faq": "Často kladené otázky",
        "faqpage": "Project:Často kladené otázky",
-       "vector-action-addsection": "Pridať tému",
-       "vector-action-delete": "Zmazať",
-       "vector-action-move": "Presunúť",
-       "vector-action-protect": "Zamknúť",
-       "vector-action-undelete": "Obnoviť",
-       "vector-action-unprotect": "Zmeniť stav ochrany",
-       "vector-view-create": "Vytvoriť",
-       "vector-view-edit": "Upraviť",
-       "vector-view-history": "Zobraziť históriu",
-       "vector-view-view": "Čítať",
-       "vector-view-viewsource": "Zobraziť zdroj",
        "actions": "Operácie",
        "namespaces": "Menné priestory",
        "variants": "Varianty",
        "difference-missing-revision": "{{PLURAL:$2|$2 revízia|$2 revízie|$2 revízií}} pre požadovaný rozdiel ($1) {{PLURAL:$2|neexistuje|neexistujú|neexistuje}}.\n\nPravdepodobne ste nasledovali zastaraný odkaz na rozdiel revízií, z ktorých niektorá bola medzičasom odstránená.\nPodrobnosti nájdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zázname zmazaní].",
        "searchresults": "Výsledky vyhľadávania",
        "searchresults-title": "Výsledky hľadania „$1“",
-       "toomanymatches": "Hľadanie vrátilo príliš veľa výsledkov. Prosím, skúste inú požiadavku.",
        "titlematches": "Vyhovujúce názvy stránok",
        "textmatches": "Zhody v textoch stránok",
        "notextmatches": "V textoch stránok nebola nájdená zhoda",
        "searchmenu-exists": "*Stránka '''[[$1]]'''",
        "searchmenu-new": "<strong>Vytvoriť na tejto wiki stránku „[[:$1|$1]]“!</strong> {{PLURAL:$2|0=|Pozrite si tiež stránku nájdenú vašim vyhľadávaním.|Pozrite si tiež stránky nájdené vašim vyhľadávaním.}}",
        "searchprofile-articles": "Stránky s obsahom",
-       "searchprofile-project": "Stránky pomocníka a projektu",
        "searchprofile-images": "Multimédiá",
        "searchprofile-everything": "Všetky",
        "searchprofile-advanced": "Pokročilé",
        "searchprofile-articles-tooltip": "Hľadať v $1",
-       "searchprofile-project-tooltip": "Hľadať v $1",
        "searchprofile-images-tooltip": "Hľadať súbory",
        "searchprofile-everything-tooltip": "Hľadať v celom obsahu (vrátane diskusných stránok)",
        "searchprofile-advanced-tooltip": "Hľadať vo vymenovaných menných priestoroch",
        "search-interwiki-default": "$1 výsledkov:",
        "search-interwiki-more": "(viac)",
        "search-relatedarticle": "Súvisiace",
-       "searcheverything-enable": "Vyhľadať vo všetkých menných priestoroch",
        "searchrelated": "súvisiace",
        "searchall": "všetko",
        "showingresults": "Nižšie {{PLURAL:$1|je zobrazený jeden výsledok|sú zobrazené '''1''' výsledky|je zobrazených '''$1''' výsledkov}}, počnúc od  #<b>$2</b>.",
        "allowemail": "Povoliť prijímanie e-mailov od iných používateľov",
        "prefs-searchoptions": "Hľadanie",
        "prefs-namespaces": "Menné priestory",
-       "defaultns": "Inak vyhľadávať v týchto menných priestoroch:",
        "default": "predvolený",
        "prefs-files": "Súbory",
        "prefs-custom-css": "Vlastný CSS",
        "recentchanges-label-unpatrolled": "Táto úprava zatiaľ nebola strážená",
        "recentchanges-label-plusminus": "Veľkosť stránky sa zmenila o toľkoto bajtov",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "(pozri tiež [[Special:NewPages|zoznam nových stránok]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (pozri tiež [[Special:NewPages|zoznam nových stránok]])",
        "rcnotefrom": "Nižšie sú zobrazené úpravy od <strong>$2</strong> (do <strong>$1</strong>).",
        "rclistfrom": "Zobraziť nové úpravy počnúc od $3 $2",
        "rcshowhideminor": "$1 drobné úpravy",
        "tooltip-preferences-save": "Uložiť nastavenia",
        "tooltip-summary": "Zadajte krátke zhrnutie",
        "common.css": "/* Tu umiestnené CSS bude ovplyvňovať všetky štýly */",
-       "cologneblue.css": "/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Kolínska modrá */",
-       "monobook.css": "/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Monobook */",
-       "modern.css": "/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Moderný */",
-       "vector.css": "/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Vector */",
        "print.css": "/* Tu umiestnené CSS bude ovplyvňovať tlačový výstup */",
        "noscript.css": "/* Tu umiestnené CSS bude ovplyvňovať používateľov s vypnutým JavaScriptom */",
        "group-autoconfirmed.css": "/* Tu umiestnené CSS bude ovplyvňovať iba používateľov s overenou emailovou adresou */",
        "group-sysop.css": "/* Tu umiestnené CSS bude ovplyvňovať iba správcov */",
        "group-bureaucrat.css": "/* Tu umiestnené CSS bude ovplyvňovať iba byrokratov */",
        "common.js": "/* Tu uvedený JavaScript sa nahrá všetkým používateľom pri každom nahraní stránky. */",
-       "cologneblue.js": "/* Tu sa nachádzajúci JavaScript sa načíta používateľom vzhľadu Kolínska modrá */",
-       "monobook.js": "/* Tu sa nachádzajúci JavaScript sa načíta používateľom vzhľadu Monobook */",
-       "modern.js": "/* Tu sa nachádzajúci JavaScript sa načíta používateľom vzhľadu Moderný */",
-       "vector.js": "/* Tu sa nachádzajúci JavaScript sa načíta používateľom vzhľadu Vector */",
        "group-autoconfirmed.js": "/* Tu sa nachádzajúci JavaScript sa načíta používateľom s potvrdenou emailovou adresou */",
        "group-bot.js": "/* Tu sa nachádzajúci JavaScript sa načíta len robotom */",
        "group-sysop.js": "/* Tu sa nachádzajúci JavaScript sa načíta len správcom */",
        "pageinfo-category-pages": "Počet stránok",
        "pageinfo-category-subcats": "Počet podkategórií",
        "pageinfo-category-files": "Počet súborov",
-       "skinname-cologneblue": "Kolínska modrá",
-       "skinname-monobook": "MonoBook",
-       "skinname-modern": "Moderný",
-       "skinname-vector": "Vector",
        "markaspatrolleddiff": "Označiť ako stráženú",
        "markaspatrolledtext": "Označiť túto stránku ako stráženú",
        "markedaspatrolled": "Označené ako strážené",
index bc2de72..4a902d0 100644 (file)
        "qbmyoptions": "Moje strani",
        "faq": "Najpogostejša vprašanja",
        "faqpage": "Project:Najpogostejša vprašanja",
-       "vector-action-addsection": "Dodaj temo",
-       "vector-action-delete": "Izbriši",
-       "vector-action-move": "Prestavi",
-       "vector-action-protect": "Zaščiti",
-       "vector-action-undelete": "Vrni",
-       "vector-action-unprotect": "Spremeni zaščito",
-       "vector-view-create": "Ustvari",
-       "vector-view-edit": "Uredi",
-       "vector-view-history": "Zgodovina",
-       "vector-view-view": "Preberi",
-       "vector-view-viewsource": "Izvorno besedilo",
        "actions": "Dejanja",
        "namespaces": "Imenski prostori",
        "variants": "Različice",
        "copyrightwarning": "Vsi prispevki k {{GRAMMAR:dajalnik|{{SITENAME}}}} se obravnavajo kot objave pod pogoji $2 (za podrobnosti glej $1). Če niste pripravljeni na neusmiljeno urejanje in prosto razširjanje vašega gradiva, ga ne prispevajte.<br />\nPoleg tega zagotavljate, da ste prispevke napisali oziroma ustvarili sami ali pa prepisali iz javno dostopnega ali podobnega prostega vira.\n'''Ne dodajajte avtorsko zaščitenega dela brez dovoljenja!'''",
        "copyrightwarning2": "Vedite, da lahko drugi urejevalci urejajo, spremenijo ali odstranijo kateri koli prispevek k {{GRAMMAR:dajalnik|{{SITENAME}}}}.\nČe niste pripravljeni na neusmiljeno urejanje svojega gradiva, ga ne objavljajte tukaj.<br />\nPoleg tega jamčite, da ste prispevke napisali oziroma ustvarili sami ali pa prepisali iz vira v javni lasti ali podobnega prostega vira (za podrobnosti glej $1).\n'''Ne objavljajte avtorsko zaščitenega gradiva brez dovoljenja!'''",
        "longpageerror": "'''Napaka: Predloženo besedilo je dolgo $1 {{PLURAL:$1|kilobajt|kilobajta|kilobajte|kilobajtov}}, s čimer presega največjo dovoljeno dolžino $2 {{PLURAL:$2|kilobajta|kilobajtov|kilobajtov|kilobajtov}}.'''\nZato ga ni mogoče shraniti.",
-       "readonlywarning": "'''Opozorilo: Zbirka podatkov je zaradi vzdrževanja začasno zaklenjena, kar pomeni, da sprememb trenutno ne morete shraniti. Prosimo, prenesite besedilo v urejevalnik in ga dodajte pozneje.'''\n\nSistemski skrbnik, ki jo je zaklenil, je podal naslednjo razlago: $1",
+       "readonlywarning": "<strong>Opozorilo: Zbirka podatkov je zaradi vzdrževanja začasno zaklenjena, kar pomeni, da sprememb trenutno ne morete shraniti.</strong>\nProsimo, prenesite besedilo v urejevalnik in ga dodajte pozneje.\n\nSistemski skrbnik, ki jo je zaklenil, je podal naslednjo razlago: $1",
        "protectedpagewarning": "'''Opozorilo: Stran je bila zaklenjena in jo lahko urejajo le uporabniki z administratorskimi pravicami.'''\nZadnji vnos v dnevnik je naveden spodaj:",
        "semiprotectedpagewarning": "'''Opomba:''' Stran je bila zaklenjena in jo lahko urejajo le registrirani uporabniki.\nZadnji vnos v dnevnik je naveden spodaj:",
        "cascadeprotectedwarning": "'''Opozorilo:''' Ta stran je zaklenjena, tako da jo lahko urejajo le administratorji, saj je bila vključena med {{PLURAL:$1|sledečo stran|sledeči strani|sledeče strani}} s kaskadno zaščito:",
        "currentrev": "Trenutna redakcija",
        "currentrev-asof": "Trenutna redakcija s časom $1",
        "revisionasof": "Redakcija: $1",
-       "revision-info": "Redakcija dne $1 od $2",
+       "revision-info": "Redakcija dne $1 od {{GENDER:$6|$2}}$7",
        "previousrevision": "← Starejša redakcija",
        "nextrevision": "Novejša redakcija →",
        "currentrevisionlink": "poglejte trenutno redakcijo",
        "mergehistory-empty": "Redakcij ni moč združiti.",
        "mergehistory-success": "$3 {{PLURAL:$3|redakcija|redakciji|redakcije|redakcij}} [[:$1]] je uspešno spojenih v [[:$2]].",
        "mergehistory-fail": "Ne morem izvesti združitev zgodovine, prosimo, ponovno preverite strani in parametre časa.",
+       "mergehistory-fail-toobig": "Ne morem izvesti združitve zgodovine, saj bi moral premakniti več kot $1 {{PLURAL:$1|redakcijo|redakciji|redakcije|redakcij}}, kar je omejitev.",
        "mergehistory-no-source": "Izvirna stran $1 ne obstaja.",
        "mergehistory-no-destination": "Ciljna stran $1 ne obstaja.",
        "mergehistory-invalid-source": "Izhodiščna stran mora imeti veljaven naslov.",
        "difference-missing-revision": "{{PLURAL:$2|Ene redakcije|$2 redakcij}} razlike ($1) {{PLURAL:$2|nisem}} našel.\n\nPo navadi se to zgodi, ko sledite zastareli povezavi na razliko redakcij strani, ki jo je nekdo izbrisal.\nPodrobnosti lahko najdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} dnevniku brisanja].",
        "searchresults": "Izid iskanja",
        "searchresults-title": "Zadetki za povpraševanje »$1«",
-       "toomanymatches": "Vrnjenih je bilo preveč zadetkov, poskusite z drugačno poizvedbo",
        "titlematches": "Ujemanje z naslovom članka",
        "textmatches": "Ujemanje z besedilom članka",
        "notextmatches": "Iskanih besed ne vsebuje nobeno besedilo članka",
        "search-interwiki-default": "Rezultati s strani $1:",
        "search-interwiki-more": "(več)",
        "search-relatedarticle": "Podobno",
-       "searcheverything-enable": "Iskanje po vseh imenskih prostorih",
        "searchrelated": "povezano",
        "searchall": "vse",
        "showingresults": "Prikazujem do '''$1''' {{PLURAL:$1|zadetek|zadetka|zadetke|zadetkov}}, začenši s št. '''$2'''.",
        "powersearch-togglelabel": "Izberi:",
        "powersearch-toggleall": "Vse",
        "powersearch-togglenone": "Nič",
+       "powersearch-remember": "Zapomni si izbiro za nadaljnja iskanja",
        "search-external": "Zunanji iskalnik",
        "searchdisabled": "Iskanje po {{GRAMMAR:dajalnik|{{SITENAME}}}} je onemogoočeno.\nMedtem lahko iščete preko Googla.\nUpoštevajte, da so njihovi podatki vsebine {{GRAMMAR:rodilnik|{{SITENAME}}}} morda zastareli.",
        "search-error": "Med iskanjem je prišlo do napake: $1",
        "allowemail": "Drugim uporabnikom omogoči pošiljanje e-pošte",
        "prefs-searchoptions": "Iskanje",
        "prefs-namespaces": "Imenski prostori",
-       "defaultns": "Navadno išči v naslednjih imenskih prostorih:",
        "default": "privzeto",
        "prefs-files": "Datoteke",
        "prefs-custom-css": "CSS po meri",
        "recentchanges-label-unpatrolled": "Urejanje še ni bilo pregledano",
        "recentchanges-label-plusminus": "uporabnik je velikost strani spremenil za tolikšno število bajtov",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "(glej tudi [[Special:NewPages|seznam novih strani]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (glej tudi [[Special:NewPages|seznam novih strani]])",
        "rcnotefrom": "Navedene so spremembe od <strong>$2</strong> dalje (prikazujem jih do <strong>$1</strong>).",
        "rclistfrom": "Prikaži spremembe od $3 $2 naprej",
        "rcshowhideminor": "$1 manjša urejanja",
        "largefileserver": "Velikost datoteke presega strežnikove nastavitve.",
        "emptyfile": "Kaže, da je aložena datoteka prazna.\nDo tega bi lahko prišlo zaradi tipkarske napake v imenu.\nAli datoteko resnično želite naložiti?",
        "windows-nonascii-filename": "Ta wiki ne podpira imen datotek s posebnimi znaki.",
-       "fileexists": "Datoteka s tem imenom že obstaja. Preden jo povozite, preverite stran <strong>[[:$1]]</strong>.\n[[$1|thumb]]",
+       "fileexists": "Datoteka s tem imenom že obstaja. Preden jo {{GENDER:|povozite}}, preverite stran <strong>[[:$1]]</strong>.\n[[$1|thumb]]",
        "filepageexists": "Opisna stran za to datoteko je bila že ustvarjena na <strong>[[:$1]]</strong>, vendar datoteka s tem imenom trenutno ne obstaja.\nPovzetek, ki ste ga vnesli, se ne bo prikazal na opisni strani.\nDa tam prikažete povzetek, morate stran urediti ročno.\n[[$1|thumb]]",
-       "fileexists-extension": "Datoteka s podobnim imenom že obstaja: [[$2|thumb]]\n* Ime naložene datoteke: <strong>[[:$1]]</strong>\n* Ime obstoječe datoteke: <strong>[[:$2]]</strong>\nProsimo, izberite drugo ime.",
+       "fileexists-extension": "Datoteka s podobnim imenom že obstaja: [[$2|thumb]]\n* Ime naložene datoteke: <strong>[[:$1]]</strong>\n* Ime obstoječe datoteke: <strong>[[:$2]]</strong>\nŽelite morda uporabiti bolj opisno ime?",
        "fileexists-thumbnail-yes": "Kot izgleda, je ta slika pomanjšana ''(thumbnail)''. [[$1|thumb]]\nProsimo, preverite datoteko <strong>[[:$1]]</strong>.\nČe je preverjena datoteka enaka kot ta, ki jo nalage, ni potrebno nalagati še dodatne sličice.",
        "file-thumbnail-no": "Ime datoteke se začne z <strong>$1</strong>.\nIzgleda, da je to pomanjšana slika ''(thumbnail)''.\nČe imate sliko polne resolucije, jo naložite, drugače spremenite ime datoteke.",
        "fileexists-forbidden": "Datoteka s tem imenom že obstaja in je ni mogoče prepisati.\nČe še vedno želite naložiti vašo datoteko, se prosimo vrnite nazaj in uporabite novo ime.\n[[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Brisanje in obnovitev datotek je začasno onemogočeno zaradi vzdrževanja.",
        "filedelete-maintenance-title": "Ne morem izbrisati datoteke",
        "mimesearch": "Iskanje po vrsti MIME",
-       "mimesearch-summary": "Ta stran omogoča filtriranje datotek po njihovi vrsti MIME.\nVnesite: vrstavsebine/podvrsta, npr. <code>image/jpeg</code>.",
+       "mimesearch-summary": "Stran omogoča filtriranje datotek po njihovi vrsti MIME.\nVnesite: vrstavsebine/podvrsta ali vrstavsebine/*, npr. <code>image/jpeg</code>.",
        "mimetype": "Vrsta MIME:",
        "download": "prenesi",
        "unwatchedpages": "Nespremljane strani",
        "wantedtemplates": "Želene predloge",
        "mostlinked": "Strani, na katere se največ povezuje",
        "mostlinkedcategories": "Kategorije z največ elementi",
-       "mostlinkedtemplates": "Najbolj uporabljane predloge",
+       "mostlinkedtemplates": "Največkrat vključene strani",
        "mostcategories": "Članki z največ kategorijami",
        "mostimages": "Najbolj uporabljane datoteke",
        "mostinterwikis": "Strani z največ medjezikovnimi povezavami",
        "version-hook-name": "Ime razširitve",
        "version-hook-subscribedby": "Naročen s strani",
        "version-version": "(Različica $1)",
+       "version-no-ext-name": "[brez imena]",
        "version-license": "Dovoljenje MediaWiki",
        "version-ext-license": "Dovoljenje",
        "version-ext-colheader-name": "Razširitev",
index f90910e..c8c93d9 100644 (file)
        "qbmyoptions": "Boggageyga",
        "faq": "SIL",
        "faqpage": "Project:SIL",
-       "vector-action-addsection": "Hadal ku dar",
-       "vector-action-delete": "Tirtir",
-       "vector-action-move": "Wareeji",
-       "vector-action-protect": "Difaac",
-       "vector-action-undelete": "Ha tirtirin",
-       "vector-action-unprotect": "Bedel difaacida",
-       "vector-view-create": "Sameey",
-       "vector-view-edit": "Wax ka bedel",
-       "vector-view-history": "Itusi taariikhda",
-       "vector-view-view": "Akhri",
-       "vector-view-viewsource": "Itusi xogta",
        "actions": "Waxa dhacaayo",
        "namespaces": "Xarun magaceedyada",
        "variants": "Isbedelada",
        "powersearch-togglenone": "Waxna",
        "preferences": "Dooqyada",
        "mypreferences": "Dooqyadeyda",
+       "prefs-edits": "Tirada wax bedelka:",
        "prefs-skin": "Jirka",
        "skin-preview": "Horfiirin",
        "datedefault": "Ma'jiro dooq",
        "prefs-rc": "Isbedelada dhow",
        "prefs-watchlist": "liiska-waardiyaha",
        "prefs-watchlist-days": "Tirada maalamaha ay ku jirayaan liiska-waardiyaha:",
+       "prefs-resetpass": "Bedel ereysirta",
        "prefs-email": "E-mail aad dooran kartaa",
        "prefs-rendering": "Muuqaalka",
        "saveprefs": "Kaydi",
        "youremail": "E-mail:",
        "username": "Gudagal:",
        "prefs-memberingroups": "{{GENDER:$2|Xubin}} ka mid ah {{PLURAL:$1|kooxda|kooxaha}}:",
+       "prefs-registration": "Waqtiga diiwaan galinta",
        "yourrealname": "Magacaaga runta ah:",
        "yourlanguage": "luqad:",
        "yournick": "Saxiix cusub:",
+       "prefs-help-signature": "Waan in la saxiixaa wadahdalada ku dhaca bogga wadhadalka adigoo adeegsaanaya \"<nowiki>~~~~</nowiki>\", kaasoo u rogi doona saxiixa iyo waqtiga.",
        "badsiglength": "Naaneysta aad bey u dheertahay.\nWaa in aysan ka badanin $1 {{PLURAL:$1|eray|erayo}}.",
        "yourgender": "Jinsi:",
        "gender-unknown": "Aana la qeexin",
        "gender-male": "Lab",
        "gender-female": "Dhedig",
+       "prefs-help-gender": "Ahaysiinta xulashaan waa mid dooqasha ah.\nBarnaamijkaan adeegsigiisa waxay qiima u yeelaysaa wadahadalkaada iyo kuwa kale iyadoo bedelaysa habka qofka sida lab ama dheddig.\nMacluumadkaan waa mid la wada arkayo.",
        "email": "E-mail",
        "prefs-help-realname": "Optional: if you choose to provide it this will be used for giving you attribution for your work.",
        "prefs-help-email": "E-mail waa wax aad xor u leedahay. laakiin waa loo baahanyahay hadii aad eraysirka badaleesid, hadii aad ilaawdo eraygaaga sirta ah",
        "prefs-help-email-others": "Waxaa kale oo aad u isticmaali kartaa in ee dadka kale kugula soo xiriiraan e-mail ayaga oo isticmaalaayo linki isticmaalahaada ama bogga wadahadalka.\nE-mailkaada mala sheegaayo markii ee dadka kale kula soo xiriirayaan.",
        "prefs-help-email-required": "Waxaa loo baahanyahay e-mail.",
        "prefs-info": "Macluumaadka asaasiga ah",
+       "prefs-i18n": "Caalamiyeen",
+       "prefs-signature": "Saxiixa",
+       "prefs-help-prefershttps": "Waxaa lahagaajin doonaan dooqaan marka xiga ee aad soo gasho",
        "saveusergroups": "Kaydi kooxaha isticmaalayaasha",
        "userrights-groupsmember": "Ka mid ah:",
        "userrights-reason": "Sababta:",
        "recentchanges-label-unpatrolled": "bedelkaan hadda wali lama waardiyeen",
        "recentchanges-label-plusminus": "Qaadka bogga wuxuu ku bedelmay tirada halbeega baytka",
        "recentchanges-legend-heading": "'''Sharaxaad:'''",
-       "recentchanges-legend-newpage": "(sidoo kale eeg [[Special:NewPages|liiska bogagga cusub]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sidoo kale eeg [[Special:NewPages|liiska bogagga cusub]])",
        "rcnotefrom": "Hoostaan waa isbedaladii dhacay  '''$2''' (waxaad arkoosaa ilaa '''$1''' ).",
        "rclistfrom": "Itusi isbedelada cusub oo ka bilaabaneyso $3 $2",
        "rcshowhideminor": "$1 bedelada yar",
index ae8507d..baa5b45 100644 (file)
@@ -51,7 +51,7 @@
        "tog-shownumberswatching": "Trego numrin e përdoruesve që vëzhgojnë këtë faqe",
        "tog-oldsig": "Nënshkrimi ekzistues:",
        "tog-fancysig": "Mbaje nënshkrimin si wikitekst (pa lidhje automatike)",
-       "tog-uselivepreview": "Trego bocetin në mënyrë të drejtëpërdrejtë (kërkon JavaScript) (eksperimentale)",
+       "tog-uselivepreview": "Trego pamjen në mënyrë të drejtëpërdrejtë (kërkon JavaScript) (eksperimentale)",
        "tog-forceeditsummary": "Më njofto kur e lë përmbledhjen e redaktimit bosh",
        "tog-watchlisthideown": "Fshih redaktimet e mia nga lista e faqeve të vëzhguara",
        "tog-watchlisthidebots": "Fshih redaktimet e robotëve nga lista e faqeve të vëzhguara",
@@ -64,6 +64,7 @@
        "tog-showhiddencats": "Trego kategoritë e fshehura",
        "tog-norollbackdiff": "Ndryshimi pas rikthimit do të fshihet",
        "tog-useeditwarning": "Më paralajmëro kur unë lë një redaktim faqeje me ndryshime të paruajtura",
+       "tog-prefershttps": "Gjithmonë përdorni një lidhje të sigurt kur të kyçur",
        "underline-always": "Gjithmonë",
        "underline-never": "Asnjëherë",
        "underline-default": "Parapërcaktuar nga shfletuesi",
        "newwindow": "(hapet në një dritare të re)",
        "cancel": "Anulo",
        "moredotdotdot": "Më shumë...",
-       "morenotlisted": "Të tjera...",
+       "morenotlisted": "Kjo listë nuk është e plotë.",
        "mypage": "Faqja",
        "mytalk": "Diskutimet",
        "anontalk": "Diskutimet për këtë IP",
        "qbmyoptions": "Faqet e mia",
        "faq": "Pyetje që bëhen shpesh",
        "faqpage": "Project: Pyetje që bëhen shpesh",
-       "vector-action-addsection": "Shto një temë",
-       "vector-action-delete": "Grise",
-       "vector-action-move": "Zhvendose",
-       "vector-action-protect": "Mbroje",
-       "vector-action-undelete": "Anullo fshirjen",
-       "vector-action-unprotect": "Ndrysho mbrojtjen",
-       "vector-view-create": "Krijo",
-       "vector-view-edit": "Redakto",
-       "vector-view-history": "Shiko historikun",
-       "vector-view-view": "Lexo",
-       "vector-view-viewsource": "Shiko tekstin",
        "actions": "Veprimet",
        "namespaces": "Hapsirat e emrit",
        "variants": "Variante",
        "permalink": "Lidhje e përhershme",
        "print": "Printo",
        "view": "Shiko",
+       "view-foreign": "Pamja <span class=\"notranslate\" translate=\"asnjë\">$1</span>",
        "edit": "Redakto",
+       "edit-local": "Modifiko burimin lokalt të përshkrimit",
        "create": "Krijo",
+       "create-local": "Shtonipërshkrimin lokal",
        "editthispage": "Redakto këtë faqe",
        "create-this-page": "Krijoje këtë faqe",
        "delete": "Grise",
        "jumptonavigation": "lundrim",
        "jumptosearch": "kërko",
        "view-pool-error": "Ju kërkojmë ndjesë, serverët janë të mbingarkuar për momentin.\nKëtë faqe po përpiqen t'i shikojnë më shumë njerëz nga ç'është e mundur.\nJu lutemi prisni pak para se ta hapni sërish këtë faqe.\n\n$1",
+       "generic-pool-error": "Ju kërkojmë ndjesë, serverët janë të mbingarkuar për momentin.\nKëtë faqe po përpiqen t'i shikojnë më shumë njerëz nga ç'është e mundur.\nJu lutemi prisni pak para se ta hapni sërish këtë faqe.\n\n$1",
        "pool-timeout": "Mbaroi koha duke pritur për kyçin",
        "pool-queuefull": "Radha e proceseve është mbushur",
        "pool-errorunknown": "Gabim i panjohur",
+       "pool-servererror": "Pishinë e  numerimit  te shërbimit nuk është në dispozicion (<span class=\"notranslate\" translate=\"asnjë\">$1</span>).",
        "aboutsite": "Rreth {{SITENAME}}",
        "aboutpage": "Project:Rreth",
-       "copyright": "Përmbajtja është në disponim nëpërmjet licencës $1.",
+       "copyright": "Përmbajtja është në disponim nëpërmjet licencës $1 ose tregohet ndryshe.",
        "copyrightpage": "{{ns:project}}:Të drejtat e autorit",
        "currentevents": "Ngjarjet aktuale",
        "currentevents-url": "Project:Ngjarjet aktuale",
        "nospecialpagetext": "<strong>Ju keni kërkuar një faqe speciale të pavlefshme.</strong> \n\n Një listë e faqeve speciale të vlefshme mund të gjendet në [[Special:SpecialPages|{{int: specialpages }}]].",
        "error": "Gabim",
        "databaseerror": "Gabim në databazë",
+       "databaseerror-text": "\nKjo mund të tregojë një gabim në software.",
+       "databaseerror-textcl": " ka ndodhur  një   gabim ne query te bazën të dhënash",
+       "databaseerror-query": "\nPyetje: $ 1",
+       "databaseerror-function": "Funksioni: <span class=\"notranslate\" translate=\"asnjë\">$1</span>",
+       "databaseerror-error": "Gabim: <span class=\"notranslate\" translate=\"asnjë\">$1</span>",
        "laggedslavemode": "'''Kujdes:''' Kjo faqe nuk mund të ketë përditësime të kohëve të fundit.",
        "readonly": "Databaza e kyçur",
        "enterlockreason": "Shëno arsyen e kyçjes, gjithashtu shëno se kur mund të hapet.",
        "cannotdelete": "Faqja ose skeda $1 nuk mund të fshihej.\nMund të jetë fshirë nga dikush tjetër.",
        "cannotdelete-title": "Faqja \"$1\" nuk mund të fshihet",
        "delete-hook-aborted": "Fshirja u anulua nga togëza.\nNuk jipet shpjegim.",
+       "no-null-revision": "I pamundur krijimi rishikimi  i ri për faqen bosh \"$ 1\"",
        "badtitle": "Titull i pasaktë",
        "badtitletext": "Titulli i faqes që kërkuat nuk ishte i saktë, ishte bosh, ose ishte një titull ndër-gjuhësor/inter-wiki me lidhje të pasaktë.\nMund të përmbajë një ose më shumë germa, të cilat nuk mund të përdoren në tituj.",
        "perfcached": "nformacioni i mëposhtëm është kopje e ruajtur dhe mund të mos jetë i përditësuar. E shumta  {{PLURAL:$1|një rezultat është|$1 rezultate janë}} ruajtur në kopje.",
        "viewsource-title": "Shiko tekstin për $1",
        "actionthrottled": "Veprim u ndalua",
        "actionthrottledtext": "Si masë sigurie anti-spam, është e ndaluar kryerja e shpeshtë e një veprimi brenda një hapësire kohore shumë të shkurtër. Ju kryet shumë herë të njëjtin veprim brenda një kohe shumë të shkurtër.\nJu lutemi, provojeni përsëri pas disa minutash.",
-       "protectedpagetext": "Kjo faqe është e mbrojtur dhe nuk mund të redaktohet.",
+       "protectedpagetext": "Kjo faqe është e mbrojtur për të parandaluar redaktimi apo veprime të tjera.",
        "viewsourcetext": "Ju mund të shikoni dhe kopjoni tekstin e kësaj faqeje:",
        "viewyourtext": "Ju mund të shikoni dhe të kopjoni tekstin e '''ndryshimeve tuaja''' tek kjo faqe:",
        "protectedinterface": "Kjo faqe përmban tekstin e dritares së programit, për këtë arsye mbrohet për të shmangur abuzimet.",
        "namespaceprotected": "Nuk ju lejohet redaktimi i faqeve në hapsirën '''$1'''.",
        "customcssprotected": "Ju nuk keni leje për të redaktuar këtë faqe CSS, sepse ai përmban cilësimet personale tjetër user's.",
        "customjsprotected": "Ju nuk keni leje për të redaktuar këtë faqe JavaScript, sepse ai përmban cilësimet personale tjetër user's.",
+       "mycustomcssprotected": "Ju nuk keni leje për të redaktuar këtë faqe CSS.",
+       "mycustomjsprotected": "Ju nuk keni leje për të redaktuar këtë   faqe JavaScript .",
+       "myprivateinfoprotected": "Ju nuk keni leje për të redaktuar të dhënat tuaja private.",
+       "mypreferencesprotected": "Ju nuk keni leje për të ndryshuar preferencat tuaja.",
        "ns-specialprotected": "Faqet speciale nuk mund të redaktohen.",
        "titleprotected": "Ky titull është mbrojtur nga [[User:$1|$1]] dhe nuk mund të krijohet.\nArsyeja e dhënë është ''$2''.",
        "filereadonlyerror": "Nuk është në gjendje që të ndryshojë skedarin \"$1\" sepse depoja e skedarit \"$2\" është në formën vetëm-lexim.\n\nAdministratori i cili e mbylli atë e dha këtë shpjegim: \"$3\".",
        "invalidtitle-unknownnamespace": "Titull jo i vlefshëm me numrin e panjohur të hapësirës së emrit $1 dhe tekstit \"$2\"",
        "exception-nologin": "I paqasur",
        "exception-nologin-text": "Kjo faqe ose ky veprim ju kërkon që të qaseni në këtë wiki.",
+       "exception-nologin-text-manual": "Ju lutem <span class=\"notranslate\" translate=\"asnjë\">$1</span> që të jeni në gjendje për të hyrë në këtë faqe ose të veproni.",
        "virus-badscanner": "Konfiguracion i parregullt: Skaner i panjohur virusesh: ''$1''",
        "virus-scanfailed": "skani dështoi (code $1)",
        "virus-unknownscanner": "antivirus i pa njohur:",
-       "logouttext": "'''Ju keni dalë jashtë.''' \n\n 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. \n Kini parasysh që disa faqe mund të shfaqen sikur të ishit i identifikuar derisa të fshini ''cache''-in e shfletuesit tuaj.",
+       "logouttext": "'''Ju keni dalë jashtë.''' \n \n Kini parasysh që disa faqe mund të shfaqen sikur të ishit i identifikuar derisa të fshini ''cache''-in e shfletuesit tuaj.",
        "welcomeuser": "Mirë se vini, $1!",
        "welcomecreation-msg": "Llogaria juaj u krijua. \nMos harroni të ndryshoni [[Special:Preferences|{{SITENAME}} preferencat]] tuaja.",
        "yourname": "Fusni nofkën tuaj",
        "gotaccount": "Keni një llogari? '''$1'''.",
        "gotaccountlink": "Hyni",
        "userlogin-resetlink": "Keni harruar të dhënat tuaja të identifikimit?",
-       "userlogin-resetpassword-link": "Rivendos fjalëkalimin",
-       "createaccountmail": "me email",
+       "userlogin-resetpassword-link": "Harruat fjalëkalimin",
+       "userlogin-helplink2": "Ndihmoni me hyrjen në",
+       "userlogin-loggedin": "Ju tashmë janë të regjistruar si <span class=\"notranslate\" translate=\"asnjë\">{{GJINIA:$1|</span><span class=\"notranslate\" translate=\"asnjë\">$1</span>}}.\nPërdorim formularin më poshtë që të hyni në si një përdorues tjetër.",
+       "userlogin-createanother": "Krijo një llogari tjeter",
+       "createacct-emailrequired": "Posta elektronike",
+       "createacct-emailoptional": "Adresa Elektronike (me dëshirë)",
+       "createacct-email-ph": "Fusni adresën tuaj elektronike",
+       "createacct-another-email-ph": "Vendos adresën e postës elektronike",
+       "createaccountmail": "Përdorni një fjalëkalim të përkohshëm të rastit dhe  dërgojeni atë në adresën e specifikuar te email",
+       "createacct-realname": "Emri i vërtetë (me dëshirë)",
        "createaccountreason": "Arsyeja:",
+       "createacct-reason": "Arsyeja",
+       "createacct-reason-ph": "Pse ju jeni duke krijuar një llogari tjetër",
+       "createacct-captcha": "kontroll sigurie",
+       "createacct-imgcaptcha-ph": "Shkruaj tekstin që ju shihni më lartë",
+       "createacct-submit": "Krijoni llogarinë tuaj",
+       "createacct-another-submit": "Krijo një llogari tjeter",
+       "createacct-benefit-heading": "{{SITENAME}} është bërë nga njerëz si ju.",
+       "createacct-benefit-body1": "$1 {{PLURAL:$1|redaktim|redaktime}}",
+       "createacct-benefit-body2": "\n{{Plural: $ 1 | faqe | faqe}}",
        "badretype": "Fjalëkalimet nuk janë njësoj.",
        "userexists": "Emri i përdoruesit që kërkuat është në përdorim. \nZgjidhni një emër tjetër.",
        "loginerror": "Gabim gjatë identifikimit",
        "diff-multi-manyusers": "({{PLURAL:$1|Një versioni i ndërmjetshëm|$1 versione të ndërmjetshme}} nga më shumë se $2 {{PLURAL:$2|përdorues|përdorues}} i/të pashfaqur)",
        "searchresults": "Rezultatet e kërkimit",
        "searchresults-title": "Rezultatet e kërkimit për \"$1\"",
-       "toomanymatches": "Ky kërkim ka shumë përfundime, provoni një pyetje tjetër më përcaktuese",
        "titlematches": "Tituj faqesh që përputhen",
        "textmatches": "Tekst faqesh që përputhet",
        "notextmatches": "Nuk ka asnjë tekst faqeje që përputhet",
        "searchmenu-exists": "'''Në këtë wiki kjo faqe është emëruar \"[[:$1]]\"'''",
        "searchmenu-new": "'''Hapë faqen \"[[:$1]]\" në këtë wiki!'''",
        "searchprofile-articles": "Përmbajtja e faqeve",
-       "searchprofile-project": "Ndihmë dhe faqet e Projektit",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Gjithçka",
        "searchprofile-advanced": "Avancuar",
        "searchprofile-articles-tooltip": "Kërko në $1",
-       "searchprofile-project-tooltip": "Kërko në $1",
        "searchprofile-images-tooltip": "Kërko skedarë",
        "searchprofile-everything-tooltip": "Kërko gjithë përmbajtjen (duke përfshirë edhe faqet e diskutimit)",
        "searchprofile-advanced-tooltip": "Kërkimi në hapësina",
        "search-interwiki-default": "$1 përfundime:",
        "search-interwiki-more": "(më shumë)",
        "search-relatedarticle": "Të ngjashme",
-       "searcheverything-enable": "Kërko në të gjitha hapësirat",
        "searchrelated": "të ngjashme",
        "searchall": "të gjitha",
        "showingresults": "Më poshtë tregohen {{PLURAL:$1|'''1''' përfundim|'''$1''' përfundime}} duke filluar nga #'''$2'''.",
        "allowemail": "Lejo përdoruesit të më dërgojnë email",
        "prefs-searchoptions": "Mundësi kërkimi",
        "prefs-namespaces": "Hapësirat",
-       "defaultns": "Kërko automatikisht vetëm në këto hapësira:",
        "default": "parazgjedhje",
        "prefs-files": "Figura",
        "prefs-custom-css": "CSS i përpunuem",
        "prefs-emailconfirm-label": "Konfirmimi i emailit:",
        "youremail": "Adresa e email-it*",
        "username": "Nofka e përdoruesit:",
-       "uid": "Nr. i identifikimit:",
        "prefs-memberingroups": "Anëtar i {{PLURAL:$1|grupit|grupeve}}:",
        "prefs-registration": "Koha e regjistrimit:",
        "yourrealname": "Emri juaj i vërtetë*",
        "log-title-wildcard": "Kërko tituj që fillojnë me këtë tekst",
        "showhideselectedlogentries": "Paraqit/fshih shënimet e përzgjedhura të regjistruara.",
        "allpages": "Të gjitha faqet",
-       "alphaindexline": "$1 deri në $2",
        "nextpage": "Faqja më pas ($1)",
        "prevpage": "Faqja më parë ($1)",
        "allpagesfrom": "Trego faqet duke filluar nga:",
        "tooltip-undo": "\"Zhbëje\" rikthen këtë ndryshim dhe hap modulin e redaktimit për shqyrtim. Lejon që të jepni një arsye tek përmbledhja.",
        "tooltip-preferences-save": "Ruaj parapëlqimet",
        "tooltip-summary": "Fusni një përmbledhje të shkurtër",
-       "monobook.css": "/* redaktoni këtë faqe për të përshtatur pamjen Monobook për tëra faqet tuaja */",
+       "interlanguage-link-title-nonlang": "$1 deri në $2",
        "anonymous": "{{PLURAL:$1|Përdoruesi anonim|Përdoruesit anonimë}} të {{SITENAME}}",
        "siteuser": "Përdoruesi $1 nga {{SITENAME}}",
        "anonuser": "Përdorues anonim i {{SITENAME}} $1",
        "pageinfo-watchers": "Numri i mbikqyrësve",
        "pageinfo-edits": "Numri i redaktimeve",
        "pageinfo-authors": "Numri i autorëve të veçantë",
-       "skinname-cologneblue": "Kolonjë Blu",
        "markaspatrolleddiff": "Shënoje si të patrulluar",
        "markaspatrolledtext": "Shënoje këtë artikull të patrulluar",
        "markedaspatrolled": "Shënoje të patrulluar",
index aa6d614..86d2892 100644 (file)
        },
        "tog-underline": "Подвлачење веза:",
        "tog-hideminor": "Сакриј мање измене у списку скорашњих измена",
-       "tog-hidepatrolled": "Сакриј прегледане измене у списку скорашњих измена",
-       "tog-newpageshidepatrolled": "Сакриј прегледане странице са списка нових страница",
+       "tog-hidepatrolled": "Сакриј патролиране измене у списку скорашњих измена",
+       "tog-newpageshidepatrolled": "Сакриј патролиране странице са списка нових страница",
        "tog-extendwatchlist": "Прошири списак надгледања за приказ свих измена, не само скорашњих",
        "tog-usenewrc": "Промене у групи по страници у списку скорашњих измена и надгледаних страница",
-       "tog-numberheadings": "СамоÑ\81Ñ\82ално нумериши поднаслове",
+       "tog-numberheadings": "Ð\90Ñ\83Ñ\82омаÑ\82Ñ\81ки нумериши поднаслове",
        "tog-showtoolbar": "Прикажи траку с алаткама за уређивање",
        "tog-editondblclick": "Уређивање страница двоструким кликом",
        "tog-editsectiononrightclick": "Уређивање одељака десним кликом на њихове наслове",
        "qbmyoptions": "Моје странице",
        "faq": "НПП",
        "faqpage": "Project:НПП",
-       "vector-action-addsection": "Додај тему",
-       "vector-action-delete": "Обриши",
-       "vector-action-move": "Премести",
-       "vector-action-protect": "Заштити",
-       "vector-action-undelete": "Врати",
-       "vector-action-unprotect": "Промени заштиту",
-       "vector-view-create": "Направи",
-       "vector-view-edit": "Уреди",
-       "vector-view-history": "Историја",
-       "vector-view-view": "Читај",
-       "vector-view-viewsource": "Изворни код",
        "actions": "Радње",
        "namespaces": "Именски простори",
        "variants": "Варијанте",
        "changeemail-submit": "Промени",
        "changeemail-cancel": "Откажи",
        "changeemail-throttled": "Превише пута сте покушали да се пријавите.\nМолимо вас да сачекате $1 пре него што покушате поново.",
-       "resettokens": "Ресетује токене",
-       "resettokens-no-tokens": "Нема токена за ресетовање.",
-       "resettokens-legend": "Ресетује токене",
-       "resettokens-tokens": "Токени:",
+       "resettokens": "Ресетовање жетона",
+       "resettokens-no-tokens": "Нема жетона за ресетовање.",
+       "resettokens-legend": "Ресетовање жетона",
+       "resettokens-tokens": "Ð\96еÑ\82они:",
        "resettokens-token-label": "$1 (тренутна вредност: $2)",
-       "resettokens-watchlist-token": "Токен за веб довод (Atom/RSS) вашег [[Special:Watchlist|списка надгледања]]",
-       "resettokens-done": "Токени су ресетовани",
-       "resettokens-resetbutton": "Ресетуј изабране токене",
+       "resettokens-watchlist-token": "Ð\96еÑ\82он за веб довод (Atom/RSS) вашег [[Special:Watchlist|списка надгледања]]",
+       "resettokens-done": "Ð\96еÑ\82они су ресетовани",
+       "resettokens-resetbutton": "Ресетуј изабране жетоне",
        "bold_sample": "Подебљан текст",
        "bold_tip": "Подебљан текст",
        "italic_sample": "Искошени текст",
        "link_sample": "Наслов везе",
        "link_tip": "Унутрашња веза",
        "extlink_sample": "http://www.primer.com наслов везе",
-       "extlink_tip": "Спољна веза (с предметком ''http://'')",
+       "extlink_tip": "Спољна веза (с предметком http://)",
        "headline_sample": "Наслов",
        "headline_tip": "Поднаслов",
        "nowiki_sample": "Убаците необликован текст овде",
        "accmailtitle": "Лозинка је послата.",
        "accmailtext": "Лозинка за {{GENDER:$1|корисника|корисницу}} [[User talk:$1|$1]] је послата на $2. Након пријаве, лозинка се може променити [[Special:ChangePassword|овде]].",
        "newarticle": "(нови)",
-       "newarticletext": "Ð\94оÑ\88ли Ñ\81Ñ\82е Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 ÐºÐ¾Ñ\98а Ñ\98оÑ\88 Ð½Ðµ Ð¿Ð¾Ñ\81Ñ\82оÑ\98и.\nÐ\94а Ð±Ð¸Ñ\81Ñ\82е Ñ\98е Ð½Ð°Ð¿Ñ\80авили, Ð¿Ð¾Ñ\87ниÑ\82е ÐºÑ\83Ñ\86аÑ\82и у прозор испод овог текста (погледајте [$1 страницу за помоћ]).\nАко сте овде дошли грешком, вратите се на претходну страницу.",
+       "newarticletext": "Ð\94оÑ\88ли Ñ\81Ñ\82е Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 ÐºÐ¾Ñ\98а Ñ\98оÑ\88 Ð½Ðµ Ð¿Ð¾Ñ\81Ñ\82оÑ\98и.\nÐ\94а Ð±Ð¸Ñ\81Ñ\82е Ñ\98е Ð½Ð°Ð¿Ñ\80авили, Ð¿Ð¾Ñ\87ниÑ\82е Ð´Ð° ÐºÑ\83Ñ\86аÑ\82е у прозор испод овог текста (погледајте [$1 страницу за помоћ]).\nАко сте овде дошли грешком, вратите се на претходну страницу.",
        "anontalkpagetext": "---- Ово је страница за разговор с анонимним корисником који још нема налог или га не користи.\nЗбог тога морамо да користимо бројчану ИП адресу како бисмо га препознали.\nТакву адресу може делити више корисника.\nАко сте анонимни корисник и мислите да су вам упућене примедбе, [[Special:UserLogin/signup|отворите налог]] или се [[Special:UserLogin|пријавите]] да бисте избегли будућу забуну с осталим анонимним корисницима.",
        "noarticletext": "На овој страници тренутно нема садржаја.\nМожете [[Special:Search/{{PAGENAME}}|потражити овај наслов]] на другим страницама,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} претражити сродне извештаје] или [{{fullurl:{{FULLPAGENAME}}|action=edit}} уредити страницу]</span>.",
        "noarticletext-nopermission": "На овој страници тренутно нема садржаја.\nМожете [[Special:Search/{{PAGENAME}}|потражити овај наслов]] на другим страницама или <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} претражити сродне дневнике]</span>, али немате дозволу да направите ову страницу.",
        "yourtext": "Ваш текст",
        "storedversion": "Ускладиштена измена",
        "nonunicodebrowser": "'''Упозорење: ваш прегледач не подржава уникод.'''\nПромените га пре него што почнете с уређивањем.",
-       "editingold": "<div style=\"background: #FFBDBD; border: 1px solid #BB7979; color: #000000; font-weight: bold; margin: 2em 0 1em; padding: .5em 1em; vertical-align: middle; clear: both;\">Упозорење: Ви уређујете старију ревизију ове странице.<br />\nАко је сачувате, све промене учињене од ове ревизије биће изгубљене.\n</div>",
+       "editingold": "<strong>Упозорење: уређујете застарелу измену ове странице.</strong>\nАко је сачувате, све новије измене ће бити изгубљене.",
        "yourdiff": "Разлике",
        "copyrightwarning": "Имајте на уму да се сви доприноси на овом викију сматрају као објављени под лиценцом $2 (више на $1).\nАко не желите да се ваши текстови мењају и размењују без ограничења, онда их не шаљите овде.<br />\nИсто тако обећавате да сте ви аутор текста, или да сте га умножили с извора који је у јавном власништву.\n'''Не шаљите радове заштићене ауторским правима без дозволе!'''",
        "copyrightwarning2": "Имајте на уму да се сви доприноси на овом викију могу мењати, враћати или брисати од других корисника.\nАко не желите да се ваши текстови слободно мењају и расподељују, не шаљите их овде.<br />\nИсто тако обећавате да сте ви аутор текста, или да сте га умножили с извора који је у јавном власништву (више на $1).\n'''Не шаљите радове заштићене ауторским правима без дозволе!'''",
        "longpageerror": "'''Грешка: текст који сте унели је величине {{PLURAL:$1|један килобајт|$1 килобајта|$1 килобајта}}, што је веће од {{PLURAL:$2|дозвољеног једног килобајта|дозвољена $2 килобајта|дозвољених $2 килобајта}}.'''\nСтраница не може бити сачувана.",
        "readonlywarning": "'''Упозорење: база података је закључана ради одржавања, тако да тренутно нећете моћи да сачувате измене.'''\nМожда бисте желели сачувати текст за касније у некој текстуалној датотеци.\n\nАдминистратор који је закључао базу дао је следеће објашњење: $1",
-       "protectedpagewarning": "'''Упозорење: ова страница је заштићена, тако да само администратори могу да је мењају.'''\nПоследња ставка у историји је приказана испод:",
+       "protectedpagewarning": "<strong>Упозорење: ова страница је заштићена, тако да само администратори могу да је мењају.</strong>\nПоследњи запис у дневнику је приказан испод:",
        "semiprotectedpagewarning": "'''Напомена:''' ова страница је заштићена, тако да само регистровани корисници могу да је уређују.\nПоследњи запис у дневнику је приказан испод:",
-       "cascadeprotectedwarning": "<div style=\"background: #FFBDBD; border: 1px solid #BB7979; color: #000000; font-weight: bold; margin: 2em 0 1em; padding: .5em 1em; vertical-align: middle; clear: both;\">'''Упозорење:''' Ова страница је заштићена тако да је могу уређивати само администратори, јер је она укључена у {{PLURAL:$1|следећу страницу која је|следеће странице које су}} заштићене „преносивом“ заштитом:</div>",
+       "cascadeprotectedwarning": "<strong>Упозорење:</strong> ова страница је заштићена тако да је могу уређивати само администратори, јер је она укључена у {{PLURAL:$1|следећу страницу која је|следеће странице које су}} заштићене „преносивом“ заштитом:",
        "titleprotectedwarning": "'''Упозорење: ова страница је заштићена тако да је могу направити само корисници [[Special:ListGroupRights|с одређеним правима]].'''",
        "templatesused": "{{PLURAL:$1|Шаблон|Шаблони}} на овој страници:",
        "templatesusedpreview": "{{PLURAL:$1|Шаблон|Шаблони}} у овом прегледу:",
        "currentrev": "Текућа измена",
        "currentrev-asof": "Текућа измена од $2 у $3",
        "revisionasof": "Измена од $2 у $3",
-       "revision-info": "Измена од $1; $2",
+       "revision-info": "Измена од $1; {{GENDER:$6|$2}}$7",
        "previousrevision": "← Старија измена",
        "nextrevision": "Новија измена →",
        "currentrevisionlink": "Текућа измена",
        "last": "разл",
        "page_first": "прва",
        "page_last": "последња",
-       "histlegend": "Избор разлика: изаберите кутијице измена за упоређивање и притисните ентер или дугме на дну.<br />\nОбјашњење: '''({{int:cur}})''' – разлика с тренутном изменом,\n'''({{int:last}})''' – разлика с претходном изменом, '''{{int:minoreditletter}}''' – мала измена",
+       "histlegend": "Избор разлика: изаберите кутијице измена за упоређивање и притисните ентер или дугме на дну.<br />\nОбјашњење: <strong>({{int:cur}})</strong> – разлика с тренутном изменом,\n<strong>({{int:last}})</strong> – разлика с претходном изменом, <strong>{{int:minoreditletter}}</strong> – мала измена",
        "history-fieldset-title": "Преглед историје",
        "history-show-deleted": "Само обрисано",
        "histfirst": "најстарије",
        "revdelete-selected-text": "{{PLURAL:$1|Изабрана измена|Изабране измене}} [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Изабрана верзија датотеке|Изабране верзије датотеке}} [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Изабрана ставка у историји|Изабране ставке у историји}}:",
+       "revdelete-text-text": "Избрисане измене ће и даље бити видљиве у историји странице, али делови њиховог садржаја неће бити јавно доступну.",
+       "revdelete-text-file": "Избрисане верзије датотеке ће и даље бити видљиве у историји датотеке, али делови њиховог садржаја неће бити јавно доступну.",
+       "logdelete-text": "Избрисани уноси у дневницима ће и даље бити видљиви у дневницима, али делови њиховог садржаја неће бити јавно доступну.",
        "revdelete-confirm": "Потврдите да намеравате ово урадити, да разумете последице и да то чините у складу с [[{{MediaWiki:Policy-url}}|правилима]].",
        "revdelete-suppress-text": "Сакривање измена би требало користити '''само''' у следећим случајевима:\n* Злонамерни или погрдни подаци\n* Неприкладни лични подаци\n*: ''кућна адреса и број телефона, број банковне картице итд.''",
        "revdelete-legend": "Ограничења видљивости",
-       "revdelete-hide-text": "Текст ревизије",
+       "revdelete-hide-text": "Текст измене",
        "revdelete-hide-image": "Сакриј садржај датотеке",
        "revdelete-hide-name": "Сакриј радњу и одредиште",
        "revdelete-hide-comment": "Опис измене",
        "mergehistory-empty": "Нема измена за спајање.",
        "mergehistory-success": "$3 {{PLURAL:$3|измена странице [[:$1]] је спојена|измене странице [[:$1]] су спојене|измена странице [[:$1]] је спојено}} у [[:$2]].",
        "mergehistory-fail": "Не могу да спојим историје. Проверите страницу и временске параметре.",
+       "mergehistory-fail-toobig": "Није могуће спојити историје јер више од $1 {{PLURAL:$1|измене|измена}} ће бити премештено.",
        "mergehistory-no-source": "Изворна страница $1 не постоји.",
        "mergehistory-no-destination": "Одредишна страница $1 не постоји.",
        "mergehistory-invalid-source": "Изворна страница мора имати исправан наслов.",
        "showhideselectedversions": "Прикажи/сакриј изабране измене",
        "editundo": "поништи",
        "diff-empty": "(Нема разлике)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Једна међуизмена истог корисника није приказана|$1 међуизмена истог корисника није приказано}})",
+       "diff-multi-otherusers": "({{PLURAL:$1|Једна међуизмена|$1 међуизмена}} од стране {{PLURAL:$2|још једног корисника није приказана|$2 корисника није приказано}})",
        "diff-multi-manyusers": "({{PLURAL:$1|Није приказана међуизмена|Нису приказане $1 међуизмене|Није приказано $1 међуизмена}} од више од $2 корисника)",
        "difference-missing-revision": "Не могу да пронађем {{PLURAL:$2|једну измену|$2 измене|$2 измена}} од ове разлике ($1).\n\nОво се обично дешава када пратите застарелу везу до странице која је обрисана.\nВише информација можете пронаћи у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневнику брисања].",
        "searchresults": "Резултати претраге",
        "searchresults-title": "Резултати претраге за „$1“",
-       "toomanymatches": "Пронађено је превише резултата. Измените упит.",
        "titlematches": "Наслов странице одговара",
        "textmatches": "Текст странице одговара",
        "notextmatches": "Ниједан текст странице не одговара",
        "search-interwiki-default": "Резултати са $1:",
        "search-interwiki-more": "(више)",
        "search-relatedarticle": "Повезано",
-       "searcheverything-enable": "сви именски простори",
        "searchrelated": "повезано",
        "searchall": "све",
        "showingresults": "Испод {{PLURAL:$1|је приказан <strong>1</strong> резултат|су приказана <strong>$1</strong> резултата|је приказано <strong>$1</strong> резултата}} почев од броја <strong>$2</strong>.",
        "powersearch-togglelabel": "Изабери:",
        "powersearch-toggleall": "све",
        "powersearch-togglenone": "ништа",
+       "powersearch-remember": "Запамти мој избор за будуће претраге",
        "search-external": "Спољна претрага",
        "searchdisabled": "Претрага је онемогућена.\nУ међувремену можете тражити преко Гугла.\nУпамтите да његови пописи овог викија могу бити застарели.",
        "search-error": "Дошло је до грешке приликом претраге: $1",
        "prefs-watchlist-days-max": "Највише $1 {{PLURAL:$1|дан|дана|дана}}",
        "prefs-watchlist-edits": "Највећи број измена у проширеном списку надгледања:",
        "prefs-watchlist-edits-max": "Највећа вредност је хиљаду",
-       "prefs-watchlist-token": "Токен списка надгледања:",
+       "prefs-watchlist-token": "Ð\96еÑ\82он списка надгледања:",
        "prefs-misc": "Друга подешавања",
        "prefs-resetpass": "Промени лозинку",
        "prefs-changeemail": "Промени е-адресу",
        "restoreprefs": "Врати све на подразумевано (у свим одељцима)",
        "prefs-editing": "Уређивање",
        "rows": "Редова:",
-       "columns": "Ð\9aолоне:",
+       "columns": "Ð\9aолона",
        "searchresultshead": "Претрага",
        "stub-threshold": "Праг за обликовање <a href=\"#\" class=\"stub\">везе као клице</a> (у бајтовима):",
        "stub-threshold-disabled": "Онемогућено",
        "allowemail": "Омогући примање е-порука од других корисника",
        "prefs-searchoptions": "Претрага",
        "prefs-namespaces": "Именски простори",
-       "defaultns": "Ако није наведено другачије, тражи у овим именским просторима:",
        "default": "подразумевано",
        "prefs-files": "Датотеке",
        "prefs-custom-css": "Прилагођени CSS",
        "prefs-advancedwatchlist": "Напредне поставке",
        "prefs-displayrc": "Поставке приказа",
        "prefs-displaywatchlist": "Поставке приказа",
-       "prefs-tokenwatchlist": "Токен",
+       "prefs-tokenwatchlist": "Ð\96еÑ\82он",
        "prefs-diffs": "Разлике",
        "prefs-help-prefershttps": "Ова подешавања ће ступити на снагу при следећој пријави.",
        "email-address-validity-valid": "Е-адреса је исправна",
        "right-createpage": "прављење страница (изузев страница за разговор)",
        "right-createtalk": "прављење страница за разговор",
        "right-createaccount": "отварање нових корисничких налога",
-       "right-minoredit": "ознаÑ\87аваÑ\9aе Ð¸Ð·Ð¼ÐµÐ½Ð° ÐºÐ°Ð¾ Ð¼Ð°Ñ\9aе",
+       "right-minoredit": "ознаÑ\87аваÑ\9aе Ð¸Ð·Ð¼ÐµÐ½Ð° Ð¼Ð°Ñ\9aим",
        "right-move": "премештање страница",
        "right-move-subpages": "премештање страница с њиховим подстраницама",
        "right-move-rootuserpages": "премештање основних корисничких страница",
        "right-block": "блокирање даљих измена других корисника",
        "right-blockemail": "онемогућавање корисницима да шаљу е-поруке",
        "right-hideuser": "блокирање корисничког имена и његово сакривање од јавности",
-       "right-ipblock-exempt": "заобилажење блокирања IP адресе, аутоматска блокирања и блокирања опсега",
-       "right-proxyunbannable": "заобилажење самоблокирања посредника",
+       "right-ipblock-exempt": "заобилажење блокирања ИП адресе, аутоматска блокирања и блокирања опсега",
+       "right-proxyunbannable": "заобилажење аутоматских блокирања посредника",
        "right-unblockself": "одблокирај самог себе",
        "right-protect": "промени нивое заштите и уреди странице са преносивом заштитом",
        "right-editprotected": "уређивање страница под заштитом „{{int:protect-level-sysop}}“",
        "right-edituserjs": "уређивање туђих JavaScript датотека",
        "right-editmyusercss": "уређивање сопствених CSS датотека",
        "right-editmyuserjs": "уређивање сопствених JavaScript датотека",
-       "right-viewmywatchlist": "vidi sopstveni spisak nadgledanja",
+       "right-viewmywatchlist": "види сопствени списак надгледања",
        "right-viewmyprivateinfo": "видите своје личне податке (нпр. адресу е-поште, право име)",
        "right-editmyprivateinfo": "уређивање сопствених личних података (нпр. адресу е-поште, право име)",
-       "right-editmyoptions": "уредите своја подешавања",
+       "right-editmyoptions": "уређивање сопствених подешавања",
        "right-rollback": "брзо враћање измена последњег корисника који је мењао одређену страницу",
        "right-markbotedits": "означавање враћених измена као измене бота",
        "right-noratelimit": "отпорност на ограничења",
        "right-import": "увожење страница из других викија",
        "right-importupload": "увожење страница из отпремљене датотеке",
        "right-patrol": "означавање туђих измена патролираним",
-       "right-autopatrol": "аÑ\83Ñ\82омаÑ\82Ñ\81ко Ð¾Ð·Ð½Ð°Ñ\87аваÑ\9aе Ð¸Ð·Ð¼ÐµÐ½Ð° ÐºÐ°Ð¾ Ð¿Ñ\80егледаним",
+       "right-autopatrol": "аÑ\83Ñ\82омаÑ\82Ñ\81ко Ð¾Ð·Ð½Ð°Ñ\87аваÑ\9aе Ð¸Ð·Ð¼ÐµÐ½Ð° Ð¿Ð°Ñ\82Ñ\80олиÑ\80аним",
        "right-patrolmarks": "прегледање ознака за патролирање унутар скорашњих измена",
        "right-unwatchedpages": "прегледање списка ненадгледаних страница",
        "right-mergehistory": "спајање историја страница",
        "recentchanges-label-unpatrolled": "Ова измена још није патролирана",
        "recentchanges-label-plusminus": "Промена величине странице у бајтовима",
        "recentchanges-legend-heading": "'''Легенда:'''",
-       "recentchanges-legend-newpage": "([[Special:NewPages|списак нових страница]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|списак нових страница]])",
        "rcnotefrom": "Испод су измене од <strong>$2</strong> (до <strong>$1</strong> измена).",
        "rclistfrom": "Прикажи нове измене почев од $2 $3",
        "rcshowhideminor": "$1 мање измене",
        "wantedfiletext-nocat": "Следеће датотеке се користе, али не постоје. Датотеке из других ризница могу бити наведене иако не постоје. Такве датотеке ће бити <del>поништене</del> са списка.",
        "wantedtemplates": "Тражени шаблони",
        "mostlinked": "Странице с највише веза",
-       "mostlinkedcategories": "ЧланÑ\86и Ñ\81 Ð½Ð°Ñ\98виÑ\88е ÐºÐ°Ñ\82егоÑ\80иÑ\98а",
+       "mostlinkedcategories": "Ð\9aаÑ\82егоÑ\80иÑ\98е Ñ\81 Ð½Ð°Ñ\98виÑ\88е Ð²ÐµÐ·а",
        "mostlinkedtemplates": "Шаблони с највише веза",
-       "mostcategories": "ЧланÑ\86и с највише категорија",
+       "mostcategories": "СÑ\82Ñ\80аниÑ\86е с највише категорија",
        "mostimages": "Датотеке с највише веза",
        "mostinterwikis": "Странице са највише међувикија",
        "mostrevisions": "Странице с највише измена",
        "emailuser-title-notarget": "Слање е-поруке кориснику",
        "emailpage": "Слање е-порука",
        "emailpagetext": "Можете да користите доњи образац да пошаљете е-поруку {{GENDER:$1|овом кориснику|овој корисници|овом кориснику|}}.\nЕ-адреса коју сте унели у вашим [[Special:Preferences|подешавањима]] ће се приказати у пољу „Од“, тако да ће прималац моћи да вам одговори директно.",
-       "defemailsubject": "{{SITENAME}} е-адреса {{GENDER:$1|корисника|кориснице|корисника}} $1",
+       "defemailsubject": "{{SITENAME}} — Е-пошта од {{GENDER:$1|корисника|кориснице}} $1",
        "usermaildisabled": "Корисничка е-пошта је онемогућена",
        "usermaildisabledtext": "Не можете да шаљете е-поруке другим корисницима на овом викију",
        "noemailtitle": "Нема е-адресе",
        "enotif_lastvisited": "Погледајте $1 за све измене од ваше последње посете.",
        "enotif_lastdiff": "Погледајте $1 да видите ову измену.",
        "enotif_anon_editor": "анониман корисник $1",
-       "enotif_body": "Поштовани $WATCHINGUSERNAME,\n\n\nСтраница $PAGETITLE на викију {{SITENAME}} је $CHANGEDORCREATED дана $PAGEEDITDATE од стране {{GENDER:$PAGEEDITOR|корисника|кориснице|корисника}} $PAGEEDITOR. Погледајте $PAGETITLE_URL за текућу измену.\n\n$NEWPAGE\n\nОпис: $PAGESUMMARY $PAGEMINOREDIT\n\nКонтакт:\nе-адреса: $PAGEEDITOR_EMAIL\nвики: $PAGEEDITOR_WIKI\n\nНеће бити других обавештења у случају даљих измена уколико не посетите ову страницу.\nМожете и да поништите поставке обавештења за све странице у вашем списку надгледања.\n\nСрдачан поздрав, {{SITENAME}}\n\n--\nДа бисте променили поставке у вези са е-обавештењима, посетите\n{{canonicalurl:{{#special:Preferences}}}}\n\nДа бисте променили поставке у вези са списком надгледања, посетите\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nДа бисте уклонили ову страницу са списка надгледања, посетите\n$UNWATCHURL\n\nПодршка и даља помоћ:\n$HELPPAGE",
+       "enotif_body": "Поштовани $WATCHINGUSERNAME,\n \t\n$PAGEINTRO $NEWPAGE\n\nОпис: $PAGESUMMARY $PAGEMINOREDIT\n\nКонтакт:\nе-пошта: $PAGEEDITOR_EMAIL\nвики: $PAGEEDITOR_WIKI\n\nНеће бити других обавештења у случају даљих измена уколико не посетите ову страницу када сте пријављени.\nМожете и да поништите поставке обавештења за све странице у вашем списку надгледања.\n\nСрдачан поздрав, {{SITENAME}}\n\n--\nДа бисте променили поставке у вези са е-обавештењима, посетите\n{{canonicalurl:{{#special:Preferences}}}}\n\nДа бисте променили поставке у вези са списком надгледања, посетите\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nДа бисте уклонили ову страницу са списка надгледања, посетите\n$UNWATCHURL\n\nПодршка и даља помоћ:\n$HELPPAGE",
        "created": "направљена",
        "changed": "измењена",
        "deletepage": "Обриши страницу",
        "ipblocklist-localblock": "Локално блокирање",
        "ipblocklist-otherblocks": "{{PLURAL:$1|Друго блокирање|Друга блокирања}}",
        "infiniteblock": "трајно",
-       "expiringblock": "истиче дана $1 у $2",
+       "expiringblock": "истиче $1 у $2",
        "anononlyblock": "само анонимни",
        "noautoblockblock": "аутоматско блокирање је онемогућено",
        "createaccountblock": "отварање налога је блокирано",
        "movepagetalktext": "Одговарајућа страница за разговор, ако постоји, биће аутоматски премештена заједно с њом, осим ако:\n*Већ постоји страница за разговор с новим насловом, или\n*Ако је означено доленаведено поље.\n\nУ овом случају мора ручно да се премести или споји, ако има потребе за тим.",
        "movearticle": "Премести страницу:",
        "moveuserpage-warning": "'''Упозорење:''' на путу сте да преместите корисничку страницу. Имајте у виду да ће само страница бити премештена, а сам корисник ''неће'' бити преименован.",
+       "movecategorypage-warning": "<strong>Упозорење:</strong> премештате страницу категорије. Имајте на уму да ће само страница бити премештена и да све странице у старој категорији <em>неће</em> бити рекатегорисане у нову категорију.",
        "movenologintext": "Морате да будете регистровани и [[Special:UserLogin|пријављени]] да бисте премештали странице.",
        "movenotallowed": "Немате дозволу да премештате странице.",
        "movenotallowedfile": "Немате дозволу да премештате датотеке.",
        "tooltip-preferences-save": "Сачувај поставке",
        "tooltip-summary": "Унесите кратак опис",
        "common.css": "/** CSS постављен овде ће се одразити на све теме */",
-       "monobook.css": "/* CSS постављен овде ће утицати на све кориснике теме „Монобук“ */",
-       "vector.css": "/* CSS постављен овде ће утицати на све кориснике теме „Векторско“ */",
        "print.css": "/* CSS постављен овде ће утицати на издање за штампу */",
        "noscript.css": "/* CSS постављен овде ће утицати на све кориснике којима је онемогућен јаваскрипт */",
        "group-autoconfirmed.css": "/* CSS постављен овде ће утицати на самопотврђене кориснике */",
        "group-sysop.css": "/* CSS постављен овде ће утицати само на системске операторе */",
        "group-bureaucrat.css": "/* CSS постављен овде ће утицати само на бирократе */",
        "common.js": "/* Јаваскрипт постављен овде ће се користити за све кориснике при отварању сваке странице. */",
-       "monobook.js": "/* Јаваскрипт постављен овде ће се учитати за све оне који користе тему „Монобук“ */",
-       "vector.js": "/* Јаваскрипт постављен овде ће се учитати за све оне који користе тему „Векторско“ */",
        "group-autoconfirmed.js": "/* Јаваскрипт постављен овде ће се учитати за самопотврђене кориснике */",
        "group-bot.js": "/* Јаваскрипт постављен овде ће се учитати само за ботове */",
        "group-sysop.js": "/* Јаваскрипт постављен овде ће се учитати само за системске операторе */",
        "pageinfo-category-pages": "Број страница",
        "pageinfo-category-subcats": "Број поткатегорија",
        "pageinfo-category-files": "Број датотека",
-       "skinname-monobook": "Монобук",
-       "skinname-vector": "Векторско",
        "markaspatrolleddiff": "Означи као патролирано",
        "markaspatrolledtext": "Означи страницу као патролирану",
        "markedaspatrolled": "Означено као патролирано",
        "newimages-summary": "Ова посебна страница приказује последње послате датотеке.",
        "newimages-legend": "Филтер",
        "newimages-label": "Назив датотеке (или њен део):",
+       "newimages-showbots": "Прикажи датотеке које су послали ботови",
        "noimages": "Нема ништа.",
        "ilsubmit": "Претражи",
        "bydate": "по датуму",
        "exif-iimsupplementalcategory": "Допунске категорије",
        "exif-datetimeexpires": "Не користи након",
        "exif-datetimereleased": "Објављено",
-       "exif-originaltransmissionref": "Изворни пренос кôда локације",
+       "exif-originaltransmissionref": "Изворни пренос кода локације",
        "exif-identifier": "Назнака",
        "exif-lens": "Коришћени објектив",
        "exif-serialnumber": "Серијски број камере",
        "scarytranscludefailed": "[Добављање шаблона за $1 није успело]",
        "scarytranscludefailed-httpstatus": "[Не могу да преузмем шаблон $1: HTTP $2]",
        "scarytranscludetoolong": "[URL адреса је предугачка]",
-       "deletedwhileediting": "'''Упозорење''': ова страница је обрисана након што сте почели с уређивањем!",
+       "deletedwhileediting": "<strong>Упозорење</strong>: ова страница је обрисана након што сте почели с уређивањем!",
        "confirmrecreate": "[[User:$1|$1]] ([[User talk:$1|разговор]]) {{GENDER:$1|је обрисао|је обрисала|обриса}} ову страницу након што сте почели да је уређујете из следећег разлога:\n: ''$2''\nПотврдите да стварно желите да направите страницу.",
        "confirmrecreate-noreason": "Корисник [[User:$1|$1]] ([[User talk:$1|разговор]]) је обрисао ову страницу након што сте почели да га уређујете. Потврдите да стварно желите да поново направите ову страницу.",
        "recreate": "Поново направи",
        "watchlistedit-normal-title": "Уређивање списка надгледања",
        "watchlistedit-normal-legend": "Уклањање наслова са списка надгледања",
        "watchlistedit-normal-explain": "Наслови на вашем списку надгледања су приказани испод.\nДа бисте уклонили наслов, означите кућицу до њега и кликните на „{{int:Watchlistedit-normal-submit}}“.\nМожете и да [[Special:EditWatchlist/raw|уредите сиров списак]].",
-       "watchlistedit-normal-submit": "Уклони",
+       "watchlistedit-normal-submit": "Уклони наслове",
        "watchlistedit-normal-done": "{{PLURAL:$1|Једна страница је уклоњена|$1 странице су уклоњене|$1 страница је уклоњено}} с вашег списка надгледања:",
        "watchlistedit-raw-title": "Измени сиров списак надгледања",
-       "watchlistedit-raw-legend": "Ð\9dапÑ\80едно Ñ\83Ñ\80еÑ\92иваÑ\9aе Ñ\81пиÑ\81ка надгледања",
+       "watchlistedit-raw-legend": "Ð\98змени Ñ\81иÑ\80ов Ñ\81пиÑ\81ак надгледања",
        "watchlistedit-raw-explain": "Наслови са списка надгледања су приказани испод и могу се уређивати додавањем или уклањањем ставки са списка;\nједан наслов по реду.\nКада завршите, кликните на „{{int:Watchlistedit-raw-submit}}“.\nМожете да [[Special:EditWatchlist|користите и обичан уређивач]].",
        "watchlistedit-raw-titles": "Наслови:",
        "watchlistedit-raw-submit": "Ажурирај списак",
        "watchlistedit-raw-done": "Ваш списак надгледања је ажуриран.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Додат је један наслов|Додата су $1 наслова|Додато је $1 наслова}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 наслов је уклоњен|Уклоњена су $1 наслова|Уклоњено је $1 наслова}}:",
-       "watchlistedit-clear-title": "Ð\9fÑ\80ажÑ\9aеÑ\9aе Ñ\81пиÑ\81ка надгледања",
+       "watchlistedit-clear-title": "Ð\98Ñ\81пÑ\80азни Ñ\81пиÑ\81ак надгледања",
        "watchlistedit-clear-legend": "Испразни списак надгледања",
        "watchlistedit-clear-explain": "Сви наслови ће бити уклоњени из вашег списка надгледања.",
        "watchlistedit-clear-titles": "Наслови:",
        "compare-revision-not-exists": "Наведена измена не постоји.",
        "dberr-problems": "Дошло је до техничких проблема.",
        "dberr-again": "Сачекајте неколико минута и поново учитајте страницу.",
-       "dberr-info": "(не могу да се повежем са сервером базе: $1)",
+       "dberr-info": "(не могу да се повежем са сервером базе података: $1)",
+       "dberr-info-hidden": "(не могу да се повежем са сервером базе података)",
        "dberr-usegoogle": "У међувремену, покушајте да претражите помоћу Гугла.",
        "dberr-outofdate": "Имајте на уму да њихови примерци нашег садржаја могу бити застарели.",
        "dberr-cachederror": "Ово је привремено меморисан примерак стране који можда није ажуран.",
index 843ac2f..d416e87 100644 (file)
        },
        "tog-underline": "Podvlačenje veza:",
        "tog-hideminor": "Sakrij manje izmene u spisku skorašnjih izmena",
-       "tog-hidepatrolled": "Sakrij pregledane izmene u spisku skorašnjih izmena",
-       "tog-newpageshidepatrolled": "Sakrij pregledane stranice sa spiska novih stranica",
+       "tog-hidepatrolled": "Sakrij patrolirane izmene u spisku skorašnjih izmena",
+       "tog-newpageshidepatrolled": "Sakrij patrolirane stranice sa spiska novih stranica",
        "tog-extendwatchlist": "Proširi spisak nadgledanja za prikaz svih izmena, ne samo skorašnjih",
        "tog-usenewrc": "Promene u grupi po stranici u spisku skorašnjih izmena i nadgledanih stranica",
-       "tog-numberheadings": "Samostalno numeriši podnaslove",
+       "tog-numberheadings": "Automatski numeriši podnaslove",
        "tog-showtoolbar": "Prikaži traku s alatkama za uređivanje",
        "tog-editondblclick": "Uređivanje stranica dvostrukim klikom",
        "tog-editsectiononrightclick": "Uređivanje odeljaka desnim klikom na njihove naslove",
        "broken-file-category": "Stranice s neispravnim vezama do datoteka",
        "about": "O nama",
        "article": "Stranica sa sadržajem",
-       "newwindow": "(otvara u novom prozoru)",
+       "newwindow": "(otvara se u novom prozoru)",
        "cancel": "Otkaži",
        "moredotdotdot": "Više…",
        "morenotlisted": "Ova lista nije kompletna.",
        "qbmyoptions": "Moje stranice",
        "faq": "NPP",
        "faqpage": "Project:NPP",
-       "vector-action-addsection": "Dodaj temu",
-       "vector-action-delete": "Obriši",
-       "vector-action-move": "Premesti",
-       "vector-action-protect": "Zaštiti",
-       "vector-action-undelete": "Vrati",
-       "vector-action-unprotect": "Promeni zaštitu",
-       "vector-view-create": "Napravi",
-       "vector-view-edit": "Uredi",
-       "vector-view-history": "Istorija",
-       "vector-view-view": "Čitaj",
-       "vector-view-viewsource": "Izvorni kod",
        "actions": "Radnje",
        "namespaces": "Imenski prostori",
        "variants": "Varijante",
        "changeemail-submit": "Promeni",
        "changeemail-cancel": "Otkaži",
        "changeemail-throttled": "Previše puta ste pokušali da se prijavite.\nMolimo vas da sačekate $1 pre nego što pokušate ponovo.",
-       "resettokens": "Resetuje tokene",
-       "resettokens-no-tokens": "Nema tokena za resetovanje.",
-       "resettokens-legend": "Resetuje tokene",
-       "resettokens-tokens": "Tokeni:",
+       "resettokens": "Resetovanje žetona",
+       "resettokens-no-tokens": "Nema žetona za resetovanje.",
+       "resettokens-legend": "Resetovanje žetona",
+       "resettokens-tokens": "Žetoni:",
        "resettokens-token-label": "$1 (trenutna vrednost: $2)",
-       "resettokens-watchlist-token": "Token za veb dovod (Atom/RSS) vašeg [[Special:Watchlist|spiska nadgledanja]]",
-       "resettokens-done": "Tokeni su resetovani",
-       "resettokens-resetbutton": "Resetuj izabrane tokene",
+       "resettokens-watchlist-token": "Žeton za veb dovod (Atom/RSS) vašeg [[Special:Watchlist|spiska nadgledanja]]",
+       "resettokens-done": "Žetoni su resetovani",
+       "resettokens-resetbutton": "Resetuj izabrane žetone",
        "bold_sample": "Podebljan tekst",
        "bold_tip": "Podebljan tekst",
        "italic_sample": "Iskošeni tekst",
        "link_sample": "Naslov veze",
        "link_tip": "Unutrašnja veza",
        "extlink_sample": "http://www.primer.com naslov veze",
-       "extlink_tip": "Spoljna veza (s predmetkom ''http://'')",
+       "extlink_tip": "Spoljna veza (s predmetkom http://)",
        "headline_sample": "Naslov",
        "headline_tip": "Podnaslov",
        "nowiki_sample": "Ubacite neoblikovan tekst ovde",
        "accmailtitle": "Lozinka je poslata.",
        "accmailtext": "Lozika za {{GENDER:$1|korisnika|korisnicu}} [[User talk:$1|$1]] je poslata na $2. Nakon prijave, lozinka se može promeniti [[Special:ChangePassword|ovde]].",
        "newarticle": "(novi)",
-       "newarticletext": "Došli ste na stranicu koja još ne postoji.\nDa biste je napravili, počnite kucati u prozor ispod ovog teksta (pogledajte [$1 stranicu za pomoć]).\nAko ste ovde došli greškom, vratite se na prethodnu stranicu.",
+       "newarticletext": "Došli ste na stranicu koja još ne postoji.\nDa biste je napravili, počnite da kucate u prozor ispod ovog teksta (pogledajte [$1 stranicu za pomoć]).\nAko ste ovde došli greškom, vratite se na prethodnu stranicu.",
        "anontalkpagetext": "---- Ovo je stranica za razgovor s anonimnim korisnikom koji još nema nalog ili ga ne koristi.\nZbog toga moramo da koristimo brojčanu IP adresu kako bismo ga prepoznali.\nTakvu adresu može deliti više korisnika.\nAko ste anonimni korisnik i mislite da su vam upućene primedbe, [[Special:UserLogin/signup|otvorite nalog]] ili se [[Special:UserLogin|prijavite]] da biste izbegli buduću zabunu s ostalim anonimnim korisnicima.",
        "noarticletext": "Na ovoj stranici trenutno nema sadržaja.\nMožete [[Special:Search/{{PAGENAME}}|potražiti ovaj naslov]] na drugim stranicama,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti srodne izveštaje] ili [{{fullurl:{{FULLPAGENAME}}|action=edit}} urediti stranicu]</span>.",
        "noarticletext-nopermission": "Na ovoj stranici trenutno nema sadržaja.\nMožete [[Special:Search/{{PAGENAME}}|potražiti ovaj naslov]] na drugim stranicama ili <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti srodne dnevnike]</span>, ali nemate dozvolu da napravite ovu stranicu.",
        "yourtext": "Vaš tekst",
        "storedversion": "Uskladištena izmena",
        "nonunicodebrowser": "'''Upozorenje: vaš pregledač ne podržava unikod.'''\nPromenite ga pre nego što počnete s uređivanjem.",
-       "editingold": "<div style=\"background: #FFBDBD; border: 1px solid #BB7979; color: #000000; font-weight: bold; margin: 2em 0 1em; padding: .5em 1em; vertical-align: middle; clear: both;\">Upozorenje: Vi uređujete stariju reviziju ove stranice.<br />\nAko je sačuvate, sve promene učinjene od ove revizije biće izgubljene.\n</div>",
+       "editingold": "<strong>Upozorenje: uređujete zastarelu izmenu ove stranice.</strong>\nAko je sačuvate, sve novije izmene će biti izgubljene.",
        "yourdiff": "Razlike",
        "copyrightwarning": "Imajte na umu da se svi doprinosi na ovom vikiju smatraju kao objavljeni pod licencom $2 (više na $1).\nAko ne želite da se vaši tekstovi menjaju i razmenjuju bez ograničenja, onda ih ne šaljite ovde.<br />\nIsto tako obećavate da ste vi autor teksta, ili da ste ga umnožili s izvora koji je u javnom vlasništvu.\n'''Ne šaljite radove zaštićene autorskim pravima bez dozvole!'''",
        "copyrightwarning2": "Imajte na umu da se svi doprinosi na ovom vikiju mogu menjati, vraćati ili brisati od drugih korisnika.\nAko ne želite da se vaši tekstovi slobodno menjaju i raspodeljuju, ne šaljite ih ovde.<br />\nIsto tako obećavate da ste vi autor teksta, ili da ste ga umnožili s izvora koji je u javnom vlasništvu (više na $1).\n'''Ne šaljite radove zaštićene autorskim pravima bez dozvole!'''",
        "longpageerror": "'''Greška: tekst koji ste uneli je veličine {{PLURAL:$1|jedan kilobajt|$1 kilobajta|$1 kilobajta}}, što je veće od {{PLURAL:$2|dozvoljenog jednog kilobajta|dozvoljena $2 kilobajta|dozvoljenih $2 kilobajta}}.'''\nStranica ne može biti sačuvana.",
        "readonlywarning": "<strong>Upozorenje: baza podataka je zaključana radi održavanja, tako da trenutno nećete moći da sačuvate izmene.</strong>\nMožda biste želeli sačuvati tekst za kasnije u nekoj tekstualnoj datoteci.\n\nAdministrator koji je zaključao bazu dao je sledeće objašnjenje: $1",
-       "protectedpagewarning": "'''Upozorenje: ova stranica je zaštićena, tako da samo administratori mogu da je menjaju.'''\nPoslednja stavka u istoriji je prikazana ispod:",
+       "protectedpagewarning": "<strong>Upozorenje: ova stranica je zaštićena, tako da samo administratori mogu da je menjaju.</strong>\nPoslednji zapis u dnevniku je prikazan ispod:",
        "semiprotectedpagewarning": "'''Napomena:''' ova stranica je zaštićena, tako da samo registrovani korisnici mogu da je uređuju.\nPoslednji zapis u dnevniku je prikazan ispod:",
-       "cascadeprotectedwarning": "<div style=\"background: #FFBDBD; border: 1px solid #BB7979; color: #000000; font-weight: bold; margin: 2em 0 1em; padding: .5em 1em; vertical-align: middle; clear: both;\">'''Upozorenje:''' Ova stranica je zaštićena tako da je mogu uređivati samo administratori, jer je ona uključena u {{PLURAL:$1|sledeću stranicu koja je|sledeće stranice koje su}} zaštićene „prenosivom“ zaštitom:</div>",
+       "cascadeprotectedwarning": "<strong>Upozorenje:</strong> ova stranica je zaštićena tako da je mogu uređivati samo administratori, jer je ona uključena u {{PLURAL:$1|sledeću stranicu koja je|sledeće stranice koje su}} zaštićene „prenosivom“ zaštitom:",
        "titleprotectedwarning": "'''Upozorenje: ova stranica je zaštićena tako da je mogu napraviti samo korisnici [[Special:ListGroupRights|s određenim pravima]].'''",
        "templatesused": "{{PLURAL:$1|Šablon|Šabloni}} na ovoj stranici:",
        "templatesusedpreview": "{{PLURAL:$1|Šablon|Šabloni}} u ovom pregledu:",
        "permissionserrors": "Greška u dozvoli",
        "permissionserrorstext": "Nemate ovlašćenje za tu radnju iz {{PLURAL:$1|sledećeg|sledećih}} razloga:",
        "permissionserrorstext-withaction": "Nemate dozvolu za $2 iz {{PLURAL:$1|sledećeg|sledećih}} razloga:",
-       "recreate-moveddeleted-warn": "'''Upozorenje: ponovo pravite stranicu koja je prethodno obrisana.'''\n\nRazmotrite da li je prikladno da nastavite s uređivanjem ove stranice.\nOvde je navedena istorija brisanja i premeštanja s obrazloženjem:",
+       "recreate-moveddeleted-warn": "<strong>Upozorenje: ponovo pravite stranicu koja je prethodno obrisana.</strong>\n\nRazmotrite da li je prikladno da nastavite s uređivanjem ove stranice.\nOvde je navedena istorija brisanja i premeštanja s obrazloženjem:",
        "moveddeleted-notice": "Ova stranica je obrisana.\nIstorija njenog brisanja i premeštanja nalazi se ispod:",
        "log-fulllog": "Pogledaj celu istoriju",
        "edit-hook-aborted": "Izmenu je prekinula kuka.\nNije dato nikakvo obrazloženje.",
        "currentrev": "Tekuća izmena",
        "currentrev-asof": "Tekuća izmena od $2 u $3",
        "revisionasof": "Izmena od $2 u $3",
-       "revision-info": "Izmena od $1; $2",
+       "revision-info": "Izmena od $1; {{GENDER:$6|$2}}$7",
        "previousrevision": "← Starija izmena",
        "nextrevision": "Novija izmena →",
        "currentrevisionlink": "Tekuća izmena",
        "last": "razl",
        "page_first": "prva",
        "page_last": "poslednja",
-       "histlegend": "Izbor razlika: izaberite kutijice izmena za upoređivanje i pritisnite enter ili dugme na dnu.<br />\nObjašnjenje: '''({{int:cur}})''' – razlika s trenutnom izmenom,\n'''({{int:last}})''' – razlika s prethodnom izmenom, '''{{int:minoreditletter}}''' – mala izmena",
+       "histlegend": "Izbor razlika: izaberite kutijice izmena za upoređivanje i pritisnite enter ili dugme na dnu.<br />\nObjašnjenje: <strong>({{int:cur}})</strong> – razlika s trenutnom izmenom,\n<strong>({{int:last}})</strong> – razlika s prethodnom izmenom, <strong>{{int:minoreditletter}}</strong> – mala izmena",
        "history-fieldset-title": "Pregled istorije",
        "history-show-deleted": "Samo obrisane",
        "histfirst": "najstarije",
        "revdelete-confirm": "Potvrdite da nameravate ovo uraditi, da razumete posledice i da to činite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].",
        "revdelete-suppress-text": "Sakrivanje izmena bi trebalo koristiti '''samo''' u sledećim slučajevima:\n* Zlonamerni ili pogrdni podaci\n* Neprikladni lični podaci\n*: ''kućna adresa i broj telefona, broj bankovne kartice itd.''",
        "revdelete-legend": "Ograničenja vidljivosti",
-       "revdelete-hide-text": "Tekst revizije",
+       "revdelete-hide-text": "Tekst izmene",
        "revdelete-hide-image": "Sakrij sadržaj datoteke",
        "revdelete-hide-name": "Sakrij radnju i odredište",
        "revdelete-hide-comment": "Opis izmene",
        "showhideselectedversions": "Prikaži/sakrij izabrane izmene",
        "editundo": "poništi",
        "diff-empty": "(Nema razlike)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Jedna međuizmena istog korisnika nije prikazana|$1 međuizmena istog korisnika nije prikazano}})",
+       "diff-multi-otherusers": "({{PLURAL:$1|Jedna međuizmena|$1 međuizmena}} od strane {{PLURAL:$2|još jednog korisnika nije prikazana|$2 korisnika nije prikazano}})",
        "diff-multi-manyusers": "({{PLURAL:$1|Nije prikazana međuizmena|Nisu prikazane $1 međuizmene|Nije prikazano $1 međuizmena}} od više od $2 korisnika)",
        "difference-missing-revision": "Ne mogu da pronađem {{PLURAL:$2|jednu izmenu|$2 izmene|$2 izmena}} od ove razlike ($1).\n\nOvo se obično dešava kada pratite zastarelu vezu do stranice koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} dnevniku brisanja].",
        "searchresults": "Rezultati pretrage",
        "searchresults-title": "Rezultati pretrage za „$1“",
-       "toomanymatches": "Pronađeno je previše rezultata. Izmenite upit.",
        "titlematches": "Naslov stranice odgovara",
        "textmatches": "Tekst stranice odgovara",
        "notextmatches": "Nijedan tekst stranice ne odgovara",
        "search-interwiki-default": "Rezultati sa $1:",
        "search-interwiki-more": "(više)",
        "search-relatedarticle": "Povezano",
-       "searcheverything-enable": "svi imenski prostori",
        "searchrelated": "povezano",
        "searchall": "sve",
        "showingresults": "Ispod {{PLURAL:$1|je prikazan <strong>1</strong> rezultat|su prikazana <strong>$1</strong> rezultata|je prikazano <strong>$1</strong> rezultata}} počev od broja <strong>$2</strong>.",
        "powersearch-togglelabel": "Izaberi:",
        "powersearch-toggleall": "sve",
        "powersearch-togglenone": "ništa",
+       "powersearch-remember": "Zapamti moj izbor za buduće pretrage",
        "search-external": "Spoljna pretraga",
        "searchdisabled": "Pretraga je onemogućena.\nU međuvremenu možete tražiti preko Gugla.\nUpamtite da njegovi popisi ovog vikija mogu biti zastareli.",
        "search-error": "Došlo je do greške prilikom pretrage: $1",
        "prefs-watchlist-days-max": "Najviše $1 {{PLURAL:$1|dan|dana|dana}}",
        "prefs-watchlist-edits": "Najveći broj izmena u proširenom spisku nadgledanja:",
        "prefs-watchlist-edits-max": "Najveća vrednost je hiljadu",
-       "prefs-watchlist-token": "Token spiska nadgledanja:",
+       "prefs-watchlist-token": "Žeton spiska nadgledanja:",
        "prefs-misc": "Druga podešavanja",
        "prefs-resetpass": "Promeni lozinku",
        "prefs-changeemail": "Promeni e-adresu",
        "restoreprefs": "Vrati sve na podrazumevano (u svim odeljcima)",
        "prefs-editing": "Uređivanje",
        "rows": "Redova:",
-       "columns": "Kolone:",
+       "columns": "Kolona",
        "searchresultshead": "Pretraga",
        "stub-threshold": "Prag za oblikovanje <a href=\"#\" class=\"stub\">veze kao klice</a> (u bajtovima):",
        "stub-threshold-disabled": "Onemogućeno",
        "allowemail": "Omogući primanje e-poruka od drugih korisnika",
        "prefs-searchoptions": "Pretraga",
        "prefs-namespaces": "Imenski prostori",
-       "defaultns": "Ako nije navedeno drugačije, traži u ovim imenskim prostorima:",
        "default": "podrazumevano",
        "prefs-files": "Datoteke",
        "prefs-custom-css": "Prilagođeni CSS",
        "prefs-advancedwatchlist": "Napredne postavke",
        "prefs-displayrc": "Postavke prikaza",
        "prefs-displaywatchlist": "Postavke prikaza",
+       "prefs-tokenwatchlist": "Žeton",
        "prefs-diffs": "Razlike",
        "prefs-help-prefershttps": "Ova podešavanja će stupiti na snagu pri sledećoj prijavi.",
        "email-address-validity-valid": "E-adresa je ispravna",
        "right-createpage": "pravljenje stranica (izuzev stranica za razgovor)",
        "right-createtalk": "pravljenje stranica za razgovor",
        "right-createaccount": "otvaranje novih korisničkih naloga",
-       "right-minoredit": "označavanje izmena kao manje",
+       "right-minoredit": "označavanje izmena manjim",
        "right-move": "premeštanje stranica",
        "right-move-subpages": "premeštanje stranica s njihovim podstranicama",
        "right-move-rootuserpages": "premeštanje osnovnih korisničkih stranica",
        "right-blockemail": "onemogućavanje korisnicima da šalju e-poruke",
        "right-hideuser": "blokiranje korisničkog imena i njegovo sakrivanje od javnosti",
        "right-ipblock-exempt": "zaobilaženje blokiranja IP adrese, automatska blokiranja i blokiranja opsega",
-       "right-proxyunbannable": "zaobilaženje samoblokiranja posrednika",
+       "right-proxyunbannable": "zaobilaženje automatskih blokiranja posrednika",
        "right-unblockself": "odblokiraj samog sebe",
        "right-protect": "promeni nivoe zaštite i uredi stranice sa prenosivom zaštitom",
        "right-editprotected": "uređivanje stranice pod zaštitom „{{int:protect-level-sysop}}“",
        "right-viewmywatchlist": "vidi sopstveni spisak nadgledanja",
        "right-viewmyprivateinfo": "vidite svoje lične podatke (npr. adresu e-pošte, pravo ime)",
        "right-editmyprivateinfo": "uređivanje sopstvenih ličnih podataka (npr. adresu e-pošte, pravo ime)",
-       "right-editmyoptions": "uredite svoja podešavanja",
+       "right-editmyoptions": "uređivanje sopstvenih podešavanja",
        "right-rollback": "brzo vraćanje izmena poslednjeg korisnika koji je menjao određenu stranicu",
        "right-markbotedits": "označavanje vraćenih izmena kao izmene bota",
        "right-noratelimit": "otpornost na ograničenja",
        "right-import": "uvoženje stranica iz drugih vikija",
        "right-importupload": "uvoženje stranica iz otpremljene datoteke",
        "right-patrol": "označavanje tuđih izmena patroliranim",
-       "right-autopatrol": "automatsko označavanje izmena kao pregledanim",
+       "right-autopatrol": "automatsko označavanje izmena patroliranim",
        "right-patrolmarks": "pregledanje oznaka za patroliranje unutar skorašnjih izmena",
        "right-unwatchedpages": "pregledanje spiska nenadgledanih stranica",
        "right-mergehistory": "spajanje istorija stranica",
        "recentchanges-label-unpatrolled": "Ova izmena još nije patrolirana",
        "recentchanges-label-plusminus": "Promena veličine stranice u bajtovima",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "([[Special:NewPages|spisak novih stranica]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|spisak novih stranica]])",
        "rcnotefrom": "Ispod su izmene od <b>$2</b> (do <b>$1</b> izmena).",
        "rclistfrom": "Prikaži nove izmene počev od $2 $3",
        "rcshowhideminor": "$1 manje izmene",
        "wantedfiletext-nocat": "Sledeće datoteke se koriste, ali ne postoje. Datoteke iz drugih riznica mogu biti navedene iako ne postoje. Takve datoteke će biti <del>poništene</del> sa spiska.",
        "wantedtemplates": "Traženi šabloni",
        "mostlinked": "Stranice s najviše veza",
-       "mostlinkedcategories": "Članci s najviše kategorija",
+       "mostlinkedcategories": "Kategorije s najviše veza",
        "mostlinkedtemplates": "Šabloni s najviše veza",
-       "mostcategories": "Članci s najviše kategorija",
+       "mostcategories": "Stranice s najviše kategorija",
        "mostimages": "Datoteke s najviše veza",
        "mostinterwikis": "Stranice sa najviše međuvikija",
        "mostrevisions": "Stranice s najviše izmena",
        "emailuser-title-notarget": "Slanje e-poruke korisniku",
        "emailpage": "Slanje e-poruka",
        "emailpagetext": "Možete da koristite donji obrazac da pošaljete e-poruku {{GENDER:$1|ovom korisniku|ovoj korisnici|ovom korisniku|}}.\nE-adresa koju ste uneli u vašim [[Special:Preferences|podešavanjima]] će se prikazati u polju „Od“, tako da će primalac moći da vam odgovori direktno.",
-       "defemailsubject": "{{SITENAME}} e-adresa {{GENDER:$1|korisnika|korisnice|korisnika}} $1",
+       "defemailsubject": "{{SITENAME}} — E-pošta od {{GENDER:$1|korisnika|korisnice}} $1",
        "usermaildisabled": "Korisnička e-pošta je onemogućena",
        "usermaildisabledtext": "Ne možete da šaljete e-poruke drugim korisnicima na ovom vikiju",
        "noemailtitle": "Nema e-adrese",
        "enotif_lastvisited": "Pogledajte $1 za sve izmene od vaše poslednje posete.",
        "enotif_lastdiff": "Pogledajte $1 da vidite ovu izmenu.",
        "enotif_anon_editor": "anoniman korisnik $1",
-       "enotif_body": "Poštovani $WATCHINGUSERNAME,\n\n\nStranica $PAGETITLE na vikiju {{SITENAME}} je $CHANGEDORCREATED dana $PAGEEDITDATE od strane {{GENDER:$PAGEEDITOR|korisnika|korisnice|korisnika}} $PAGEEDITOR. Pogledajte $PAGETITLE_URL za tekuću izmenu.\n\n$NEWPAGE\n\nOpis: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt:\ne-adresa: $PAGEEDITOR_EMAIL\nviki: $PAGEEDITOR_WIKI\n\nNeće biti drugih obaveštenja u slučaju daljih izmena ukoliko ne posetite ovu stranicu.\nMožete i da poništite postavke obaveštenja za sve stranice u vašem spisku nadgledanja.\n\nSrdačan pozdrav, {{SITENAME}}\n\n--\nDa biste promenili postavke u vezi sa e-obaveštenjima, posetite\n{{canonicalurl:{{#special:Preferences}}}}\n\nDa biste promenili postavke u vezi sa spiskom nadgledanja, posetite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nDa biste uklonili ovu stranicu sa spiska nadgledanja, posetite\n$UNWATCHURL\n\nPodrška i dalja pomoć:\n$HELPPAGE",
+       "enotif_body": "Poštovani $WATCHINGUSERNAME,\n \t\n$PAGEINTRO $NEWPAGE\n\nOpis: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt:\ne-pošta: $PAGEEDITOR_EMAIL\nviki: $PAGEEDITOR_WIKI\n\nNeće biti drugih obaveštenja u slučaju daljih izmena ukoliko ne posetite ovu stranicu kada ste prijavljeni.\nMožete i da poništite postavke obaveštenja za sve stranice u vašem spisku nadgledanja.\n\nSrdačan pozdrav, {{SITENAME}}\n\n--\nDa biste promenili postavke u vezi sa e-obaveštenjima, posetite\n{{canonicalurl:{{#special:Preferences}}}}\n\nDa biste promenili postavke u vezi sa spiskom nadgledanja, posetite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nDa biste uklonili ovu stranicu sa spiska nadgledanja, posetite\n$UNWATCHURL\n\nPodrška i dalja pomoć:\n$HELPPAGE",
        "created": "napravljena",
        "changed": "izmenjena",
        "deletepage": "Obriši stranicu",
        "ipblocklist-localblock": "Lokalno blokiranje",
        "ipblocklist-otherblocks": "{{PLURAL:$1|Drugo blokiranje|Druga blokiranja}}",
        "infiniteblock": "trajno",
-       "expiringblock": "ističe dana $1 u $2",
+       "expiringblock": "ističe $1 u $2",
        "anononlyblock": "samo anonimni",
        "noautoblockblock": "automatsko blokiranje je onemogućeno",
        "createaccountblock": "otvaranje naloga je blokirano",
        "movepagetalktext": "Odgovarajuća stranica za razgovor, ako postoji, biće automatski premeštena zajedno s njom, osim ako:\n*Već postoji stranica za razgovor s novim naslovom, ili\n*Ako je označeno dolenavedeno polje.\n\nU ovom slučaju mora ručno da se premesti ili spoji, ako ima potrebe za tim.",
        "movearticle": "Premesti stranicu:",
        "moveuserpage-warning": "'''Upozorenje:''' na putu ste da premestite korisničku stranicu. Imajte u vidu da će samo stranica biti premeštena, a sam korisnik ''neće'' biti preimenovan.",
+       "movecategorypage-warning": "<strong>Upozorenje:</strong> premeštate stranicu kategorije. Imajte na umu da će samo stranica biti premeštena i da sve stranice u staroj kategoriji <em>neće</em> biti rekategorisane u novu kategoriju.",
        "movenologintext": "Morate da budete registrovani i [[Special:UserLogin|prijavljeni]] da biste premeštali stranice.",
        "movenotallowed": "Nemate dozvolu da premeštate stranice.",
        "movenotallowedfile": "Nemate dozvolu da premeštate datoteke.",
        "tooltip-preferences-save": "Sačuvaj postavke",
        "tooltip-summary": "Unesite kratak opis",
        "common.css": "/** CSS postavljen ovde će se odraziti na sve teme */",
-       "monobook.css": "/* CSS postavljen ovde će uticati na sve korisnike teme „Monobuk“ */",
-       "vector.css": "/* CSS postavljen ovde će uticati na sve korisnike teme „Vektorsko“ */",
        "print.css": "/* CSS postavljen ovde će uticati na izdanje za štampu */",
        "noscript.css": "/* CSS postavljen ovde će uticati na sve korisnike kojima je onemogućen javaskript */",
        "group-autoconfirmed.css": "/* CSS postavljen ovde će uticati na samopotvrđene korisnike */",
        "group-sysop.css": "/* CSS postavljen ovde će uticati samo na sistemske operatore */",
        "group-bureaucrat.css": "/* CSS postavljen ovde će uticati samo na birokrate */",
        "common.js": "/* Javaskript postavljen ovde će se koristiti za sve korisnike pri otvaranju svake stranice. */",
-       "monobook.js": "/* Javaskript postavljen ovde će se učitati za sve one koji koriste temu „Monobuk“ */",
-       "vector.js": "/* Javaskript postavljen ovde će se učitati za sve one koji koriste temu „Vektorsko“ */",
        "group-autoconfirmed.js": "/* Javaskript postavljen ovde će se učitati za samopotvrđene korisnike */",
        "group-bot.js": "/* Javaskript postavljen ovde će se učitati samo za botove */",
        "group-sysop.js": "/* Javaskript postavljen ovde će se učitati samo za sistemske operatore */",
        "pageinfo-category-pages": "Broj stranica",
        "pageinfo-category-subcats": "Broj potkategorija",
        "pageinfo-category-files": "Broj datoteka",
-       "skinname-monobook": "Monobuk",
-       "skinname-vector": "Vektorsko",
        "markaspatrolleddiff": "Označi kao patrolirano",
        "markaspatrolledtext": "Označi stranicu kao patroliranu",
        "markedaspatrolled": "Označeno kao patrolirano",
        "newimages-summary": "Ova posebna stranica prikazuje poslednje poslate datoteke.",
        "newimages-legend": "Filter",
        "newimages-label": "Naziv datoteke (ili njen deo):",
+       "newimages-showbots": "Prikaži datoteke koje su poslali botovi",
        "noimages": "Nema ništa.",
        "ilsubmit": "Pretraži",
        "bydate": "po datumu",
        "exif-iimsupplementalcategory": "Dopunske kategorije",
        "exif-datetimeexpires": "Ne koristi nakon",
        "exif-datetimereleased": "Objavljeno",
-       "exif-originaltransmissionref": "Izvorni prenos kôda lokacije",
+       "exif-originaltransmissionref": "Izvorni prenos koda lokacije",
        "exif-identifier": "Naznaka",
        "exif-lens": "Korišćeni objektiv",
        "exif-serialnumber": "Serijski broj kamere",
        "scarytranscludefailed": "[Dobavljanje šablona za $1 nije uspelo]",
        "scarytranscludefailed-httpstatus": "[Ne mogu da preuzmem šablon $1: HTTP $2]",
        "scarytranscludetoolong": "[URL adresa je predugačka]",
-       "deletedwhileediting": "'''Upozorenje''': ova stranica je obrisana nakon što ste počeli s uređivanjem!",
+       "deletedwhileediting": "<strong>Upozorenje</strong>: ova stranica je obrisana nakon što ste počeli s uređivanjem!",
        "confirmrecreate": "[[User:$1|$1]] ([[User talk:$1|razgovor]]) {{GENDER:$1|je obrisao|je obrisala|je obrisao}} ovu stranicu nakon što ste počeli da je uređujete iz sledećeg razloga:\n: ''$2''\nPotvrdite da stvarno želite da napravite stranicu.",
        "confirmrecreate-noreason": "Korisnik [[User:$1|$1]] ([[User talk:$1|razgovor]]) je obrisao ovu stranicu nakon što ste počeli da ga uređujete. Potvrdite da stvarno želite da ponovo napravite ovu stranicu.",
        "recreate": "Ponovo napravi",
        "watchlistedit-normal-title": "Uređivanje spiska nadgledanja",
        "watchlistedit-normal-legend": "Uklanjanje naslova sa spiska nadgledanja",
        "watchlistedit-normal-explain": "Naslovi na vašem spisku nadgledanja su prikazani ispod.\nDa biste uklonili naslov, označite kućicu do njega i kliknite na „{{int:Watchlistedit-normal-submit}}“.\nMožete i da [[Special:EditWatchlist/raw|uredite sirov spisak]].",
-       "watchlistedit-normal-submit": "Ukloni",
+       "watchlistedit-normal-submit": "Ukloni naslove",
        "watchlistedit-normal-done": "{{PLURAL:$1|Jedna stranica je uklonjena|$1 stranice su uklonjene|$1 stranica je uklonjeno}} s vašeg spiska nadgledanja:",
        "watchlistedit-raw-title": "Izmeni sirov spisak nadgledanja",
-       "watchlistedit-raw-legend": "Napredno uređivanje spiska nadgledanja",
+       "watchlistedit-raw-legend": "Izmeni sirov spisak nadgledanja",
        "watchlistedit-raw-explain": "Naslovi sa spiska nadgledanja su prikazani ispod i mogu se uređivati dodavanjem ili uklanjanjem stavki sa spiska;\njedan naslov po redu.\nKada završite, kliknite na „{{int:Watchlistedit-raw-submit}}“.\nMožete da [[Special:EditWatchlist|koristite i običan uređivač]].",
        "watchlistedit-raw-titles": "Naslovi:",
        "watchlistedit-raw-submit": "Ažuriraj spisak",
        "watchlistedit-raw-done": "Vaš spisak nadgledanja je ažuriran.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Dodat je jedan naslov|Dodata su $1 naslova|Dodato je $1 naslova}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 naslov je uklonjen|Uklonjena su $1 naslova|Uklonjeno je $1 naslova}}:",
+       "watchlistedit-clear-title": "Isprazni spisak nadgledanja",
        "watchlistedit-clear-legend": "Isprazni spisak nadgledanja",
        "watchlistedit-clear-explain": "Svi naslovi će biti uklonjeni iz vašeg spiska nadgledanja.",
        "watchlistedit-clear-titles": "Naslovi:",
        "redirect-value": "Vrednost:",
        "redirect-user": "Korisnički ID",
        "redirect-page": "ID stranice",
+       "redirect-revision": "Verzija stranice",
        "redirect-file": "Naziv datoteke",
        "redirect-not-exists": "Vrednost nije pronađen",
        "fileduplicatesearch": "Pretraga duplikata",
        "compare-revision-not-exists": "Navedena izmena ne postoji.",
        "dberr-problems": "Došlo je do tehničkih problema.",
        "dberr-again": "Sačekajte nekoliko minuta i ponovo učitajte stranicu.",
-       "dberr-info": "(ne mogu da se povežem sa serverom baze: $1)",
+       "dberr-info": "(ne mogu da se povežem sa serverom baze podataka: $1)",
+       "dberr-info-hidden": "(ne mogu da se povežem sa serverom baze podataka)",
        "dberr-usegoogle": "U međuvremenu, pokušajte da pretražite pomoću Gugla.",
        "dberr-outofdate": "Imajte na umu da njihovi primerci našeg sadržaja mogu biti zastareli.",
        "dberr-cachederror": "Ovo je privremeno memorisan primerak strane koji možda nije ažuran.",
diff --git a/languages/i18n/sr.json b/languages/i18n/sr.json
deleted file mode 100644 (file)
index 7c7ed28..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Milicevic01",
-            "Misos",
-            "Terik",
-            "Жељко Тодоровић",
-            "Михајло Анђелковић"
-        ]
-    },
-    "vector-view-viewsource": "#REDIRECT[[MediaWiki:Vector-view-viewsource/sr-ec]]",
-    "postedit-confirmation": "",
-    "newuserlogpage": "историја креирања корисника",
-    "newuserlogpagetext": "Ово је историја скорашњих креирања корисника.",
-    "linksearch": "#REDIRECT[[MediaWiki:Linksearch/sr-ec]]",
-    "linksearch-text": "#REDIRECT[[MediaWiki:Linksearch-text/sr-ec]]",
-    "linksearch-line": "$1 повезана са $2",
-    "linksearch-error": "Џокери могу да се појављују само на почетку домена.",
-    "uctop": "‎"
-}
index f527f8b..9f845f6 100644 (file)
@@ -57,7 +57,8 @@
                        "Where next Columbus?",
                        "WikiPhoenix",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Abbedabb"
                ]
        },
        "tog-underline": "Stryk under länkar:",
        "qbmyoptions": "Mina sidor",
        "faq": "FAQ",
        "faqpage": "Project:FAQ",
-       "vector-action-addsection": "Nytt ämne",
-       "vector-action-delete": "Radera",
-       "vector-action-move": "Flytta",
-       "vector-action-protect": "Skrivskydda",
-       "vector-action-undelete": "Återställ",
-       "vector-action-unprotect": "Ändra skydd",
-       "vector-view-create": "Skapa",
-       "vector-view-edit": "Redigera",
-       "vector-view-history": "Visa historik",
-       "vector-view-view": "Visa",
-       "vector-view-viewsource": "Visa källa",
        "actions": "Åtgärder",
        "namespaces": "Namnrymder",
        "variants": "Varianter",
        "toc": "Innehåll",
        "showtoc": "visa",
        "hidetoc": "göm",
-       "collapsible-collapse": "Kollapsa",
-       "collapsible-expand": "Expandera",
+       "collapsible-collapse": "Dölj",
+       "collapsible-expand": "Visa",
        "thisisdeleted": "Visa eller återställ $1?",
        "viewdeleted": "Visa $1?",
        "restorelink": "{{PLURAL:$1|en raderad version|$1 raderade versioner}}",
        "currentrev": "Nuvarande version",
        "currentrev-asof": "Nuvarande version från $1",
        "revisionasof": "Versionen från $1",
-       "revision-info": "Version från den $1 av $2",
+       "revision-info": "Version från den $1 av {{GENDER:$6|$2}}$7",
        "previousrevision": "← Äldre version",
        "nextrevision": "Nyare version →",
        "currentrevisionlink": "Nuvarande version",
        "mergehistory-empty": "Inga versioner av sidorna kan sammanfogas.",
        "mergehistory-success": "$3 {{PLURAL:$3|version|versioner}} av [[:$1]] har infogats i [[:$2]].",
        "mergehistory-fail": "Historikerna kunde inte sammanfogas, kontrollera de sidor och den sidversion som du valt.",
+       "mergehistory-fail-toobig": "Kunde inte utföra historiksammanslagningen då fler än maxgränsen på $1 {{PLURAL:$1|version|versioner}} skulle ha flyttats.",
        "mergehistory-no-source": "Källsidan $1 finns inte.",
        "mergehistory-no-destination": "Målsidan $1 finns inte.",
        "mergehistory-invalid-source": "Källsidan måste vara en giltig sidtitel.",
        "difference-missing-revision": "{{PLURAL:$2|En version|$2 versioner}} av denna skillnad ($1) kunde inte hittas.\n\nDetta orsakas vanligtvis av att följa en utgången difflänk till en sida som har raderats.\nDetaljer kan hittas i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} raderingsloggen].",
        "searchresults": "Sökresultat",
        "searchresults-title": "Sökresultat för \"$1\"",
-       "toomanymatches": "Sökningen gav för många resultat, försök med en annan fråga",
        "titlematches": "Träffar i sidtitlar",
        "textmatches": "Artikeltexter som matchar sökningen",
        "notextmatches": "Inga artikeltexter matchar sökningen",
        "searchmenu-exists": "<strong>Det finns en sida med namnet \"[[:$1]]\" på denna wiki.</strong> {{PLURAL:$2|0=|Se även de andra sökresultaten som hittades.}}",
        "searchmenu-new": "<strong>Skapa sidan \"[[:$1]]\" på denna wiki!</strong> {{PLURAL:$2|0=|Se även sidan som hittades med din sökning.|Se även sidorna som hittades med din sökning.}}",
        "searchprofile-articles": "Innehållssidor",
-       "searchprofile-project": "Hjälp- och projektsidor",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Allt",
        "searchprofile-advanced": "Avancerad",
        "searchprofile-articles-tooltip": "Sök i $1",
-       "searchprofile-project-tooltip": "Sök i $1",
        "searchprofile-images-tooltip": "Sök efter filer",
        "searchprofile-everything-tooltip": "Sök allt innehåll (inklusive diskussionssidor)",
        "searchprofile-advanced-tooltip": "Sök i vissa namnrymder",
        "search-interwiki-default": "Resultat från $1:",
        "search-interwiki-more": "(mer)",
        "search-relatedarticle": "Relaterad",
-       "searcheverything-enable": "Sök i alla namnrymder",
        "searchrelated": "relaterad",
        "searchall": "alla",
        "showingresults": "Nedan visas upp till {{PLURAL:$1|'''1''' post|'''$1''' poster}} från och med nummer '''$2'''.",
        "powersearch-togglelabel": "Kryssa:",
        "powersearch-toggleall": "Alla",
        "powersearch-togglenone": "Ingen",
+       "powersearch-remember": "Kom ihåg val för framtida sökningar",
        "search-external": "Extern sökning",
        "searchdisabled": "Sökfunktionen på {{SITENAME}} är avstängd.\nDu kan istället göra sökningar med hjälp av Google.\nNotera dock att deras indexering av {{SITENAME}} kan vara något föråldrad.",
        "search-error": "Ett fel uppstod under sökningen: $1",
        "allowemail": "Tillåt e-post från andra användare",
        "prefs-searchoptions": "Sök",
        "prefs-namespaces": "Namnrymder",
-       "defaultns": "Sök annars i dessa namnrymder:",
        "default": "ursprungsinställning",
        "prefs-files": "Filer",
        "prefs-custom-css": "personlig CSS",
        "recentchanges-label-unpatrolled": "Denna redigering har inte blivit patrullerad ännu",
        "recentchanges-label-plusminus": "Sidans storlek ändrades med detta antal byte",
        "recentchanges-legend-heading": "'''Teckenförklaring:'''",
-       "recentchanges-legend-newpage": "(se även [[Special:NewPages|listan över nya sidor]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (se även [[Special:NewPages|listan över nya sidor]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Nedan visas ändringar sedan <strong>$2</strong> (upp till <strong>$1</strong> ändringar visas).",
        "rclistfrom": "Visa ändringar från och med $3 $2",
        "largefileserver": "Denna fil är större än vad servern ställts in att tillåta.",
        "emptyfile": "Filen du laddade upp verkar vara tom; felet kan bero på ett stavfel i filnamnet. Kontrollera om du verkligen vill ladda upp denna fil.",
        "windows-nonascii-filename": "Denna wiki stödjer inte filnamn med specialtecken.",
-       "fileexists": "Det finns redan en fil med detta namn.\nTitta på <strong>[[:$1]]</strong>, såvida du inte är säker på att du vill ändra den.\n[[$1|thumb]]",
+       "fileexists": "Det finns redan en fil med detta namn. Titta på <strong>[[:$1]]</strong>, om {{GENDER:|du}} inte är säker på att {{GENDER:|du}} vill ändra den.\n[[$1|thumb]]",
        "filepageexists": "Beskrivningssidan för denna fil har redan skapats på <strong>[[:$1]]</strong>, men just nu finns ingen fil med detta namn.\nDen sammanfattning du skriver här kommer inte visas på beskrivningssidan.\nFör att din sammanfattning ska visas där, så måste du redigera beskrivningssidan manuellt.\n[[$1|thumb]]",
-       "fileexists-extension": "En fil med ett liknande namn finns redan: [[$2|thumb]]\n* Namn på den fil du försöker ladda upp: <strong>[[:$1]]</strong>\n* Namn på filen som redan finns: <strong>[[:$2]]</strong>\nVar vänlig välj ett annat namn.",
+       "fileexists-extension": "En fil med ett liknande namn finns redan: [[$2|thumb]]\n* Namn på den fil du försöker ladda upp: <strong>[[:$1]]</strong>\n* Namn på filen som redan finns: <strong>[[:$2]]</strong>\nVill du möjligen välja ett mer distinkt namn?",
        "fileexists-thumbnail-yes": "Filen verkar vara en bild med förminskad storlek ''(miniatyrbild)''. [[$1|thumb]]\nVar vänlig kontrollera filen <strong>[[:$1]]</strong>.\nOm det är samma fil i originalstorlek så är det inte nödvändigt att ladda upp en extra miniatyrbild.",
        "file-thumbnail-no": "Filnamnet börjar med <strong>$1</strong>.\nDet verkar vara en bild med förminskad storlek ''(miniatyrbild)''.\nOm du har denna bild i full storlek, ladda då hellre upp den, annars var vänlig och ändra filens namn.",
        "fileexists-forbidden": "En fil med detta namn existerar redan, och kan inte överskrivas.\nOm du fortfarande vill ladda upp din fil, var god gå tillbaka och välj ett nytt namn. [[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Radering och återställning av filer har tillfälligt avaktiverats under underhåll.",
        "filedelete-maintenance-title": "Kan inte radera filen",
        "mimesearch": "MIME-sökning",
-       "mimesearch-summary": "På den här sidan kan du söka efter filer via dess MIME-typ. Input: contenttype/subtype, t.ex. <code>image/jpeg</code>.",
+       "mimesearch-summary": "Denna sidan gör det möjligt att filtrera filer via dess MIME-typ.\nIndata: contenttype/subtype, t.ex. <code>image/jpeg</code>.",
        "mimetype": "MIME-typ:",
        "download": "ladda ner",
        "unwatchedpages": "Obevakade sidor",
        "ntransclusions": "använd på $1 {{PLURAL:$1|sida|sidor}}",
        "specialpage-empty": "Den här sidan är tom.",
        "lonelypages": "Föräldralösa sidor",
-       "lonelypagestext": "Följande sidor länkas inte till från någon annan sida på {{SITENAME}}.",
+       "lonelypagestext": "Följande sidor länkas inte till eller inkluderas på någon annan sida på {{SITENAME}}.",
        "uncategorizedpages": "Ej kategoriserade sidor",
        "uncategorizedcategories": "Ej kategoriserade kategorier",
        "uncategorizedimages": "Ej kategoriserade filer",
        "wantedtemplates": "Önskade mallar",
        "mostlinked": "Sidor med flest länkar till sig",
        "mostlinkedcategories": "Kategorier med flest länkar till sig",
-       "mostlinkedtemplates": "Mallar med flest länkar till sig",
+       "mostlinkedtemplates": "Mest inkluderade sidor",
        "mostcategories": "Sidor med flest kategorier",
        "mostimages": "Filer med flest länkar till sig",
        "mostinterwikis": "Sidor med flest interwikis",
        "whatlinkshere-next": "{{PLURAL:$1|nästa|nästa $1}}",
        "whatlinkshere-links": "← länkar",
        "whatlinkshere-hideredirs": "$1 omdirigeringar",
-       "whatlinkshere-hidetrans": "$1 mallinkluderingar",
+       "whatlinkshere-hidetrans": "$1 inkluderingar",
        "whatlinkshere-hidelinks": "$1 länkar",
        "whatlinkshere-hideimages": "$1 fillänkar",
        "whatlinkshere-filters": "Filter",
        "tooltip-summary": "Skriv en kort sammanfattning",
        "interlanguage-link-title": "$1 - $2",
        "common.css": "/* CSS som skrivs här påverkar alla skal */",
-       "cologneblue.css": "/* CSS som skrivs här kommer att påverka alla användare av skalet Cologne blå */",
-       "monobook.css": "/* CSS som skrivs här kommer att påverka alla användare av skalet Monobook */",
-       "modern.css": "/* CSS som skrivs här kommer att påverka alla användare av skalet Modern */",
-       "vector.css": "/* CSS som skrivs här kommer att påverka alla användare av skalet Vector */",
        "print.css": "/* CSS som skrivs här kommer att påverka utskriftsversionen */",
        "noscript.css": "/* CSS som placeras här kommer att påverka användare med JavaScript inaktiverat */",
        "group-autoconfirmed.css": "/* CSS som placeras här kommer bara att påverka bekräftade användare */",
        "group-sysop.css": "/* CSS som placeras här kommer bara att påverka administratörer */",
        "group-bureaucrat.css": "/* CSS som placeras här kommer bara att påverka byråkrater */",
        "common.js": "/* JavaScript som skrivs här körs varje gång en användare laddar en sida. */",
-       "cologneblue.js": "/* JavaScript här kommer att laddas för dem som använder skalet Cologne blå */",
-       "monobook.js": "/* JavaScript här kommer att laddas för dem som använder skalet Monobook */",
-       "modern.js": "/* JavaScript här kommer att laddas för dem som använder skalet Modern */",
-       "vector.js": "/* JavaScript här kommer att laddas för dem som använder skalet Vector */",
        "group-autoconfirmed.js": "/* JavaScript här kommer att laddas för bekräftade användare */",
        "group-user.js": "/* JavaScript här kommer att laddas för registrerade användare */",
        "group-bot.js": "/* JavaScript här kommer att laddas för robotar */",
        "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-transclusions": "{{PLURAL:$1|Sida|Sidor}} mallinkluderas på ($1)",
+       "pageinfo-transclusions": "{{PLURAL:$1|Sida|Sidor}} inkluderas på ($1)",
        "pageinfo-toolboxlink": "Sidinformation",
        "pageinfo-redirectsto": "Omdirigerar till",
        "pageinfo-redirectsto-info": "info",
        "pageinfo-category-pages": "Antal sidor",
        "pageinfo-category-subcats": "Antal underkategorier",
        "pageinfo-category-files": "Antal filer",
-       "skinname-cologneblue": "Cologne blå",
-       "skinname-monobook": "Monobook",
-       "skinname-modern": "Modern",
-       "skinname-vector": "Vector",
        "markaspatrolleddiff": "Märk som patrullerad",
        "markaspatrolledtext": "Märk den här sidan som patrullerad",
        "markedaspatrolled": "Markerad som patrullerad",
        "version-hooks": "Hakar",
        "version-parser-extensiontags": "Tilläggstaggar",
        "version-parser-function-hooks": "Parserfunktioner",
-       "version-hook-name": "Namn",
+       "version-hook-name": "Namn på hook",
        "version-hook-subscribedby": "Används av",
        "version-version": "(Version $1)",
+       "version-no-ext-name": "[inget namn]",
        "version-license": "MediaWiki-licens",
        "version-ext-license": "Licens",
        "version-ext-colheader-name": "Tillägg",
index 7117def..d297c7b 100644 (file)
@@ -33,7 +33,8 @@
                        "மதனாஹரன்",
                        "බිඟුවා",
                        "Thamiziniyan",
-                       "아라"
+                       "아라",
+                       "Kalyanasundar"
                ]
        },
        "tog-underline": "இணைப்புகளுக்கு அடிக்கோடிடு",
        "searchmenu-exists": "'''\"[[:$1]]\" என்னும் பெயருடைய பக்கம் இந்த விக்கியில் உள்ளது'''",
        "searchmenu-new": "'''\"[[:$1]]\" பக்கத்தை இந்த விக்கியில் உருவாக்கவும்!'''",
        "searchprofile-articles": "உள்ளடக்கப் பக்கங்களின் பட்டியல்",
-       "searchprofile-project": "உதவி மற்றும் திட்டப் பக்கங்கள்",
        "searchprofile-images": "பல்லூடகம்",
        "searchprofile-everything": "எல்லாம்\n\nஅத்தனையும்",
        "searchprofile-advanced": "மேம்பட்ட",
        "searchprofile-articles-tooltip": "$1-ல் தேடவும்",
-       "searchprofile-project-tooltip": "$1-ல் தேடவும்",
        "searchprofile-images-tooltip": "கோப்புகளைத் தேடுக",
        "searchprofile-everything-tooltip": "எல்லா உள்ளடக்கங்களிலும் தேடுக (பேச்சுப் பக்கங்கள் உட்பட)",
        "searchprofile-advanced-tooltip": "தனிப்பட்ட பெயர்வெளிகளில் தேடவும்",
        "search-interwiki-default": "$1 தளத்தின் முடிவுகள்:",
        "search-interwiki-more": "(மேலும்)",
        "search-relatedarticle": "தொடர்புடையவை",
-       "searcheverything-enable": "அனைத்துப் பெயர்வெளிகளிலும் தேடவும்",
        "searchrelated": "தொடர்புடையவை",
        "searchall": "அனைத்தும்",
        "showingresults": "'''$2''' இலிருந்து தொடங்கும்  {{PLURAL:$1|'''1''' முடிவு கீழே காட்டப்பட்டுள்ளது|'''$1''' முடிவுகள் கீழே காட்டப்பட்டுள்ளன}}.",
        "powersearch-togglelabel": "சரிபார்க்கவும்:",
        "powersearch-toggleall": "அனைத்தும்",
        "powersearch-togglenone": "ஏதுமில்லை",
+       "powersearch-remember": "எதிர்கால தேடுதல்களுக்காக தேர்வை நினைவில் கொள்ளவும்",
        "search-external": "வெளித்தேடல்",
        "searchdisabled": "{{SITENAME}} தளத்தின் தேடல் வசதிகள் தற்காலிகமாக முடக்கப்பட்டுள்ளது. அதுவரை நீங்கள் கீழேயுள்ள கூகிள் தேடலைப் பயன்படுத்தலாம். இது சில சமயம் இற்றைப்படுத்தப்படாததாய் இருக்கக்கூடும்.",
        "search-error": "தேடுகையில் ஒரு பிழை ஏற்பட்டுள்ளது:$1",
        "allowemail": "ஏனைய பயனர்களிடம் இருந்தான மின்னஞ்சல்களை அனுமதி",
        "prefs-searchoptions": "தேடல்",
        "prefs-namespaces": "பெயர்வெளிகள்",
-       "defaultns": "அப்படியில்லையென்றால் இந்த பொயர்வெளிகளில் தேடவும்:",
        "default": "பொதுவானது",
        "prefs-files": "கோப்புகள்",
        "prefs-custom-css": "தனிப்பட்ட சி.எசு.எசு (CSS)",
        "prefs-emailconfirm-label": "மின்னஞ்சலை உறுதிசெய்தல்:",
        "youremail": "மின்னஞ்சல்:",
        "username": "{{GENDER:$1|பயனர் பெயர்}}:",
-       "uid": "{{GENDER:$1|User}} ID:",
        "prefs-memberingroups": "பின்வரும் {{PLURAL:$1|குழு|குழுக்களில்}} உறுப்பினர்:",
        "prefs-registration": "பதிவு செய்யும் நேரம்:",
        "yourrealname": "உண்மைப் பெயர்:",
        "log-title-wildcard": "இவ்வுரையுடன் தொடங்கும் தலைப்புகளைத் தேடு",
        "showhideselectedlogentries": "தேர்ந்தெடுத்த குறிப்பேடு உள்ளீடுகள் காண்பி/மறை",
        "allpages": "அனைத்துப் பக்கங்கள்",
-       "alphaindexline": "$1 தொடக்கம் $2 வரை",
        "nextpage": "அடுத்த பக்கம் ($1)",
        "prevpage": "முந்திய பக்கம் ($1)",
        "allpagesfrom": "அடுத்து காணப்படும் எழுத்தில் தொடங்கும் பக்கங்களை காட்டு:",
        "pageinfo-category-info": "பகுப்புகளின் எண்ணிக்கை",
        "pageinfo-category-pages": "பக்கங்களின் எண்ணிக்கை",
        "pageinfo-category-files": "கோப்புகளின் எண்ணிக்கை",
-       "skinname-cologneblue": "கொலோன் (Cologne) நீலம் Blue",
        "markaspatrolleddiff": "ரோந்திட்டதாக குறி",
        "markaspatrolledtext": "இப்பக்கத்தை ரோந்திட்டதாகக் குறி",
        "markedaspatrolled": "ரோந்திட்டதாக குறிக்கப்பட்டது",
index 7b9d9ce..67d8ba6 100644 (file)
        "qbmyoptions": "నా పేజీలు",
        "faq": "తరచూ అడిగే ప్రశ్నలు",
        "faqpage": "Project:తరచూ అడిగే ప్రశ్నలు",
-       "vector-action-addsection": "విషయాన్ని చేర్చు",
-       "vector-action-delete": "తొలగించు",
-       "vector-action-move": "తరలించు",
-       "vector-action-protect": "సంరక్షించు",
-       "vector-action-undelete": "తొలగింపును రద్దుచెయ్యి",
-       "vector-action-unprotect": "సంరక్షణను మార్చు",
-       "vector-view-create": "సృష్టించు",
-       "vector-view-edit": "సవరించు",
-       "vector-view-history": "చరిత్రను చూడండి",
-       "vector-view-view": "చదువు",
-       "vector-view-viewsource": "మూలాన్ని చూపించు",
        "actions": "పనులు",
        "namespaces": "పేరుబరులు",
        "variants": "వివిధ రూపాలు",
        "view": "చూచుట",
        "view-foreign": "$1 లో చూడండి",
        "edit": "సవరించు",
+       "edit-local": "ప్రాంతీయ వివరణని మార్చు",
        "create": "సృష్టించు",
+       "create-local": "ప్రాంతీయ వివరణని చేర్చు",
        "editthispage": "ఈ పేజీని సవరించండి",
        "create-this-page": "ఈ పేజీని సృష్టించండి",
        "delete": "తొలగించు",
        "jumptonavigation": "మార్గసూచీ",
        "jumptosearch": "వెతుకు",
        "view-pool-error": "క్షమించండి, ప్రస్తుతం సర్వర్లన్నీ ఓవర్‌లోడ్ అయిఉన్నాయి.\nచాలామంది వాడుకరులు ఈ పేజీని చూస్తున్నారు.\nఈ పేజీని వీక్షించడానికి కొద్దిసేపు నిరీక్షించండి.\n\n$1",
+       "generic-pool-error": "క్షమించండి, ప్రస్తుతం సర్వర్లన్నీ ఓవర్‌లోడ్ అయిఉన్నాయి.\nచాలామంది వాడుకరులు దీనిని చూస్తున్నారు.\nదీనిని వీక్షించడానికి కొద్దిసేపు నిరీక్షించండి.",
        "pool-timeout": "తాళం కొరకు వేచివుండడానికి కాలపరిమితి అయిపోయింది",
        "pool-queuefull": "సమూహపు వరుస నిండుగా ఉంది",
        "pool-errorunknown": "తెలియని లోపం",
        "edit-conflict": "దిద్దుబాటు ఘర్షణ.",
        "edit-no-change": "పాఠ్యంలో మార్పులేమీ చెయ్యలేదు కాబట్టి, మీ మార్పును పట్టించుకోవట్లేదు.",
        "postedit-confirmation-created": "పేజీ సృష్టించబడినది.",
+       "postedit-confirmation-restored": "పేజీ పునసృష్టించబడినది.",
        "postedit-confirmation-saved": "మీ మార్పు భద్రమయ్యింది.",
        "edit-already-exists": "కొత్త పేజీని సృష్టించలేకపోయాం.\nఅది ఇప్పటికే ఉంది.",
        "defaultmessagetext": "అప్రమేయ సందేశపు పాఠ్యం",
        "parser-template-recursion-depth-warning": "మూస రికర్షను లోతు అధిగమించబడింది ($1)",
        "language-converter-depth-warning": "భాషా మార్పిడి లోతు పరిమితిని అధిగమించారు ($1)",
        "node-count-exceeded-category": "నోడ్-కౌంటును మించిన పేజీలు",
+       "node-count-exceeded-category-desc": "నోడు-సంఖ్య ఎక్కువ అయిన ప్రతులకు వర్గము",
        "node-count-exceeded-warning": "పేజీ నోడ్-కౌంటును మించింది",
        "expansion-depth-exceeded-category": "విస్తరణ లోతును మించిన పేజీలు",
+       "expansion-depth-exceeded-category-desc": "విస్తరణ లోతును మించిన పేజీలకు వర్గము",
        "expansion-depth-exceeded-warning": "పేజీ విస్తరణ లోతును మించింది",
        "parser-unstrip-loop-warning": "Unstrip లూపును కనుక్కున్నాం",
        "parser-unstrip-recursion-limit": "Unstrip రికర్షన్ పరిమితిని దాటింది ($1)",
        "currentrev": "ప్రస్తుతపు సంచిక",
        "currentrev-asof": "$1 నాటి చిట్టచివరి కూర్పు",
        "revisionasof": "$1 నాటి కూర్పు",
-       "revision-info": "$1 నాటి కూర్పు. రచయిత: $2",
+       "revision-info": "{{GENDER:$6|$2}}$7 ద్వారా $1 నాటి కూర్పు",
        "previousrevision": "← పాత కూర్పు",
        "nextrevision": "తరువాతి కూర్పు →",
        "currentrevisionlink": "ప్రస్తుత కూర్పు",
        "difference-missing-revision": "ఈ తేడా ($1) యొక్క {{PLURAL:$2|ఒక కూర్పు|$2 కూర్పులు}} {{PLURAL:$2|కనబడలేదు}}.\n\nసాధారణంగా, తొలగించబడిన పేజీ యొక్క కాలం చెల్లిన ’తేడా’ లింకును నొక్కినపుడు ఇది జరుగుతుంది. \n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} తొలగింపు లాగ్] లో వివరాలు ఉంటాయి.",
        "searchresults": "వెతుకులాట ఫలితాలు",
        "searchresults-title": "\"$1\" కి వెతుకులాట ఫలితాలు",
-       "toomanymatches": "మరీ ఎక్కువ పోలికలు వచ్చాయి, దయచేసి మరో ప్రశ్నని ప్రయత్నించండి",
        "titlematches": "వ్యాస శీర్షిక సరిపోయింది",
        "textmatches": "పేజిలోని పాఠం సరిపోలింది",
        "notextmatches": "పేజీ పాఠ్యమేదీ సరిపోలడం లేదు",
        "searchmenu-exists": "<strong>ఈ వికీలో \"[[:$1]]\" అనే పేజీ ఉంది.</strong> {{PLURAL:$2|0=|ఇతర ఫలితాలను కూడా చూడండి.}}",
        "searchmenu-new": "<strong>ఈ వికీలో \"[[:$1]]\" అనే పేరుతో పేజీని సృష్టించండి!</strong> {{PLURAL:$2|0=|మీ వెతుకులాటలో దొరికిన పేజీని కూడా చూడండి.|వెతుకులాట ఫలితాలను కూడా చూడండి.}}",
        "searchprofile-articles": "విషయపు పేజీలు",
-       "searchprofile-project": "సహాయం మరియు ప్రాజెక్టు పేజీలు",
        "searchprofile-images": "బహుళమాధ్యమాలు",
        "searchprofile-everything": "ప్రతీ ఒక్కటీ",
        "searchprofile-advanced": "ఉన్నత",
        "searchprofile-articles-tooltip": "$1 లలో వెతకండి",
-       "searchprofile-project-tooltip": "$1 లలో వెతకండి",
        "searchprofile-images-tooltip": "పైళ్ళ కోసం వెతకండి",
        "searchprofile-everything-tooltip": "అన్ని చోట్లా (చర్చా పేజీలతో సహా) వెతకండి",
        "searchprofile-advanced-tooltip": "కస్టం నేంస్పేసులలో వెదుకు",
        "search-interwiki-default": "$1 నుండి ఫలితాలు:",
        "search-interwiki-more": "(మరిన్ని)",
        "search-relatedarticle": "సంబంధించినవి",
-       "searcheverything-enable": "అన్ని పేరుబరుల్లో వెతుకు",
        "searchrelated": "సంబంధించినవి",
        "searchall": "అన్నీ",
        "showingresults": "#<strong>$2</strong> నుండి మొదలుకొని {{PLURAL:$1|</strong>ఒక్క</strong> ఫలితాన్ని|<strong>$1</strong> ఫలితాలను}} కింద చూపించాం.",
        "powersearch-togglelabel": "ఎంచుకోండి:",
        "powersearch-toggleall": "అన్నీ",
        "powersearch-togglenone": "ఏదీకాదు",
+       "powersearch-remember": "భవిష్యత్తులో వెతుకుటకు అభిరుచులను గుర్తు పెట్టుకో",
        "search-external": "బయటి అన్వేషణ",
        "searchdisabled": "{{SITENAME}} అన్వేషణ తాత్కాలికంగా పని చెయ్యడం లేదు. ఈలోగా మీరు గూగుల్‌ ఉపయోగించి అన్వేషించవచ్చు. గమనిక: గూగుల్‌ వారి {{SITENAME}} ఫలితాలు కాలదోషం పట్టి ఉండే అవకాశం ఉంది.",
        "search-error": "$1 కోసం వెతికేటపుడు లోపమేదో దొర్లింది.",
        "allowemail": "ఇతర వాడుకరుల నుండి ఈ-మెయిళ్ళను రానివ్వు",
        "prefs-searchoptions": "వెతుకులాట",
        "prefs-namespaces": "పేరుబరులు",
-       "defaultns": "లేకపోతే ఈ నేంస్పేసులలో అన్వేషించు:",
        "default": "అప్రమేయం",
        "prefs-files": "ఫైళ్ళు",
        "prefs-custom-css": "ప్రత్యేక CSS",
        "recentchanges-label-unpatrolled": "ఈ దిద్దుబాటు మీద నిఘా లేదు",
        "recentchanges-label-plusminus": "ఈ పేజి పరిమాణంలో  జరిగిన మార్పుల  బైట్ల సంఖ్య",
        "recentchanges-legend-heading": "'''సూచిక :'''",
-       "recentchanges-legend-newpage": "([[Special:NewPages|కొత్త పేజీల జాబితా]]ను కూడా చూడండి)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|కొత్త పేజీల జాబితా]]ను కూడా చూడండి)",
        "rcnotefrom": "<strong>$2</strong> నుండి జరిగిన మార్పులు (<strong>$1</strong> వరకు) కింద చూపబడ్డాయి.",
        "rclistfrom": "$3, $2 నుండి జరిగిన మార్పులను చూపించు",
        "rcshowhideminor": "చిన్న మార్పులను $1",
        "doubleredirects": "జంట దారిమార్పులు",
        "doubleredirectstext": "ఇతర దారిమార్పు పుటలకి తీసుకెళ్ళే దారిమార్పులని ఈ పుట చూపిస్తుంది.\nప్రతీ వరుసలో మొదటి మరియు రెండవ దారిమార్పులకు లంకెలు, ఆలానే రెండవ దారిమార్పు పుట యొక్క లక్ష్యం ఉన్నాయి. సాధారణంగా ఈ రెండవ దారిమార్పు యొక్క లక్ష్యమే \"అసలైనది\", అదే మొదటి దారిమార్పు యొక్క లక్ష్యంగా ఉండాలి.\n<del>కొట్టివేయబడిన</del> పద్దులు పరిష్కరించబడ్డవి.",
        "double-redirect-fixed-move": "[[$1]]ని తరలించారు, అది ప్రస్తుతం [[$2]]కి దారిమార్పు.",
-       "double-redirect-fixed-maintenance": "[[$1]] కు జమిలి దారిమార్పును [[$2]] కు సరిచేస్తున్నాం.",
+       "double-redirect-fixed-maintenance": "[[$1]] à°\95à±\81 à°\9cమిలి à°¦à°¾à°°à°¿à°®à°¾à°°à±\8dà°ªà±\81à°¨à±\81 [[$2]] à°\95à±\81 à°\85à°ªà±\8dà°°à°®à±\87à°¯à°\82à°\97à°¾ à°¸à°°à°¿à°\9aà±\87à°¸à±\8dà°¤à±\81à°¨à±\8dనాà°\82.",
        "double-redirect-fixer": "దారిమార్పు సరిద్దువారు",
        "brokenredirects": "తెగిపోయిన దారిమార్పులు",
        "brokenredirectstext": "కింది దారిమార్పులు ఉనికిలోనే లేని పేజీలకు వెళ్తున్నాయి:",
        "listgrouprights-removegroup-self-all": "స్వంత ఖాతా నుండి అన్ని సమూహాలనూ తొలగించుకోగలగడం",
        "listgrouprights-namespaceprotection-header": "పేరుబరి నిబంధనలు",
        "listgrouprights-namespaceprotection-namespace": "పేరుబరి",
+       "listgrouprights-namespaceprotection-restrictedto": "వాడుకరి మార్పు చేయుటకు హక్కు(లు)",
+       "trackingcategories": "పహారా కాయు వర్గాలు",
+       "trackingcategories-msg": "పహారా కార్యు వర్గము",
        "trackingcategories-name": "సందేశం పేరు",
        "trackingcategories-nodesc": "వివరణ లేదు.",
        "trackingcategories-disabled": "వర్గం అచేతనమై ఉంది",
        "pageinfo-contentpage-yes": "అవును",
        "pageinfo-protect-cascading": "సంరక్షణ ఇక్కడినుంచి వ్యాపిస్తుంది",
        "pageinfo-protect-cascading-yes": "అవును",
+       "pageinfo-protect-cascading-from": "సంరక్షణ ఇక్కడినుంచి వ్యాపిస్తుంది",
        "pageinfo-category-info": "వర్గపు సమాచారం",
        "pageinfo-category-pages": "పేజీల సంఖ్య",
        "pageinfo-category-subcats": "ఉపవర్గాల సంఖ్య",
        "pageinfo-category-files": "దస్త్రాల సంఖ్య",
-       "skinname-cologneblue": "కలోన్ నీలం",
-       "skinname-monobook": "మోనోబుక్",
-       "skinname-modern": "ఆధునిక",
-       "skinname-vector": "వెక్టర్",
        "markaspatrolleddiff": "పరీక్షించినట్లుగా గుర్తు పెట్టు",
        "markaspatrolledtext": "ఈ వ్యాసాన్ని పరీక్షించినట్లుగా గుర్తు పెట్టు",
        "markedaspatrolled": "పరీక్షింపబడినట్లు గుర్తింపబడింది",
        "file-info-size-pages": "$1 × $2 పిక్సెళ్ళు, దస్త్రపు పరిమాణం: $3, MIME రకం: $4, $5 {{PLURAL:$5|పేజీ|పేజీలు}}",
        "file-nohires": "మరింత స్పష్టమైన బొమ్మ లేదు.",
        "svg-long-desc": "SVG ఫైలు, నామమాత్రంగా $1 × $2 పిక్సెళ్ళు, ఫైలు పరిమాణం: $3",
+       "svg-long-desc-animated": "ఏనిమేటడ్ SVG ఫైలు, నామమాత్రంగా $1 × $2 పిక్సెళ్ళు, ఫైలు పరిమాణం: $3",
        "svg-long-error": "చెల్లని SVG దస్త్రం: $1",
        "show-big-image": "అసలు దస్త్రం",
        "show-big-image-preview": "ఈ మునుజూపు పరిమాణం: $1.",
        "watchlistedit-raw-done": "మీ వీక్షణ జాబితాను తాజాకరించాం.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 శీర్షికను|$1 శీర్షికలను}} చేర్చాం:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 శీర్షికను|$1 శీర్షికలను}} తీసివేశాం:",
+       "watchlistedit-clear-title": "వీక్షణజాబితా చెరిపివేయబడింది",
+       "watchlistedit-clear-legend": "వీక్షణజాబితా చెరిపివేయి",
        "watchlistedit-clear-titles": "శీర్షికలు:",
        "watchlistedit-clear-submit": "వీక్షణ జాబితా శుభ్రం చేయి (ఇది శాశ్వతం!)",
        "watchlistedit-clear-done": "మీ వీక్షణ జాబితాను శుభ్రం చేశాం.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 శీర్షికను|$1 శీర్షికలను}} తీసివేశాం:",
        "watchlisttools-clear": "వీక్షణజాబితాను శుభ్రం చేయి",
        "watchlisttools-view": "సంబంధిత మార్పులను చూడండి",
        "watchlisttools-edit": "వీక్షణ జాబితాను చూడండి లేదా మార్చండి",
index 98c4e37..10ca3ea 100644 (file)
        "qbmyoptions": "หน้าของฉัน",
        "faq": "คำถามพบบ่อย",
        "faqpage": "Project:คำถามพบบ่อย",
-       "vector-action-addsection": "เพิ่มหัวข้อใหม่",
-       "vector-action-delete": "ลบ",
-       "vector-action-move": "เปลี่ยนชื่อ",
-       "vector-action-protect": "ล็อก",
-       "vector-action-undelete": "กู้คืน",
-       "vector-action-unprotect": "เปลี่ยนการล็อก",
-       "vector-view-create": "สร้าง",
-       "vector-view-edit": "แก้ไข",
-       "vector-view-history": "ดูประวัติ",
-       "vector-view-view": "อ่าน",
-       "vector-view-viewsource": "ดูโค้ด",
        "actions": "ปฏิบัติการ",
        "namespaces": "เนมสเปซ",
        "variants": "สิ่งที่แตกต่าง",
        "nstab-image": "ไฟล์",
        "nstab-mediawiki": "ข้อความ",
        "nstab-template": "แม่แบบ",
-       "nstab-help": "หà¸\99à¹\89าà¸\84ำอà¸\98ิà¸\9aาย",
+       "nstab-help": "หà¸\99à¹\89าวิà¸\98ีà¹\83à¸\8aà¹\89",
        "nstab-category": "หมวดหมู่",
        "nosuchaction": "ไม่มีการกระทำดังกล่าว",
        "nosuchactiontext": "การกระทำที่กำหนดผ่านยูอาร์แอลดังกล่าวไม่สามารถใช้ได้\nคุณอาจกรอกยูอาร์แอลผิด หรือมาตามลิงก์ที่ไม่ถูกต้อง\nหรืออาจเกิดจากข้อผิดพลาดในซอฟต์แวร์ซึ่ง {{SITENAME}} ใช้อยู่",
        "currentrev": "รุ่นปัจจุบัน",
        "currentrev-asof": "รุ่นปัจจุบัน เมื่อ $1",
        "revisionasof": "รุ่นเมื่อ $1",
-       "revision-info": "รุ่นเมื่อ $1 โดย $2",
+       "revision-info": "รุ่นเมื่อ $1 โดย {{GENDER:$6|$2}}$7",
        "previousrevision": "←รุ่นก่อนหน้า",
        "nextrevision": "รุ่นถัดไป→",
        "currentrevisionlink": "รุ่นล่าสุด",
        "difference-missing-revision": "ไม่พบรุ่น{{PLURAL:$2|รุ่น| $2 รุ่น}}ของผลต่างนี้ ($1)\n\nโดยปกติเกิดจากการเข้าลิงก์ผลต่างของหน้าที่ถูกลบไปแล้ว \nดูรายละเอียดได้ที่[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
        "searchresults": "ผลการค้นหา",
        "searchresults-title": "ผลการค้นหาสำหรับ \"$1\"",
-       "toomanymatches": "พบตรงกันมากเกินไป กรุณาลองใช้คำค้นหาอื่น",
        "titlematches": "พบชื่อเรื่องหน้าตรงกัน",
        "textmatches": "พบข้อความตรงในหน้า",
        "notextmatches": "ไม่พบข้อความตรงในหน้า",
        "search-interwiki-default": "ผลลัพธ์จาก $1 :",
        "search-interwiki-more": "(เพิ่มเติม)",
        "search-relatedarticle": "สัมพันธ์",
-       "searcheverything-enable": "ค้นหาในทุกเนมสเปซ",
        "searchrelated": "สัมพันธ์",
        "searchall": "ทั้งหมด",
        "showingresults": "ด้านล่างแสดง <strong>1</strong> ผลลัพธ์ เริ่มตั้งแต่รายการที่ <strong>$2</strong>",
        "powersearch-togglelabel": "เลือก:",
        "powersearch-toggleall": "ทั้งหมด",
        "powersearch-togglenone": "ไม่เลือก",
+       "powersearch-remember": "จำการเลือกสำหรับการค้นหาในอนาคต",
        "search-external": "ค้นหาภายนอก",
        "searchdisabled": "การค้นหา {{SITENAME}} ปิดใช้งาน คุณสามารถค้นหาผ่านกูเกิลหรือเซิร์ชเอนจินอื่นในเวลาไม่นาน โปรดทราบว่าดัชนีเนื้อหาของ {{SITENAME}} บนเซิร์ชเอนจินอาจเป็นข้อมูลเก่า",
        "search-error": "เกิดข้อผิดพลาดขณะกำลังค้นหา: $1",
        "allowemail": "เปิดรับอีเมลจากผู้ใช้อื่น",
        "prefs-searchoptions": "ค้นหา",
        "prefs-namespaces": "เนมสเปซ",
-       "defaultns": "หรือค้นหาในเนมสเปซต่อไปนี้:",
        "default": "ค่าโดยปริยาย",
        "prefs-files": "ไฟล์",
        "prefs-custom-css": "สไตล์ชีตปรับแต่งเอง",
        "recentchanges-label-unpatrolled": "การแก้ไขนี้ยังไม่ได้ตรวจสอบ",
        "recentchanges-label-plusminus": "ขนาดของหน้าเปลี่ยนไปด้วยจำนวนไบต์เท่านี้",
        "recentchanges-legend-heading": "'''คำอธิบายสัญลักษณ์:'''",
-       "recentchanges-legend-newpage": "(ดูเพิ่มที่[[Special:NewPages|รายชื่อหน้าใหม่]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ดูเพิ่มที่[[Special:NewPages|รายชื่อหน้าใหม่]])",
        "rcnotefrom": "ด้านล่างเป็นการเปลี่ยนแปลงตั้งแต่ <strong>$2</strong> (มากสุด <strong>$1</strong> รายการ)",
        "rclistfrom": "แสดงการเปลี่ยนแปลงใหม่เริ่มตั้งแต่ $3 $2",
        "rcshowhideminor": "$1การแก้ไขเล็กน้อย",
        "watchnologin": "ยังไม่ได้ล็อกอิน",
        "addwatch": "เพิ่มเข้ารายการเฝ้าดู",
        "addedwatchtext": "หน้า \"[[:$1]]\" ได้เพิ่มลงใน[[Special:Watchlist|รายการเฝ้าดู]]ของคุณแล้ว การเปลี่ยนแปลงในหน้านี้หรือหน้าพูดคุยที่เกี่ยวข้องจะแสดงในรายการดังกล่าว",
+       "addedwatchtext-short": "หน้า \"$1\" ถูกเพิ่มเข้ารายการเฝ้าดูของคุณ",
        "removewatch": "นำออกจากรายการเฝ้าดู",
        "removedwatchtext": "หน้า \"[[:$1]]\" ถูกนำออกจาก[[Special:Watchlist|รายการเฝ้าดูของคุณ]]",
+       "removedwatchtext-short": "หน้า \"$1\" ถูกนำออกจากรายการเฝ้าดูของคุณ",
        "watch": "เฝ้าดู",
        "watchthispage": "เฝ้าดูหน้านี้",
        "unwatch": "เลิกเฝ้าดู",
        "movereason": "เหตุผล:",
        "revertmove": "ย้อน",
        "delete_and_move": "ลบและย้าย",
-       "delete_and_move_text": "== ต้องการลบ ==\n\nมีหน้าปลายทาง \"[[:$1]]\" แล้ว คุณต้องการลบหน้านั้นหรือไม่เพื่อดำเนินการต่อ",
+       "delete_and_move_text": "== ต้องการลบ ==\nมีหน้าปลายทาง \"[[:$1]]\" แล้ว คุณต้องการลบหน้าดังกล่าวเพื่อสร้างหนทางที่จะย้ายหรือไม่?",
        "delete_and_move_confirm": "ใช่ ต้องการจะลบและย้าย",
        "delete_and_move_reason": "ลบเพื่อสร้างหนทางที่จะย้ายจาก \"[[$1]]\"",
        "selfmove": "ชื่อหน้าต้นทางและปลายทางเป็นชื่อเดียวกัน ไม่สามารถเปลี่ยนชื่อได้มาใช้ชื่อเดิมได้",
        "importunknownsource": "ไม่ทราบชนิดของไฟล์นำเข้า",
        "importcantopen": "ไม่สามารถเปิดไฟล์นำเข้าได้",
        "importbadinterwiki": "ลิงก์ข้ามภาษาเสีย",
-       "importsuccess": "à¸\99ำà¹\80à¸\82à¹\89าà¹\84à¸\9fลà¹\8cสำà¹\80รà¹\87à¸\88!",
+       "importsuccess": "นำเข้าสำเร็จ!",
        "importnosources": "ไม่มีการกำหนดแหล่งนำเข้าข้ามวิกิ และการอัปโหลดประวัติหน้าโดยตรงถูกปิดการใช้งาน",
        "importnofile": "ไฟล์นำเข้าไม่ได้ถูกอัปโหลด",
        "importuploaderrorsize": "อัปโหลดไฟล์ข้อมูลนำเข้าไม่สำเร็จ\nขนาดไฟล์ใหญ่เกินกว่าที่อนุญาตไว้",
        "tooltip-preferences-save": "บันทึกการตั้งค่า",
        "tooltip-summary": "ใส่คำอธิบายอย่างย่อสั้น ๆ",
        "common.css": "/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ทุกสกิน */",
-       "monobook.css": "/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินโมโนบุ๊ก */",
-       "vector.css": "/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินเวกเตอร์ */",
        "print.css": "/* สไตล์ชีตในหน้านี้จะส่งผลแก่ข้อมูลส่งออกเป็นสิ่งพิมพ์ */",
        "noscript.css": "/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ปิดการใช้งานจาวาสคริปต์ */",
        "group-autoconfirmed.css": "/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ทั่วไปเท่านั้น */",
        "group-sysop.css": "/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ดูแลเท่านั้น */",
        "group-bureaucrat.css": "/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ดูแลสิทธิแต่งตั้งเท่านั้น */",
        "common.js": "/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ทุกคนในทุกหน้า */",
-       "monobook.js": "/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินโมโนบุ๊ก */",
-       "vector.js": "/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินเวกเตอร์ */",
        "group-autoconfirmed.js": "/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ทั่วไปเท่านั้น */",
        "group-bot.js": "/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่บอตเท่านั้น */",
        "group-sysop.js": "/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ดูแลเท่านั้น */",
        "pageinfo-category-pages": "จำนวนหน้า",
        "pageinfo-category-subcats": "จำนวนหมวดหมู่ย่อย",
        "pageinfo-category-files": "จำนวนไฟล์",
-       "skinname-monobook": "โมโนบุ๊ก",
-       "skinname-vector": "เวกเตอร์",
        "markaspatrolleddiff": "ทำเครื่องหมายว่าตรวจสอบแล้ว",
        "markaspatrolledtext": "ทำเครื่องหมายว่าหน้านี้ถูกตรวจสอบแล้ว",
        "markedaspatrolled": "ตรวจสอบแล้ว",
        "watchlistedit-raw-done": "รายการเฝ้าดูของคุณได้ปรับแล้ว",
        "watchlistedit-raw-added": "$1 ชื่อเรื่องได้ถูกเพิ่มเข้าไป:",
        "watchlistedit-raw-removed": "$1 ชื่อเรื่องได้ถูกนำออกไป:",
+       "watchlistedit-clear-legend": "ล้างรายการเฝ้าดู",
+       "watchlisttools-clear": "ล้างรายการเฝ้าดู",
        "watchlisttools-view": "ดูการเปลี่ยนแปลงที่เกี่ยวข้อง",
        "watchlisttools-edit": "ดูและแก้ไขรายการเฝ้าดู",
        "watchlisttools-raw": "แก้ไขรายการเฝ้าดูทั้งหมด",
index 395ba26..9e092e7 100644 (file)
        "qbmyoptions": "Mga pahina ko",
        "faq": "Mga karaniwang itinatanong (''FAQ'')",
        "faqpage": "Project:Mga karaniwang itinatanong (''FAQ'')",
-       "vector-action-addsection": "Magdagdag ng paksa",
-       "vector-action-delete": "Burahin",
-       "vector-action-move": "Ilipat",
-       "vector-action-protect": "Ipagsanggalang",
-       "vector-action-undelete": "Alisin ang pagbubura",
-       "vector-action-unprotect": "Baguhin ang pagsasanggalang",
-       "vector-view-create": "Likhain",
-       "vector-view-edit": "Baguhin",
-       "vector-view-history": "Tingnan ang kasaysayan",
-       "vector-view-view": "Basahin",
-       "vector-view-viewsource": "Tingnan ang pinagmulan",
        "actions": "Mga kilos",
        "namespaces": "Mga ngalan-espasyo",
        "variants": "Naiiba pa",
        "yourpassword": "Password:",
        "userlogin-yourpassword": "Password",
        "userlogin-yourpassword-ph": "Ipasok ang iyong password",
-       "createacct-yourpassword-ph": "Ilagay ang hudyat (password)",
+       "createacct-yourpassword-ph": "Ilagay ang password",
        "yourpasswordagain": "Password mo uli:",
-       "createacct-yourpasswordagain": "Tiyakin ang hudyat",
-       "createacct-yourpasswordagain-ph": "Muling ilagay ang hudyat (password)",
+       "createacct-yourpasswordagain": "Tiyakin ang password",
+       "createacct-yourpasswordagain-ph": "Muling ilagay ang password",
        "remembermypassword": "Tandaan ang paglagda ko sa kompyuter na ito (pinakamarami na ang $1 {{PLURAL:$1|araw|mga araw}})",
        "userlogin-remembermypassword": "Panatilihin akong naka-login",
        "userlogin-signwithsecure": "Gumamit ng ligtas na koneksyon",
        "noemail": "Walang nakatalang adres ng e-liham para sa tagagamit na \"$1\".",
        "noemailcreate": "Kailangan mong magbigay ng may-bisang direksiyong e-liham",
        "passwordsent": "Isang bagong password ang ipinadala sa email address na nakatala para kay \"$1\".\nPaki login muli pagkaraan mong matanggap ito.",
-       "blocked-mailpassword": "Hinarangan sa paggawa ng mga pagbabago ang iyong adres ng IP, at kaya hindi rin pinapahintulutang gumamit ng tungkuling makabawi ng hudyat para maiwasan ang pangaabuso.",
+       "blocked-mailpassword": "Hinarangan sa paggawa ng mga pagbabago ang iyong IP address, at kaya hindi rin pinapahintulutang gumamit ng tungkuling makabawi ng password para maiwasan ang pang-aabuso.",
        "eauthentsent": "Nagpadala ng isang email na pangkompirmasyon doon sa tinukoy na email address.\nBago magpadala ng iba email sa account, kailangan mong sundin ang mga tagubiling nasa loob ng email, para mapatunayang iyo talaga ang account.",
        "throttled-mailpassword": "Nagpadala na ng isang paalalang pang-password, nitong huling {{PLURAL:$1|oras|$1 oras}}.\nPara maiwasin ang pangaabuso, isang paalalang pang-password lamang ang ipapadala bawat {{PLURAL:$1|oras|$1 oras}}.",
        "mailerror": "Kamalian sa pagpapadala ng liham: $1",
        "passwordreset-username": "Pangalan ng tagagamit:",
        "passwordreset-domain": "Nasasakupan:",
        "passwordreset-capture": "Tingnan ang lumabas na e-liham?",
-       "passwordreset-capture-help": "Kapag tsetsekan mo ang kahong ito, ang e-liham (may pansamantalang hudyat) ay ipapakita sa iyo at ipapadala rin sa tagagamit.",
+       "passwordreset-capture-help": "Kapag tsetsekan mo ang kahong ito, ang email (may pansamantalang password) ay ipapakita sa iyo at ipapadala rin sa tagagamit.",
        "passwordreset-email": "Direksiyong e-liham:",
        "passwordreset-emailtitle": "Mga detalye ng account sa {{SITENAME}}",
        "passwordreset-emailtext-ip": "Isang tao (marahil ay ikaw, mula sa IP address na $1) ang humiling ng isang paalala sa iyong mga detalye ng account para sa {{SITENAME}} ($4). Ang sumusunod na {{PLURAL:$3|account ng tagagamit ay|mga account ng tagagamit ay}} may kaugnayan sa email address na ito:\n\n$2\n\n{{PLURAL:$3|Ang pansamantalang password na ito|Ang mga pansamantalang password na ito}} ay mawawalan ng bisa sa loob ng {{PLURAL:$5|isang araw|$5 araw}}.\nDapat kang mag-login at pumili ng isang bagong password ngayon. Kung ibang tao ang gumawa ng kahilingang ito, o kung naalala mo na ang orihinal mong password, at hindi mo na nais palitan ito, maaari mong huwag nang pansinin ang mensaheng ito at magpatuloy sa paggamit ng luma mong password.",
        "passwordreset-emailerror-capture": "Nalikha na ang isang e-liham na paalala, na ipinapakita sa ibaba, subalit nabigo ang pagpapadala sa tagagamit: $1",
        "changeemail": "Baguhin ang direksiyong e-liham",
        "changeemail-header": "Baguhin ang email address ng account",
-       "changeemail-text": "Kumpletuhin ang pormularyong ito upang mabago ang tirahan na para sa e-liham mo. Kakailanganin mong ipasok ang iyong hudyat upang tiyakin ang pagbabagong ito.",
+       "changeemail-text": "Kumpletuhin ang form na ito upang mabago ang email address. Kakailanganin mong ipasok ang iyong password upang tiyakin ang pagbabagong ito.",
        "changeemail-no-info": "Kailangan mong lumagda upang tuwirang mapuntahan ang pahinang ito.",
        "changeemail-oldemail": "Kasalukuyang direksiyong e-liham:",
        "changeemail-newemail": "Bagong direksiyong e-liham:",
        "loginreqlink": "lumagda/tumala",
        "loginreqpagetext": "Kailangan mong $1 para matanaw ang ibang mga pahina.",
        "accmailtitle": "Ipinadala na ang password.",
-       "accmailtext": "Ipinadala na sa $2 ang isang hudyat na nilikha ng pagkakataon para kay [[User talk:$1|$1]].  Maaari itong baguhin sa pahinang ''[[Special:ChangePassword|palitan ng hudyat]]'' kapag lumagdang papasok.",
+       "accmailtext": "Ipinadala na sa $2 ang isang password na nilikha ng pagkakataon para kay [[User talk:$1|$1]].  Maaari itong baguhin sa pahinang ''[[Special:ChangePassword|palitan ang password]]'' kapag nag-login.",
        "newarticle": "(Bago)",
        "newarticletext": "Sinundan mo ang isang kawing para sa isang pahinang hindi pa umiiral.\nPara likhain ang pahina, magsimulang magmakinilya sa loob ng kahong nasa ibaba (tingnan ang [$1 pahina ng tulong] para sa mas maraming kabatiran).\nKung napunta ka rito dahil sa pagkakamali, pakipindot ang pinduntang '''balik''' ('''''back''''') ng iyong pantingin-tingin (''browser'').",
        "anontalkpagetext": "Ito ang pahinang usapan para sa isang hindi nakikilalang tagagamit na hindi pa lumilikha ng account, o kaya hindi ito ginagamit.\nKaya't kinailangan naming gamitin ang may bilang na IP address para makilala siya.\nMaaaring pagsaluhan ng ilang mga tagagamit ang ganiyang  IP address.\nKung isa kang hindi nagpapakilalang tagagamit at nakadaramang may mga walang saysay na komentong patungkol sa iyo, [[Special:UserLogin/signup|pakilikha ng isang account]] o [[Special:UserLogin|lumagda]] para maiwasan ang kalituhan o mapagkamalan ka bilang ibang hindi nakikilalang mga tagagamit sa hinaharap.",
        "difference-missing-revision": "Hindi natagpuan ang {{PLURAL:$2|isang rebisyon|$2 mga rebisyon}} ng kaibahang ($1) ito.\n\nKaraniwang itong isinanhi ng pagsunod sa isang wala na sa panahong kawing sa pagkakaiba na papunta sa isang pahinang nabura na.\nMatatagpuan ang mga detalye sa loob ng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} talaan ng pagbura].",
        "searchresults": "Kinalabasan/Resulta ng paghahanap",
        "searchresults-title": "Resulta ng paghahanap para sa \"$1\"",
-       "toomanymatches": "Napakaraming mga tumutugmang ibinalik, pakisubok ang isang ibang tanong",
        "titlematches": "Tumutugma ang pamagat ng pahina",
        "textmatches": "Tumutugma ang teksto ng pahina",
        "notextmatches": "Walang katugmang pahina ng teksto",
        "search-interwiki-default": "$1 mga resulta:",
        "search-interwiki-more": "(mas marami pa)",
        "search-relatedarticle": "Kaugnay",
-       "searcheverything-enable": "Maghanap sa lahat ng ngalan-espasyo:",
        "searchrelated": "kaugnay",
        "searchall": "lahat",
        "showingresults": "Ipinapakita sa ibaba ang magpahanggang sa {{PLURAL:$1|'''1''' resultang|'''$1''' mga resultang}} nagsisimula sa #'''$2'''.",
        "powersearch-togglelabel": "Suriin:",
        "powersearch-toggleall": "Lahat",
        "powersearch-togglenone": "Wala",
+       "powersearch-remember": "Tandaan ang piniling ito para sa mga paghahanap sa hinaharap",
        "search-external": "Panlabas na paghahanap",
        "searchdisabled": "Nakapatay ang paghahanap sa {{SITENAME}}. Maaari kang pansamantalang maghanap sa pamamagitan ng Google. Tandaan na maaaring luma na ang kanilang mga indeks sa nilalaman ng {{SITENAME}}.",
        "preferences": "Mga kagustuhan",
        "allowemail": "Pahintulutan ang e-liham mula sa ibang mga tagagamit",
        "prefs-searchoptions": "Paghahanap",
        "prefs-namespaces": "Mga espasyo ng pangalan",
-       "defaultns": "O kaya maghanap sa mga pangalan ng espasyong ito:",
        "default": "Likas na pagtatakda",
        "prefs-files": "Mga talaksan",
        "prefs-custom-css": "Pasadyang CSS",
        "recentchanges-legend-newpage": "$1 - bagong pahina",
        "rcnotefrom": "Nasa ibaba ang mga pagbabago mula pa noong '''$2''' (ipinapakita ang magpahanggang sa '''$1''').",
        "rclistfrom": "Ipakita ang bagong mga pagbabago simula sa $3 $2",
-       "rcshowhideminor": "$1 maliliit na mga pagbabago",
+       "rcshowhideminor": "$1 ang mga maliliit na pagbabago",
        "rcshowhideminor-show": "Ipakita",
        "rcshowhideminor-hide": "Itago",
-       "rcshowhidebots": "$1 mga ''bot''",
+       "rcshowhidebots": "$1 ang mga bot",
        "rcshowhidebots-show": "Ipakita",
        "rcshowhidebots-hide": "Itago",
-       "rcshowhideliu": "$1 nakatalang mga tagagamit",
+       "rcshowhideliu": "$1 ang mga nakatalang tagagamit",
        "rcshowhideliu-show": "Ipakita",
        "rcshowhideliu-hide": "Itago",
-       "rcshowhideanons": "$1 hindi kilalang mga tagagamit",
+       "rcshowhideanons": "$1 ang mga 'di-kilalang tagagamit",
        "rcshowhideanons-show": "Ipakita",
        "rcshowhideanons-hide": "Itago",
-       "rcshowhidepatr": "$1 napatrolyang mga pagbabago",
+       "rcshowhidepatr": "$1 ang mga pagbabagong nakapatrolya",
        "rcshowhidepatr-show": "Ipakita",
        "rcshowhidepatr-hide": "Itago",
-       "rcshowhidemine": "$1 mga pagbabago ko",
+       "rcshowhidemine": "$1 ang mga pagbabago ko",
        "rcshowhidemine-show": "Ipakita",
        "rcshowhidemine-hide": "Itago",
        "rclinks": "Ipakita ang huling $1 mga pagbabago sa loob ng huling $2 mga araw<br />$3",
        "tooltip-preferences-save": "Sagipin ang mga nais",
        "tooltip-summary": "Magbigay ng maikling buod",
        "common.css": "/* Ang inilagay na CSS dito ay gagamitin para sa lahat ng mga pabalat */",
-       "monobook.css": "/* Ang CSS na inilagay dito ay makakaapekto sa mga tagagamit ng pabalat na Monobook */",
-       "vector.css": "/* Ang inilagay na CSS dito ay makakaapekto sa mga tagagamit ng pabalat na Vector */",
        "print.css": "/* Ang CSS na inilagay dito ay makakaapekto sa kalalabasan o resulta ng paglilimbag */",
        "noscript.css": "/* Ang inilagay na Cascading Style Sheets dito ay makakaapekto sa mga tagagamit na hindi nagpapagana ng JavaScript */",
        "group-autoconfirmed.css": "/* Ang inilagay na Mga Pilas ng Estilong Lumalagaslas (Cascading Style Sheets o CSS) dito ay makakaapekto lamang sa mga tagagamit na kusang natiyak */",
        "group-sysop.css": "/* Ang inilagay na Mga Pilas ng Estilong Lumalagaslas (Cascading Style Sheets) dito ay makakaapekto lamang sa mga tagapagpaandar ng sistema */",
        "group-bureaucrat.css": "/* Ang inilagay na Mga Pilas ng Estilong Lumalagaslas (Cascading Style Sheets o CSS) dito ay makakaapekto lamang sa mga burokrata */",
        "common.js": "/* Ang anumang JavaScript dito ay ikakarga para sa lahat ng mga tagagamit ng bawat pahinang ikinarga. */",
-       "monobook.js": "/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na gumagamit ng pabalat na MonoBook */",
-       "vector.js": "/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na gumagamit ng pabalat na Vector */",
        "group-autoconfirmed.js": "/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na kusang natiyak lamang */",
        "group-bot.js": "/* Ang anumang JavaScript dito ay ikakarga para sa mga bot lamang */",
        "group-sysop.js": "/* Ang anumang JavaScript dito ay ikakarga para sa mga tagapagpaandar ng sistema lamang */",
        "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)",
-       "skinname-monobook": "MonoBook",
-       "skinname-vector": "Vector",
        "markaspatrolleddiff": "Tatakan bilang napatrolya na",
        "markaspatrolledtext": "Tatakan ang pahinang ito bilang napatrolya na",
        "markedaspatrolled": "Tatakan bilang napatrolya na",
index 8df60af..63b80e9 100644 (file)
@@ -58,7 +58,9 @@
                        "Vito Genovese",
                        "Vugar 1981",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Arystanbek",
+                       "Sayginer"
                ]
        },
        "tog-underline": "Bağlantıların altını çiz:",
        "qbmyoptions": "Sayfalarım",
        "faq": "SSS",
        "faqpage": "Project:SSS",
-       "vector-action-addsection": "Konu ekle",
-       "vector-action-delete": "Sil",
-       "vector-action-move": "Taşı",
-       "vector-action-protect": "Koru",
-       "vector-action-undelete": "Silinmeyi geri al",
-       "vector-action-unprotect": "Korumayı değiştir",
-       "vector-view-create": "Oluştur",
-       "vector-view-edit": "Düzenle",
-       "vector-view-history": "Geçmişi gör",
-       "vector-view-view": "Oku",
-       "vector-view-viewsource": "Kaynağı gör",
        "actions": "Eylemler",
        "namespaces": "Ad alanları",
        "variants": "Türevler",
        "jumptonavigation": "kullan",
        "jumptosearch": "ara",
        "view-pool-error": "Üzgünüz, sunucular şu anda aşırı yüklendi.\nBirçok kullanıcı bu sayfayı görüntülemeye çalışıyor.\nLütfen bu sayfaya  tekrar erişmeyi denemeden önce biraz bekleyin.\n\n$1",
+       "generic-pool-error": "Üzgünüz, sunucular şu anda aşırı yüklendi.\nBirçok kullanıcı bu sayfayı görüntülemeye çalışıyor.\nLütfen bu sayfaya  tekrar erişmeyi denemeden önce biraz bekleyin.\n\n$1",
        "pool-timeout": "Kilit için zaman bitimi bekleniyor",
        "pool-queuefull": "Havuz sırası dolu",
        "pool-errorunknown": "Bilinmeyen hata",
        "difference-missing-revision": "Bu farkın {{PLURAL:$2|bir revizyonu|$2 revizyonu}} ($1) {{PLURAL:$2|bulunamadı|bulunamadı}}.\n\nBu genellikle, silinen bir sayfaya olan eski tarihli bir fark sayfasına bağlantılardan dolayı olur.\nAyrıntılar [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} silme günlüğünde] bulunabilir.",
        "searchresults": "Arama sonuçları",
        "searchresults-title": "\"$1\" için arama sonuçları",
-       "toomanymatches": "Çok fazla eşleşme döndü, lütfen başka bir sorgu seçin",
        "titlematches": "Madde adı eşleşiyor",
        "textmatches": "Sayfa metni eşleşiyor",
        "notextmatches": "Hiçbir sayfada bulunamadı",
        "searchmenu-exists": "'''Bu vikide \"[[:$1]]\" adında bir sayfa mevcut'''",
        "searchmenu-new": "<strong>Bu vikide \"[[:$1]]\" sayfasını oluştur!</strong> {{PLURAL:$2|0=|Ayrıca aramınızda bulunan sayfayı görün.|Ayrıca bulunan arama sonuçlarını görün.}}",
        "searchprofile-articles": "İçerik sayfaları",
-       "searchprofile-project": "Yardım ve proje sayfaları",
        "searchprofile-images": "Çokluortam",
        "searchprofile-everything": "Her şey",
        "searchprofile-advanced": "Gelişmiş",
        "searchprofile-articles-tooltip": "$1 içinde ara",
-       "searchprofile-project-tooltip": "$1 içinde ara",
        "searchprofile-images-tooltip": "Dosya ara",
        "searchprofile-everything-tooltip": "Tüm içerikte ara (tartışma sayfaları dahil)",
        "searchprofile-advanced-tooltip": "Özel ad alanlarında ara",
        "search-interwiki-default": "$1 sonuçlar:",
        "search-interwiki-more": "(daha çok)",
        "search-relatedarticle": "ilgili",
-       "searcheverything-enable": "Tüm ad alanlarında ara",
        "searchrelated": "ilgili",
        "searchall": "hepsi",
        "showingresults": "$2. sonuçtan başlayarak {{PLURAL:$1|'''1''' sonuç |'''$1''' sonuç }} aşağıdadır:",
        "powersearch-togglelabel": "Seç:",
        "powersearch-toggleall": "Hepsi",
        "powersearch-togglenone": "Hiçbiri",
+       "powersearch-remember": "Gelecek aramalarda seçimi hatırla",
        "search-external": "Dış arama",
        "searchdisabled": "{{SITENAME}} sitesinde arama yapma geçici olarak durdurulmuştur. Bu arada Google kullanarak {{SITENAME}} içinde arama yapabilirsiniz. Arama sitelerinde dizinlerin biraz eski kalmış olabileceğini göz önünde bulundurunuz.",
        "search-error": "Arama yapılırken bir hata oluştu: $1",
        "allowemail": "Diğer kullanıcılar bana e-posta atabilsin",
        "prefs-searchoptions": "Arama",
        "prefs-namespaces": "İsim alanları",
-       "defaultns": "Aksi halde bu ad alanlarında ara:",
        "default": "varsayılan",
        "prefs-files": "Dosyalar",
        "prefs-custom-css": "Özel CSS",
        "right-move": "Sayfaları taşı",
        "right-move-subpages": "Sayfaları altsayfalarıyla beraber taşı",
        "right-move-rootuserpages": "Kök kullanıcı sayfalarını taşı",
+       "right-move-categorypages": "Kategori sayfaları taşı",
        "right-movefile": "Dosyaları taşı",
        "right-suppressredirect": "Bir sayfayı taşırken eski isimden yönlendirme oluşturma",
        "right-upload": "Dosyaları yükle",
        "action-createpage": "sayfa oluşturmaya",
        "action-createtalk": "tartışma sayfası oluşturmaya",
        "action-createaccount": "bu kullanıcı hesabını oluşturmaya",
+       "action-history": "sayfa geçmişini görüntüle",
        "action-minoredit": "bu değişikliği küçük olarak işaretlemeye",
        "action-move": "bu sayfayı taşımaya",
        "action-move-subpages": "bu sayfayı ve altsayfalarını taşımaya",
        "action-move-rootuserpages": "kök kullanıcı sayfalarını taşımaya",
+       "action-move-categorypages": "kategori sayfalarını taşı",
        "action-movefile": "bu dosyayı taşımaya",
        "action-upload": "bu dosyayı yüklemeye",
        "action-reupload": "bu mevcut dosyanın üzerine yazmaya",
        "recentchanges-label-unpatrolled": "Bu değişiklik henüz gözlenmemiş",
        "recentchanges-label-plusminus": "Sayfa boyutundaki değişikliğin bayt bazında değeri",
        "recentchanges-legend-heading": "'''Gösterge:'''",
-       "recentchanges-legend-newpage": "(ayrıca bakınız [[Special:NewPages|yeni sayfalar listesi]])",
-       "rcnotefrom": "'''$2''' tarihinden itibaren yapılan değişiklikler aşağıdadır (en fazla <b>$1</b> tanesi gösterilmektedir).",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ayrıca bakınız [[Special:NewPages|yeni sayfalar listesi]])",
+       "rcnotefrom": "<strong>$2</strong> tarihinden itibaren yapılan değişiklikler aşağıdadır (en fazla <strong>$1</strong> tanesi gösterilmektedir).",
        "rclistfrom": "$3 $2 tarihinden itibaren yeni değişiklikleri göster",
        "rcshowhideminor": "Küçük değişiklikleri $1",
        "rcshowhideminor-show": "Göster",
-       "rcshowhideminor-hide": "Gizle",
+       "rcshowhideminor-hide": "gizle",
        "rcshowhidebots": "botları $1",
-       "rcshowhidebots-show": "Göster",
-       "rcshowhidebots-hide": "Gizle",
+       "rcshowhidebots-show": "göster",
+       "rcshowhidebots-hide": "gizle",
        "rcshowhideliu": "Kayıtlı kullanıcıları $1",
        "rcshowhideliu-show": "göster",
        "rcshowhideliu-hide": "gizle",
        "rcshowhideanons": "Anonim kullanıcıları $1",
        "rcshowhideanons-show": "Göster",
-       "rcshowhideanons-hide": "Gizle",
+       "rcshowhideanons-hide": "gizle",
        "rcshowhidepatr": "İzlenmiş değişiklikleri $1",
        "rcshowhidepatr-show": "Göster",
        "rcshowhidepatr-hide": "Gizle",
        "rcshowhidemine": "Değişikliklerimi $1",
        "rcshowhidemine-show": "Göster",
-       "rcshowhidemine-hide": "Gizle",
+       "rcshowhidemine-hide": "gizle",
        "rclinks": "Son $2 günde yapılan son $1 değişikliği göster;<br /> $3",
        "diff": "fark",
        "hist": "geçmiş",
        "largefileserver": "Bu dosyanın uzunluğu sunucuda izin verilenden daha büyüktür.",
        "emptyfile": "Yüklediğiniz dosya boş görünüyor. Bunun sebebi dosya adındaki bir yazım hatası olabilir. Lütfen dosyayı gerçekten yüklemek isteyip istemediğinizden emin olun.",
        "windows-nonascii-filename": "Bu viki dosya isimlerinde özel karakter kullanımını desteklemiyor",
-       "fileexists": "Bu isimde bir dosya mevcut.\nEğer değiştirmekten emin değilseniz ilk önce <strong>[[:$1]]</strong> dosyasına bir gözatın.\n[[$1|thumb]]",
+       "fileexists": "Bu isimde bir dosya mevcut; eğer değiştirmekten emin değilseniz ilk önce <strong>[[:$1]]</strong> dosyasına bir göz atın.\n[[$1|thumb]]",
        "filepageexists": "Bu dosya için açıklama sayfası <strong>[[:$1]]</strong> adresinde zaten oluşturulmuş, fakat bu isimde bir dosya şu anda mevcut değil.\nGireceğiniz özet açıklama sayfasında görünmeyecektir.\nÖzetinizin orada görünmesi için, bunu elle değiştirmelisiniz.\n[[$1|küçük resim]]",
        "fileexists-extension": "Benzer isimle başka bir dosya mevcut: [[$2|thumb]]\n* Yüklenilen dosyanın adı: <strong>[[:$1]]</strong>\n* Varolan dosyanın adı: <strong>[[:$2]]</strong>\nLütfen başka bir isim seçin",
        "fileexists-thumbnail-yes": "Bu dosya, bir resmi küçültülmüş sürümü gibi görünüyor ''(thumbnail)''. [[$1|thumb]]\nLütfen <strong>[[:$1]]</strong> dosyasını kontrol edin .\nEğer kontrol edilen dosya ile özgün boyutundaki aynı dosyaysa fazladan küçük resim yüklemeye gerek yoktur.",
        "deadendpagestext": "Aşağıdaki sayfalar, {{SITENAME}} sitesinde diğer sayfalara bağlantı vermiyor.",
        "protectedpages": "Koruma altındaki sayfalar",
        "protectedpages-indef": "Sadece süresiz korumalar",
-       "protectedpages-summary": "Bu sayfa şu anda koruma altında olan mevcut sayfaları listeler. Oluşturulması korunan başlıkların bir listesi için [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]] sayfasına bakın.",
+       "protectedpages-summary": "Bu sayfa şu anda koruma altında olan mevcut sayfaları listeler. Oluşturulması korunan başlıkların listesi için [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]] sayfasına bakın.",
        "protectedpages-cascade": "Sadece ardışık korumalar",
        "protectedpages-noredirect": "Yönlendirmeleri gizle",
        "protectedpagesempty": "Şu anda, bu parametrelerle korunan hiç bir sayfa yok.",
        "protectedpages-unknown-timestamp": "Bilinmiyor",
        "protectedpages-unknown-performer": "Bilinmeyen kullanıcı",
        "protectedtitles": "Korunan başlıklar",
-       "protectedtitles-summary": "Bu sayfa şu anda oluşturulması korunan başlıkları listeler. Koruma altında olan mevcut sayfaların bir listesi için [[{{#special:ProtectedPages}}|{{int:protectedpages}}]] sayfasına bakın.",
+       "protectedtitles-summary": "Bu sayfa şu anda oluşturulması korunan başlıkları listeler. Koruma altında olan mevcut sayfaların listesi için [[{{#special:ProtectedPages}}|{{int:protectedpages}}]] sayfasına bakın.",
        "protectedtitlesempty": "Şu anda, bu parametrelerle korunan hiç bir başlık yok.",
        "listusers": "Kullanıcı listesi",
        "listusers-editsonly": "Sadece değişiklik yapan kullanıcıları göster",
        "listgrouprights-removegroup-self": "Kendi hesabından {{PLURAL:$2|grup|grupları}} çıkarabilir: $1",
        "listgrouprights-addgroup-self-all": "Kendi hesabına tüm grupları ekleyebilir",
        "listgrouprights-removegroup-self-all": "Kendi hesabından tüm grupları çıkarabilir",
+       "trackingcategories-nodesc": "Açıklama yok.",
        "mailnologin": "Gönderi adresi yok.",
        "mailnologintext": "Diğer kullanıcılara e-posta gönderebilmeniz için [[Special:UserLogin|oturum aç]]malısınız ve [[Special:Preferences|tercihler]] sayfasında geçerli bir e-posta adresiniz olmalı.",
        "emailuser": "Bu kullanıcıya e-posta gönder",
        "watchnologin": "Oturum açık değil.",
        "addwatch": "İzleme listesine ekle",
        "addedwatchtext": "\"[[:$1]]\" sayfası [[Special:Watchlist|izleme listenize]] eklenmiştir.\nBundan sonra, bu sayfaya ve ilgili tartışma sayfasına yapılacak değişiklikler burada listelenecek.",
+       "addedwatchtext-short": "\"$1\" sayfası izleme listenize eklendi.",
        "removewatch": "İzleme listesinden kaldır",
        "removedwatchtext": "\"[[:$1]]\" sayfası [[Special:Watchlist|izleme listenizden]] silinmiştir.",
+       "removedwatchtext-short": "\"$1\" sayfası izleme listenizden çıkarıldı.",
        "watch": "izle",
        "watchthispage": "Sayfayı izle",
        "unwatch": "İzleme",
        "delete-edit-reasonlist": "Silme nedenlerini değiştir",
        "delete-toobig": "Bu sayfa, $1 {{PLURAL:$1|tane değişiklik|tane değişiklik}} ile çok uzun bir geçmişe sahiptir.\nBöyle sayfaların silinmesi, {{SITENAME}} sitesini bozmamak için sınırlanmaktadır.",
        "delete-warning-toobig": "Bu sayfanın büyük bir değişiklik geçmişi var, $1 {{PLURAL:$1|revizyonun|revizyonun}} üzerinde.\nBunu silmek {{SITENAME}} işlemlerini aksatabilir;\ndikkatle devam edin.",
-       "deleting-backlinks-warning": "'''Uyarı:''' Silmek üzere olduğunuz sayfaya başka sayfalardan bağlantıları var veya sayfanın bazı bölümleri başka sayfalar tarafından alıntı olarak kullanılıyor.",
+       "deleting-backlinks-warning": "'''Uyarı:''' Silmek üzere olduğunuz sayfaya [[Özel:SayfayaBağlantılar/{{FULLPAGENAME}}|başka sayfalardan]] bağlantılar var veya sayfanın bazı bölümleri başka sayfalar tarafından alıntı olarak kullanılıyor.",
        "rollback": "değişiklikleri geri al",
        "rollback_short": "geri al",
        "rollbacklink": "geri döndür",
        "contributions-title": "$1 için kullanıcı katkıları",
        "mycontris": "Katkılar",
        "contribsub2": "{{GENDER:$3|$1}} ($2) tarafından",
+       "contributions-userdoesnotexist": "\"$1\" kullanıcı hesabı kayıtlı değil.",
        "nocontribs": "Bu kriterlere uyan değişiklik bulunamadı",
        "uctop": "(son)",
        "month": "Ay:",
        "movenotallowedfile": "Sayfaları taşımaya izniniz yok.",
        "cant-move-user-page": "Kullanıcı sayfalarını taşımaya izniniz yok (altsayfalardan başka).",
        "cant-move-to-user-page": "Bir sayfayı, bir kullanıcı sayfasına taşımaya izniniz yok (bir kullanıcı altsayfası dışında).",
+       "cant-move-to-category-page": "Bir sayfayı, bir kategoriye taşımaya izniniz yok.",
        "newtitle": "Yeni isim",
        "move-watch": "Bu sayfayı izle",
        "movepagebtn": "İsmi değiştir",
        "tooltip-preferences-save": "Tercihleri kaydet",
        "tooltip-summary": "Kısa bir özet girin",
        "common.css": "/* Buraya konulacak CSS kodu tüm temalarda etkin olur */",
-       "monobook.css": "/* Buraya konulacak CSS kodu tüm Monobook teması kullanan tüm kullanıcılarda etkin olur */",
        "common.js": "/* Buraya konulacak JavaScript kodu sitedeki her kullanıcı için her sayfa yüklendiğinde çalışacaktır */",
        "anonymous": "{{SITENAME}} sitesinin anonim {{PLURAL:$1|kullanıcısı|kullanıcıları}}",
        "siteuser": "{{SITENAME}} kullanıcısı $1",
        "pageinfo-category-pages": "Sayfa sayısı",
        "pageinfo-category-subcats": "Alt kategori sayısı",
        "pageinfo-category-files": "Dosya sayısı",
-       "skinname-modern": "Modern",
        "markaspatrolleddiff": "Kontrol edilmiş olarak işaretle",
        "markaspatrolledtext": "Kontrol edilmiş olarak işaretle",
        "markedaspatrolled": "Kontrol edildi",
        "newimages-summary": "Bu özel sayfa, en son yüklenen dosyaları göstermektedir.",
        "newimages-legend": "Filtre",
        "newimages-label": "Dosya adı (ya da bir parçası):",
+       "newimages-showbots": "Bot yüklemelerini göster",
        "noimages": "Görecek bir şey yok.",
        "ilsubmit": "Ara",
        "bydate": "kronolojik sırayla",
        "watchlistedit-raw-done": "İzleme listeniz güncellendi.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 başlık|$1 başlık}} eklendi:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 başlık|$1 başlık}} silindi:",
+       "watchlistedit-clear-legend": "İzleme listesini temizle",
+       "watchlistedit-clear-explain": "İzleme listenizdeki tüm başlıklar silinecek",
+       "watchlistedit-clear-titles": "Başlıklar:",
+       "watchlistedit-clear-submit": "İzleme listesini temizle (Geri alınamaz!)",
+       "watchlistedit-clear-done": "İzleme listeniz temizlendi.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 başlık|$1 başlık}} silindi:",
+       "watchlisttools-clear": "İzleme listesini temizle",
        "watchlisttools-view": "İlgili değişiklikleri göster",
        "watchlisttools-edit": "İzleme listesini gör ve düzenle",
        "watchlisttools-raw": "Ham izleme listesini düzenle",
        "htmlform-no": "Hayır",
        "htmlform-yes": "Evet",
        "htmlform-chosen-placeholder": "Bir seçenek seçin",
+       "htmlform-cloner-delete": "Sil",
+       "htmlform-cloner-required": "En az bir değer gereklidir.",
        "sqlite-has-fts": "$1 tam-metin arama desteği ile",
        "sqlite-no-fts": "$1 tam-metin arama desteği olmaksızın",
        "logentry-delete-delete": "$1 $3 sayfasını {{GENDER:$2|sildi}}",
index 3812afb..de90e5a 100644 (file)
        "qbmyoptions": "Битләрем",
        "faq": "ЕБС",
        "faqpage": "Project:ЕБС",
-       "vector-action-addsection": "Яңа тема өстәү",
-       "vector-action-delete": "Бетерү",
-       "vector-action-move": "Күчерү",
-       "vector-action-protect": "Яклау",
-       "vector-action-undelete": "Кайтару",
-       "vector-action-unprotect": "Яклауны үзгәртү",
-       "vector-view-create": "Төзү",
-       "vector-view-edit": "Үзгәртү",
-       "vector-view-history": "Тарихын карау",
-       "vector-view-view": "Уку",
-       "vector-view-viewsource": "Чыганагын карау",
        "actions": "Хәрәкәт",
        "namespaces": "Исемнәр мәйданы",
        "variants": "Төрләр",
        "searchmenu-exists": "'''Бу вики-проекта «[[:$1]]» исемле бит бар инде'''",
        "searchmenu-new": "'''«[[:$1]]»  исемле яңа бит ясау'''",
        "searchprofile-articles": "Төп битләр",
-       "searchprofile-project": "Ярдәм һәм проектлар бите",
        "searchprofile-images": "Мультимедиа",
        "searchprofile-everything": "Һәркайда",
        "searchprofile-advanced": "Киңәйтелгән",
        "searchprofile-articles-tooltip": "$1 дә эзләү",
-       "searchprofile-project-tooltip": "$1 дә эзләү",
        "searchprofile-images-tooltip": "Файллар эзләү",
        "searchprofile-everything-tooltip": "Барлык битләрдә дә эзләү",
        "searchprofile-advanced-tooltip": "Бирелгән исемнәр мәйданында эзләү",
        "search-interwiki-default": "$1 нәтиҗә:",
        "search-interwiki-more": "(тагын)",
        "search-relatedarticle": "Бәйләнгән",
-       "searcheverything-enable": "Барлык исемнәр мәйданында эзләү",
        "searchrelated": "бәйләнгән",
        "searchall": "барлык",
        "showingresults": "Аста № '''$2''' {{PLURAL:$1|башлап}} '''$1''' {{PLURAL:$1|результат}} күрсәтелгән.",
        "allowemail": "Башка кулланучылардан хатлар алырга рөхсәт ителсен",
        "prefs-searchoptions": "Эзләү көйләнмәләре",
        "prefs-namespaces": "Исемнәр мәйданы",
-       "defaultns": "Алайса менә бу исемнәр мәйданында эзләү",
        "default": "килешү буенча",
        "prefs-files": "Файллар",
        "prefs-custom-css": "Үземнең CSS",
        "prefs-emailconfirm-label": "E-mail раслау",
        "youremail": "Электрон почта:",
        "username": "Кулланучы исеме:",
-       "uid": "Кулланучының идентификаторы:",
        "prefs-memberingroups": "Төркем {{PLURAL:$1|әгъзасы}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Теркәлү вакыты:",
        "recentchanges-label-bot": "Бу үзгәртү бот белән эшләнгән",
        "recentchanges-label-unpatrolled": "Үзгәртүне әлегә тикшермәгәннәр",
        "recentchanges-label-plusminus": "Битнең зурлыгы шуның кадәрле байтка үзгәрде",
-       "recentchanges-legend-newpage": "([[Special:NewPages|яңа бит]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|яңа бит]])",
        "rcnotefrom": "Астарак '''$2''' башлап ('''$1''' кадәр) үзгәртүләр күрсәтелгән.",
        "rclistfrom": "$3 $2 башлап яңа үзгәртүләрне күрсәт",
        "rcshowhideminor": "кече үзгәртүләрне $1",
        "alllogstext": "{{SITENAME}} сәхифәсенең гомуми көндәлекләре исемлеге.\nСез нәтиҗәләрне көндәлек төре, кулланучы исеме (хәреф зурлыгын истә тотыгыз) яки куззаллаган бит (шулай ук хәреф зурлыгын истә тотыгыз) буенча тәртипкә салырга мөмкин.",
        "logempty": "Кирәкле язмалар көндәлектә юк.",
        "allpages": "Барлык битләр",
-       "alphaindexline": "$1 битеннән $2 битенә кадәр",
        "nextpage": "Алдагы бит ($1)",
        "prevpage": "Алдагы бит ($1)",
        "allpagesfrom": "Моңа башланучы битләрне чыгару:",
        "creditspage": "Рәхмәтләр",
        "spamprotectiontitle": "Спам фильтры",
        "pageinfo-toolboxlink": "Бит турында мәгълүмат",
-       "skinname-cologneblue": "Зәңгәр сагыш",
-       "skinname-monobook": "Китап",
-       "skinname-modern": "Замана",
-       "skinname-vector": "Сызымлы",
        "markaspatrolledtext": "Бу мәкаләне тикшерелгән дип тамгалау",
        "markedaspatrolled": "Тикшерелгән дип тамгаланды",
        "markedaspatrolledtext": "Сайланган [[:$1]] мәкаләсенең әлеге юрамасы тикшерелгән дип тамгаланды.",
index 332c006..598df5f 100644 (file)
        "databaseerror": "Медээ шыгжамыры алдаг",
        "laggedslavemode": "'''Оваарымчалыг:''' Бо арында чаартыышкыннар чок болуп болур.",
        "readonly": "шоочалаарынга медээ шыгжамыры",
-       "missing-article": "Ð\94аннÑ\8bйлаÑ\80 Ð±Ð°Ð·Ð°Ð·Ñ\8bнда Ñ\82Ñ\8bваÑ\80 Ñ\83жÑ\83Ñ\80лÑ\83г Â«$1» $2 Ð´ÐµÐ¿ Ð°Ñ\80Ñ\8bннÑ\8bÒ£ Ð½ÐµÐ³ÐµÑ\82Ñ\82инип Ñ\82Ñ\83Ñ\80аÑ\80 Ñ\81өзүглели Ñ\82Ñ\8bвÑ\8bлбаан.\n\nÐ\9dÑ\83Ñ\80гÑ\83лайÑ\8bнда Ñ\8bндÑ\8bг Ð±Ð°Ð¹Ð´Ð°Ð» Ñ\8dÑ\80ги Ñ\88өлүлге-биле казыттынган арынның өскерилге төөгүзүнче дамчып оралдажырга тыптыр.\n\nА шынында ындыг эвес болза, Силер программа хандырылгазының алдаанга душканыңар хөңнү.\n\nОоң дугайында кайы-бир [[Special:ListUsers/sysop|удуртукчуларга]], мүн URL-ин айытпышаан, дамчыдыңарам.",
+       "missing-article": "Ð\94аннÑ\8bйлаÑ\80 Ð±Ð°Ð·Ð°Ð·Ñ\8bнда Ñ\82Ñ\8bваÑ\80 Ñ\83жÑ\83Ñ\80лÑ\83г Â«$1» $2 Ð´ÐµÐ¿ Ð°Ñ\80Ñ\8bннÑ\8bÒ£ Ð½ÐµÐ³ÐµÑ\82Ñ\82инип Ñ\82Ñ\83Ñ\80аÑ\80 Ñ\81өзүглели Ñ\82Ñ\8bвÑ\8bлбаан.\n\nÐ\9dÑ\83Ñ\80гÑ\83лайÑ\8bнда Ñ\8bндÑ\8bг Ð±Ð°Ð¹Ð´Ð°Ð» Ñ\8dÑ\80ги Ñ\88өлүг-биле казыттынган арынның өскерилге төөгүзүнче дамчып оралдажырга тыптыр.\n\nА шынында ындыг эвес болза, Силер программа хандырылгазының алдаанга душканыңар хөңнү.\n\nОоң дугайында кайы-бир [[Special:ListUsers/sysop|удуртукчуларга]], мүн URL-ин айытпышаан, дамчыдыңарам.",
        "missingarticle-rev": "(үндүрериниң саны: $1)",
        "missingarticle-diff": "(Ылгал: $1, $2)",
        "internalerror": "Иштики алдаг",
        "viewsource": "Дөзүн көөрү",
        "actionthrottled": "Шеглээн дүрген",
        "exception-nologin": "Кирбес",
+       "welcomeuser": "Кирип моорлаңар, %s!",
        "yourname": "Aжыглакчының ады",
        "yourpassword": "Чажыт сөс",
        "yourpasswordagain": "Чажыт сөзүңерни катап бижиңер:",
        "searchmenu-exists": "'''Бо викиде \"[[:$1]]\" деп арын бар.'''",
        "searchmenu-new": "'''Бо викиде «[[:$1]]» арынны чогаадыры'''",
        "searchprofile-articles": "үндезин арыннар",
-       "searchprofile-project": "Төлевилел биле дуза арыннары",
        "searchprofile-images": "Мультимедиа",
        "searchprofile-everything": "Бүгүде",
        "searchprofile-advanced": "Калбайтыр",
        "searchprofile-articles-tooltip": "$1 иштинден дилээри",
-       "searchprofile-project-tooltip": "$1 иштинде дилээри",
        "searchprofile-images-tooltip": "Файлдар дилээри",
        "searchprofile-everything-tooltip": "Шупту арыннардан дилээри (сумележиишкиннерден база)",
        "searchprofile-advanced-tooltip": "Айыткан аттар делгемнеринден дилээри",
        "search-section": "(«$1» деп салбыр)",
        "search-suggest": "Силер «$1» деп бодадыңар чадавас",
        "search-interwiki-more": "(артык)",
-       "searcheverything-enable": "Шупту аттар делгемнеринден дилээри",
        "searchrelated": "холбаалыг",
        "searchall": "шупту",
        "showingresultsheader": "«'''$4'''» дилээниниң {{PLURAL:$5|1='''$3''' одуругдан '''$1''' түңнели|'''$3''' одуругдан '''$1—$2''' түңнелдери}}",
        "timezoneregion-asia": "Азия",
        "timezoneregion-australia": "Австралия",
        "timezoneregion-europe": "Европа",
+       "prefs-searchoptions": "Дилээшкин",
        "prefs-namespaces": "Аттар делгемнери",
        "default": "ниити",
        "prefs-files": "файлдар",
        "prefs-custom-js": "Бодуңар JavaScript",
        "youremail": "Э-чагааңар:",
        "username": "Aжыглакчының ады:",
-       "uid": "Ажыглакчынын саны (ID):",
        "prefs-memberingroups": "Силерниң {{PLURAL:$1|1=бөлүү|бөлүктери}}:",
        "prefs-registration": "Кажан даңзылатканыл:",
        "yourrealname": "Шын адыңар:",
        "speciallogtitlelabel": "Target (aтка азы ажыглакчыга):",
        "log": "Журналдар",
        "allpages": "Шупту арыннар",
-       "alphaindexline": "«$1» деп арындан «$2» деп арында",
        "nextpage": "Дараазында арын ($1)",
        "prevpage": "Эрткен арын ($1)",
        "allarticles": "Шупту арыннар",
        "block": "Ажыглакчыны кызыгаарлаары",
        "blockip": "Ажыглакчыны кызыгаарлаары",
        "blockip-legend": "Ажыглакчыны кызыгаарлаары",
-       "ipadressorusername": "ИП-адрес азы aжыглaкчының aды",
+       "ipaddressorusername": "ИП-адрес азы aжыглaкчының aды",
        "ipbreason": "Чылдагаан:",
        "ipbsubmit": "Бо ажыглакчыны кызыгаарлаары",
        "ipbother": "Өске шак:",
        "tooltip-undo": "Киирген эдигни казааш, ойталалдың чылдагаанын айтыр аргалыг мурнай көргүзүүн көргүзер.",
        "tooltip-summary": "Кысказы-биле бижиңер",
        "anonymous": "{{grammar:genitive|{{SITENAME}}}} адыжок {{PLURAL:$1|киржикчизи}}",
-       "skinname-cologneblue": "Cologne Blue",
+       "pageinfo-toolboxlink": "Арын дугайында медээлел",
        "skinname-monobook": "МоноБук",
-       "skinname-modern": "Модерн",
        "skinname-vector": "Вектор",
        "filedelete-missing": "«$1» деп файл чок, ынчангаш ол ап калдынмас.",
        "previousdiff": "← Артык эрги үндүрери",
        "show-big-image": "Улуг чурумал",
        "show-big-image-size": "$1 × $2 пиксел",
        "newimages-legend": "Шүүрү",
-       "showhidebots": "(роботтарны $1)",
        "noimages": "Nothing to see.",
        "ilsubmit": "Дилээр",
        "seconds": "{{PLURAL:$1|$1 секунда|$1 секунда}}",
        "feedback-subject": "Кол сөс:",
        "feedback-message": "Чагаа:",
        "feedback-cancel": "Соксаары",
+       "searchsuggest-search": "Дилээшкин",
        "duration-seconds": "$1 {{PLURAL:$1|секунда|секунда}}",
        "duration-minutes": "$1 {{PLURAL:$1|минут|минут}}",
        "duration-hours": "$1 {{PLURAL:$1|шак|шак}}",
index 2e329dc..62b6340 100644 (file)
        "qbmyoptions": "بەتلەرىم",
        "faq": "كۆپ كۆرۈلىدىغان مەسىلىلەر",
        "faqpage": "Project:كۆپ كۆرۈلىدىغان مەسىلىلەر",
-       "vector-action-addsection": "يېڭى تېما قوش",
-       "vector-action-delete": "ئۆچۈر",
-       "vector-action-move": "يۆتكە",
-       "vector-action-protect": "قوغدا",
-       "vector-action-undelete": "ئەسلىگە قايتۇر",
-       "vector-action-unprotect": "قوغداش ئۆزگەرت",
-       "vector-view-create": "قۇر",
-       "vector-view-edit": "تەھرىر",
-       "vector-view-history": "تارىخ كۆرسەت",
-       "vector-view-view": "ئوقۇ",
-       "vector-view-viewsource": "مەنبەنى كۆرسەت",
        "actions": "مەشغۇلات",
        "namespaces": "ئات بوشلۇقى",
        "variants": "ۋارىيانتلار",
        "difference-missing-revision": "{{PLURAL:$2|نەشر|$2 نەشىر لەر}} نىڭ ($1) پەرق سېلىشتۇرما {{PLURAL:$2}} تېپىلمىدى.\n\nئادەتتە بۇ ئۆچۈرۈلگەن بەتنىڭ ئۇلانمىسىغا كىرگەنلىك سەۋەبىدىن بولىدۇ.\nتەپسىلىي ئۇچۇرنى [{{fullurl:{{#Special:log}}/delete|page={{FULLPAGENEMEE}}}}ئۆچۈرۈش خاتىرىسى] دىن تاپقىلى بولىدۇ.",
        "searchresults": "ئىزدەش نەتىجىسى",
        "searchresults-title": "\"$1\" نىڭ ئىزدەش نەتىجىسى",
-       "toomanymatches": "ناھايىتى كۆپ ماسلىشىش ئىنكاس قايتۇردى، باشقا سۈرۈشتۈرۈشنى سىناڭ",
        "titlematches": "بەت ماۋزۇسىغا ماس كەلدى",
        "textmatches": "بەت مەزمۇنى ماس كەلدى",
        "notextmatches": "ماس كېلىدىغان بەت مەزمۇنى يوق",
        "searchmenu-exists": "'''بۇ wiki دا  \"[[:$1]]\" ئاتلىق بەت بار '''",
        "searchmenu-new": "'''بۇ wiki دا  \"[[:$1]]\" ئاتلىق بەت قۇر!'''",
        "searchprofile-articles": "مەزمۇن بېتى",
-       "searchprofile-project": "ياردەم ۋە قۇرۇلۇش بەتلەر",
        "searchprofile-images": "كۆپ ۋاسىتە",
        "searchprofile-everything": "ھەممە بەت",
        "searchprofile-advanced": "ئالىي",
        "searchprofile-articles-tooltip": "$1 دىن ئىزدە",
-       "searchprofile-project-tooltip": "$1 دىن ئىزدە",
        "searchprofile-images-tooltip": "ھۆججەت ئىزدە",
        "searchprofile-everything-tooltip": "ھەممە مەزمۇننى ئىزدە (مۇنازىرە بەتمۇ ئىچىدە)",
        "searchprofile-advanced-tooltip": "ئادەتلەنگەن ئات بوشلۇقىدىن ئىزدە",
        "search-interwiki-default": "$1 نەتىجە:",
        "search-interwiki-more": "(تېخىمۇ كۆپ)",
        "search-relatedarticle": "ئالاقىدار",
-       "searcheverything-enable": "ھەممە ئات بوشلۇقىدىن ئىزدە",
        "searchrelated": "ئالاقىدار",
        "searchall": "ھەممىسى",
        "showingresults": "تۆۋەندە '''$2''' - نەتىجىدىن باشلانغان {{PLURAL:$1|'''1''' نەتىجە|'''$1''' نەتىجە}} كۆرسىتىدۇ:",
        "allowemail": "باشقا ئىشلەتكۈچىلەر ئېلخەت ئەۋەتىشنى قوزغات",
        "prefs-searchoptions": "ئىزدەش",
        "prefs-namespaces": "ئات بوشلۇقى",
-       "defaultns": "بولمىسا بۇ ئات بوشلۇقلىرىدىن ئىزدە:",
        "default": "كۆڭۈلدىكى",
        "prefs-files": "ھۆججەتلەر",
        "prefs-custom-css": "ئىختىيارى CSS",
        "prefs-emailconfirm-label": "ئېلخەت جەزملەش:",
        "youremail": "ئېلخەت:",
        "username": "{{GENDER:$1|ئىشلەتكۇچى ئىسمى}}:",
-       "uid": "{{GENDER:$1|ئىشلەتكۇچى}} كىملىك:",
        "prefs-memberingroups": "{{PLURAL:$1|گۇرۇپپا}} دىكى{{GENDER:$2| ئەزا}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "خەتلەتكەن ۋاقىت:",
        "recentchanges-label-minor": "بۇ ئازراقلا تەھرىرلەش",
        "recentchanges-label-bot": "بۇ تەھرىرنى ماشىنا ئادەم ئېلىپ بارغان",
        "recentchanges-label-unpatrolled": "بۇ تەھرىر تېخى كۆزىتىلمىگەن",
-       "recentchanges-legend-newpage": "(بۇنىڭغىمۇ قاراڭ [[Special:NewPages|يېڭى بەتلەر تىزىملىگى]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (بۇنىڭغىمۇ قاراڭ [[Special:NewPages|يېڭى بەتلەر تىزىملىگى]])",
        "rcnotefrom": "تۆۋەندىكىسى '''$2''' نىڭ ئۆزگەرتىشى (ئەڭ كۆپ بولغاندا '''$1''' كۆرسىتىدۇ )",
        "rclistfrom": "$3 $2 دىن باشلانغان يېڭى ئۆزگەرتىشنى كۆرسەت",
        "rcshowhideminor": "$1 ئازراقلا تەھرىر",
        "log-title-wildcard": "بۇ تېكست بىلەن باشلانغان ماۋزۇنى ئىزدە",
        "showhideselectedlogentries": "تالغان خاتىرىسى كۈرسەت / يوشۇر",
        "allpages": "ھەممە بەت",
-       "alphaindexline": "$1 دىن $2",
        "nextpage": "كەينى بەت ($1)",
        "prevpage": "ئالدىنقى بەت ($1)",
        "allpagesfrom": "باشلانغان بەتنى كۆرسەت:",
        "tooltip-preferences-save": "مايىللىق ساقلا",
        "tooltip-summary": "قىسقىچە ئۈزۈندە كىرگۈزۈڭ",
        "common.css": "/* CSS placed here will be applied to all skins */",
-       "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 */",
-       "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-sysop.css": "/* CSS placed here will affect sysops only */",
        "group-bureaucrat.css": "/* CSS placed here will affect bureaucrats only */",
        "common.js": "/* Any JavaScript here will be loaded for all users on every page load. */",
-       "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 */",
-       "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 */",
        "pageinfo-category-pages": "بەت سانى",
        "pageinfo-category-subcats": "تارماق تۈر سانى",
        "pageinfo-category-files": "ھۆججەت سانى",
-       "skinname-cologneblue": "Cologne Blue",
-       "skinname-monobook": "MonoBook",
-       "skinname-modern": "Modern",
-       "skinname-vector": "Vector",
        "markaspatrolleddiff": "چارلاش بەلگىسى قوي",
        "markaspatrolledtext": "بۇ بەتكە چارلاش بەلگىسى قوي",
        "markedaspatrolled": "چارلاش بەلگىسى قويۇلغان",
index 89ee4eb..6b7d813 100644 (file)
@@ -46,7 +46,8 @@
                        "Дар'я Козлова",
                        "Максим Підліснюк",
                        "Тест",
-                       "아라"
+                       "아라",
+                       "Calak"
                ]
        },
        "tog-underline": "Підкреслювати посилання:\nПідкреслювання посилань:",
        "category-empty": "''Ця категорія зараз порожня.''",
        "hidden-categories": "{{PLURAL:$1|1=Прихована категорія|Приховані категорії|Прихованих категорій}}",
        "hidden-category-category": "Приховані категорії",
-       "category-subcat-count": "{{PLURAL:$2|ЦÑ\8f ÐºÐ°Ñ\82егоÑ\80Ñ\96Ñ\8f Ð¼Ð°Ñ\94 Ñ\82Ñ\96лÑ\8cки Ñ\82акÑ\83 Ð¿Ñ\96дкаÑ\82егоÑ\80Ñ\96Ñ\8e.|ЦÑ\8f ÐºÐ°Ñ\82егоÑ\80Ñ\96Ñ\8f Ð¼Ð°Ñ\94 $1 {{PLURAL:$1|Ñ\82акÑ\83 Ð¿Ñ\96дкаÑ\82егоÑ\80Ñ\96Ñ\8e Ð·|Ñ\82акÑ\96 Ð¿Ñ\96дкаÑ\82егоÑ\80Ñ\96Ñ\97 Ð·|Ñ\82акиÑ\85 підкатегорій із}} $2.}}",
+       "category-subcat-count": "{{PLURAL:$2|ЦÑ\8f ÐºÐ°Ñ\82егоÑ\80Ñ\96Ñ\8f Ð¼Ð°Ñ\94 Ñ\82Ñ\96лÑ\8cки Ñ\82акÑ\83 Ð¿Ñ\96дкаÑ\82егоÑ\80Ñ\96Ñ\8e.|Ð\9fоказано $1 {{PLURAL:$1|пÑ\96дкаÑ\82егоÑ\80Ñ\96Ñ\8e Ð·|пÑ\96дкаÑ\82егоÑ\80Ñ\96Ñ\97 Ð·|підкатегорій із}} $2.}}",
        "category-subcat-count-limited": "У цій категорії {{PLURAL:$1|$1 підкатегорія|$1 підкатегорії|$1 підкатегорій}}.",
        "category-article-count": "Показано $1 {{PLURAL:$1|сторінку|сторінки|сторінок}} цієї категорії (із $2).",
        "category-article-count-limited": "У цій категорії {{PLURAL:$1|$1 сторінка|$1 сторінки|$1 сторінок}}.",
        "qbmyoptions": "Мої налаштування",
        "faq": "Часті питання",
        "faqpage": "Project:Часті питання",
-       "vector-action-addsection": "Додати тему",
-       "vector-action-delete": "Вилучити",
-       "vector-action-move": "Перейменувати",
-       "vector-action-protect": "Захистити",
-       "vector-action-undelete": "Відновити",
-       "vector-action-unprotect": "Зміна захисту",
-       "vector-view-create": "Створити",
-       "vector-view-edit": "Редагувати",
-       "vector-view-history": "Переглянути історію",
-       "vector-view-view": "Читати",
-       "vector-view-viewsource": "Переглянути код",
        "actions": "Дії",
        "namespaces": "Простори назв",
        "variants": "Варіанти",
        "difference-missing-revision": "{{PLURAL:$2|$2 версія|$2 версії|$2 версій}} для цього порівняння ($1) не {{PLURAL:$2|1=знайдена|знайдені}}.\n\nІмовірно, ви перейшли за застарілим посиланням на порівняння версій вилученої сторінки.\nПодробиці можна дізнатися з [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журналу вилучень].",
        "searchresults": "Результати пошуку",
        "searchresults-title": "Результати пошуку для «$1»",
-       "toomanymatches": "Знайдено дуже багато відповідностей, будь ласка, спробуйте інший запит",
        "titlematches": "Збіги в назвах сторінок",
        "textmatches": "Збіги в текстах сторінок",
        "notextmatches": "Немає збігів у текстах сторінок",
        "search-interwiki-default": "Результати із $1:",
        "search-interwiki-more": "(більше)",
        "search-relatedarticle": "Пов'язаний",
-       "searcheverything-enable": "Пошук у всіх просторах назв",
        "searchrelated": "пов'язаний",
        "searchall": "усі",
        "showingresults": "Нижче {{PLURAL:$1|показане|показані|показані}} '''$1''' {{PLURAL:$1|результат|результати|результатів}}, починаючи з №&nbsp;'''$2'''",
        "powersearch-togglelabel": "Позначити:",
        "powersearch-toggleall": "Усі",
        "powersearch-togglenone": "Жодний",
+       "powersearch-remember": "Запам'ятати вибір для майбутніх пошуків",
        "search-external": "Зовнішній пошук",
        "searchdisabled": "<p>Вибачте, повнотекстовий пошук тимчасово недоступний через перевантаження сервера; передбачається, що ця функція буде знову включена після установки нового обладнання. Поки що ми пропонуємо вам скористатися Google чи Yahoo!:</p>",
        "search-error": "Сталася помилка під час пошуку:$1",
        "allowemail": "Дозволити електронну пошту від інших користувачів",
        "prefs-searchoptions": "Пошук",
        "prefs-namespaces": "Простори назв",
-       "defaultns": "Інакше шукати в таких просторах назв:",
        "default": "за умовчанням",
        "prefs-files": "Файли",
        "prefs-custom-css": "Власний CSS",
        "recentchanges-label-unpatrolled": "Це редагування ще не було відпатрульоване",
        "recentchanges-label-plusminus": "Розмір сторінки змінився на таке число байтів",
        "recentchanges-legend-heading": "'''Легенда:'''",
-       "recentchanges-legend-newpage": "(див. також [[Special:NewPages|список нових сторінок]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (див. також [[Special:NewPages|список нових сторінок]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Нижче відображені редагування з <strong>$2</strong> (до <strong>$1</strong>).",
        "rclistfrom": "Показати редагування починаючи з $3 $2.",
        "duplicatesoffile": "{{PLURAL:$1|Дублікатом цього файлу є файл|Такі $1 файли є дублікатами цього файлу|Такі $1 файлів є дублікатами цього файлу}}\n([[Special:FileDuplicateSearch/$2|докладніше]]):",
        "sharedupload": "Цей файл із $1 і є доступним для інших проектів.",
        "sharedupload-desc-there": "Цей файл з $1 і може використовуватися в інших проектах.\nДодаткову інформацію можна знайти на [$2 сторінці опису файлу].",
-       "sharedupload-desc-here": "Цей файл з $1 і може використовуватися в інших проектах.\nДалі наведена інформація з його [$2 сторінки опису].",
+       "sharedupload-desc-here": "Цей файл з {{GRAMMAR:genitive|$1}} і може використовуватися в інших проектах.\nДалі наведена інформація з його [$2 сторінки опису].",
        "sharedupload-desc-edit": "Цей файл з $1 і може використовуватися в інших проектах. \nЙого опис можна відредагувати [$2 на відповідній сторінці тут].",
        "sharedupload-desc-create": "Цей файл з $1 і може використовуватися в інших проектах. \nЙого опис можна зробити [$2 на відповідній сторінці тут].",
        "filepage-nofile": "Не існує файлу з такою назвою.",
        "tooltip-summary": "Введіть короткий опис",
        "interlanguage-link-title": "$1 — $2",
        "common.css": "/** Розміщений тут CSS буде застосовуватися до всіх тем оформлення */",
-       "monobook.css": "/* Розміщений тут CSS буде застосовуватися до всіх тем оформлення Monobook */",
-       "vector.css": "/* Розміщений тут CSS-код буде використаний в темі оформлення Векторне */",
        "print.css": "/* Розміщений тут CSS-код буде використаний для друкованої версії */",
        "noscript.css": "/* Розміщений тут CSS-код буде використаний для користувачів у яких вимкнено JavaScript */",
        "group-autoconfirmed.css": "/* Розміщений тут CSS-код буде використаний для автопідтверджених користувачів */",
        "group-sysop.css": "/* Розміщений тут CSS-код буде використаний тільки для адміністраторів */",
        "group-bureaucrat.css": "/* Розміщений тут CSS-код буде використаний тільки для бюрократів */",
        "common.js": "/* Розміщений тут код JavaScript буде завантажений всім користувачам при зверненні до будь-якої сторінки */",
-       "monobook.js": "/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують тему оформлення Моно-книга */",
-       "vector.js": "/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують векторну тему оформлення */",
        "group-autoconfirmed.js": "/* Розміщений тут код JavaScript буде завантажений тільки для автопідтверджених користувачів */",
        "group-bot.js": "/* Розміщений тут код JavaScript буде завантажений тільки для ботів */",
        "group-sysop.js": "/* Розміщений тут код JavaScript буде завантажений тільки для адміністраторів */",
        "pageinfo-category-pages": "Кількість сторінок",
        "pageinfo-category-subcats": "Кількість підкатегорій",
        "pageinfo-category-files": "Кількість файлів",
-       "skinname-monobook": "Моно-книга",
-       "skinname-vector": "Векторне",
        "markaspatrolleddiff": "Позначити як перевірену",
        "markaspatrolledtext": "Позначити цю сторінку як перевірену",
        "markedaspatrolled": "Позначена як перевірена",
index 1128468..22d26c3 100644 (file)
@@ -18,7 +18,8 @@
                        "سمرقندی",
                        "محبوب عالم",
                        "පසිඳු කාවින්ද",
-                       "아라"
+                       "아라",
+                       "Calak"
                ]
        },
        "tog-underline": "ربط کی خط کشیدگی:",
        "vector-view-view": "مطالعہ",
        "vector-view-viewsource": "مسودہ",
        "actions": "ایکشنز",
+       "vector-more-actions": "زیادہ",
        "namespaces": "جائے نام",
        "variants": "متغیرات",
        "errorpagetitle": "خطاء",
        "edit-gone-missing": "صفحہ تجدید نہیں کیا جاسکتا.\nلگتا ہے یہ حذف ہوچکا ہے.",
        "edit-conflict": "تنازعۂ تدوین.",
        "edit-no-change": "آپ کی تدوین کو نظرانداز کردیا گیا، کیونکہ متن میں کوئی تبدیلی نہیں ہوئی تھی.",
-       "postedit-confirmation": "آپ کی ترمیم محفوظ ہوگئی۔",
+       "postedit-confirmation-saved": "آپ کی ترمیم محفوظ ہوگئی۔",
        "edit-already-exists": "نیا صفحہ تخلیق نہیں کیا جاسکتا.\nیہ پہلے سے موجود ہے.",
        "content-model-text": "سادہ متن",
        "content-model-javascript": "جاوا اسکرپٹ",
        "searchmenu-exists": "'''اِس ویکی پر \"[[:$1]]\" نامی ایک صفحہ موجود ہے'''",
        "searchmenu-new": "'''اِس ویکی پر صفحہ \"[[:$1]]\" تخلیق کیجئے!'''",
        "searchprofile-articles": "مشمولاتی صفحات",
-       "searchprofile-project": "صفحاتِ مدد و منصوبہ",
        "searchprofile-images": "کثیرالوسیط",
        "searchprofile-everything": "سب کچھ",
        "searchprofile-advanced": "پیشرفتہ",
        "searchprofile-articles-tooltip": "$1 میں تلاش",
-       "searchprofile-project-tooltip": "$1 میں تلاش",
        "searchprofile-images-tooltip": "تلاش برائے ملفات",
        "searchprofile-everything-tooltip": " تلاش تمام مشمولات (بشمول تبادلۂ خیال صفحات) میں",
        "searchprofile-advanced-tooltip": "اپنی پسند کے جائے نام میں تلاش",
        "prefs-emailconfirm-label": "برقی پتہ کی تصدیق:",
        "youremail": "٭ برقی خط",
        "username": "اسم صارف",
-       "uid": "صارف نمبر:",
        "prefs-memberingroups": "{{PLURAL:$1|گروہ|گروہوں}} کا رُکن:",
        "prefs-registration": "وقتِ اندراج:",
        "yourrealname": "* اصلی نام",
        "speciallogtitlelabel": "عنوان:",
        "log": "نوشتہ جات",
        "allpages": "تمام صفحات",
-       "alphaindexline": "$1 تا $2",
        "nextpage": "اگلا صفحہ ($1)",
        "prevpage": "پچھلا صفحہ ($1)",
        "allpagesfrom": "مطلوبہ حرف شروع ہونے والے صفحات کی نمائش:",
        "file-nohires": "اس سے بڑی تصمیم دستیاب نہیں۔",
        "show-big-image": "مکمل تصمیم",
        "newimages": "نئی فائلوں کی گیلری",
-       "showhidebots": "($1 بوٹ)",
        "ilsubmit": "تلاش",
        "bydate": "بالحاظ تاریخ",
        "weeks": "{{PLURAL:$1|$1ہفتہ| $1  ہفتے}}",
index 6ae2b30..9ad375a 100644 (file)
@@ -8,7 +8,8 @@
                        "Lyncos",
                        "Nataev",
                        "Sociologist",
-                       "Xexdof"
+                       "Xexdof",
+                       "Arystanbek"
                ]
        },
        "tog-underline": "Havolalarning tagiga chizish:",
        "qbmyoptions": "Moslamalarim",
        "faq": "TSS",
        "faqpage": "Project:TSS",
-       "vector-action-addsection": "Mavzu qoʻshish",
-       "vector-action-delete": "O‘chirish",
-       "vector-action-move": "Ko‘chirish",
-       "vector-action-protect": "Himoyalash",
-       "vector-action-undelete": "Tiklash",
-       "vector-action-unprotect": "Himoyalashni oʻzgartirish",
-       "vector-view-create": "Yaratish",
-       "vector-view-edit": "Tahrirlash",
-       "vector-view-history": "Tarix",
-       "vector-view-view": "Mutolaa",
-       "vector-view-viewsource": "Manbasini koʻrish",
        "actions": "Amallar",
        "namespaces": "Nomfazolar",
        "variants": "Variantlar",
        "editundo": "qaytarish",
        "searchresults": "Qidiruv natijalari",
        "searchresults-title": "\"$1\" uchun qidiruv natijalari",
-       "toomanymatches": "Juda ko'p o'xshashliklar topildi, iltimos, boshqa so'rov bilan urinib ko'ring",
        "titlematches": "Sahifalar nomlaridagi mos kelishlar",
        "textmatches": "Sahifalar matnlaridagi mos kelishlar",
        "notextmatches": "Bunday matn topilmadi",
        "searchmenu-exists": "'''Ushbu vikida \"[[:$1]]\" nomli sahifa mavjud.'''",
        "searchmenu-new": "<strong>'''Ushbu vikida \"[[:$1]]\" sahifasini yarating!</strong> {{PLURAL:$2|0=|Shuningdek qidiruvingiz orqali topilgan sahifani qarang.|Shuningdek topilgan qidiruv natijalarini qarang.}}",
        "searchprofile-articles": "Maqolalar",
-       "searchprofile-project": "Yordam va loyiha sahifalari",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Hamma joyda",
        "searchprofile-advanced": "Tanlangan joyda",
        "searchprofile-articles-tooltip": "$1da qidirish",
-       "searchprofile-project-tooltip": "$1da qidirish",
        "searchprofile-images-tooltip": "Fayllarni qidirish",
        "searchprofile-everything-tooltip": "Barcha sahifalardan qidirish (munozara sahifalarinidan ham)",
        "searchprofile-advanced-tooltip": "Belgilangan nomfazolardan qidirish",
        "search-interwiki-default": "$1 natijalar:",
        "search-interwiki-more": "(yana)",
        "search-relatedarticle": "Bog'liq",
-       "searcheverything-enable": "Barcha nomfazolardan qidirish",
        "searchrelated": "bogʻlangan",
        "searchall": "barchasi",
        "showingresults": "Quyida №'''$2'''dan boshlab {{PLURAL:$1|'''bitta''' natija|'''$1''' ta natija}} koʻrsatilgan.",
        "allowemail": "Boshqa foydalanuvchilardan elektron xat olishga ruxsat berish",
        "prefs-searchoptions": "Qidiruv",
        "prefs-namespaces": "Nomfazolar",
-       "defaultns": "Aks holda quyidagi nomfazolardan qidirish:",
        "default": "Sukut boʻyicha",
        "prefs-files": "Fayllar",
        "prefs-custom-css": "Shaxsiy CSS",
        "prefs-emailconfirm-label": "Elektron pochta manzilini tasdiqlash:",
        "youremail": "E-mail:",
        "username": "Foydalanuvchi nomi",
-       "uid": "Identifikator:",
        "prefs-memberingroups": "Qaysi {{PLURAL:$1|guruh|guruhlar}} aʼzosi:",
        "prefs-registration": "Hisob yaratilgan vaqt:",
        "yourrealname": "Haqiqiy ism *:",
        "recentchanges-label-unpatrolled": "Bu tahrir hali tekshirilmagan",
        "recentchanges-label-plusminus": "Sahifa vazni qanchaga oʻzgargani (bayt)",
        "recentchanges-legend-heading": "'''Izoh:'''",
-       "recentchanges-legend-newpage": "([[Special:NewPages|alohida roʻyxat]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|alohida roʻyxat]])",
        "rcnotefrom": "Quyida <strong>$2</strong> dan keyin amalga oshirilgan oʻzgarishlar keltirilgan (oxirgi <strong>$1</strong> tasi)",
        "rclistfrom": "$3, $2 dan keyingi oʻzgarishlarni koʻrsat",
        "rcshowhideminor": "Kichik tahrirlarni $1",
        "logempty": "Talabga mos yozuvlar mavjud emas.",
        "log-title-wildcard": "Shu matndan boshlanuvchi sarlavhalarni izlash",
        "allpages": "Barcha sahifalar",
-       "alphaindexline": "$1 dan $2 ga",
        "nextpage": "Keyingi sahifa ($1)",
        "prevpage": "Avvalgi sahifa ($1)",
        "allpagesfrom": "Quyidagidan boshlanuvchi sahifalarni koʻrsatish:",
        "pageinfo-edits": "Jami tahrirlar soni",
        "pageinfo-toolboxlink": "Sahifa haqida maʼlumot",
        "pageinfo-redirectsto": "Qayta yoʻnaltirish",
-       "skinname-cologneblue": "Kyolncha sogʻinch",
-       "skinname-modern": "Zamonaviy",
-       "skinname-vector": "Vektor",
        "patrol-log-page": "Patrullash qaydlari",
        "previousdiff": "← Avvalgi tahrir",
        "nextdiff": "Keyingi tahrir →",
index 23d8abd..978a98f 100644 (file)
        "qbmyoptions": "Łe me pajine",
        "faq": "Domande frequenti",
        "faqpage": "Project:Domande frequenti",
-       "vector-action-addsection": "Zonta discusion",
-       "vector-action-delete": "Scanseła",
-       "vector-action-move": "Sposta",
-       "vector-action-protect": "Protezi",
-       "vector-action-undelete": "Recupera",
-       "vector-action-unprotect": "Canbia ła protesion",
-       "vector-view-create": "Crea",
-       "vector-view-edit": "Canbia",
-       "vector-view-history": "Varda ła storia",
-       "vector-view-view": "Lezi",
-       "vector-view-viewsource": "Varda el testo",
        "actions": "Asion",
        "namespaces": "Namespace",
        "variants": "Varianse",
        "difference-missing-revision": "{{PLURAL:$2|Na version|$2 version}} de sta difarensa ($1) {{PLURAL:$2|nó ła xe sta trovà|nó łe xe stae trovae}}.\n\nCuesto se verifega de sołito seguendo un ligamente vecio de un dif a na pàjina scansełà.\nI detaji i pol esar catai inte'l [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de łe scansełasion].",
        "searchresults": "Risultati de la riserca",
        "searchresults-title": "Risultati de la riserca de \"$1\"",
-       "toomanymatches": "Xe stà catà massa corispondense, par piaser próa a modificar la richiesta.",
        "titlematches": "In tei titoli de le pagine",
        "textmatches": "Corispondense nel testo de le pagine",
        "notextmatches": "Nei testi de le pagine no gò catà gnente",
        "searchmenu-exists": "Su sto sito ghe xe na pagina che se ciama \"[[:$1]]\"",
        "searchmenu-new": "'''Crèa la pagina \"[[:$1]]\" su sta wiki!'''",
        "searchprofile-articles": "Pagine de contenuti",
-       "searchprofile-project": "Pagine de progeto e de ajuto",
        "searchprofile-images": "File",
        "searchprofile-everything": "Tuto quanto",
        "searchprofile-advanced": "Avansada",
        "searchprofile-articles-tooltip": "Serca in $1",
-       "searchprofile-project-tooltip": "Serca in $1",
        "searchprofile-images-tooltip": "Serca file",
        "searchprofile-everything-tooltip": "Serca dapartuto (anca su le pagine de discussion)",
        "searchprofile-advanced-tooltip": "Serca nei namespace personalixài",
        "search-interwiki-default": "Risultati da $1:",
        "search-interwiki-more": "(altro)",
        "search-relatedarticle": "Ligà",
-       "searcheverything-enable": "Serca in tuti quanti i namespace",
        "searchrelated": "ligà",
        "searchall": "tuti",
        "showingresults": "Qua de soto vien mostrà al massimo {{PLURAL:$1|'''1''' risultato|'''$1''' risultati}} a partir dal nùmaro '''$2'''.",
        "allowemail": "Consenti la ricezion de e-mail da altri utenti<sup>1</sup>",
        "prefs-searchoptions": "Riserca",
        "prefs-namespaces": "Namespace",
-       "defaultns": "Serca in sti namespace se no diversamente specificà:",
        "default": "predefinìo",
        "prefs-files": "File",
        "prefs-custom-css": "CSS personalixà",
        "prefs-emailconfirm-label": "Conferma de l'e-mail:",
        "youremail": "La to e-mail",
        "username": "{{GENDER:$1|Nome utente}}:",
-       "uid": "{{GENDER:$1|ID utente}}:",
        "prefs-memberingroups": "{{GENDER:$2|Menbro}} {{PLURAL:$1|del grupo|de i grupi}}:",
        "prefs-registration": "Data de registrassion:",
        "yourrealname": "El to vero nome:",
        "recentchanges-label-bot": "Sta modifica el la ga fata un bot",
        "recentchanges-label-unpatrolled": "Sta modifica no la xe stà gnancora verificà",
        "recentchanges-label-plusminus": "La dimension de la pagina la xe canbià de sto nùmaro de byte",
-       "recentchanges-legend-newpage": "(varda anca [[Special:NewPages|l'elenco de le pagine nove]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (varda anca [[Special:NewPages|l'elenco de le pagine nove]])",
        "rcnotefrom": "Qui di seguito sono elencate le modifiche da '''$2''' (fino a '''$1''').",
        "rclistfrom": "Fà védar i canbiamenti fati dal $3 $2",
        "rcshowhideminor": "$1 i canbiamenti picenini",
        "log-title-wildcard": "Riçerca dei titoli che scuminsia con",
        "showhideselectedlogentries": "Mostra/scondi łe voxe de registro sełesionae",
        "allpages": "Tute le pagine",
-       "alphaindexline": "da $1 a $2",
        "nextpage": "Pagina dopo ($1)",
        "prevpage": "La pagina prima ($1)",
        "allpagesfrom": "Mostra le pagine tacando da:",
index c9c3699..6667c65 100644 (file)
        "qbmyoptions": "Trang cá nhân",
        "faq": "Câu hỏi thường gặp",
        "faqpage": "Project:Các câu hỏi thường gặp",
-       "vector-action-addsection": "Thêm chủ đề",
-       "vector-action-delete": "Xóa",
-       "vector-action-move": "Di chuyển",
-       "vector-action-protect": "Khóa",
-       "vector-action-undelete": "Phục hồi",
-       "vector-action-unprotect": "Đổi mức khóa",
-       "vector-view-create": "Tạo",
-       "vector-view-edit": "Sửa đổi",
-       "vector-view-history": "Xem lịch sử",
-       "vector-view-view": "Đọc",
-       "vector-view-viewsource": "Xem mã nguồn",
        "actions": "Tác vụ",
        "namespaces": "Không gian tên",
        "variants": "Biến thể",
        "currentrev": "Bản hiện tại",
        "currentrev-asof": "Bản hiện tại lúc $1",
        "revisionasof": "Phiên bản lúc $1",
-       "revision-info": "Phiên bản vào lúc $1 do $2 sửa đổi",
+       "revision-info": "Phiên bản vào lúc $1 của {{GENDER:$6}}$2$7",
        "previousrevision": "← Phiên bản cũ",
        "nextrevision": "Phiên bản mới →",
        "currentrevisionlink": "xem phiên bản hiện hành",
        "mergehistory-empty": "Không thể trộn được sửa đổi nào.",
        "mergehistory-success": "$3 {{PLURAL:$3|sửa đổi|sửa đổi}} của [[:$1]] đã được trộn vào [[:$2]].",
        "mergehistory-fail": "Không thể thực hiện được việc trộn lịch sử sửa đổi, vui lòng chọn lại trang cũng như thông số ngày giờ.",
+       "mergehistory-fail-toobig": "Không thể trộn lịch sử vì phải di chuyển $1 phiên bản và vượt quá giới hạn cho phép.",
        "mergehistory-no-source": "Trang nguồn $1 không tồn tại.",
        "mergehistory-no-destination": "Trang đích $1 không tồn tại.",
        "mergehistory-invalid-source": "Trang nguồn phải có tiêu đề hợp lệ.",
        "difference-missing-revision": "Không tìm thấy {{PLURAL:$2|một phiên bản|$2 phiên bản}} trong khác biệt này ($1).\n\nLỗi này thường xuất hiện đối khi theo dõi liên kết lỗi thời đến khác biệt giữa các bản của trang đã bị xóa.\nXem chi tiết trong [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} nhật trình xóa].",
        "searchresults": "Kết quả tìm kiếm",
        "searchresults-title": "Kết quả tìm kiếm “$1”",
-       "toomanymatches": "Có quá nhiều kết quả được trả về, xin hãy thử câu tìm kiếm khác",
        "titlematches": "Đề mục tương tự",
        "textmatches": "Câu chữ tương tự",
        "notextmatches": "Không tìm thấy nội dung trang",
        "search-interwiki-default": "Kết quả từ $1:",
        "search-interwiki-more": "(thêm)",
        "search-relatedarticle": "Liên quan",
-       "searcheverything-enable": "Tìm trong tất cả không gian tên",
        "searchrelated": "có liên quan",
        "searchall": "tất cả",
        "showingresults": "Dưới đây là {{PLURAL:$1|'''1'''|'''$1'''}} kết quả bắt đầu từ #'''$2'''.",
        "powersearch-togglelabel": "Chọn:",
        "powersearch-toggleall": "Tất cả",
        "powersearch-togglenone": "Không",
+       "powersearch-remember": "Nhớ lựa chọn khi lần sau tìm kiếm",
        "search-external": "Tìm kiếm từ bên ngoài",
        "searchdisabled": "Chức năng tìm kiếm tại {{SITENAME}} đã bị tắt. Bạn có tìm kiếm bằng Google trong thời gian này. Chú ý rằng các chỉ mục từ {{SITENAME}} của chúng có thể đã lỗi thời.",
        "search-error": "Đã xuất hiện lỗi khi tìm kiếm: $1",
        "allowemail": "Nhận thư điện tử từ các thành viên khác",
        "prefs-searchoptions": "Tìm kiếm",
        "prefs-namespaces": "Không gian tên",
-       "defaultns": "Nếu không thì tìm trong không gian sau:",
        "default": "mặc định",
        "prefs-files": "Tập tin",
        "prefs-custom-css": "sửa CSS",
        "action-patrol": "đánh dấu đã tuần tra vào sửa đổi của người khác",
        "action-autopatrol": "tự động đánh dấu đã tuần tra vào sửa đổi của bạn",
        "action-unwatchedpages": "xem danh sách các trang chưa được theo dõi",
-       "action-mergehistory": "hợp nhất lịch sử của trang này",
+       "action-mergehistory": "trộn lịch sử của trang này",
        "action-userrights": "sửa đổi mọi quyền người dùng",
        "action-userrights-interwiki": "sửa đổi quyền của người dùng tại wiki khác",
        "action-siteadmin": "khóa hoặc mở khóa cơ sở dữ liệu",
        "recentchanges-label-unpatrolled": "Sửa đổi này chưa được tuần tra",
        "recentchanges-label-plusminus": "Kích cỡ trang đã thay đổi bằng số byte này",
        "recentchanges-legend-heading": "'''Chú giải:'''",
-       "recentchanges-legend-newpage": "(xem thêm [[Special:NewPages|danh sách các trang mới]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (xem thêm [[Special:NewPages|danh sách các trang mới]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Các thay đổi từ <strong>$2</strong> (hiển thị tối đa <strong>$1</strong> thay đổi).",
        "rclistfrom": "Xem các thay đổi từ $2 $3 trở về sau",
        "windows-nonascii-filename": "Wiki này không hỗ trợ ký tự đặc biệt trong tên tập tin.",
        "fileexists": "Một tập tin với tên này đã tồn tại, xin hãy kiểm tra lại <strong>[[:$1]]</strong> nếu bạn không chắc bạn có muốn thay đổi nó hay không.\n[[$1|thumb]]",
        "filepageexists": "Trang miêu tả của tập tin này đã được tạo tại <strong>[[:$1]]</strong>, nhưng hiện không có tập tin nào có tên như vậy.\nNhững gì bạn ghi trong ô \"Tóm tắt tập tin\" sẽ không hiện ra ở trang miêu tả.\nĐể khiến nó hiển thị, bạn cần phải sửa đổi trang đó bằng tay.\n[[$1|thumb]]",
-       "fileexists-extension": "Hiện có một tập tin trùng tên: [[$2|thumb]]\n* Tên tập tin đang tải lên: <strong>[[:$1]]</strong>\n* Tên tập tin có từ trước: <strong>[[:$2]]</strong>\nXin hãy chọn một tên tập tin khác.",
+       "fileexists-extension": "Hiện có một tập tin trùng tên: [[$2|thumb]]\n* Tên tập tin đang tải lên: <strong>[[:$1]]</strong>\n* Tên tập tin có từ trước: <strong>[[:$2]]</strong>\nGợi ý bạn chọn một tên rõ hơn.",
        "fileexists-thumbnail-yes": "Tập tin này có vẻ là hình có kích thước thu gọn ''(hình thu nhỏ)''. [[$1|thumb]]\nXin kiểm tra lại tập tin <strong>[[:$1]]</strong>.\nNếu tập tin được kiểm tra trùng với hình có kích cỡ gốc thì không cần thiết tải lên một hình thu nhỏ khác.",
        "file-thumbnail-no": "Tên tập tin bắt đầu bằng <strong>$1</strong>.\nCó vẻ đây là bản thu nhỏ của hình gốc ''(thumbnail)''.\nNếu bạn có hình ở độ phân giải tối đa, xin hãy tải bản đó lên, nếu không xin hãy đổi lại tên tập tin.",
        "fileexists-forbidden": "Đã có tập tin với tên gọi này, và nó không thể bị ghi đè.\nNếu bạn vẫn muốn tải tập tin của bạn lên, xin hãy quay lại và sử dụng một tên khác. [[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Tác vụ xóa và phục hồi tập tin đã bị tắt tạm thời trong khi bảo trì.",
        "filedelete-maintenance-title": "Không thể xóa tập tin",
        "mimesearch": "Tìm kiếm theo định dạng",
-       "mimesearch-summary": "Trang này có khả năng lọc tập tin theo kiểu MIME. Đầu vào: kiểu-nội-dung/kiểu-phụ, v.d. <code>image/jpeg</code>.",
+       "mimesearch-summary": "Trang này có khả năng lọc tập tin theo kiểu MIME. Đầu vào: kiểu-nội-dung/kiểu-phụ hoặc kiểu-nội-dung/*, ví dụ <code>image/jpeg</code>.",
        "mimetype": "Kiểu MIME:",
        "download": "tải về",
        "unwatchedpages": "Trang chưa được theo dõi",
        "wantedtemplates": "Bản mẫu cần viết nhất",
        "mostlinked": "Trang được liên kết đến nhiều nhất",
        "mostlinkedcategories": "Thể loại có nhiều trang nhất",
-       "mostlinkedtemplates": "Bản mẫu được liên kết đến nhiều nhất",
+       "mostlinkedtemplates": "Trang được nhúng nhiều nhất",
        "mostcategories": "Trang có nhiều thể loại nhất",
        "mostimages": "Tập tin được liên kết đến nhiều nhất",
        "mostinterwikis": "Trang có nhiều liên kết liên wiki nhất",
        "tooltip-summary": "Hãy nhập câu tóm lược",
        "interlanguage-link-title": "$1 – $2",
        "common.css": "/* Mã CSS đặt ở đây sẽ áp dụng cho mọi hình dạng */",
-       "monobook.css": "/* Mã CSS đặt ở đây sẽ ảnh hưởng đến thành viên sử dụng hình dạng MonoBook */",
-       "vector.css": "/* Mã CSS đặt ở đây sẽ ảnh hưởng đến thành viên sử dụng hình dạng Vectơ */",
        "print.css": "/* Mã CSS tại đây sẽ ảnh hưởng đến bản để in */",
        "noscript.css": "/* Mã CSS tại đây sẽ ảnh hưởng đến những người dùng tắt JavaScript */",
        "group-autoconfirmed.css": "/* Mã CSS tại đây sẽ chỉ ảnh hưởng đến các thành viên tự động xác nhận */",
        "group-sysop.css": "/* Mã CSS tại đây sẽ chỉ ảnh hưởng đến các bảo quản viên */",
        "group-bureaucrat.css": "/* Mã CSS tại đây sẽ chỉ ảnh hưởng đến các hành chính viên */",
        "common.js": "/* Bất kỳ mã JavaScript ở đây sẽ được tải cho tất cả các thành viên khi tải một trang nào đó lên. */",
-       "monobook.js": "/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng bề ngoài MonoBook */",
-       "vector.js": "/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng bề ngoài Vectơ */",
        "group-autoconfirmed.js": "/* Mã JavaScript tại đây sẽ chỉ được tải cho các thành viên tự động xác nhận */",
        "group-user.js": "/* Mã JavaScript tại đây sẽ chỉ được tải cho các thành viên có tài khoản */",
        "group-bot.js": "/* Mã JavaScript tại đây sẽ chỉ được tải cho các bot */",
        "pageinfo-category-pages": "Số trang",
        "pageinfo-category-subcats": "Số thể loại con",
        "pageinfo-category-files": "Số tập tin",
-       "skinname-vector": "Vectơ",
        "markaspatrolleddiff": "Đánh dấu tuần tra",
        "markaspatrolledtext": "Đánh dấu tuần tra trang này",
        "markedaspatrolled": "Đã đánh dấu tuần tra",
        "version-hook-name": "Tên hook",
        "version-hook-subscribedby": "Được theo dõi bởi",
        "version-version": "(Phiên bản $1)",
+       "version-no-ext-name": "[không tên]",
        "version-license": "Giấy phép MediaWiki",
        "version-ext-license": "Giấy phép",
        "version-ext-colheader-name": "Phần mở rộng",
index b8df457..d9a83f7 100644 (file)
        "vector-view-view": "Basaha",
        "vector-view-viewsource": "Kitaa an ginkuhaan",
        "actions": "Mga buhat",
+       "vector-more-actions": "Damo pa",
        "namespaces": "Mga ngaran-lat'ang",
        "variants": "Mga pagkadirudilain",
        "navigation-heading": "Menu hit nabigasyon",
        "permalink": "Sumpay nga unob",
        "print": "Igpatik",
        "view": "Kitaa",
+       "view-foreign": "Pagkita ha $1",
        "edit": "Igliwat",
+       "edit-local": "Igliwat an lokal nga pagpahayag",
        "create": "Himo-a",
+       "create-local": "Igdugang an lokal nga pagpahayag",
        "editthispage": "Igliwat ini nga pakli",
        "create-this-page": "Himo-a ini nga pakli",
        "delete": "Para-a",
        "jumptonavigation": "paglayag",
        "jumptosearch": "bilnga",
        "view-pool-error": "Pasayloa, an mga server diri na kaya yana nga takna.\nDamo nga nagamit in gusto sinmulod hini nga pakli.\nAlayon paghulat makadali san-o ka inmutro pagsulod hin nga pakli utro.\n\n$1",
+       "generic-pool-error": "Pasayloa, an mga server nasobrahan ha yanâ nga takna.\nDamo nga mga nágámit in karúyag sumulod hini nga kiritaon.\nAlayon paghulat magakadli san-o ka bumalik pagsulod hini nga kiritaon.",
        "pool-timeout": "An pagpaundang-hin-oras in naghuhulat hin trangka",
        "pool-queuefull": "Puno an katitirok nga pila",
        "pool-errorunknown": "Waray kasabti nga kasaypanan",
+       "pool-servererror": "An pool nga pag-ihap nga serbisyo diri yanâ magagamit ($)",
        "aboutsite": "Mahitungod han {{SITENAME}}",
        "aboutpage": "Project:Mahitungod han",
        "copyright": "An sulod mabiblingan ha ilarom han $1 antes may-ada pasabot.",
        "gotaccountlink": "Sakob",
        "userlogin-resetlink": "Nangalimot han imo detalye han pagsakob?",
        "userlogin-resetpassword-link": "¿Nangalimot ka han imo tigaman-pansulod?",
+       "userlogin-helplink2": "Búlig hin pagsakob",
        "userlogin-loggedin": "Nakalog-in kana komo hi {{GENDER:$1|$1}}.\nGamiti an porma ha ubos para makalog-in komo iba nga gumaramit.",
        "userlogin-createanother": "Paghimo hin iba nga akawnt",
        "createacct-emailrequired": "Email address",
        "loginlanguagelabel": "Pinulongan: $1",
        "suspicious-userlogout": "Waray ka tugoti pag-logout tungod nga baga ini ginpadangat hin usa nga broken browser o caching proxy.",
        "createacct-another-realname-tip": "Ada la ha imo kun karuyag mo igbutang an imo tinuod nga ngaran.\nKun pinili mo ito ighatag, gagamiton ini paghatag hin atribusyon ha gumaramit para hit ira buhat.",
+       "pt-login": "Sakob",
+       "pt-login-button": "Sakob",
+       "pt-createaccount": "Himo-a an akawnt",
+       "pt-userlogout": "Gawas",
        "php-mail-error-unknown": "Waray kasabti ha kanan PHP mail() function.",
        "user-mail-no-addy": "Nagsend hin email bisan waray email address.",
        "user-mail-no-body": "Nagsend hin email bisan waray o diri resonably kahalipot kaduro nga sulod.",
        "changepassword": "Igliwan an tigaman-pagsulod",
-       "resetpass_announce": "Nakalog-in ka hit temporaryo nga ginemail nga kodigo.\nPara mahuman paglalog-on, kinahanglan mo magbutang hin bag-o nga tigaman-panakob dinhi:",
+       "resetpass_announce": "Basi mahumán an pagsakob, ángay ka magpílì hin bag-o nga tigaman-panakob.",
        "resetpass_header": "Igliwan an akawnt nga tigaman-pagsulod",
        "oldpassword": "Daan nga tigaman-pagsulod:",
        "newpassword": "Bag-o nga tigaman-pagsulod:",
        "resetpass-submit-loggedin": "Igbal-iw an tigaman-pagsulod",
        "resetpass-submit-cancel": "Pasagdi",
        "resetpass-wrong-oldpass": "Diri balido an temporaryo o yana nga tigaman-panakob.\nImo malinamposon nga ginsalyuan an imo tigaman-panakob o umaro ka na hin bag-o nga temporaryo nga tigman-panakob.",
+       "resetpass-recycled": "Alayon pagreset han imo tigaman-pansakob hin lain tikang han imo yanâ nga tigaman-pansakob",
+       "resetpass-temp-emailed": "Nagsakob ka pinaagi hin temporary nga gin-email nga kodigo.\nBasi matapos an imo pagsakob, kinahanglan ka maghimo hin bag-o nga tigaman-pansakob dinhi:",
        "resetpass-temp-password": "Temporaryo nga tigaman-pagsakob:",
        "resetpass-abort-generic": "Ginpugong an pagbal-iw hin tigaman-panakob hin uska ekstensyon.",
+       "resetpass-expired": "Naubosan na hin panahon an im tigaman-pansakob.  Alayon paghimo hin bag-o nga tigaman-pansakob basi ka makasakob.",
        "passwordreset": "igreset an tigaman-hit-pagsulod",
        "passwordreset-text-one": "Kompletoha ini nga porma paramakareset hin imo tigaman-panakob.",
        "passwordreset-text-many": "{{PLURAL:$1|Butanga it usa nga mga surodlan basi makakarawat ko hin temporaryo nga tigaman-pansulod pinaagi ha email.}}",
        "log-fulllog": "Kitaa an bug-os nga taramdan",
        "edit-conflict": "Diri pagkakauroyon han pagliwat.",
        "edit-no-change": "Ginpabay-an an im pagliwat, mahitungod nga waray pagbalyo nga nabuhat ha nakasurat.",
-       "postedit-confirmation": "Natipig an imo ginliwat.",
+       "postedit-confirmation-saved": "Natipig an imo ginliwat.",
        "edit-already-exists": "Diri nakakahimo hin bag-o nga pakli.\nAada na ito.",
        "defaultmessagetext": "Aada-nga-daan nga teksto han mensahe",
        "invalid-content-data": "Sayop nga sulod nga datos",
        "currentrev": "Giurhii nga pagliwat",
        "currentrev-asof": "Giuurhii nga pagliwat han $1",
        "revisionasof": "Pagbabag-o han $1",
-       "revision-info": "Pagbag-o han $1 ni $",
+       "revision-info": "Pagbag-o tikang han $1 ni {{GENDER:$6|$2}}$7",
        "previousrevision": "← Durudaan nga pagliwat",
        "nextrevision": "Burubag-o nga pagliwat →",
        "currentrevisionlink": "Giurhii nga pagliwat",
        "searchmenu-exists": "'''May-ada pakli nga nakangaran hin \"[[:$1]]\" hini nga wiki.'''",
        "searchmenu-new": "<strong>Himoa an pakli nga \"[[:$1]]\" dinhi nga wiki!</strong> {{PLURAL:$2|0=|Kitaa gihapon an pakli nga nabilngan han imo pagbiling.|Kitaa gihapon an mga nabilngan nga ginmawas han pagbiling.}}",
        "searchprofile-articles": "Mga unod nga pakli",
-       "searchprofile-project": "Mga Bulig ngan Proyekto nga pakli",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Ngatanan",
        "searchprofile-advanced": "Abansado",
        "searchprofile-articles-tooltip": "Pamiling ha $1",
-       "searchprofile-project-tooltip": "Pamiling ha $1",
        "searchprofile-images-tooltip": "Pamiling hin mga fayl",
        "searchprofile-everything-tooltip": "Pamiling ha ngatanan nga sulod (lakip an mga hiruhimangraw nga pakli)",
        "searchprofile-advanced-tooltip": "Pamilnga ha mga nabatasan nga ngaran-lat'ang",
        "search-section": "(bahin $1)",
        "search-suggest": "Buot sidngon mo ba: $1",
        "search-interwiki-caption": "Mga bugto nga proyekto",
-       "search-interwiki-default": "$1 nga resulta:",
+       "search-interwiki-default": "Mga resulta tikang han $1:",
        "search-interwiki-more": "(damo pa)",
        "search-relatedarticle": "kasumapy",
-       "searcheverything-enable": "Pamilnga ha ngatanan nga ngaran-lat'ang",
        "searchrelated": "kadugtong",
        "searchall": "ngatanan",
        "showingresultsheader": "{{PLURAL:$5|Resulta '''$1''' han '''$3'''|Mga resulta '''$1 - $2''' han '''$3'''}} para ha '''$4'''",
        "allowemail": "Igpaandar an email nga tikang ha iba nga mga gumaramit",
        "prefs-searchoptions": "Pamilnga",
        "prefs-namespaces": "Ngaran-lat'ang",
-       "defaultns": "Kun diri, pamilnga hini nga mga ngaran-lat'ang:",
        "default": "aada-nga-daan",
        "prefs-files": "Mga paypay",
        "prefs-custom-css": "Custom CSS",
        "prefs-emailconfirm-label": "Kompirmasyon han email:",
        "youremail": "E-mail:",
        "username": "{{HENERO:$1|Agnay hit gumaramit}}:",
-       "uid": "ID hit {{HENERO:$1|Gumaramit}}:",
        "prefs-memberingroups": "{{GENDER:$2|Api}} han {{PLURAL:$1|grupo|mga grupo}}:",
        "prefs-registration": "Oras han pagrehistro:",
        "yourrealname": "Tinuod nga ngaran:",
        "recentchanges-label-minor": "Gutiay ini nga pagliwat",
        "recentchanges-label-bot": "Ini nga pagliwat in ginbuhat han bot",
        "recentchanges-label-unpatrolled": "Ini nga pagliwat in diri pa nakapatrol",
-       "rcnotefrom": "An ha ubos in mga pagbabag-o tikanng '''$''' (kutob ngadto ha '''$1''' nga ginpakita).",
+       "rcnotefrom": "An ha ubos in mga pagbabag-o tikang han <strong>$2</strong> (kutob ngadto ha <strong>$1</strong> nga ginpakita).",
        "rclistfrom": "Pakit-a an mga ginbag-ohan tikang han $3 $2",
        "rcshowhideminor": "$1 gudti nga mga pagliwat",
        "rcshowhidebots": "$1 mga bot",
        "log": "Mga talaan",
        "all-logs-page": "Ngatanan nga mga talaan panpubliko",
        "allpages": "Ngatanan nga mga pakli",
-       "alphaindexline": "$1 tubtob ha $2",
        "nextpage": "Sunod nga pakli ($1)",
        "prevpage": "Nahiuna nga pakli ($1)",
        "allpagesfrom": "Igpakita an mga pakli nga nagtitikang ha:",
        "unwatchthispage": "Undangi pagbantay",
        "notanarticle": "Diri uska unod nga pakli",
        "notvisiblerev": "An urhi nga pagliwat han iba nga gumaramit in ginpara",
-       "watchlist-details": "{{PLURAL:$1|$1 nga pakli|$1 nga mga pakli}} nga aada ha imo talaan nga binabantayan, diri lakip an mga hiruhimangraw-nga-pakli.",
+       "watchlist-details": "{{PLURAL:$1|$1 nga pakli|$1 nga mga pakli}} nga aada ha imo talaan nga binabantayan, diri bulag nga paglakip han mga hiruhimangraw-nga-pakli.",
        "wlshowlast": "Igpakita an katapusan nga $1 nga mga oras $2 nga mga adlaw $3",
        "watchlist-options": "Mga pirilian han talaan han binabantayan",
        "watching": "Ginbabantay...",
        "rollback_short": "Libot-pabalik",
        "rollbacklink": "libot-pabalik",
        "rollbackfailed": "Diri malinamposon an paglibot-pabalik",
-       "revertpage": "Ginpabalik an ginliwat ni [[Special:Contributions/|$2]] ([[User talk:$2|hiruhimangraw]]) ngadto ha urhi nga rebisyon ni [[User:$1|$1]] ngan",
+       "revertpage": "Ginpabalik an ginliwat ni [[Special:Contributions/$2|$2]] ([[User talk:$2|hiruhimangraw]]) ngadto ha urhi nga pagliwat ni [[User:$1|$1]]",
        "sessionfailure-title": "Pakyas an sesyon",
        "protectlogpage": "Talaan han pinasaliporan",
        "protectedarticle": "pinasaliporan \"[[$1]]\"",
        "block": "Pugngi an gumaramit",
        "blockip": "Pugngi an gumaramit",
        "blockip-legend": "Pugngi an gumaramit",
-       "ipadressorusername": "IP address o agnay-hit-gumaramit:",
+       "ipaddressorusername": "IP address o agnay-hit-gumaramit:",
        "ipbexpiry": "Matitima an dulot:",
        "ipbreason": "Katadungan:",
        "ipbreason-dropdown": "*Agsob nga mga rason hit pagpugong\n** Pagsusuksok hin sayop nga pananabutan\n** Pagtatangtang hin sulod tikang ha mga pakli\n** Bisan la ano nga pansusumpay ngadto ha gawas nga mga dapit\n** Pansusuksok hin inamasang/buro-buro ngadto ha mga pakli\n** Panhahadlok nga pamatasan/makakalilisang nga pansamok\n** Pan-abusar hin dirudilain nga mga akawnt\n** Diri makakarawat nga agnay-hit-gumaramit",
        "newimages": "Galeryia hin mga paypay nga bag-o",
        "newimages-legend": "Panara",
        "newimages-label": "Ngaran han paypay (o uska bahin hini):",
-       "showhidebots": "($1 ka mga bot)",
        "noimages": "Waray makikit-an.",
        "ilsubmit": "Bilnga",
        "bydate": "pinaagi han petsa",
index e0b3a91..ed77249 100644 (file)
@@ -10,7 +10,9 @@
                        "Yfdyh000",
                        "乌拉跨氪",
                        "十弌",
-                       "아라"
+                       "아라",
+                       "Mywood",
+                       "Cwek"
                ]
        },
        "tog-underline": "鏈接下橫線:",
        "qbmyoptions": "我頁",
        "faq": "FAQ",
        "faqpage": "Project:FAQ",
-       "vector-action-addsection": "加話題",
-       "vector-action-delete": "刪",
-       "vector-action-move": "移",
-       "vector-action-protect": "保",
-       "vector-action-undelete": "弗刪",
-       "vector-action-unprotect": "换保护状态",
-       "vector-view-create": "建",
-       "vector-view-edit": "编",
-       "vector-view-history": "望页史",
-       "vector-view-view": "读",
-       "vector-view-viewsource": "望源码",
        "actions": "动作",
        "namespaces": "名字空间",
        "variants": "变量",
        "errorpagetitle": "錯誤",
-       "returnto": "转å\88°$1。",
+       "returnto": "è¿\94å\9b\9e$1。",
        "tagline": "从{{SITENAME}}来",
        "help": "幫忙",
        "search": "寻",
        "enterlockreason": "请输入锁定个原因,包括预计解锁个辰光",
        "readonlytext": "数据库目前禁止输入新内容及更改,\n箇蛮有可能是因为数据库拉许维修,完成仔即可恢复。\n\n管理员有如下解释:$1",
        "missing-article": "数据库寻弗着想寻个页面文本:名字“$1”$2。\n\n箇一般是由于点击了链向旧有差异或历史个链接,而原有修订已拨删除导致个。\n\n如果弗是箇种情况,你侬作兴寻着软件里一个错误。畀URL地址记落来,搭[[Special:ListUsers/sysop|管理员]]报告。",
-       "missingarticle-rev": "(修订#:$1)",
+       "missingarticle-rev": "(版本#:$1)",
        "missingarticle-diff": "(两样:$1、$2)",
        "readonly_lag": "从数据库服务器垃拉从主服务器上更新,数据库已经拨自动锁定",
        "internalerror": "内部错误",
        "editconflict": "编辑冲突: $1",
        "explainconflict": "有人垃拉侬开始编辑之后更改仔页面。\n上头个文字框内显示个是箇歇本页个内容。\n侬个修改显示垃拉下底只文字框里向。\n侬应当拿侬个修改加入到现有个内容里向。\n<b>只有</b>上头文字框里向个内容会得垃侬点击\"保存页面\"之后畀保存。",
        "yourtext": "侬个文字",
-       "storedversion": "已保存修订版本",
+       "storedversion": "已保存版本",
        "nonunicodebrowser": "'''警告:侬个浏览器弗兼容Unicode编码。'''箇搭有一只工作区将使侬可以安全编辑页面:非ASCII字符将以十六进制编码方式出现垃拉编辑框里向。",
        "editingold": "''' 注意:倷勒里改动一只已经过期个页面修改。 如果倷保存俚个说话,勒拉该个修改之后个亨白浪当个修改侪会呒拨个。'''",
        "yourdiff": "两样",
        "language-converter-depth-warning": "字词转换器深度超限($1)",
        "undo-success": "箇只编辑可以撤销。\n请检查下头个比较,确定侬确实想撤销,然后保存下底个更改完成撤销编辑。",
        "undo-failure": "由于相互冲突个中途编辑,箇只编辑弗好撤销。",
-       "undo-norev": "由于其修订版本弗存在或已删除,此编辑弗好撤销。",
-       "undo-summary": "撤销由[[Special:Contributions/$2|$2]]([[User talk:$2|对话]])作出个修订$1",
+       "undo-norev": "由于其版本弗存在或已删除,此编辑弗好撤销。",
+       "undo-summary": "撤销由[[Special:Contributions/$2|$2]]([[User talk:$2|讨论]])作出个版本$1",
        "cantcreateaccounttitle": "呒处建立帐户",
        "cantcreateaccount-text": "从箇只IP地址 (<b>$1</b>) 创建账户已经畀[[User:$3|$3]]禁止。\n\n$3封禁个原因是''$2''",
        "viewpagelogs": "望箇页日志",
        "nohistory": "该只页面呒拨编辑历史。",
-       "currentrev": "最新修订版本",
+       "currentrev": "最版本",
        "currentrev-asof": "于$1个最新修订版",
        "revisionasof": "垃拉$1所作出个修订版",
-       "revision-info": "垃拉$1由$2所作修订版本",
+       "revision-info": "垃拉$1由$2所作版本",
        "previousrevision": "←还旧版",
        "nextrevision": "新点个版本→",
-       "currentrevisionlink": "最新修订",
+       "currentrevisionlink": "最后版本",
        "cur": "当前",
        "next": "后头",
        "last": "上个",
        "rev-deleted-user": "(用户名已删除)",
        "rev-deleted-event": "(日志动作已删除)",
        "rev-deleted-user-contribs": "[用户名或IP地址已删除 - 垃贡献里向囥脱编辑]",
-       "rev-deleted-text-permission": "箇只页面修订已畀'''删除'''。\n垃拉[{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} 删除日志]里向可以寻着详细信息。",
+       "rev-deleted-text-permission": "箇只页面版本已畀'''删除'''。\n垃拉[{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} 删除日志]里向可以寻着详细信息。",
        "rev-deleted-text-unhide": "箇只页面修订已经畀'''删除'''。\n垃拉[{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} 删除日志]里向可以寻着详细信息。\n作为管理员,如果侬想继续个闲话,侬可以仍旧[$1 查看箇趟修订]。",
        "rev-suppressed-text-unhide": "箇只页面修订已经畀'''废止'''。\n垃拉[{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} 废止日志]里向可以寻着详细信息。\n作为管理员,如果侬想继续个闲话,侬可以仍旧[$1 查看箇趟修订]。",
        "rev-deleted-text-view": "箇只页面修订已经畀'''删除'''。作为管理员,侬可以查看渠;\n垃拉[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]里向可以寻着详细信息。",
        "rev-suppressed-text-view": "箇只页面修订已经畀'''废止'''。作为管理员,侬可以查看渠;\n垃拉[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 废止日志]里向可以寻着详细信息。",
        "rev-deleted-no-diff": "因为其中一趟修订已畀'''删除''',侬弗可以查看差异。\n垃拉[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]里向可以寻着更多信息。",
-       "rev-suppressed-no-diff": "箇只页面个其中一趟修订已经畀'''删除''',箇咾弗可以查看箇趟修订。",
+       "rev-suppressed-no-diff": "箇只页面个其中一趟版本已经畀'''删除''',箇咾弗可以查看箇趟版本。",
        "rev-deleted-unhide-diff": "箇只页面个其中一趟修订已经畀'''删除'''。\n垃拉[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]里向可以寻着更多信息。\n作为管理员,如果侬想继续个闲话,侬仍旧可以[$1 查看箇趟修订]。",
        "rev-suppressed-unhide-diff": "箇只页面个其中一趟修订已经拨'''废止'''。\n垃拉[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 废止日志]里向可以寻着更多资料。\n作为管理员,如果侬想继续个闲话,侬可以仍旧[$1 查看箇趟修订]。",
        "rev-deleted-diff-view": "差异里向个一趟修订已拨'''删除'''。\n作为管理员,侬可以查看箇个差异。详细信息可垃拉[{{fullurl: {{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]里向寻着。",
        "rev-suppressed-diff-view": "差异里向个一趟修订已拨'''废止'''。\n作为管理员,侬可以查看箇个差异。详细信息可垃拉[{{fullurl: {{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 废止日志]里向寻着。",
        "rev-delundel": "显示/囥脱",
        "rev-showdeleted": "显示",
-       "revisiondelete": "删除 / 反删除修订",
-       "revdelete-nooldid-title": "无效个目标修订",
-       "revdelete-nooldid-text": "侬还弗曾指定一个目标修订去进行箇只功能、\n所指定个修订弗存在,或者侬尝试去隐藏现时个修订。",
+       "revisiondelete": "删除 / 反删除版本",
+       "revdelete-nooldid-title": "无效个目标版本",
+       "revdelete-nooldid-text": "侬还弗曾指定一个目标版本去进行箇只功能、\n所指定个版本弗存在,或者侬尝试去隐藏现时个版本。",
        "revdelete-no-file": "指定文件弗存在。",
-       "revdelete-show-file-confirm": "侬阿是真个要查看文件“<nowiki>$1</nowiki>”垃拉$2 $3已经删除个修订?",
+       "revdelete-show-file-confirm": "侬阿是真个要查看文件“<nowiki>$1</nowiki>”垃拉$2 $3已经删除个版本?",
        "revdelete-show-file-submit": "是",
        "logdelete-selected": "选取$1个日志事件:",
        "revdelete-confirm": "假使侬想箇能介做个闲话,请确认侬已经清爽箇能介做个后果,外加箇个程序符合[[{{MediaWiki:Policy-url}}|政策]]。",
        "revdelete-log": "理由:",
        "revdelete-submit": "应用于拣中个{{PLURAL:$1|修订}}",
        "revdelete-success": "'''修订个可见性已经成功更新。'''",
-       "revdelete-failure": "'''修订个可见性无法更新:'''\n$1",
+       "revdelete-failure": "<strong>版本个可见性无法更新:</strong>$1",
        "logdelete-success": "'''事件个可见性已经成功设置。'''",
        "logdelete-failure": "'''事件个可见性无法设置:'''\n$1",
        "revdel-restore": "改变可见性",
        "pagehist": "页面历史",
        "deletedhist": "已删除之历史",
-       "revdelete-hide-current": "隐藏于$1 $2之项目错误:箇个是当前个修订,弗可以隐藏。",
+       "revdelete-hide-current": "隐藏于$1 $2之项目错误:箇个是当前个版本,弗可以隐藏。",
        "revdelete-show-no-access": "显示于$1 $2之项目错误:箇只项目已经标示为\"已限制\",侬对渠并无通行权。",
        "revdelete-modify-no-access": "更改于$1 $2之项目错误:箇个项目已经标示为\"已限制\",侬对渠并无通行权。",
        "revdelete-modify-missing": "更改项目ID $1错误:数据库里寻弗着!",
        "revdelete-otherreason": "别个/附加理由:",
        "revdelete-reasonotherlist": "别个理由",
        "revdelete-edit-reasonlist": "编辑删除理由",
-       "revdelete-offender": "修订作者:",
+       "revdelete-offender": "版本作者:",
        "suppressionlog": "阻止日志",
        "suppressionlogtext": "下头是只删除搭仔封锁列表,包括对管理员隐藏个内容。\n参看[[Special:IPBlockList|IP封锁名单]]来了解目前有效个禁止搭仔封锁之名单。",
        "mergehistory": "合并页面历史",
        "mergehistory-from": "来源页面:",
        "mergehistory-into": "目的页面:",
        "mergehistory-list": "可合并个编辑历史",
-       "mergehistory-merge": "下头对[[:$1]]个修订可以合并到[[:$2]]。用该选项揿钮列去合并只有垃拉指定辰光前头创建个修订。要当心个是使用导航链接就会重设箇栏。",
+       "mergehistory-merge": "下头对[[:$1]]个版本可以合并到[[:$2]]。用该选项揿钮列去合并只有垃拉指定辰光前头创建个版本。要当心个是使用导航链接就会重设箇栏。",
        "mergehistory-go": "显示可合并个编辑",
-       "mergehistory-submit": "合并修订",
+       "mergehistory-submit": "合并版本",
        "mergehistory-empty": "呒没修订可以合并",
        "mergehistory-success": "[[:$1]]个$3趟修订已成功合并到[[:$2]]。",
        "mergehistory-fail": "弗可以进行历史合并,请重新检查页面以及辰光参数。",
        "pagemerge-logentry": "已拿[[$1]]合并到[[$2]] (修订截至$3)",
        "revertmerge": "反合并",
        "mergelogpagetext": "下底是只最近发生个页面历史合并个记录列表。",
-       "history-title": "“$1”个修订史",
+       "history-title": "“$1”的版本历史",
        "lineno": "第$1排:",
        "compareselectedversions": "比较选中个版本",
        "showhideselectedversions": "显示/囥脱选定修订版本",
        "editundo": "撤销",
        "searchresults": "搜寻结果",
        "searchresults-title": "搜寻“$1”个结果",
-       "toomanymatches": "匹配结果忒多哉,请尝试弗同个查询关键词",
        "titlematches": "页面标题匹配",
        "textmatches": "页面内容匹配",
        "notextmatches": "呒没匹配个页面文本",
        "searchmenu-exists": "'''箇wiki里有一页名字“[[:$1]]”哉'''",
        "searchmenu-new": "'''徕箇wiki里建“[[:$1]]”页!'''",
        "searchprofile-articles": "内容页",
-       "searchprofile-project": "帮助搭项目页",
        "searchprofile-images": "多媒体",
        "searchprofile-everything": "全部",
        "searchprofile-advanced": "高级",
        "searchprofile-articles-tooltip": "徕$1里搜寻",
-       "searchprofile-project-tooltip": "徕$1里搜寻",
        "searchprofile-images-tooltip": "搜寻文件",
        "searchprofile-everything-tooltip": "搜寻全部内容(包括讨论页)",
        "searchprofile-advanced-tooltip": "垃拉自定义名字空间里向搜索",
        "search-interwiki-default": "$1项结果:",
        "search-interwiki-more": "(更多)",
        "search-relatedarticle": "相关",
-       "searcheverything-enable": "垃拉所有名字空间里向搜索",
        "searchrelated": "相关",
        "searchall": "全部",
        "showingresults": "下头显示从第<b>$2</b>条开始个<b>$1</b>条结果:",
        "prefs-files": "文件",
        "youremail": "电子信箱:",
        "username": "用户名:",
-       "uid": "用户号:",
        "yourrealname": "真名字:",
        "yourlanguage": "语言:",
        "yournick": "绰号:",
        "speciallogtitlelabel": "目標(標題要弗用戶):",
        "log": "记录",
        "allpages": "全部页面",
-       "alphaindexline": "$1到$2",
        "nextpage": "下页 ($1)",
        "prevpage": "上一页($1)",
        "allpagesfrom": "显示个页面开始于:",
        "whatlinkshere-hidelinks": "$1链接",
        "whatlinkshere-filters": "过滤器",
        "blockip": "查封用户",
-       "ipadressorusername": "IP地址或用户名:",
+       "ipaddressorusername": "IP地址或用户名:",
        "ipbreason": "理由:",
        "ipbsubmit": "封杀该个用户",
        "ipbother": "其它时间:",
        "tooltip-t-upload": "上传文件",
        "tooltip-t-specialpages": "全部特殊页列表",
        "tooltip-t-print": "箇页个打印版",
-       "tooltip-t-permalink": "箇页当前修订版个老世链接",
+       "tooltip-t-permalink": "箇页当前版本个老世链接",
        "tooltip-ca-nstab-main": "望内容页",
        "tooltip-ca-nstab-user": "查看用户页",
        "tooltip-ca-nstab-media": "查看媒体页",
        "svg-long-desc": "SVG文件,名义大小:$1×$2像素,文件大小:$3",
        "show-big-image": "完整分辨率",
        "newimages": "新文件陈列室",
-       "showhidebots": "($1机器人)",
        "ilsubmit": "搜寻",
        "bad_image_list": "格式如下:\n\n只列出项目(线开始* )的审议。\n第一个环节上线必须是一个链接到一个坏文件。\n其后的任何链接在同一行被认为是例外情况,即网页的文件,则可能会发生内部。",
        "variantname-zh-tw": "台湾",
index 55e7fd2..bdbe3de 100644 (file)
        "qbmyoptions": "מיינע בלעטער",
        "faq": "מערסטע געפרעגטע פראגעס",
        "faqpage": "Project:מערסטע געפרעגט פראגעס",
-       "vector-action-addsection": "צושטעלן טעמע",
-       "vector-action-delete": "אויסמעקן",
-       "vector-action-move": "באַוועגן",
-       "vector-action-protect": "שיצן",
-       "vector-action-undelete": "מבטל זיין אויסמעקן",
-       "vector-action-unprotect": "ענדערונג באַשיצונג",
-       "vector-view-create": "שאַפֿן",
-       "vector-view-edit": "רעדאַקטירן",
-       "vector-view-history": "ווײַזן היסטאָריע",
-       "vector-view-view": "לייענען",
-       "vector-view-viewsource": "ווײַזן מקור",
        "actions": "אַקציעס",
        "namespaces": "נאָמענטיילן",
        "variants": "װאַריאַנטן",
        "jumptonavigation": "נאַוויגאַציע",
        "jumptosearch": "זוכן",
        "view-pool-error": "אנטשולדיגט, די סערווערס זענען איבערגעפילט איצט.\nצופיל באניצער פרובירן צו ליינען דעם בלאט.\nביטע ווארטן א ביסל צייט בעפאר איר פרובירט ווידער אריינגיין אינעם בלאט.\n\n$1",
+       "generic-pool-error": "אנטשולדיגט, די סערווערס זענען איבערגעפילט איצט.\nצופיל באניצער פרובירן צו באקוקן דעם רעסורס.\nביטע ווארטן א ביסל צייט בעפאר איר פרובירט ווידער אריינטרעטן אין דעם רעסורס.",
        "pool-timeout": "אַריבער דער צײַט וואַרטן פֿאר דער שליסונג",
        "pool-queuefull": "ריי איז פֿול",
        "pool-errorunknown": "אומבאַקאַנטער פֿעלער",
        "parser-template-recursion-depth-warning": "מוסטער רעקורסיע טיף מאקסימום איבערגעשטיגן ($1)",
        "language-converter-depth-warning": "אַריבער דעם שפּראַך קאַנווערטער טיף לימיט ($1)",
        "node-count-exceeded-category": "בלעטער וואו קנופצאל איז צו פיל",
+       "node-count-exceeded-category-desc": "א קאטעגאריע פאר בלעטער וואו די קנופצאל איז צו פיל.",
        "node-count-exceeded-warning": "קנופנצאל אויפן בלאט צו הויך",
        "expansion-depth-exceeded-category": "בלעטער וואו מ'האט אריבערגעשטיגן די פארברייטערונג טיף",
+       "expansion-depth-exceeded-category-desc": "דאס איז א קאטעגאריע פאר בלעטער וואס שטיגן איבער דער פארברייטערן־טיף.",
        "expansion-depth-exceeded-warning": "בלאט גייט אריבער דער פארברייטערונג טיף",
        "parser-unstrip-loop-warning": "פעטליע געטראפֿן",
        "converter-manual-rule-error": "געטראפן א גרײַז אין האנטלעכן שפראך־קאנווערטירן כלל",
        "currentrev": "איצטיגע ווערסיע",
        "currentrev-asof": "לויפיקע רעוויזיע פון $1",
        "revisionasof": "רעוויזיע ביי $1",
-       "revision-info": "רע×\95×\95×\99×\96×\99×¢ ×\91×\99×\99 $1 ×¤×\95×\9f $2",
+       "revision-info": "×\95×\95ערס×\99×¢ ×¤×\95×\9f $1 ×\93×\95ר×\9a {{GENDER:$6|$2}}$7",
        "previousrevision": "→ עלטערע  ווערסיע",
        "nextrevision": "נײַערע ווערסיע ←",
        "currentrevisionlink": "איצטיגע ווערסיע",
        "revdelete-selected-text": "'''{{PLURAL:$2|אויסדערוויילטע רעוויזיע| אויסדערוויילטע רעוויזיעס}} פון [[:$1]]:'''",
        "revdelete-selected-file": "'''{{PLURAL:$1|אויסדערוויילטע טעקע ווערסיע| אויסדערוויילטע טעקע ווערסיעס}} פון [[:$2]]:'''",
        "logdelete-selected": "{{PLURAL:$1| אויסדערוויילטע לאג אקציע|אויסדערוויילטע לאג אקציעס}}:",
+       "revdelete-text-text": "אויסגעמעקטע ווערסיעס וועלן נאך דערשיינען אין דער בלאט־היסטאריע, אבער טייל פון זייער אינהאלט וועט נישט זײַן צוגאנגבאר צום עולם.",
+       "revdelete-text-file": "אויסגעמעקטע טעקע ווערסיעס וועלן נאך דערשיינען אין דער בלאט־היסטאריע, אבער טייל פון זייער אינהאלט וועט נישט זײַן צוגאנגבאר צום עולם.",
+       "logdelete-text": "אויסגעמעקטע לאגביכער־געשעענישן וועלן נאך דערשיינען אינעם לאגבוך, אבער טייל פון זייער אינהאלט וועט נישט זײַן צוגאנגבאר צום עולם.",
        "revdelete-confirm": "זייט אזוי גוט און באשטעטיקט אז דאס איז טאקע אייער כוונה, אז איר פארשטייט די קאנסעקווענצן, און אז איר טוט דאס לויט  [[{{MediaWiki:Policy-url}}|דער פאליסי]].",
        "revdelete-suppress-text": "אונטערדרוקן זאל בלויז גענוצט ווערן '''נאר''' אין די פאלגנדע פעלער:\n* אינפארמאציע וואס קען זיין מוציא שם רע\n* אויפדעקונג פון פריוואטקייט אינפארמאציע\n*: ''היים אדרעסן, טעלעפאן נומערן, נאציאנאלע אידענטיפיקאציע נומערן, א.א.וו.''",
        "revdelete-legend": "שטעלט ווייזונג באגרענעצונגען",
        "difference-missing-revision": "{{PLURAL:$2|איין ווערסיע|$2 ווערסיעס}} פון דעם דיפערענץ ($1) {{PLURAL:$2|האט}} מען נישט געטראפן.\n\nדאס געשעט געוויינלעך פון פאלגן א פארעלטערטן היסטאריע לינק צו א בלאט וואס איז געווארן אויסגעמעקט.\nפרטים קען מען געפינען אינעם [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} אויסמעקונג לאגבוך].",
        "searchresults": "זוכן רעזולטאטן",
        "searchresults-title": "זוכן רעזולטאַטן פֿאַר \"$1\"",
-       "toomanymatches": "צו פֿיל רעזולטאַטן, ביטע פרואווט אן אנדער זוך",
        "titlematches": "בלאט קעפל שטימט",
        "textmatches": "בלעטער מיט פאַסנדיקן אינהאַלט",
        "notextmatches": "נישטאָ קיין בלעטער מיט פאַסנדיקן אינהאַלט",
        "search-interwiki-default": "רעזולטאטן פון $1:",
        "search-interwiki-more": "(נאך)",
        "search-relatedarticle": "פארבינדן",
-       "searcheverything-enable": "זוכן אין אלע נאמענטיילן",
        "searchrelated": "פארבינדן",
        "searchall": "אלץ",
        "showingresults": "ווייזן ביז {{PLURAL:$1|רעזולטאט '''איינס'''|'''$1''' רעזולטאטן}} אנגעפאנגן פון נומער #'''$2''':",
        "powersearch-togglelabel": "קאנטראלירן:",
        "powersearch-toggleall": "אלע",
        "powersearch-togglenone": "קיין",
+       "powersearch-remember": "געדנעקען אויסקלייב פאר צוקונפטדיקע זוכן",
        "search-external": "דרויסנדיק זוכן",
        "searchdisabled": "{{SITENAME}} זוך איז אָפאַקטיווירט.\nצווישנצײַט קענט איר זוכן מיט גוגל.\nגעב אכט אז ס'איז מעגלעך אַז זייער אינדעקס פֿון {{SITENAME}} אינהאַלט איז אפשר פֿאַרעלטערט.",
        "search-error": "ס'האט פאסירט א פֿעלער ביים זוכן: $1",
        "allowemail": "ערלויבן אנדערע צו שיקן אײַך ע־פאסט",
        "prefs-searchoptions": "זוכן",
        "prefs-namespaces": "נאָמענטיילן",
-       "defaultns": "אנדערשט זוך אין די נאמענטיילן:",
        "default": "גרונטלעך",
        "prefs-files": "טעקעס",
        "prefs-custom-css": "באַניצער דעפֿינירט CSS",
        "recentchanges-label-unpatrolled": "די רעדאקטירונג איז נאך נישט נאכגעקוקט",
        "recentchanges-label-plusminus": "בלאט גרייס געענדערט מיט דער צאל בייטן",
        "recentchanges-legend-heading": "'''לעגענדע:'''",
-       "recentchanges-legend-newpage": "(זעט אויך [[Special:NewPages|די רשימה פון נייע בלעטער]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (זעט אויך [[Special:NewPages|די רשימה פון נייע בלעטער]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "פֿאלגנד זענען די ענדערונגען זײַט <strong>$2</strong> (ביז <strong>$1</strong>).",
        "rclistfrom": "װײַזן נײַע ענדערונגען פֿון $3 $2",
        "largefileserver": "די טעקע איז גרעסער פונעם מאקסימום פאר דעם סערווער.",
        "emptyfile": "די טעקע וואס איר האט ארויפֿלגעלאָדן איז ליידיג.\nעס קען זיין אז די סיבה איז פשוט א טייפא אינעם טעקע־נאמען.\nביטע קוקט איבער צי איר ווילט ארויפֿלאדן  די דאזיקע טעקע.",
        "windows-nonascii-filename": "די וויקי שטיצט נישט טעקע־נעמען מיט ספעציעלע צייכענען.",
-       "fileexists": "א טעקע מיט דעם נאָמען עקזיסטירט שוין, ביטע זײַט בודק <strong>[[:$1]]</strong> ווען איר זענט נישט זיכער אַז איר ווילט זי ענדערן.\n[[$1|thumb]]",
+       "fileexists": "א טעקע מיט דעם נאָמען עקזיסטירט שוין, ביטע זײַט בודק <strong>[[:$1]]</strong> ווען {{GENDER:|איר}} זענט נישט זיכער אַז איר ווילט אים ענדערן.\n[[$1|thumb]]",
        "filepageexists": "דער באשרייבונג בלאט פאר דער דאזיקער טעקע האט מען שוין געשאפן ביי <strong>[[:$1]]</strong>, אבער ס'עקזיסטירט נישט קיין טעקע מיט דעם נאמען.\nדי רעזומע וואס איר קלאפט אריין וועט זיך נישט באווייזן אויפן באשרייבונג בלאט.\nכדי צו שאפן אז אייער רעזומע וועט זיך טאקע באווייזן דארט, דארפט איר רעדאקטירן זי האנטווייז.\n[[$1|thumb]]",
-       "fileexists-extension": "×\90 ×\98עקע ×\9e×\99×\98 ×\90×\9f ×¢× ×\9c×¢×\9b×\9f × ×\90×\9e×¢×\9f ×¢×§×\96×\99ס×\98×\99ר×\98 ×©×\95×\99×\9f: [[$2|thumb]]\n* × ×\90×\9e×¢×\9f ×¤×\95×\9f ×\93ער ×\98עקע ×\95×\95×\90ס ×\95×\95ער×\98 ×\90ר×\95×\99פ×\92×¢×\9c×\90Ö¸×\93×\9f: <strong>[[:$1]]</strong>\n* × ×\90×\9e×¢×\9f ×¤×\95×\9f ×\93ער ×¤Ö¿×\90ר×\90נענער ×\98עקע: <strong>[[:$2]]</strong>\n×\96ײַ×\98 ×\90×\96×\95×\99 ×\92×\95×\98 ×\90×\95×\9f ×§×\9c×\95×\99×\91×\98 ×\90×\9f ×\90× ×\93ער נאמען.",
+       "fileexists-extension": "×\90 ×\98עקע ×\9e×\99×\98 ×\90×\9f ×¢× ×\9c×¢×\9b×\9f × ×\90×\9e×¢×\9f ×¢×§×\96×\99ס×\98×\99ר×\98 ×©×\95×\99×\9f: [[$2|thumb]]\n* × ×\90×\9e×¢×\9f ×¤×\95×\9f ×\93ער ×\98עקע ×\95×\95×\90ס ×\95×\95ער×\98 ×\90ר×\95×\99פ×\92×¢×\9c×\90Ö¸×\93×\9f: <strong>[[:$1]]</strong>\n* × ×\90×\9e×¢×\9f ×¤×\95×\9f ×\93ער ×¤Ö¿×\90ר×\90נענער ×\98עקע: <strong>[[:$2]]</strong>\n×\90פשר ×\95×\95×\99×\9c×\98 ×\90×\99ר × ×\99צ×\9f ×\90 ×\9eער ×\90פש×\99×\99×\93× ×\93×\99ק×\9f נאמען.",
        "fileexists-thumbnail-yes": "די טעקע זעט אויס צו זײַן א פארקלענערט בילד  ''(קליין)''.\n[[$1|thumb]]\nזײַט אזוי גוט קאנטראלירט די טעקע <strong>[[:$1]]</strong>.\nווען די קאנטראלירטע טעקע איז דאס זעלבע בילד אין דער אריגינעלער גרייס ברויכט מען נישט ארויפלאדן נאך א פארקלענערט בילד.",
        "file-thumbnail-no": "דער טעקע־נאמען הייבט אן מיט <strong>$1</strong>.\nזי זעט אויס ווי א פארקלענערט בילד ''(מיניאטור)''.\nטאמער האט איר דאס בילד אין פולער רעזאלוציע טוט עס ארויפלאדן, אנדערשט זייט אזוי גוט און ענדערט דעם טעקע־נאמען.",
        "fileexists-forbidden": "א טעקע מיט דעם נאָמען עקזיסטירט שוין, און מען קען זי נישט אַריבערשרײַבן.\nאויב איר ווילט דאך אַרויפֿלאָדן אײַער טעקע, ביטע גיין צוריק און ניצן אַן אַנדער נאָמען.\n[[File:$1|thumb|center|$1]]",
        "php-uploaddisabledtext": "אַרויפֿלאָדן טעקעס נישט דערמעגלעכט אין PHP.\nזייט אזוי גוט בודק זיין די file_uploads שטעלונג.",
        "uploadscripted": "די טעקע האט א סקריפט אדער HTML קאד וואס קען ווערן פֿאלש אויסגעטייטשט דורך א בלעטערער",
        "uploadscriptednamespace": "די SVG טעקע אנטהאלט אן אומלעגאלן נאמענטייל  \"$1\"",
+       "uploadinvalidxml": "דאס XML אין דער ארויפגעלאדענער טעקע קען מען נישט פארזירן.",
        "uploadvirus": "די טעקע האָט אַ ווירוס! פרטים: <div dir=\"rtl\">$1</div>",
        "upload-source": "מקור טעקע",
        "sourcefilename": "מקור טעקע נאמען:",
        "upload-misc-error-text": "אן אומבאקאנטער גרייז האט פאסירט בשעת דעם ארויפלאד.\nביטע באשטעטיקט אז דער  URL איז גילטיק און דערגרייכבאר און פרובירט נאכאמאל.\nווען דער פראבלעם בלייבט ווייטער, קאנטאקטירט  א [[Special:ListUsers/sysop|סיסאפ]].",
        "upload-too-many-redirects": "דער URL אַנטהאַלט צופֿיל ווײַטערפֿירונגען.",
        "upload-http-error": "א HTTP גרײַז האט פאַסירט: $1",
+       "upload-copy-upload-invalid-domain": "ארויפלאדן טעקעס פון דעם דאמיין נישט מעגלעך.",
        "backend-fail-stream": "קען נישט מאכן שטראמען טעקע $1.",
        "backend-fail-notexists": "נישט פֿאראן די טעקע $1.",
        "backend-fail-notsame": "א נישט־אידענטישע טעקע עקזיסטירט שוין ביי \"$1\".",
        "wantedtemplates": "געזוכטע מוסטערן",
        "mostlinked": "מערסט פֿארבינדענע בלעטער",
        "mostlinkedcategories": "מערסט פֿארבינדענע קאטעגאריעס",
-       "mostlinkedtemplates": "×\9eערס×\98 ×¤Ö¿×\90ר×\91×\99× ×\93×¢× ×¢ ×\9e×\95ס×\98ער×\9f",
+       "mostlinkedtemplates": "×\9eערס×\98 ×\90ר×\99×\91ער×\92×\9cעשעסענע ×\91×\9c×¢×\98ער",
        "mostcategories": "אַרטיקלען מיט די מערסטע קאַטעגאָריעס",
        "mostimages": "מערסט פֿארבונדענע טעקעס",
        "mostinterwikis": "בלעטער מיט די מערסטע אינטערוויקיס",
        "listgrouprights-removegroup-self": "א§ראָפנעמען {{PLURAL:$2|גרופּע |גרופּעס}} פון אייגענער קאנטע: $1",
        "listgrouprights-addgroup-self-all": "צולייגן אַלע גרופעס צו אייגענער קאנטע",
        "listgrouprights-removegroup-self-all": "אראָפנעמען אַלע גרופעס פֿון אייגענער קאנטע",
+       "listgrouprights-namespaceprotection-header": "נאמענטייל באשרענקונגען",
        "listgrouprights-namespaceprotection-namespace": "נאָמענטייל",
+       "listgrouprights-namespaceprotection-restrictedto": "רעכט(ן) וואס דערלויבט באניצער צו רעדאקטירן",
+       "trackingcategories": "אויפפאסן־קאטעגאריעס",
+       "trackingcategories-msg": "אויפפאסן־קאטעגאריע",
        "trackingcategories-name": "מעלדונג נאמען",
        "trackingcategories-desc": "קאטעגאריע אײַנשליסן קריטעריע",
+       "trackingcategories-nodesc": "נישט פאראן קיין באשרײַבונג.",
+       "trackingcategories-disabled": "קאטעגאריע איז אומאקטיווירט",
        "mailnologin": "נישטא קיין אדרעס צו שיקן",
        "mailnologintext": "איר ברויכט זײַן [[Special:UserLogin|אַרײַנלאגירט]] און האָבן א גילטיגן ע־פאסט אַדרעס אין אײַער [[Special:Preferences|פרעפֿערענצן]] צו שיקן ע־פאסט צו אַנדערע באַניצער.",
        "emailuser": "שיקן ע-פאסט צו דעם באַניצער",
        "watchnologin": "איר זענט נישט אַרײַנלאגירט",
        "addwatch": "צולייגן צו דער אויפֿפאַסונג ליסטע",
        "addedwatchtext": "דער בלאט \"[[:$1]]\" איז צוגעלײגט געוואָרן צו אײַער [[Special:Watchlist|אויפֿפאַסונג ליסטע]].\n\nווײַטערע ענדערונגען צו דעם בלאַט און צו זײַן פארבינדענעם רעדן בלאַט וועלן זײַן אויסגערעכנט דארט.",
+       "addedwatchtext-short": "מ'האט צוגעלייגט בלאט \"$1\" צו אײַער אויפפאסן ליסטע.",
        "removewatch": "אַראָפּנעמען פון דער אויפֿפאַסונג ליסטע",
        "removedwatchtext": "דער בלאַט \"[[:$1]]\" איז אָפּגעראַמט געוואָרן פון [[Special:Watchlist|אייער אױפֿפּאַסונג ליסטע]].",
+       "removedwatchtext-short": "מ'האט אראפגענומען בלאט \"$1\" פון אײַער אויפפאסן ליסטע.",
        "watch": "אױפֿפּאַסן",
        "watchthispage": "טוט אױפֿפּאַסן דעם בלאט",
        "unwatch": "אויפֿהערן אויפֿפּאַסן",
        "watchlist-details": "{{PLURAL:$1|$1 בלאט|$1 בלעטער}} אין אייער אויפֿפאסן ליסטע, נישט רעכענען  רעדן בלעטער.",
        "wlheader-enotif": "ע-פאסט מעלדונג ערמעגליכט.",
        "wlheader-showupdated": "בלעטער געענדערט זײַט אײַער לעצטן וויזיט זען געוויזן '''דיק'''.",
+       "wlnote2": "אונטן זענען די ענדערונגען אין די לעצטע  {{PLURAL:$1|שעה|<strong>$1</strong> שעה'ן}}, ביז $2, $3.",
        "wlshowlast": "(ווײַזן די לעצטע $1 שעה'ן | $2 טעג | $3)",
        "watchlist-options": "אויפֿפאַסן ליסטע ברירות",
        "watching": "אויפפאסענדונג…",
        "prot_1movedto2": "[[$1]] אריבערגעפירט צו [[$2]]",
        "protect-badnamespace-title": "אומשיצבארער נאמענטייל",
        "protect-badnamespace-text": "בלעטער אין דעם נאמענטייל קען מען נישט שיצן.",
+       "protect-norestrictiontypes-text": "מען קען נישט שיצן דעם בלאט ווײַל עס זענען נישט פאראן קיין באשרענקונג־טיפן.",
        "protect-norestrictiontypes-title": "נישט־שיצבארער בלאט",
        "protect-legend": "באַשטעטיגן שיץ",
        "protectcomment": "אורזאַך:",
        "contributions-title": "בײַשטײַערונגען פֿון באַניצער $1",
        "mycontris": "בײַשטײַערונגען",
        "contribsub2": "פֿאַר {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "באניצער קאנטע \"$1\" איז נישט איינגעשריבן.",
        "nocontribs": "נישט געטראפן קיין ענדערונגען צוזאמעגעפאסט מיט די קריטעריעס.",
        "uctop": "(לויפֿיק)",
        "month": "ביז חודש:",
        "sp-contributions-newbies-sub": "פאר נייע קאנטעס",
        "sp-contributions-newbies-title": "בײַשטײַערונגען פֿון נײַע באַניצערס",
        "sp-contributions-blocklog": "בלאקירן לאג",
+       "sp-contributions-suppresslog": "אונטערדריקטע באַניצער בײַשטײַערונגען",
        "sp-contributions-deleted": "אויסגעמעקטע באַניצער בײַשטײַערונגען",
        "sp-contributions-uploads": "אַרויפֿלאָדונגען",
        "sp-contributions-logs": "לאגביכער",
        "ipboptions": "2 שעהן:2 hours,\n1 טאָג:1 day,\n3 טעג:3 days,\n1 װאָך:1 week,\n2 װאָכן:2 weeks,\n1 מאָנאַט:1 month,\n3 מאָנאַטן:3 months,\n6 מאָנאַטן:6 months,\n1 יאָר:1 year,\nאויף אייביק:infinite",
        "ipbhidename": "באַהאַלטן באַניצער נאָמען פֿון רעדאַקטירונגען און רשימות",
        "ipbwatchuser": "אויפֿפאַסן דעם באַניצערס באַניצער און רעדן בלעטער",
+       "ipb-disableusertalk": "פארמײַדן דעם באניצער פון רעדאקטירן זײַן אייגענעם רעדן בלאט בשעת ער איז בלאקירט",
+       "ipb-change-block": "ווידער-בלאקירן דעם באניצער מיט די דאזיקע אײַנשטעלונגען",
        "ipb-confirm": "באַשטעטיקן בלאָק",
        "badipaddress": "נישט קיין גוטער IP אַדרעס.",
        "blockipsuccesssub": "בלאק איז דורכגפירט מיט דערפֿאלג",
        "ipb_expiry_temp": "בלאקירן מיט פאַרבאָרגן באַניצער נאָמען מוז זייַן אויף אייביק.",
        "ipb_hide_invalid": "נישט געקענט פֿאַרשטיקן די קאנטע; זי האט {{PLURAL:$1|איין רעדאקטירונג|$1 רעדאַקטירונגען}}.",
        "ipb_already_blocked": "\"$1\" איז שוין בלאקירט",
-       "ipb-needreblock": "$1 ×\90×\99×\96 ×©×\95×\99×\9f ×\91×\9c×\90ק×\99ר×\98. ×¦×\99 ×\95×\95×\99×\9c×\98 ×\90×\99ר ×\98×\95×\99ש×\9f ×\93×\99 ×\91×\90ַצ×\99×\99×\9b× ונגען?",
+       "ipb-needreblock": "$1 ×\90×\99×\96 ×©×\95×\99×\9f ×\91×\9c×\90ק×\99ר×\98. ×¦×\99 ×\95×\95×\99×\9c×\98 ×\90×\99ר ×\98×\95×\99ש×\9f ×\93×\99 ×\90ײַנש×\98×¢×\9cונגען?",
        "ipb-otherblocks-header": "{{PLURAL:$1|אנדער בלאקירונג|אנדערע בלאקירונגען}}",
        "unblock-hideuser": "איר קענט נישט אומבלאקירן דעם באניצער, ווײַל זײַן באַניצער נאָמען איז פֿאַרבארגן.",
        "ipb_cant_unblock": "גרײַז: בלאק ID $1 נישט געפֿונען.\nס'מעגליך שוין געווארן באַפֿרייט.",
        "cant-move-user-page": "איר זענט נישט דערלויבט צו באַוועגן באַניצער בלעטער (אחוץ אונטערבלעטער).",
        "cant-move-to-user-page": "איר זענט נישט דערלויבט צו באַוועגן א בלאַט צו א באַניצער בלאַט (אַחוץ צו א באַניצער אונטערבלאַט).",
        "cant-move-category-page": "איר זענט נישט דערלויבט צו באוועגן קאטעגאריע בלעטער.",
+       "cant-move-to-category-page": "איר זענט נישט ערלויבט צו באוועגן א בלאט צו קאטעגאריע־בלאט.",
        "newtitle": "צו נייעם קעפל:",
        "move-watch": "אויפֿפאַסן אויף דעם בלאַט",
        "movepagebtn": "באַוועגן בלאַט",
        "tooltip-preferences-save": "היטן פרעפֿערענצן",
        "tooltip-summary": "אײַנגעבן א קורצע רעזומע",
        "common.css": "/* CSS געשריבן דא וועט אפילירן און באיינפלוסן אלע סקינס */",
-       "monobook.css": "/* סטייל דא געלייגט וועט באאיינפלוסן דעם Monobook סקין */",
-       "vector.css": "/* CSS געשטעלט דא ווירקט נאר אויפן וועקטאר סקין */",
        "common.js": "/* אלע סקריפטן פון JavaScript דא געשריבן וועט לויפן פאר אלע באנוצער ווען זיי וועלן לאדירן דעם בלאט */",
        "anonymous": "{{PLURAL:$1|אַנאנימער באַניצער| אַנאנימע באַניצערס}} פֿון {{SITENAME}}",
        "siteuser": "באַניצער {{SITENAME}} $1",
        "pageinfo-category-pages": "צאָל בלעטער",
        "pageinfo-category-subcats": "צאָל אונטערקאטעגאריעס",
        "pageinfo-category-files": "צאָל טעקעס",
-       "skinname-monobook": "מאנאבוק",
-       "skinname-vector": "וועקטאר",
        "markaspatrolleddiff": "באצייכענען אלס פאטראלירט",
        "markaspatrolledtext": "באצייכענען בלאט אלס פאטראלירט",
        "markedaspatrolled": "באצייכנט אלס פאטראלירט",
        "newimages-summary": "דער באַזונדערער בלאַט ווײַזט די לעצטע ארויפֿגעלאָדענע טעקעס.",
        "newimages-legend": "פֿילטער",
        "newimages-label": "טעקע נאָמען (אדער אַ טײל דערפֿון):",
+       "newimages-showbots": "ווײַזן ארויפלאדן פון באטן",
        "noimages": "נישטא קיין בילדער.",
        "ilsubmit": "זוכן",
        "bydate": "לויטן דאטום",
        "watchlistedit-raw-done": "אייער אויפֿפאַסונג ליסטע איז געווארן דערהײַנטיקט",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 טיטל איז|$1 טיטלען זענען}} געווען צוגעלייגט:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 טיטל איז|$1 טיטלען זענען}} געווען אַראָפגענומען:",
+       "watchlistedit-clear-legend": "ליידיקן די אויפפאסן ליסטע",
        "watchlistedit-clear-titles": "טיטלען:",
        "watchlisttools-clear": "ליידיקן די אויפפאסן ליסטע",
        "watchlisttools-view": "ווייזן שייכדיגע ענדערונגען",
        "version-version": "(ווערסיע $1)",
        "version-license": "מעדיעוויקי ליצענץ",
        "version-ext-license": "ליצענץ",
+       "version-ext-colheader-name": "פארברייטערונג",
+       "version-ext-colheader-version": "ווערסיע",
+       "version-ext-colheader-license": "ליצענץ",
+       "version-ext-colheader-description": "באַשרײַבונג",
+       "version-ext-colheader-credits": "שרייבער",
        "version-poweredby-others": "אַנדערע",
        "version-poweredby-translators": "translatewiki.net איבערזעצער",
        "version-credits-summary": "מיר ווילן אנערקענען די פֿאלגנדע מענטשן פֿאר זייער בײַשטײַערוג צו [[Special:Version|מעדיעוויקי]].",
        "redirect-lookup": "זוכן:",
        "redirect-value": "ווערט:",
        "redirect-user": "באַניצער־נומער:",
+       "redirect-page": "בלאט נומער",
        "redirect-revision": "בלאט ווערסיע",
        "redirect-file": "טעקע נאמען",
        "redirect-not-exists": "ווערט נישט געטראפן",
        "expand_templates_output": "רעזולטאט",
        "expand_templates_xml_output": "XML אויסגאָב",
        "expand_templates_ok": "אויספֿירן",
+       "expand_templates_remove_comments": "אראפנעמען הערות",
        "expand_templates_preview": "פֿאראויסשטעלונג"
 }
index 0dcc31d..ff7d7c0 100644 (file)
        "qbmyoptions": "Àwọn ojúewé mi",
        "faq": "FAQ",
        "faqpage": "Project:FAQ",
-       "vector-action-addsection": "Àfikún orí-ọ̀rọ̀",
-       "vector-action-delete": "Ìparẹ́",
-       "vector-action-move": "Ìyípòdà",
-       "vector-action-protect": "Àbò",
-       "vector-action-undelete": "Ìmúkúrò ìparẹ́",
-       "vector-action-unprotect": "Ìyípadà àbò",
-       "vector-view-create": "Ṣ'èdá",
-       "vector-view-edit": "Àtúnṣe",
-       "vector-view-history": "Wo ìtàn",
-       "vector-view-view": "Àwòkà",
-       "vector-view-viewsource": "Wo àmìọ̀rọ̀",
        "actions": "Àwọn ìgbéṣe",
        "namespaces": "Àwọn orúkọàyè",
        "variants": "Àwọn oriṣiríṣi",
        "difference-missing-revision": "{{PLURAL:$2|Àtúnyẹ̀wò kan|Àwọn àtúnyẹ̀wò $2}} ìyàtọ̀ yìí ($1) kò {{PLURAL:$2|sí|sí}}.\n\nÈyí ṣẹlẹ̀ nítorí pé ẹ tẹ̀lé àjápọ̀ ìyàtọ̀ tí kò ṣiṣẹ́ mọ́ wá sí ojúewé tó ti jẹ́ píparẹ́.\nẸ̀kúnrẹ́rẹ́ wà nínú [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} àkọọ́lẹ̀ ìparẹ́].",
        "searchresults": "Àwọn èsì àwárí",
        "searchresults-title": "Àwọn èsì àwárí fún \"$1\"",
-       "toomanymatches": "Àwọn ìbáramu ti pọ̀jù, ẹ jọ̀wọ́ ẹ gbìyànjú lọ́nà mìíràn",
        "titlematches": "Àkọlé ojúewé báramu",
        "textmatches": "Ọ̀rọ̀ ojúewé tóbáramu:",
        "notextmatches": "Kò sí ọ̀rọ̀ ojúewé tóbáramu",
        "searchmenu-exists": "'''Ojúewé tó ún jẹ́ \"[[:$1]]\" wà lórí wiki yìí'''",
        "searchmenu-new": "'''Dá ojúewé \"[[:$1]]\" sí orí wiki yìí!'''",
        "searchprofile-articles": "Àwọn ojúewé Àkóónú",
-       "searchprofile-project": "Àwọn ojúewé Ìrànwọ́ àti Iṣẹ́-ọwọ́",
        "searchprofile-images": "Amóhùnmáwòrán",
        "searchprofile-everything": "Èyíkéyìí",
        "searchprofile-advanced": "Onígíga",
        "searchprofile-articles-tooltip": "Ṣàwáàrí nínú $1",
-       "searchprofile-project-tooltip": "Ṣàwáàrí nínú $1",
        "searchprofile-images-tooltip": "Ṣàwáàrí fún faili",
        "searchprofile-everything-tooltip": "Ṣàwáàrí nínú gbogbo àkóónú (pẹ̀lú àwọn ojúewé ọ̀rọ̀)",
        "searchprofile-advanced-tooltip": "Ṣàwáàrí nínú àwọn orúkọàyè pàtó",
        "search-interwiki-default": "èsì $1",
        "search-interwiki-more": "(tókù)",
        "search-relatedarticle": "Tóbáramu",
-       "searcheverything-enable": "Àwárí nínú gbogbo orúkọàyè:",
        "searchrelated": "tóbáramu",
        "searchall": "gbogbo",
        "showingresults": "Ìfihàn nísàlẹ̀ títí dé {{PLURAL:$1|èsì '''1'''|àwọn èsì '''$1'''}} láti ìbẹ̀rẹ̀ ní #'''$2'''.",
        "allowemail": "Ìgbàláyè e-mail látọ̀dọ̀ àwọn oníṣe mìíràn",
        "prefs-searchoptions": "Ṣàwárí",
        "prefs-namespaces": "Àwọn orúkọàyè",
-       "defaultns": "Bíbẹ́ẹ̀kọ́ ṣe àwárí nínú àwọn orúkọàyè yìí:",
        "default": "níbẹ̀rẹ̀",
        "prefs-files": "Àwọn faili",
        "prefs-custom-css": "CSS àkànṣe",
        "recentchanges-label-unpatrolled": "Àtúnṣe yìí kò tí ì jẹ́ onísíṣọ́",
        "recentchanges-label-plusminus": "Iye bytes àtúnṣe sí ìtóbi ojúewé",
        "recentchanges-legend-heading": "'''Ìtumọ̀:'''",
-       "recentchanges-legend-newpage": "(ẹ tún wo [[Special:NewPages|àtòjọ àwọn ojúewé tuntun]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ẹ tún wo [[Special:NewPages|àtòjọ àwọn ojúewé tuntun]])",
        "rcnotefrom": "Àwọn àtúnṣe láti ''''$2''' (títí dé '''$1''' hàn) lábẹ́.",
        "rclistfrom": "Àfihàn àwọn àtúnṣe tuntun nípa bíbẹ̀rẹ̀ láti $3 $2",
        "rcshowhideminor": "$1 àwọn àtúnṣe kékéèké",
index 4c37bd6..43d9d42 100644 (file)
@@ -17,7 +17,9 @@
                        "Yfdyh000",
                        "Cwek",
                        "아라",
-                       "Ktchankt"
+                       "Ktchankt",
+                       "Kc kennylau",
+                       "Mywood"
                ]
        },
        "tog-underline": "連結加底線:",
        "tog-hidepatrolled": "響最近修改度隱藏巡查過嘅編輯",
        "tog-newpageshidepatrolled": "響新頁清單度隱藏巡查過嘅版",
        "tog-extendwatchlist": "展開監視清單去顯示全部更改,唔係淨係最新嘅",
-       "tog-usenewrc": "用強化版最近更改(需要JavaScript)",
+       "tog-usenewrc": "最近修改同監視清單顯示群組修改",
        "tog-numberheadings": "標題自動編號",
        "tog-showtoolbar": "顯示修改工具列",
        "tog-editondblclick": "撳兩下改嘢",
-       "tog-editsectiononrightclick": "可以撳右掣更改個別段落(需要JavaScript)",
-       "tog-watchcreations": "將我開嘅頁加入監視清單",
-       "tog-watchdefault": "將我修改嘅頁加入監視清單",
-       "tog-watchmoves": "將我移動嘅頁加入監視清單",
-       "tog-watchdeletion": "將我刪除嘅頁加入監視清單",
+       "tog-editsectiononrightclick": "可以撳右掣更改個別段落",
+       "tog-watchcreations": "å°\87æ\88\91é\96\8bå\98\85é \81å\90\8cä¸\8aå\82³å\98\85æª\94æ¡\88å\8a å\85¥ç\9b£è¦\96æ¸\85å\96®",
+       "tog-watchdefault": "å°\87æ\88\91ä¿®æ\94¹å\98\85é \81å\90\8cæª\94æ¡\88å\8a å\85¥ç\9b£è¦\96æ¸\85å\96®",
+       "tog-watchmoves": "å°\87æ\88\91移å\8b\95å\98\85é \81å\90\8cæª\94æ¡\88å\8a å\85¥ç\9b£è¦\96æ¸\85å\96®",
+       "tog-watchdeletion": "å°\87æ\88\91å\88ªé\99¤å\98\85é \81å\90\8cæª\94æ¡\88å\8a å\85¥ç\9b£è¦\96æ¸\85å\96®",
        "tog-minordefault": "預設全部編輯做小修改",
        "tog-previewontop": "喺修改欄上方顯示預覽",
        "tog-previewonfirst": "第一次修改時顯示預覽",
-       "tog-enotifwatchlistpages": "當響我張監視清單度嘅頁面有修改時電郵通知我",
+       "tog-enotifwatchlistpages": "當響我張監視清單度嘅頁面同檔案有修改時電郵通知我",
        "tog-enotifusertalkpages": "個人留言版有修改時電郵通知我",
-       "tog-enotifminoredits": "小修改都要電郵通知我",
+       "tog-enotifminoredits": "頁面同檔案小修改都要電郵通知我",
        "tog-enotifrevealaddr": "喺電郵通知信上面話畀人聽我嘅電郵地址",
        "tog-shownumberswatching": "顯示有幾多人監視",
        "tog-oldsig": "現有簽名:",
        "tog-fancysig": "將簽名以維基字對待(冇自動連結)",
-       "tog-uselivepreview": "用即時預覽(需要JavaScript)(實驗緊)",
+       "tog-uselivepreview": "用即時預覽(實驗緊)",
        "tog-forceeditsummary": "我冇入修改註解時通知我",
        "tog-watchlisthideown": "響監視清單度隱藏我嘅編輯",
        "tog-watchlisthidebots": "響監視清單度隱藏機械人嘅編輯",
        "newwindow": "(響新視窗度打開)",
        "cancel": "取消",
        "moredotdotdot": "更多...",
-       "mypage": "我嘅頁",
+       "mypage": "",
        "mytalk": "傾偈",
        "anontalk": "同呢個 IP 傾偈",
        "navigation": "導覽",
        "qbmyoptions": "我嘅選項",
        "faq": "FAQ",
        "faqpage": "Project:FAQ",
-       "vector-action-addsection": "加主題",
-       "vector-action-delete": "剷走",
-       "vector-action-move": "搬",
-       "vector-action-protect": "保護",
-       "vector-action-undelete": "取消剷走",
-       "vector-action-unprotect": "解除保護",
-       "vector-view-create": "開",
-       "vector-view-edit": "改",
-       "vector-view-history": "睇吓歷史",
-       "vector-view-view": "閱",
-       "vector-view-viewsource": "睇吓原始碼",
        "actions": "動作",
        "namespaces": "空間名",
        "variants": "變換",
+       "navigation-heading": "導覽選單",
        "errorpagetitle": "出錯",
        "returnto": "返去$1 。",
        "tagline": "出自{{SITENAME}}",
        "history_short": "歷史",
        "updatedmarker": "我上次來之後嘅修改",
        "printableversion": "可打印版本",
-       "permalink": "永久連結",
+       "permalink": "固定連結",
        "print": "印",
        "view": "去睇",
+       "view-foreign": "用 $1 睇",
        "edit": "改",
+       "edit-local": "改本地說明",
        "create": "開",
+       "create-local": "加本地說明",
        "editthispage": "改呢版",
        "create-this-page": "建立呢頁",
        "delete": "剷走",
        "deletethispage": "剷走呢版",
+       "undeletethispage": "反刪呢一版",
        "undelete_short": "取消剷走$1次修改",
        "viewdeleted_short": "去睇$1次刪除咗嘅修改",
        "protect": "保護",
        "protect_change": "改",
        "protectthispage": "保護呢頁",
-       "unprotect": "解除保護",
-       "unprotectthispage": "解除保護",
+       "unprotect": "保護",
+       "unprotectthispage": "改呢版保護",
        "newpage": "開新頁",
        "talkpage": "討論呢版",
        "talkpagelinktext": "傾偈",
        "articlepage": "睇目錄",
        "talk": "討論",
        "views": "去睇",
-       "toolbox": "工具箱",
+       "toolbox": "架撐",
        "userpage": "去睇用戶頁",
        "projectpage": "去睇專題頁",
        "imagepage": "去睇檔案頁",
        "jumptonavigation": "定向",
        "jumptosearch": "搵嘢",
        "view-pool-error": "對唔住,個伺服器響呢段時間超出咗負荷。\n太多用戶試過去睇呢一版。\n響再睇呢一版之前請等多一陣。\n\n$1",
+       "generic-pool-error": "對唔住,個伺服器響呢段時間超出咗負荷。\n太多用戶試過去睇呢一版。\n響再睇呢一版之前請等多一陣。",
        "pool-timeout": "等死鎖超時",
        "pool-queuefull": "隊池已滿",
        "pool-errorunknown": "未知嘅錯誤",
+       "pool-servererror": "用唔到程序計數服務 ($1)。",
        "aboutsite": "關於{{SITENAME}}",
        "aboutpage": "Project:關於",
-       "copyright": "é\9f¿版度嘅內容係根據$1嘅條款發佈。",
+       "copyright": "é\99¤é\9d\9eå\8f¦å¤\96è¬\9bæ\98\8eï¼\8cé\9f¿å\91¢版度嘅內容係根據$1嘅條款發佈。",
        "copyrightpage": "{{ns:project}}:版權",
        "currentevents": "最近發生嘅事",
        "currentevents-url": "Project:最近發生嘅事",
        "ok": "OK",
        "retrievedfrom": "由 \"$1\" 收",
        "youhavenewmessages": "你有$1($2)。",
-       "newmessageslinkplural": "新訊息",
+       "youhavenewmessagesfromusers": "你有{{PLURAL:$3|另一位用戶|$3 位用戶}}畀你嘅 $1 ($2)。",
+       "youhavenewmessagesmanyusers": "你有好多位用戶畀你嘅 $1 ($2)。",
+       "newmessageslinkplural": "{{PLURAL:$1|一個新訊息|999=新訊息}}",
+       "newmessagesdifflinkplural": "最近{{PLURAL:$1|修改}}",
        "youhavenewmessagesmulti": "你響 $1 有新信",
        "editsection": "編輯",
        "editold": "編輯",
        "page-rss-feed": "\"$1\"嘅RSS Feed",
        "page-atom-feed": "\"$1\"嘅Atom Feed",
        "red-link-title": "$1 (頁面未存在)",
+       "sort-descending": "倒轉排",
+       "sort-ascending": "順序排",
        "nstab-main": "版",
        "nstab-user": "用戶頁",
        "nstab-media": "媒體頁",
        "nospecialpagetext": "<strong>無你所要求嘅特別頁。</strong>\n\n喺[[Special:SpecialPages|{{int:specialpages}}]]有全部用得嘅特別頁。",
        "error": "錯誤",
        "databaseerror": "資料庫錯誤",
+       "databaseerror-text": "資料庫查詢出錯。\n可能係個系統有問題。",
+       "databaseerror-textcl": "資料庫查詢出錯。",
+       "databaseerror-query": "查詢: $1",
+       "databaseerror-function": "功能: $1",
+       "databaseerror-error": "出錯: $1",
        "laggedslavemode": "警告:呢頁可能未包括最新嘅更新。",
        "readonly": "資料庫鎖咗",
        "enterlockreason": "輸入鎖資料庫嘅原因,同埋預計幾耐後會解鎖",
        "formerror": "錯誤:表格交唔到",
        "badarticleerror": "喺呢頁唔可以做呢個動作。",
        "cannotdelete": "頁或檔案 \"$1\" 唔刪得。\n可能已經畀另一位刪咗。",
+       "cannotdelete-title": "刪唔到 \"$1\"",
+       "delete-hook-aborted": "編輯由鈎取消咗。\n佢無畀到解釋。",
+       "no-null-revision": "唔可以對 \"$1\" 開個新嘅空白修改",
        "badtitle": "錯嘅標題",
        "badtitletext": "要求嘅標題唔啱、空白,跨語言或者跨維基連結標題錯誤。亦可能係標題包括咗一個或多過一個字元。",
-       "perfcached": "以下嘅資料係嚟自快取,可能唔係最新嘅。 A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
-       "perfcachedts": "以下嘅資料係嚟自快取,上一次嘅更新喺$1。 A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
+       "perfcached": "以下嘅資料係嚟自快取,可能唔係最新嘅。 最多有{{PLURAL:$1|一個結果|$1個結果}}響快取度。",
+       "perfcachedts": "以下嘅資料係嚟自快取,上一次嘅更新喺$1。 最多有{{PLURAL:$4|一個結果|$4個結果}}響快取度。",
        "querypage-no-updates": "響呢一頁嘅更新現時停用。啲資料將唔會即時更新。",
        "viewsource": "睇吓原始碼",
+       "viewsource-title": "睇 $1 嘅原碼",
        "actionthrottled": "動作已壓制",
        "actionthrottledtext": "基於反垃圾嘢嘅考量,你而家響呢段短時間之內限制咗去做呢一個動作,而你已經超過咗個上限。請響幾分鐘之後再試過。",
-       "protectedpagetext": "呢一頁已經保護咗唔畀改。",
+       "protectedpagetext": "呢一版已經保護咗唔畀改或者做其他動作。",
        "viewsourcetext": "你可以睇吓或者複製呢一頁嘅原始碼:",
-       "protectedinterface": "呢一頁提供軟件嘅介面文字,呢一頁已經保護咗以預防濫用。",
-       "editinginterface": "'''警告:'''你而家編輯緊嘅呢一個用嚟提供介面文字嘅頁面。響呢一頁嘅更改會影響到其他用戶使用中嘅介面外觀。要翻譯,請考慮利用[//translatewiki.net/wiki/Main_Page?setlang=yue translatewiki.net],一個用來為MediaWiki軟件本地化嘅計劃。",
+       "viewyourtext": "你可以睇同複製呢版入面<strong>由你改</strong>嘅原碼:",
+       "protectedinterface": "呢一頁提供軟件嘅介面文字,呢一頁已經保護咗以預防濫用。\n要加或者改所有維基站嘅翻譯,請去 [//translatewiki.net/ translatewiki.net]嘅  MediaWiki 本地化項目。",
+       "editinginterface": "'''警告:'''你而家編輯緊嘅呢一個用嚟提供介面文字嘅頁面。響呢一頁嘅更改會影響到其他用戶使用中嘅介面外觀。要加或者改所有維基站嘅翻譯,請去 [//translatewiki.net/ translatewiki.net]嘅  MediaWiki 本地化項目。",
        "cascadeprotected": "呢一版已經保護咗唔能夠編輯,因為佢係響以下嘅{{PLURAL:$1|一|幾}}頁度包含咗,當中啟用咗\"連串\"保護選項來保護嗰一版: $2",
        "namespaceprotected": "你無權編輯響'''$1'''空間名裏面嘅呢一版。",
+       "customcssprotected": "你無權改呢版CSS,因為佢包含其他用戶嘅個人設定。",
+       "customjsprotected": "你無權改呢版JavaScript,因為佢包含其他用戶嘅個人設定。",
+       "mycustomcssprotected": "你無權改呢版CSS。",
+       "mycustomjsprotected": "你無權改呢版JavaScript。",
+       "myprivateinfoprotected": "你無權改呢版你嘅私人資料。",
+       "mypreferencesprotected": "你無權改呢版你嘅個人設定。",
        "ns-specialprotected": "特別頁係唔可以編輯嘅。",
        "titleprotected": "呢個標題已經俾[[User:$1|$1]]保護咗防止去開。原因係''$2''。",
+       "filereadonlyerror": "改唔到檔案 \"$1\",因為檔案庫 \"$2\" 而家係唯讀。\n\n負責鎖嘅管理員嘅解釋:\"$3\"。",
+       "invalidtitle-knownnamespace": "名域 \"$2\" 同版名 \"$3\" 無效嘅標題",
+       "invalidtitle-unknownnamespace": "未知名域號碼 \"$1\" 同版名 \"$2\" 無效嘅標題",
+       "exception-nologin": "未簽到",
+       "exception-nologin-text": "請[[Special:Userlogin|簽到]]之後先至睇或者改呢版。",
+       "exception-nologin-text-manual": "請$1之後先至睇或者改呢版。",
        "virus-badscanner": "壞設定: 未知嘅病毒掃瞄器: ''$1''",
        "virus-scanfailed": "掃瞄失敗 (代碼 $1)",
        "virus-unknownscanner": "未知嘅防病毒:",
-       "logouttext": "'''你而家已經登出咗。'''\n\n你重可以用匿名身份用{{SITENAME}},又或者<span class='plainlinks'>[$1 重新登入]</span>。\n但係留意某啲頁面可能會繼續話你未登入,除非等你清除瀏覽器嘅快取儲存。",
+       "logouttext": "<strong>你而家已經簽退咗。</strong>\n\n但係留意某啲頁面可能會繼續話你未登入,除非等你清除瀏覽器嘅快取儲存。",
+       "welcomeuser": "歡迎,$1!",
+       "welcomecreation-msg": "你個戶口已經起好。\n唔好唔記得去改改你嘅{{SITENAME}}[[Special:Preferences|喜好設定]]喎。",
        "yourname": "用戶名:",
+       "userlogin-yourname": "用戶名",
+       "userlogin-yourname-ph": "入用戶名",
+       "createacct-another-username-ph": "入用戶名",
        "yourpassword": "密碼:",
+       "userlogin-yourpassword": "密碼",
+       "userlogin-yourpassword-ph": "入密碼",
+       "createacct-yourpassword-ph": "入密碼",
        "yourpasswordagain": "再輸入密碼:",
+       "createacct-yourpasswordagain": "確認密碼",
+       "createacct-yourpasswordagain-ph": "入多次密碼",
        "remembermypassword": "響呢個瀏覽器度記住我嘅登入資料 (最高維持$1{{PLURAL:$1|日|日}})",
+       "userlogin-remembermypassword": "記住我有簽到",
+       "userlogin-signwithsecure": "用安全連線",
        "yourdomainname": "你嘅網域:",
+       "password-change-forbidden": "你唔可以改呢個維基站嘅密碼。",
        "externaldberror": "驗證資料庫出錯,或者唔允許你更新你嘅外部帳戶。",
        "login": "登入",
        "nav-login-createaccount": "登入/開新戶口",
        "logout": "登出",
        "userlogout": "登出",
        "notloggedin": "未登入",
+       "userlogin-noaccount": "重未有戶口?",
+       "userlogin-joinproject": "入{{SITENAME}}",
        "nologin": "重未有戶口? $1。",
        "nologinlink": "開個新戶口",
        "createaccount": "開戶口",
        "gotaccountlink": "登入",
        "userlogin-resetlink": "唔記得簽到資料?",
        "userlogin-resetpassword-link": "唔記得密碼?",
+       "userlogin-helplink2": "幫我簽到",
+       "userlogin-loggedin": "您目前用{{GENDER:$1|$1}}身份簽到,\n請用下面表格用另一身份簽到。",
        "userlogin-createanother": "開過個戶口",
        "createacct-emailrequired": "電郵地址",
-       "createaccountmail": "用電郵",
+       "createacct-emailoptional": "電郵地址(可以唔填)",
+       "createacct-email-ph": "入電郵地址",
+       "createacct-another-email-ph": "入電郵地址",
+       "createaccountmail": "將臨時密碼送到指定電郵地址",
+       "createacct-realname": "真名(可以唔填)",
        "createaccountreason": "原因:",
+       "createacct-reason": "原因",
        "createacct-reason-ph": "開過個戶口嘅原因",
+       "createacct-captcha": "安全檢查",
+       "createacct-imgcaptcha-ph": "入你下面見到嘅字",
        "createacct-submit": "開戶口",
+       "createacct-another-submit": "開過個戶口",
+       "createacct-benefit-heading": "{{SITENAME}}係由你同其他人貢獻。",
+       "createacct-benefit-body1": "{{PLURAL:$1|次編輯|次編輯}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|版|版}}",
+       "createacct-benefit-body3": "最近{{PLURAL:$1|貢獻者|貢獻者}}",
        "badretype": "你入嘅密碼唔一致。",
-       "userexists": "你入嘅用戶名已經有人用咗唔該揀過個名啦。",
+       "userexists": "你入嘅用戶名已經有人用咗。\n唔該揀過個名啦。",
        "loginerror": "登入錯誤",
+       "createacct-error": "開戶口出錯",
        "createaccounterror": "開唔到戶口:$1",
        "nocookiesnew": "已經開咗戶口,但你未登入。 {{SITENAME}} 要用 cookies 嚟登入。你已經熄咗佢。請你開咗再試。",
        "nocookieslogin": "{{SITENAME}} 登入要開 cookies。熄咗佢。請你開咗再試。",
        "noemailcreate": "你需要提供一個有效嘅電郵地址",
        "passwordsent": "新嘅密碼已經寄咗畀呢位用戶 \"$1\" 嘅電郵地址。收到之後請重新登入。",
        "blocked-mailpassword": "你嘅IP地址被鎖住,唔可以用密碼復原功能以防止濫用。",
-       "eauthentsent": "確認電郵已經傳送到指定嘅電郵地址。喺其它嘅郵件傳送到呢個戶口之前,你需要按電郵嘅指示,嚟確認呢個戶口真係屬於你嘅。",
+       "eauthentsent": "確認電郵已經傳送到指定嘅電郵地址。\n喺其它嘅郵件傳送到呢個戶口之前,你需要按電郵嘅指示,嚟確認呢個戶口真係屬於你嘅。",
        "throttled-mailpassword": "一個密碼提醒已經響$1{{PLURAL:$1|個鐘頭}}之前發送咗。為咗防止濫用,響$1{{PLURAL:$1|個鐘頭}}之內只可以發送一個密碼提醒。",
        "mailerror": "傳送電郵錯誤: $1",
        "acct_creation_throttle_hit": "利用你呢個IP地址嘅訪客響上一日已經開咗 $1 個戶口,係響呢段時間嘅上限。\n結果,利用呢個IP地址嘅訪客唔可以響呢段時間再開多個戶口。",
        "emailauthenticated": "你嘅電郵地址已經喺 $2 $3 確認。",
-       "emailnotauthenticated": "你嘅電郵地址重未確認。 任何傳送電郵嘅功能都唔會運作。",
+       "emailnotauthenticated": "你嘅電郵地址重未確認。\n任何傳送電郵嘅功能都唔會運作。",
        "noemailprefs": "響你嘅喜好設定度設置一個電郵地址令到呢啲功能開始運作。",
        "emailconfirmlink": "確認你嘅電郵地址",
        "invalidemailaddress": "呢個電郵地址嘅格式唔啱,所以接受唔到。請輸入一個啱格式嘅地址,或清咗嗰個空格。",
+       "cannotchangeemail": "你唔改得呢個維基站嘅戶口電郵地址。",
+       "emaildisabled": "呢個站送唔到電郵出去。",
        "accountcreated": "戶口已經建立咗",
-       "accountcreatedtext": "$1嘅戶口起好咗。",
+       "accountcreatedtext": "[[{{ns:User}}:$1|$1]]([[{{ns:User talk}}:$1|討論]])嘅戶口起好咗。",
        "createaccount-title": "響{{SITENAME}}度開個新戶口",
        "createaccount-text": "有人響{{SITENAME}}度用咗你個電郵開咗個名叫 \"$2\" 嘅新戶口 ($4),密碼係 \"$3\" 。你應該而家登入,改埋個密碼。\n\n如果個戶口係開錯咗嘅話,你可以唔埋呢篇信。",
-       "login-throttled": "你已經試咗太多次登入動作。請等多一陣再試過。",
+       "login-throttled": "你已經試咗太多次簽到動作。\n請等$1再試過。",
+       "login-abort-generic": "你簽到失敗",
        "loginlanguagelabel": "語言:$1",
        "suspicious-userlogout": "你去登出嘅要求已經拒絕咗,因為佢可能由壞咗嘅瀏覽器或者快取代理傳送。",
+       "createacct-another-realname-tip": "真名可以唔填。\n如果你畀埋佢,有需要嘅時候會用佢來標示你嘅工夫。",
+       "pt-login": "簽到",
+       "pt-login-button": "簽到",
        "pt-createaccount": "開戶口",
+       "pt-userlogout": "簽走",
        "php-mail-error-unknown": "響 PHP 嘅 mail() 參數度出現咗未知嘅錯誤",
+       "user-mail-no-addy": "試過唔用電郵地址去送出電郵。",
+       "user-mail-no-body": "試過無寫或者太短嘅內文去送出電郵。",
        "changepassword": "改密碼",
-       "resetpass_announce": "你已經用咗一個臨時電郵碼登入。要完成登入,你一定要響呢度定一個新嘅密碼:",
+       "resetpass_announce": "要完成簽到,你一定要響呢度定一個新嘅密碼:",
        "resetpass_text": "<!-- 響呢度加入文字 -->",
        "resetpass_header": "改戶口密碼",
        "oldpassword": "舊密碼:",
        "newpassword": "新密碼:",
        "retypenew": "打多次新密碼:",
        "resetpass_submit": "設定密碼同登入",
-       "changepassword-success": "你嘅密碼已經成功噉改咗!\n而家幫你登入緊...",
+       "changepassword-success": "你嘅密碼已經成功噉改咗!",
+       "changepassword-throttled": "你已經試咗太多次簽到動作。\n請等$1再試過。",
        "resetpass_forbidden": "唔可以更改密碼",
        "resetpass-no-info": "你一定要登入咗去直接入來呢一版。",
        "resetpass-submit-loggedin": "改密碼",
        "resetpass-submit-cancel": "取消",
        "resetpass-wrong-oldpass": "無效嘅臨時或現有嘅密碼。\n你可能已經成功咁更改你嘅密碼,又或者重新請求過一個新嘅臨時密碼。",
+       "resetpass-recycled": "請你設過個同而家唔同嘅密碼。",
+       "resetpass-temp-emailed": "你用電郵入面嘅臨時密碼簽到。\n要完成簽到動作,就要設過個新密碼:",
        "resetpass-temp-password": "臨時密碼:",
+       "resetpass-abort-generic": "改密碼嘅動作已經畀擴充套件停咗。",
+       "resetpass-expired": "你個密碼經已過期。請設過個新密碼。",
+       "resetpass-expired-soft": "你個密碼經已過期要設過。請揀個新密碼,或者去\"{{int:resetpass-submit-cancel}}\" 轉頭再設過。",
+       "resetpass-validity-soft": "你個密碼無效: $1\n\n請揀個新密碼,或者去\"{{int:resetpass-submit-cancel}}\" 轉頭再設過。",
        "passwordreset": "密碼重設",
+       "passwordreset-text-one": "填好呢份表格去申請將臨時密碼經電郵送畀你。",
+       "passwordreset-text-many": "{{PLURAL:$1|填其中一欄去申請將臨時密碼經電郵送畀你。}}",
        "passwordreset-legend": "重設密碼",
+       "passwordreset-disabled": "呢個維基站無得設過密碼。",
+       "passwordreset-emaildisabled": "呢個維基站無得傳送電郵。",
        "passwordreset-username": "用戶名:",
        "passwordreset-domain": "域名:",
+       "passwordreset-capture": "睇電郵內容?",
+       "passwordreset-capture-help": "如果揀呢度,電郵連臨時密碼金向你顯示,同時會送畀用戶。",
        "passwordreset-email": "電郵地址:",
+       "passwordreset-emailtitle": "{{SITENAME}}嘅戶口資料",
        "passwordreset-emailelement": "用戶名:$1\n臨時密碼:$2",
+       "passwordreset-emailsent": "密碼重設電郵經已送出。",
+       "passwordreset-emailsent-capture": "密碼重設電郵經已送出,下面有顯示。",
+       "passwordreset-emailerror-capture": "密碼重設電郵經已送出,下面有顯示,但送畀{{GENDER:$2|user}}時失敗: $1",
        "changeemail": "改電郵地址",
+       "changeemail-header": "改戶口電郵地址",
+       "changeemail-text": "填呢份表去改戶口電郵地址。你需要入密碼確認改動。",
+       "changeemail-no-info": "你一定要簽到咗去直接入來呢一版。",
+       "changeemail-oldemail": "而家個電郵地址:",
+       "changeemail-newemail": "新電郵地址:",
+       "changeemail-none": "(冇)",
+       "changeemail-password": "你{{SITENAME}}個密碼:",
        "changeemail-submit": "轉電郵",
        "changeemail-cancel": "取消",
        "changeemail-throttled": "你試咗登入太多次,請喺$1後再試過。",
+       "resettokens": "重設密匙",
+       "resettokens-text": "您可以重設有關你戶口私隱資料嘅密匙。\n\n如果你唔小心洩漏密匙,或者戶口畀人入侵,就要重設密匙。",
+       "resettokens-no-tokens": "呢度無密匙可以重設。",
+       "resettokens-legend": "重設密匙",
+       "resettokens-tokens": "密匙:",
+       "resettokens-token-label": "$1 (而家個值:$2)",
+       "resettokens-watchlist-token": "訂[[Special:Watchlist|監視清單]] Atom/RSS 嘅密匙",
+       "resettokens-done": "密匙已經重設。",
+       "resettokens-resetbutton": "重設指定密匙",
        "bold_sample": "粗體字",
        "bold_tip": "粗體字",
        "italic_sample": "斜體字",
        "loginreqlink": "登入",
        "loginreqpagetext": "你一定$1去睇其它嘅頁面。",
        "accmailtitle": "密碼寄咗喇。",
-       "accmailtext": "「[[User talk:$1|$1]]」嘅隨機產生密碼已經寄咗去 $2。\n\n呢個新戶口嘅密碼可以響登入咗之後嘅''[[Special:ChangePassword|改密碼]]''版度改佢。",
+       "accmailtext": "「[[User talk:$1|$1]]」嘅隨機產生密碼已經寄咗去 $2。\n\n呢個密碼可以響簽到咗之後嘅<em>[[Special:ChangePassword|改密碼]]</em> 版度改佢。",
        "newarticle": "(新)",
        "newarticletext": "你連連過嚟嘅頁面重未存在。\n要起版新嘅,請你喺下面嗰格度輸入。(睇睇[$1 自助版]拎多啲資料。)\n如果你係唔覺意嚟到呢度,撳一次你個瀏覽器'''返轉頭'''個掣。",
        "anontalkpagetext": "----''呢度係匿名用戶嘅討論頁,佢可能係重未開戶口,或者佢重唔識開戶口。我哋會用數字表示嘅IP地址嚟代表佢。一個IP地址係可以由幾個用戶夾來用。如果你係匿名用戶,同覺得呢啲留言係同你冇關係嘅話,唔該去[[Special:UserLogin/signup|開一個新戶口]]或[[Special:UserLogin|登入]],避免喺以後嘅留言會同埋其它用戶混淆。''",
        "userpage-userdoesnotexist": "用戶戶口\"<nowiki>$1</nowiki>\"重未開。請響䦒/編輯呢版之前先檢查一下。",
        "userpage-userdoesnotexist-view": "用戶戶口\"$1\"重未開。",
        "blocked-notice-logextract": "呢位用戶而家被封鎖緊。\n下面有最近嘅封鎖紀錄以供參考:",
-       "clearyourcache": "'''注意:喺儲存之後,你可能要先略過你嘅瀏覽器快取去睇到更改。'''\n'''Mozilla / Firefox / Safari:''' 㩒住''Shift''掣再撳''重新載入'',又或者㩒''Ctrl-F5''或者''Ctrl-R''(喺Mac㩒''Command-R''掣);\n'''Konqueror:''' 就咁以撳個''重載''掣,又或者㩒''F5'';\n'''Opera:'''喺''工具→喜好設定''之中清佢哋嘅快取,又或者㩒''Alt-F5'';\n'''Internet Explorer:''' 㩒住''Ctrl''掣再撳''重新整理'',又或者㩒''Ctrl-F5''掣。",
+       "clearyourcache": "<strong>注意</strong>:喺儲存之後,你可能要先略過你嘅瀏覽器快取去睇到更改。\n*<strong>Firefox / Safari:</strong> 㩒住<em>Shift<em>掣再撳<em>重新載入</em>,又或者㩒<em>Ctrl-F5</em>或者<em>Ctrl-R</em>(喺Mac㩒<em>Command-R</em>掣);\n*<strong>Google Chrome:</strong> 㩒<em>Ctrl-Shift-R</em>(喺Mac㩒<em>Command-R</em>掣);\n*<strong>Internet Explorer:</strong> 㩒住<em>Ctrl</em>掣再撳<em>重新整理</em>,又或者㩒<em>Ctrl-F5</em>掣;\n*<strong>Opera:</strong>喺<em>工具→喜好設定</em>之中清佢哋嘅快取。",
        "usercssyoucanpreview": "'''提示:'''響儲存前,用「{{int:showpreview}}」個掣嚟測試你嘅新CSS。",
        "userjsyoucanpreview": "'''提示:'''響儲存前,用「{{int:showpreview}}」個掣嚟測試你嘅新JavaScript。",
        "usercsspreview": "'''記住你而家只係預覽緊你嘅用戶CSS樣式表。'''\n'''佢嘅內容重未儲存!'''",
        "token_suffix_mismatch": "'''因為你嘅用戶端度嘅編輯幣整壞咗一啲標點符號字元,你嘅編輯已經拒絕咗。'''個編輯已經拒絕,以防止嗰版嘅文字損毀。\n當你響度用緊一啲好多臭蟲,以網絡為主嘅匿名代理服務。",
        "edit_form_incomplete": "'''編輯表格嘅某個部份同server唔夾,請檢查多次你嘅編輯同埋再試多次。'''",
        "editing": "而家喺度編輯$1",
+       "creating": "開版$1",
        "editingsection": "而家喺度編輯$1 (小節)",
        "editingcomment": "而家喺度編輯$1 (新小節)",
        "editconflict": "編輯衝突:$1",
        "yourdiff": "差異",
        "copyrightwarning": "請留意喺{{SITENAME}}度,所有喺呢度嘅貢獻會被考慮到喺$2之下發出(睇$1有更詳細嘅資訊)。如果你係唔想你編輯嘅文字無喇喇咁被分發,咁就唔好喺呢度遞交。\n\n你亦都要同我哋保證啲文字係你自己寫嘅,或者係由公有領域或相似嘅自由資源複製落嚟。\n'''喺未有任何許可嘅情況之下千祈唔好遞交有版權嘅作品!'''",
        "copyrightwarning2": "請留意喺{{SITENAME}}度,所有嘅貢獻可能會被其他嘅貢獻者編輯、修改,或者刪除。如果你係唔想你編輯嘅文字無喇喇咁被編輯,咁就唔好喺呢度遞交。\n\n你亦都要同我哋保證啲文字係你自己寫嘅,或者係由公有領域或相似嘅自由資源複製落嚟(睇$1有更詳細嘅資訊)。\n'''喺未有任何許可嘅情況之下千祈唔好遞交有版權嘅作品!'''",
-       "longpageerror": "'''錯誤:你所遞交嘅文字係有 $1 kilobytes 咁長,係長過最大嘅 $2 kilobytes。'''儲唔到你遞交嘅文字。",
-       "readonlywarning": "'''錯誤:料庫已經鎖住咗,以便定期保養。而家你唔可以儲起你嘅編輯。'''你可以儲啲文字落一份文字檔先。\n\n管理員嘅解釋: $1",
+       "longpageerror": "<strong>出錯:你所遞交嘅文字係有 {{PLURAL:$1|1 KB|$1 KB}} 咁長,長過最大嘅 {{PLURAL:$2|1 KB|$2 KB}}。</strong>\n儲唔到你遞交嘅文字。",
+       "readonlywarning": "<strong>警告:資料庫已經鎖住咗去做定期保養。而家你唔可以儲起你嘅編輯。</strong>\n\n你可以儲啲文字落一份文字檔先。\n\n管理員嘅解釋: $1",
        "protectedpagewarning": "'''警告:呢版已經受到保護,只有管理員權限嘅用戶先至可以改。'''\n最近嘅日誌響下面提供以便參考:",
        "semiprotectedpagewarning": "'''注意:'''呢一頁已經保護咗,只有已經註冊嘅用戶先至可以改。\n最近嘅日誌響下面提供以便參考:",
        "cascadeprotectedwarning": "'''警告:'''呢一頁已經保護咗,只有管理員權限嘅用戶先至可以改,因為佢係響以下連串保護嘅{{PLURAL:$1|一|幾}}頁度包含咗:",
        "nocreate-loggedin": "你並無許可權去開新版。",
        "sectioneditnotsupported-title": "唔支援逐改段",
        "sectioneditnotsupported-text": "呢版唔支援逐改段。",
-       "permissionserrors": "權限錯誤",
+       "permissionserrors": "權限出錯",
        "permissionserrorstext": "根據下面嘅{{PLURAL:$1|原因|原因}},你並無權限去做呢樣嘢:",
        "permissionserrorstext-withaction": "根據下面嘅{{PLURAL:$1|原因|原因}},你並無權限去做$2:",
        "recreate-moveddeleted-warn": "'''警告: 你而家重開一版係先前曾經刪除過嘅。'''\n\n你應該要考慮吓繼續編輯呢一版係唔係適合嘅。\n為咗方便起見,呢一版嘅刪除同搬版記錄已經響下面提供:",
        "edit-gone-missing": "唔能夠更新頁。\n佢可能啱啱刪除咗。",
        "edit-conflict": "編輯衝突。",
        "edit-no-change": "你嘅編輯已經略過,因為文字無改過。",
+       "postedit-confirmation-created": "呢版經已開咗。",
+       "postedit-confirmation-restored": "呢版經已恢復咗。",
+       "postedit-confirmation-saved": "呢版經已儲存咗。",
        "edit-already-exists": "唔可以開一新版。\n佢已經存在。",
+       "defaultmessagetext": "預設訊息文字",
        "editwarning-warning": "離開呢一版會令到你嘅修改唔見咗。\n你可以響你嘅喜好設定嘅\"{{int:prefs-editing}}\"小節度停用呢個警告。",
        "expensive-parserfunction-warning": "警告: 呢一版有太多耗費嘅語法功能呼叫。\n\n佢應該少過$2次呼叫,佢而家係$1次呼叫。",
        "expensive-parserfunction-category": "響版度有太多嘅耗費嘅語法功能呼叫",
        "diff-multi-manyusers": "(由$2位更多用戶所做嘅$1個中途修訂冇顯示到)",
        "searchresults": "搵嘢結果",
        "searchresults-title": "對\"$1\"嘅搵嘢結果",
-       "toomanymatches": "太多嘅配合搵到,請試吓一個唔同嘅查詢",
        "titlematches": "頁面標題符合",
        "textmatches": "頁面文字符合",
        "notextmatches": "冇頁面文字符合",
        "searchmenu-exists": "'''響呢個wiki度有一版叫做\"[[:$1]]\"。'''",
        "searchmenu-new": "'''響呢個wiki度開呢版\"[[:$1]]\"!'''",
        "searchprofile-articles": "內容頁",
-       "searchprofile-project": "幫手同計劃頁",
        "searchprofile-images": "多媒體",
        "searchprofile-everything": "全部嘢",
        "searchprofile-advanced": "進階",
        "searchprofile-articles-tooltip": "響$1度搵",
-       "searchprofile-project-tooltip": "響$1度搵",
        "searchprofile-images-tooltip": "搵檔案",
        "searchprofile-everything-tooltip": "搵全部嘢(包埋討論版)",
        "searchprofile-advanced-tooltip": "響自定空間名度搵",
        "search-interwiki-default": "$1項結果:",
        "search-interwiki-more": "(更多)",
        "search-relatedarticle": "有關",
-       "searcheverything-enable": "搵全部空間名",
        "searchrelated": "有關",
        "searchall": "全部",
        "showingresults": "'自#'''$2'''起顯示最多'''$1'''個結果。",
        "allowemail": "由其它用戶啟用電子郵件",
        "prefs-searchoptions": "搵嘢選項",
        "prefs-namespaces": "空間名",
-       "defaultns": "否則喺呢啲空間名搵嘢:",
        "default": "預設",
        "prefs-files": "檔案",
        "prefs-custom-css": "自定 CSS",
        "prefs-emailconfirm-label": "電郵確認:",
        "youremail": "電郵:",
        "username": "用戶名:",
-       "uid": "{{GENDER:$1|用戶}}ID:",
        "prefs-memberingroups": "{{PLURAL:$1|一|多}}組嘅成員:",
        "prefs-registration": "註冊時間:",
        "yourrealname": "真名:",
        "action-userrights-interwiki": "編輯響其它wiki用戶嘅權限",
        "action-siteadmin": "鎖同解鎖資料庫",
        "nchanges": "$1次更改",
-       "recentchanges": "æ\9c\80è¿\91æ\9b´æ\94¹",
+       "recentchanges": "æ\9c\80è¿\91æ\94¹é\81\8eå\98\85å\98¢",
        "recentchanges-legend": "最近更改選項",
        "recentchanges-summary": "追蹤對哩一個 wiki 嘅最後更改。",
        "recentchanges-feed-description": "追蹤對哩一個 wiki 度呢個集合嘅最後更改。",
        "logempty": "日誌中冇符合嘅項目。",
        "log-title-wildcard": "搵以呢個文字開始嘅標題",
        "allpages": "所有頁面",
-       "alphaindexline": "$1到$2",
        "nextpage": "下一頁 ($1)",
        "prevpage": "上一頁 ($1)",
        "allpagesfrom": "顯示以下位置開始嘅頁面:",
        "ipblocklist-submit": "搵",
        "ipblocklist-localblock": "本地封鎖",
        "ipblocklist-otherblocks": "其他{{PLURAL:$1|封鎖|封鎖}}",
-       "infiniteblock": "無期",
+       "infiniteblock": "無期",
        "expiringblock": "$1 $2 期滿",
        "anononlyblock": "只限匿名",
        "noautoblockblock": "自動封鎖已經停用",
        "tooltip-preferences-save": "保存設定",
        "tooltip-summary": "輸入一個簡短嘅摘要",
        "common.css": "/* 響呢度放 CSS 碼來改成個網站嘅畫面 */",
-       "cologneblue.css": "/* 響呢度放 CSS 碼去改用戶用嘅科隆藍畫面 */",
-       "monobook.css": "/* 響呢度放 CSS 碼去改用戶用嘅 Monobook 畫面 */",
-       "modern.css": "/* 響呢度放 CSS 碼去改用戶用嘅摩登畫面 */",
-       "vector.css": "/* 響呢度放 CSS 碼去改用戶用嘅域達畫面 */",
        "print.css": "/* 響呢度放 CSS 碼去改打印輸出 */",
        "common.js": "/* 響每一次個頁面載入時,所有用戶都會載入呢度任何嘅JavaScript。 */",
-       "cologneblue.js": "/* 響每一次個頁面載入時,用科隆藍畫面嘅用戶都會載入呢度任何嘅JavaScript */",
-       "monobook.js": "/* 響每一次個頁面載入時,用 Monobook 畫面嘅用戶都會載入呢度任何嘅JavaScript */",
-       "modern.js": "/* 響每一次個頁面載入時,用摩登畫面嘅用戶都會載入呢度任何嘅JavaScript */",
-       "vector.js": "/* 響每一次個頁面載入時,用域達畫面嘅用戶都會載入呢度任何嘅JavaScript */",
        "anonymous": "{{SITENAME}}嘅匿名{{PLURAL:$1|用戶|用戶}}",
        "siteuser": "{{SITENAME}}嘅用戶$1",
        "anonuser": "{{SITENAME}}嘅匿名用戶$1",
        "spam_reverting": "恢復返去最後一個唔包含指去$1嘅連結嘅嗰個修訂。",
        "spam_blanking": "全部版本都含有指去$1嘅連結,留空",
        "simpleantispam-label": "反垃圾檢查。\n'''唔好'''加入呢個!",
-       "skinname-cologneblue": "科隆藍",
-       "skinname-monobook": "MonoBook",
-       "skinname-modern": "摩登",
-       "skinname-vector": "Vector",
        "markaspatrolleddiff": "標示為已巡查嘅",
        "markaspatrolledtext": "標示呢版做查咗嘅",
        "markedaspatrolled": "已經標示做已巡查嘅",
        "sqlite-no-fts": "$1 冇全文搜尋支援",
        "revdelete-restricted": "已經應用限制到操作員",
        "revdelete-unrestricted": "已經拎走對於操作員嘅限制",
-       "rightsnone": "()",
+       "rightsnone": "()",
        "searchsuggest-search": "搵嘢",
        "searchsuggest-containing": "名單傳送緊...",
        "duration-hours": "$1{{PLURAL:$1|個鐘}}",
index 16c064a..62c3efe 100644 (file)
        "category_header": "分类“$1”中的页面",
        "subcategories": "子分类",
        "category-media-header": "分类“$1”中的媒体文件",
-       "category-empty": "''本分类目前未包含页面或媒体文件。''",
+       "category-empty": "<em>本分类目前没有包含页面或媒体文件。</em>",
        "hidden-categories": "{{PLURAL:$1|隐藏分类}}",
        "hidden-category-category": "隐藏分类",
        "category-subcat-count": "{{PLURAL:$2|本分类只有以下子分类。|本分类有以下$1个子分类,共有$2个子分类。}}",
        "qbmyoptions": "我的页面",
        "faq": "常见问题",
        "faqpage": "Project:常见问题",
-       "vector-action-addsection": "添加话题",
-       "vector-action-delete": "删除",
-       "vector-action-move": "移动",
-       "vector-action-protect": "保护",
-       "vector-action-undelete": "还原",
-       "vector-action-unprotect": "更改保护",
-       "vector-view-create": "创建",
-       "vector-view-edit": "编辑",
-       "vector-view-history": "查看历史",
-       "vector-view-view": "阅读",
-       "vector-view-viewsource": "查看源代码",
        "actions": "操作",
        "namespaces": "名字空间",
        "variants": "变种",
        "history_short": "历史",
        "updatedmarker": "更新于我上次访问后",
        "printableversion": "打印版本",
-       "permalink": "永久链接",
+       "permalink": "固定链接",
        "print": "打印",
        "view": "查看",
        "view-foreign": "在$1查看",
        "readonly": "数据库被锁定",
        "enterlockreason": "请输入锁定的原因(包括预计解锁的时间)",
        "readonlytext": "数据库当前被锁定,不能添加新条目或进行其他修改,锁定可能是因为例行的数据库维护,完成后即可恢复正常。\n\n锁定数据库的管理员提供的解释:$1",
-       "missing-article": "数据库找不到预期的页面文字:“$1”$2。\n\n这通常是由于点击了链向旧有差异或历史的链接,而原有修订已被删除导致的。\n\n如果情况不是这样,您可能找到了软件的一个内部错误。请记录下URL地址,并向[[Special:ListUsers/sysop|管理员]]报告。",
+       "missing-article": "数据库找不到预期的页面文字:“$1”$2。\n\n这通常是由于点击了链向旧有差异或历史的链接,而原有版本已被删除导致的。\n\n如果情况不是这样,您可能找到了软件的一个内部错误。请记录下URL地址,并向[[Special:ListUsers/sysop|管理员]]报告。",
        "missingarticle-rev": "(版本#:$1)",
        "missingarticle-diff": "(差异:$1,$2)",
        "readonly_lag": "附属数据库服务器正在将缓存更新到主服务器上,数据库已被自动锁定",
        "cannotdelete": "无法删除页面或图像“$1”。\n它可能已被其他人删除了。",
        "cannotdelete-title": "无法删除“$1”",
        "delete-hook-aborted": "删除被扩展钩子取消。钩子并没有给出解释。",
-       "no-null-revision": "无法创建对\"$1\"页面新的空白修订",
+       "no-null-revision": "无法创建对\"$1\"页面新的空白版本",
        "badtitle": "错误标题",
        "badtitletext": "所请求页面的标题是无效的、不存在,跨语言或跨wiki链接的标题错误。它可能包含一个或更多的不能用于标题的字符。",
        "perfcached": "以下是缓存的数据,可能不是最新的数据。缓存中最多有{{PLURAL:$1|$1条结果}}。",
        "resetpass-temp-emailed": "您通过一个暂时电子邮件发送的代码登录。要完成登录,您必须在此设置一个新密码:",
        "resetpass-temp-password": "临时密码:",
        "resetpass-abort-generic": "密码更改已经被扩展程序中止。",
-       "resetpass-expired": "您的密码已经过期。请设置一个新的密码登录。",
-       "resetpass-expired-soft": "您的密码已过期并且需要重置。请现在选择一个新密码,或单击“{{int:resetpass-submit-cancel}}”以便稍后重置。",
+       "resetpass-expired": "你的密码已经到期。请设置新登录密码。",
+       "resetpass-expired-soft": "你的密码已经到期,需要重置。请现在更换新密码,或单击“{{int:resetpass-submit-cancel}}”以稍后重置。",
        "resetpass-validity-soft": "您的密码无效:$1\n请选择一个新密码,或单击“{{int:resetpass-submit-cancel}}”以稍后重置。",
        "passwordreset": "重置密码",
        "passwordreset-text-one": "请输入你要重置的用户名。",
        "anontalkpagetext": "---- ''这是一个还未建立账户的匿名用户的讨论页, 因此我们只能用IP地址来与他或她联络。该IP地址可能由几名用户共享。如果您是一名匿名用户并认为此页上的评语与您无关,请[[Special:UserLogin/signup|创建新账户]]或[[Special:UserLogin|登录]]以避免在未来与其他匿名用户混淆。''",
        "noarticletext": "本页面目前没有内容。你可以在其他页面中[[Special:Search/{{PAGENAME}}|搜索本页标题]]、<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜索相关日志]或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 编辑本页面]。</span>",
        "noarticletext-nopermission": "本页面目前没有内容。你可以在其他页面中[[Special:Search/{{PAGENAME}}|搜索本页标题]]或<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜索相关日志]</span>,但你没有权限创建本页面。",
-       "missing-revision": "“{{FULLPAGENAME}}”的修订#$1不存在。\n\n这通常是因为进入了一个已被删除的页面的历史链接。\n详细信息可以在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中找到。",
+       "missing-revision": "“{{FULLPAGENAME}}”的版本#$1不存在。\n\n这通常是因为进入了一个已被删除的页面的历史链接。\n详细信息可以在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中找到。",
        "userpage-userdoesnotexist": "用户账户“$1”没有注册。请在创建/编辑本页前检查。",
        "userpage-userdoesnotexist-view": "用户账户“$1”没有被注册。",
        "blocked-notice-logextract": "这位用户目前已被封禁。以下提供最近的封禁日志以供参考:",
        "expansion-depth-exceeded-warning": "页面超过了扩展深度",
        "parser-unstrip-loop-warning": "检测到回圈",
        "parser-unstrip-recursion-limit": "递归超过限制 ($1)",
-       "converter-manual-rule-error": "手动语言转换规则中检测到错误",
+       "converter-manual-rule-error": "手动语言转换规则中检测到错误",
        "undo-success": "该编辑可以被撤销。请检查下面的对比以核实你想要撤销的内容,然后保存下面的更改以完成撤销。",
        "undo-failure": "因存在冲突的中间编辑,本编辑不能撤销。",
        "undo-norev": "该编辑无法撤消,因为它不存在或已被删除。",
        "undo-nochange": "这次编辑似乎已被撤销。",
        "undo-summary": "撤销[[Special:Contributions/$2|$2]]([[User talk:$2|讨论]])的版本$1",
-       "undo-summary-username-hidden": "取消由一匿名用户所作的修订$1",
+       "undo-summary-username-hidden": "取消由一匿名用户所作的版本$1",
        "cantcreateaccounttitle": "无法创建账户",
        "cantcreateaccount-text": "从该IP地址('''$1''')创建账户已被[[User:$3|$3]]禁止。\n\n$3的理由是''$2''",
        "cantcreateaccount-range-text": "从该IP地址段'''$1'''的账户创建已被[[User:$3|$3]]禁止,而这也包括了您的IP地址('''$4''')。\n$3给出的原因是“$2”。",
-       "viewpagelogs": "查看页面的日志",
+       "viewpagelogs": "查看页面的日志",
        "nohistory": "本页面没有编辑历史记录。",
        "currentrev": "最后版本",
        "currentrev-asof": "$1的最后版本",
        "revisionasof": "$1的版本",
-       "revision-info": "$1$2的版本",
+       "revision-info": "{{GENDER:$6|$2}}$1的版本$7",
        "previousrevision": "←上一版本",
        "nextrevision": "下一版本→",
        "currentrevisionlink": "最后版本",
        "cur": "当前",
        "next": "后继",
-       "last": "å\85\88å\89\8d",
+       "last": "å\89\8dä¸\80",
        "page_first": "首页",
        "page_last": "末页",
-       "histlegend": "差异选择:选出需要对比的版本,按“回车键”或下方的按钮进行对比。<br />\n说明:'''({{int:cur}})'''=与最后版本之间的差异,'''({{int:last}})'''=与上一版本之间的差异,'''{{int:minoreditletter}}'''=小编辑。",
+       "histlegend": "差异选择:选中要对比的版本的单选按钮,按Enter键或下方的按钮。<br />\n说明:<strong>({{int:cur}})</strong>=与最后版本之间的差异,<strong>({{int:last}})</strong>=与上一版本之间的差异,<strong>{{int:minoreditletter}}</strong>=小编辑。",
        "history-fieldset-title": "浏览历史",
        "history-show-deleted": "仅已被删除",
        "histfirst": "最旧",
        "rev-deleted-user-contribs": "[用户名或IP地址被删除 - 编辑在贡献中隐藏]",
        "rev-deleted-text-permission": "本页面版本已被'''删除'''。详情请见[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]。",
        "rev-deleted-text-unhide": "本页面版本已被'''删除'''。详情请见[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]。如果你想继续操作,你仍然可以[$1 查看本版本]。",
-       "rev-suppressed-text-unhide": "该页面修订已经被'''监督隐藏'''。在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中可以找到详细的信息。如果您想继续的话,您可以仍然[$1 去查看这次修订]。",
+       "rev-suppressed-text-unhide": "该页面版本已经被'''监督隐藏'''。在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中可以找到详细的信息。如果您想继续的话,您可以仍然[$1 去查看这次版本]。",
        "rev-deleted-text-view": "本页面版本已被'''删除'''。你可以查看它,详情请见[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]。",
-       "rev-suppressed-text-view": "该页面修订已经被'''监督隐藏'''。您可以查看它。在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中可以找到详细的信息。",
+       "rev-suppressed-text-view": "该页面版本已经被'''监督隐藏'''。您可以查看它。在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中可以找到详细的信息。",
        "rev-deleted-no-diff": "你不能查看该差异,因为其中一个版本已被'''删除'''。详情请见[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]。",
        "rev-suppressed-no-diff": "你不能查看该差异,因为其中一个版本已被'''删除'''。",
-       "rev-deleted-unhide-diff": "该差异对比其中的一个修订版本已经被'''删除'''。在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中可以找到更多的信息。如果您想继续的话,您仍然可以[$1 查看这次修订]。",
-       "rev-suppressed-unhide-diff": "该页面的其中一次修订已经被'''监督隐藏'''。\n在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中可以找到更多的资料。如果您想继续的话,您可以仍然[$1 去查看这次修订]。",
-       "rev-deleted-diff-view": "差异对比中的一次修订已被'''删除'''。您可以对比此差异。详细信息可在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中找到。",
-       "rev-suppressed-diff-view": "差异对比中的一次修订已被'''监督隐藏'''。您可以对比此差异。详细信息可在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中找到。",
+       "rev-deleted-unhide-diff": "该差异对比其中的一个版本已经被'''删除'''。在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中可以找到更多的信息。如果您想继续的话,您仍然可以[$1 查看这版本]。",
+       "rev-suppressed-unhide-diff": "该页面的其中一次版本已经被'''监督隐藏'''。\n在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中可以找到更多的资料。如果您想继续的话,您可以仍然[$1 去查看这版本]。",
+       "rev-deleted-diff-view": "差异对比中的一次版本已被'''删除'''。您可以对比此差异。详细信息可在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中找到。",
+       "rev-suppressed-diff-view": "差异对比中的一个版本已被'''监督隐藏'''。您可以对比此差异。详细信息可在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中找到。",
        "rev-delundel": "显示/隐藏",
        "rev-showdeleted": "显示",
        "revisiondelete": "删除/还原版本",
        "revdelete-nooldid-title": "无效目标版本",
-       "revdelete-nooldid-text": "您尚未指定一个目标修订去进行这个功能、\n所指定的修订不存在,或者您尝试去隐藏现时的修订。",
+       "revdelete-nooldid-text": "您尚未指定一个目标版本去进行这个功能、所指定的版本不存在,或者您尝试去隐藏现时的版本。",
        "revdelete-no-file": "指定的文件不存在。",
        "revdelete-show-file-confirm": "确定要查看文件“<nowiki>$1</nowiki>”于$2$3被删除的版本吗?",
        "revdelete-show-file-submit": "是",
        "revdelete-selected-text": "已选择[[:$2]]的$1个版本:",
        "revdelete-selected-file": "已选择文件[[:$2]]的$1个版本:",
        "logdelete-selected": "{{PLURAL:$1|选取的日志项目}}:",
-       "revdelete-text-text": "已删除修订仍将在页面历史中显示,但涉及部分的内容将对公众不可见。",
+       "revdelete-text-text": "已删除版本仍将在页面历史中显示,但涉及部分的内容将对公众不可见。",
        "revdelete-text-file": "已删除文件版本仍将在文件历史中显示,但涉及部分的内容将对公众不可见。",
        "logdelete-text": "已删除日志事件仍将在日志中显示,但涉及部分的内容将对公众不可见。",
        "revdelete-text-others": "在{{SITENAME}}的其他管理员仍将可以访问隐藏内容,并在一定条件下能够通过相同界面取消删除,除非附加条件被设定。",
        "revdelete-confirm": "请确认该操作,明白其后果,并确保该操作符合[[{{MediaWiki:Policy-url}}|方针]]。",
        "revdelete-suppress-text": "阻止应'''仅'''用于以下情况:\n* 潜在的诽谤信息\n* 不合适的个人信息\n*: ''家庭地址、电话号码和社保号码等。''",
        "revdelete-legend": "设置可见性之限制",
-       "revdelete-hide-text": "修订文字",
+       "revdelete-hide-text": "版本文字",
        "revdelete-hide-image": "隐藏文件内容",
        "revdelete-hide-name": "隐藏动作和目标",
        "revdelete-hide-comment": "编辑摘要",
        "revdelete-radio-set": "隐藏",
        "revdelete-radio-unset": "可见",
        "revdelete-suppress": "同时阻止管理员与其他用户查看数据",
-       "revdelete-unsuppress": "在已恢复的修订中移除限制",
+       "revdelete-unsuppress": "在已恢复的版本中移除限制",
        "revdelete-log": "原因:",
        "revdelete-submit": "应用于选中的{{PLURAL:$1|版本}}",
-       "revdelete-success": "<strong>修订版本可见性更新成功。</strong>",
-       "revdelete-failure": "<strong>修订版本可见性无法更新:</strong>\n$1",
+       "revdelete-success": "<strong>版本可见性更新成功。</strong>",
+       "revdelete-failure": "<strong>版本可见性无法更新:</strong>$1",
        "logdelete-success": "'''事件的可见性已经成功设置。'''",
        "logdelete-failure": "'''事件的可见性无法设置:'''\n$1",
        "revdel-restore": "更改可见性",
        "pagehist": "页面历史",
        "deletedhist": "已删除历史",
-       "revdelete-hide-current": "正在隐藏于$1 $2之项目错误:这个是现时的修订,不可以隐藏。",
+       "revdelete-hide-current": "隐藏$1 $2的项出错:这个是当前的版本,不可以隐藏。",
        "revdelete-show-no-access": "正在显示于$1 $2之项目错误:这个项目已经标示为\"已限制\",您对它并无通行权。",
        "revdelete-modify-no-access": "正在更改于$1 $2之项目错误:这个项目已经标示为\"已限制\",您对它并无通行权。",
        "revdelete-modify-missing": "正在更改项目ID $1错误:它在资料库中遗失!",
        "suppressionlog": "监督日志",
        "suppressionlogtext": "该列表列出了管理员隐藏的删除与封禁。另参见[[Special:BlockList|封禁列表]]查询当前的封禁列表。",
        "mergehistory": "合并页面历史",
-       "mergehistory-header": "这一页可以让您将来源页面的修订历史合并到新页面中去。\n请确保此次更改能继续保持历史页面的连续性。",
-       "mergehistory-box": "合并两个页面的修订历史:",
+       "mergehistory-header": "这一页可以让您将来源页面的版本合并到新页面中去。请确保此次更改能继续保持历史页面的连续性。",
+       "mergehistory-box": "合并两个页面的版本历史:",
        "mergehistory-from": "来源页面:",
        "mergehistory-into": "目的页面:",
        "mergehistory-list": "可以合并的编辑历史",
        "mergehistory-empty": "没有可以合并的版本。",
        "mergehistory-success": "[[:$1]]的$3个版本成功合并至[[:$2]]。",
        "mergehistory-fail": "不可以进行历史合并,请重新检查该页面以及时间参数。",
+       "mergehistory-fail-toobig": "由于超出$1的限制而无法执行历史合并,$1个版本将被移动。",
        "mergehistory-no-source": "来源页面$1不存在。",
        "mergehistory-no-destination": "目的页面$1不存在。",
        "mergehistory-invalid-source": "来源页面必须是一个有效的标题。",
        "diff-multi-sameuser": "(未显示同一用户的$1个中间版本)",
        "diff-multi-otherusers": "(未显示{{PLURAL:$1|另一用户|$2个用户}}的{{PLURAL:$1|$1个中间版本}})",
        "diff-multi-manyusers": "(未显示超过$2个用户的$1个中间版本)",
-       "difference-missing-revision": "此差异对比的{{PLURAL:$2|一个修订|$2个修订}}($1){{PLURAL:$2|没有}}找到。\n\n这通常是因为进入了一个已被删除的页面的修订差异对比链接。\n详细信息可以在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中找到。",
+       "difference-missing-revision": "此差异对比的{{PLURAL:$2|$2个版本}}($1){{PLURAL:$2|没有}}找到。\n\n这通常是因为进入了一个已被删除的页面的版本差异对比链接。\n详细信息可以在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中找到。",
        "searchresults": "搜索结果",
        "searchresults-title": "“$1”的搜索结果",
-       "toomanymatches": "找到的匹配结果过多,请尝试不同的查询词",
        "titlematches": "页面标题匹配",
        "textmatches": "页面内容匹配",
        "notextmatches": "没有页面内容匹配",
        "search-interwiki-default": "来自$1的结果:",
        "search-interwiki-more": "(更多)",
        "search-relatedarticle": "相关",
-       "searcheverything-enable": "在所有名字空间中搜索",
        "searchrelated": "相关",
        "searchall": "所有",
        "showingresults": "下面显示从第'''$2'''条结果开始的'''$1'''条结果。",
        "showingresultsinrange": "下面显示区间#<strong>$2</strong>至#<strong>$3</strong>的<strong>$1</strong>条结果。",
        "showingresultsnum": "下面显示从第'''$2'''条结果开始的'''$3'''条结果。",
-       "showingresultsheader": "关于'''$4'''的{{PLURAL:$5|第'''$1'''条结果,共'''$3'''条结果|第'''$1~$2'''条结果,共'''$3'''条结果}}",
+       "showingresultsheader": "关于<strong>$4</strong>的{{PLURAL:$5|第<strong>$1</strong>条结果,共<strong>$3</strong>条结果|第<strong>$1 - $2</strong>条结果,共<strong>$3</strong>条结果}}",
        "search-nonefound": "找不到和查询相匹配的结果。",
        "powersearch-legend": "高级搜索",
        "powersearch-ns": "搜索名字空间:",
        "powersearch-togglelabel": "选择:",
        "powersearch-toggleall": "全选",
        "powersearch-togglenone": "全不选",
+       "powersearch-remember": "记住选择用于以后搜索",
        "search-external": "外部搜索",
        "searchdisabled": "{{SITENAME}}的搜索已被禁用。您可以暂时使用搜索引擎进行搜索,须注意他们索引的{{SITENAME}}内容可能不是最新的。",
        "search-error": "搜索时发生错误:$1",
        "allowemail": "启用来自其他用户的电子邮件",
        "prefs-searchoptions": "搜索",
        "prefs-namespaces": "名字空间",
-       "defaultns": "否则在这些名字空间中搜索:",
        "default": "默认",
        "prefs-files": "文件",
        "prefs-custom-css": "自定义CSS",
        "prefs-help-gender": "该设置为可选项。软件根据该值在称呼您及对他人提及您时使用适当的语法性别。该信息会被公开。",
        "email": "电子邮件",
        "prefs-help-realname": "真实姓名是选填项目。如果你选择提供它,它将会用于贡献署名。",
-       "prefs-help-email": "电子邮件是可选项,但是在您忘记密码时很有用。",
+       "prefs-help-email": "电子邮件地址是选填项,但是当你忘记你的密码要重置密码时,需要该信息。",
        "prefs-help-email-others": "您也可以选择让其他用户通过您的用户页或讨论页上的链接用电子邮件联系您。其他用户联系您时您的电子邮件地址不会显示。",
        "prefs-help-email-required": "电子邮件地址是必填项目。",
        "prefs-info": "基本信息",
        "recentchanges-label-unpatrolled": "该编辑尚未巡查",
        "recentchanges-label-plusminus": "该页面字节数的前后变化",
        "recentchanges-legend-heading": "'''说明:'''",
-       "recentchanges-legend-newpage": "(见[[Special:NewPages|新页面列表]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}}(见[[Special:NewPages|新页面列表]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "下面是<strong>$2</strong>之后的更改(最多显示<strong>$1</strong>个)。",
        "rclistfrom": "显示$3 $2之后的新更改",
        "upload-curl-error6": "无法访问URL",
        "upload-curl-error6-text": "无法访问提供的URL。请检查该URL是否正确,及其网站是否在线。",
        "upload-curl-error28": "上传超时",
-       "upload-curl-error28-text": "ç«\99ç\82¹å\93\8dåº\94æ\97¶é\97´è¿\87é\95¿ã\80\82请æ£\80æ\9f¥æ­¤ç½\91ç«\99ç\9a\84访é\97®æ\98¯å\90¦æ­£å¸¸ï¼\8cè¿\87ä¸\80ä¼\9aå\86\8dè¿\9bè¡\8cå°\9dè¯\95ã\80\82æ\82¨å\8f¯è\83½é\9c\80è¦\81å\9c¨ç½\91ç»\9c访é\97®ç©ºé\97²æ\97¶é\97´å\86\8d次è¿\9bè¡\8c尝试。",
+       "upload-curl-error28-text": "ç½\91ç«\99å\93\8dåº\94æ\97¶é\97´è¿\87é\95¿ã\80\82请æ£\80æ\9f¥ç½\91ç«\99æ\98¯å\90¦æ­£å¸¸ï¼\8c并ç¨\8då\90\8eé\87\8dè¯\95ã\80\82ä½ å\8f¯è\83½æ\83³è¦\81å\9c¨ç½\91ç»\9c空é\97²æ\97尝试。",
        "license": "授权协议:",
        "license-header": "授权协议",
        "nolicense": "未选定",
        "brokenredirectstext": "以下重定向链接至不存在的页面:",
        "brokenredirects-edit": "编辑",
        "brokenredirects-delete": "删除",
-       "withoutinterwiki": "无语言链接页面",
+       "withoutinterwiki": "无语言链接页面",
        "withoutinterwiki-summary": "以下页面没有链接至其它语言版本。",
        "withoutinterwiki-legend": "前缀",
        "withoutinterwiki-submit": "显示",
        "uncategorizedtemplates": "未归类模板",
        "unusedcategories": "未使用分类",
        "unusedimages": "未使用文件",
-       "popularpages": "热页面",
+       "popularpages": "热页面",
        "wantedcategories": "需要的分类",
        "wantedpages": "需要的页面",
        "wantedpages-badtitle": "在结果组上的无效标题:$1",
        "wantedtemplates": "需要的模板",
        "mostlinked": "最多链接页面",
        "mostlinkedcategories": "最多链接分类",
-       "mostlinkedtemplates": "最多链接模板",
+       "mostlinkedtemplates": "最多嵌入页面",
        "mostcategories": "有最多分类的页面",
        "mostimages": "最多链接文件",
        "mostinterwikis": "有最多跨wiki的页面",
        "protectedpagesempty": "在这些参数下没有页面正在保护。",
        "protectedpages-timestamp": "时间戳",
        "protectedpages-page": "页面",
-       "protectedpages-expiry": "到期",
+       "protectedpages-expiry": "终止时间",
        "protectedpages-performer": "保护用户",
        "protectedpages-params": "保护参数",
        "protectedpages-reason": "原因",
        "listusers-editsonly": "只显示有编辑的用户",
        "listusers-creationsort": "按创建日期排序",
        "listusers-desc": "降序排序",
-       "usereditcount": "$1次编辑",
+       "usereditcount": "$1个{{PLURAL:$1|编辑}}",
        "usercreated": "{{GENDER:$3|创建}}于$1 $2",
        "newpages": "新页面",
        "newpages-username": "用户名:",
        "cachedspecial-viewing-cached-ts": "您正浏览此页的缓存版本,不一定是最新的完整版本。",
        "cachedspecial-refresh-now": "查看最新的。",
        "categories": "分类",
-       "categoriespagetext": "以下{{PLURAL:$1|分类包含}}页面或媒体文件。[[Special:UnusedCategories|未使用分类]]不显示在这里。另请见[[Special:WantedCategories|需要的分类]]。",
+       "categoriespagetext": "以下{{PLURAL:$1|分类包含}}页面或媒体文件。[[Special:UnusedCategories|未使用分类]]不在这里显示。另请见[[Special:WantedCategories|需要的分类]]。",
        "categoriesfrom": "显示分类开始于:",
        "special-categories-sort-count": "按数量排列",
        "special-categories-sort-abc": "按字母排列",
-       "deletedcontributions": "被删除的用户贡献",
-       "deletedcontributions-title": "被删除的用户贡献",
+       "deletedcontributions": "被删除的用户贡献",
+       "deletedcontributions-title": "被删除的用户贡献",
        "sp-deletedcontributions-contribs": "贡献",
        "linksearch": "外部链接搜索",
        "linksearch-pat": "搜索网址:",
        "unwatch": "取消监视",
        "unwatchthispage": "停止监视",
        "notanarticle": "非内容页面",
-       "notvisiblerev": "上次由不同用户所作的修订版本已经删除",
-       "watchlist-details": "不计讨论页,您的监视列表中有$1个页面。",
+       "notvisiblerev": "上次由不同用户所作的版本已经删除",
+       "watchlist-details": "不计讨论页,您的监视列表中有$1个页面。",
        "wlheader-enotif": "已启用电子邮件通知。",
        "wlheader-showupdated": "您上次访问后发生更改的页面'''加粗'''显示",
        "wlnote2": "下面是最近{{PLURAL:$1|<strong>$1</strong>小时}}的更改,截至$2 $3。",
        "enotif_subject_created": "{{SITENAME}}页面$1已被$2创建",
        "enotif_subject_moved": "{{SITENAME}}页面$1已被$2移动",
        "enotif_subject_restored": "{{SITENAME}}页面$1已经被$2{{GENDER:$2|还原}}",
-       "enotif_subject_changed": "{{SITENAME}}页面$1被$2更改",
+       "enotif_subject_changed": "{{SITENAME}}页面$1被$2更改",
        "enotif_body_intro_deleted": "{{SITENAME}}页面$1已于$PAGEEDITDATE被$2{{GENDER:$2|删除}},请见$3。",
        "enotif_body_intro_created": "{{SITENAME}}页面$1已于$PAGEEDITDATE被$2{{GENDER:$2|创建}},请浏览<$3>查看当前版本。",
        "enotif_body_intro_moved": "{{SITENAME}}页面$1已于$PAGEEDITDATE被$2{{GENDER:$2|移动}},请浏览<$3>查看当前版本。",
        "exbeforeblank": "被清空前的内容为:“$1”",
        "delete-confirm": "删除“$1”",
        "delete-legend": "删除",
-       "historywarning": "警告:您将要删除的页面有约$1个{{PLURAL:$1|修订}}版本的历史:",
+       "historywarning": "警告:您将要删除的页面有约$1个{{PLURAL:$1|版本}}的历史:",
        "confirmdeletetext": "您即将删除一个页面或图像以及其历史。\n请确定您要进行此项操作,并且了解其后果,同时您的行为符合[[{{MediaWiki:Policy-url}}]]。",
        "actioncomplete": "操作完成",
        "actionfailed": "操作失败",
        "deletereasonotherlist": "其他原因",
        "deletereason-dropdown": "*常见删除原因\n**广告\n**破坏行为\n**侵犯著作权\n**作者申请\n**受损重定向",
        "delete-edit-reasonlist": "编辑删除原因",
-       "delete-toobig": "这个页面有一个十分大量的编辑历史,超过$1次修订。删除此类页面的动作已经被限制,以防止在{{SITENAME}}上的意外扰乱。",
-       "delete-warning-toobig": "这个页面有一个十分大量的编辑历史,超过$1次修订。删除它可能会扰乱{{SITENAME}}的数据库操作;在继续此动作前请小心。",
+       "delete-toobig": "这个页面有一个十分大量的编辑历史,超过$1个版本。删除此类页面的动作已经被限制,以防止在{{SITENAME}}上的意外扰乱。",
+       "delete-warning-toobig": "这个页面有一个十分大量的编辑历史,超过$1个版本。删除它可能会扰乱{{SITENAME}}的数据库操作;在继续此动作前请小心。",
        "deleting-backlinks-warning": "'''警告:'''有[[Special:WhatLinksHere/{{FULLPAGENAME}}|其他页面]]链接至或包含您要删除的页面。",
        "rollback": "回退编辑",
        "rollback_short": "回退",
        "protect-norestrictiontypes-title": "不可保护页面",
        "protect-legend": "确认保护",
        "protectcomment": "原因:",
-       "protectexpiry": "到期:",
+       "protectexpiry": "终止时间:",
        "protect_expiry_invalid": "输入的终止时间无效。",
        "protect_expiry_old": "终止时间已过去。",
        "protect-unchain-permissions": "解锁更多保护选项",
        "protect-summary-desc": "[$1=$2]($3)",
        "protect-summary-cascade": "联锁",
        "protect-expiring": "终止于$1(UTC)",
-       "protect-expiring-local": "$1到期",
+       "protect-expiring-local": "终止于$1",
        "protect-expiry-indefinite": "无限期",
        "protect-cascade": "保护本页中包含的页面(连锁保护)",
        "protect-cantedit": "您无法更改这个页面的保护等级,因为您没有权限去编辑它。",
        "protect-othertime": "其它时间:",
        "protect-othertime-op": "其它时间",
-       "protect-existing-expiry": "ç\8e°æ\97¶å\88°æ\9c\9fä¹\8b时间:$2 $3",
+       "protect-existing-expiry": "ç\8e°æ\9c\89ç\9a\84ç»\88æ­¢时间:$2 $3",
        "protect-otherreason": "其他/附加原因:",
        "protect-otherreason-op": "其他原因",
        "protect-dropdown": "*常见保护原因\n** 过度破坏\n** 过多垃圾信息\n** 负面的编辑战\n** 高流量页面",
        "restriction-level-all": "任何级别",
        "undelete": "查看被删除页面",
        "undeletepage": "查看和还原被删除的页面",
-       "undeletepagetitle": "'''以下包含[[:$1]]的已删除之修订版本'''。",
+       "undeletepagetitle": "'''以下包含[[:$1]]的已删除之版本'''。",
        "viewdeletedpage": "查看被删页面",
        "undeletepagetext": "以下{{PLURAL:$1|页面|$1个页面}}已被删除,但依然在归档中并可以被恢复。归档可能会被定时清理。",
        "undelete-fieldset-title": "还原版本",
        "undeleteextrahelp": "要恢复该页面的整个历史记录时,不选中任何复选框直接点击'''''{{int:undeletebtn}}'''''。要选择性地恢复部分版本时,请选中相应版本前的复选框再点击'''''{{int:undeletebtn}}'''''。",
        "undeleterevisions": "$1版本存档",
-       "undeletehistory": "如果您恢复了该页面,所有版本都会被恢复到修订历史中。\n如果本页删除后有一个同名的新页面建立,被恢复的版本将会出现在先前的历史中。",
-       "undeleterevdel": "如果把最新修订部分删除,反删除将会无法进行。如果遇到这种情况,您必须反选或反隐藏最新已删除的修订。",
-       "undeletehistorynoadmin": "这个页面已被删除。删除原因显示在下方编辑摘要中,被删除前的所有修订文本连同删除前贡献用户的细节信息只对管理员可见。",
-       "undelete-revision": "$1由$3(在$4 $5)所编写的已删除修订版本:",
-       "undeleterevision-missing": "无效或丢失的修订版本。您可能使用了错误的链接,或者此修订版本已经被从存档中恢复或移除。",
-       "undelete-nodiff": "找不到先前的修订版本。",
+       "undeletehistory": "如果您恢复了该页面,所有版本都会被恢复到版本历史中。如果本页删除后有一个同名的新页面建立,被恢复的版本将会出现在先前的历史中。",
+       "undeleterevdel": "如果把最新版本部分删除,反删除将会无法进行。如果遇到这种情况,您必须反选或反隐藏最新已删除的版本。",
+       "undeletehistorynoadmin": "这个页面已被删除。删除原因显示在下方编辑摘要中,被删除前的所有版本文本连同删除前贡献用户的细节信息只对管理员可见。",
+       "undelete-revision": "$1由$3(在$4 $5)所编写的已删除版本:",
+       "undeleterevision-missing": "无效或丢失的版本。您可能使用了错误的链接,或者此版本已经被从存档中恢复或移除。",
+       "undelete-nodiff": "找不到先前的版本。",
        "undeletebtn": "还原",
        "undeletelink": "查看/还原",
        "undeleteviewlink": "查看",
        "undelete-search-prefix": "显示页面自:",
        "undelete-search-submit": "搜索",
        "undelete-no-results": "删除日志中没有匹配的结果。",
-       "undelete-filename-mismatch": "不能删除带有时间戳的文件修订$1:文件不匹配",
-       "undelete-bad-store-key": "不能删除带有时间戳的文件修订$1:文件在删除前遗失。",
+       "undelete-filename-mismatch": "不能删除带有时间戳的文件版本$1:文件不匹配",
+       "undelete-bad-store-key": "不能删除带有时间戳的文件版本$1:文件在删除前遗失。",
        "undelete-cleanup-error": "删除无用的存档文件“$1”时发生错误。",
        "undelete-missing-filearchive": "由于文件存档 ID $1 不在数据库中,不能在文件存档中恢复。它可能已经被恢复了。",
        "undelete-error": "还原页面出错",
        "mycontris": "贡献",
        "contribsub2": "{{GENDER:$3|$1}}的贡献($2)",
        "contributions-userdoesnotexist": "用户“$1”尚未注册。",
-       "nocontribs": "没有找到符合特征的更改。",
+       "nocontribs": "没有找到匹配这些规则的更改。",
        "uctop": "(当前)",
        "month": "截止月份:",
        "year": "截止年份:",
        "sp-contributions-newbies-sub": "新账户的贡献",
        "sp-contributions-newbies-title": "新账户的用户贡献",
        "sp-contributions-blocklog": "封禁日志",
-       "sp-contributions-suppresslog": "已被删除的用户贡献",
-       "sp-contributions-deleted": "被删除的用户贡献",
+       "sp-contributions-suppresslog": "被压制的用户贡献",
+       "sp-contributions-deleted": "被删除的用户贡献",
        "sp-contributions-uploads": "上传",
        "sp-contributions-logs": "日志",
        "sp-contributions-talk": "讨论",
        "nolinkshere": "没有页面链接至'''[[:$1]]'''。",
        "nolinkshere-ns": "在所选的名字空间内没有页面链接到'''[[:$1]]'''。",
        "isredirect": "重定向页面",
-       "istemplate": "å\8c\85å\90«",
+       "istemplate": "åµ\8cå\85¥",
        "isimage": "文件链接",
        "whatlinkshere-prev": "{{PLURAL:$1|前|前$1个}}",
        "whatlinkshere-next": "{{PLURAL:$1|后|后$1个}}",
        "blockip-legend": "封禁用户",
        "blockiptext": "使用下方的表单来禁止来自特定IP地址或用户名的写访问。\n只有在为了防止破坏,并符合[[{{MediaWiki:Policy-url}}|方针]]的情况下才可采取此行动。\n请在下面输入一个具体的理由(例如引述一个被破坏的页面)。",
        "ipaddressorusername": "IP地址或用户名:",
-       "ipbexpiry": "期限:",
+       "ipbexpiry": "终止时间:",
        "ipbreason": "原因:",
        "ipbreason-dropdown": "*常见封禁原因\n** 插入虚假信息\n** 删除页面内容\n** 添加垃圾外部链接\n** 插入无意义文字\n** 恐吓行为/骚扰\n** 滥用多个账户\n** 不能接受的用户名",
        "ipb-hardblock": "阻止登录用户使用该IP地址编辑",
        "blocklist-rangeblocks": "隐藏IP段封禁",
        "blocklist-timestamp": "时间",
        "blocklist-target": "目标",
-       "blocklist-expiry": "到期",
+       "blocklist-expiry": "终止时间",
        "blocklist-by": "封禁管理员",
        "blocklist-params": "封禁范围",
        "blocklist-reason": "原因",
        "ipblocklist-localblock": "本地封禁",
        "ipblocklist-otherblocks": "其他{{PLURAL:$1|封禁}}",
        "infiniteblock": "无限期",
-       "expiringblock": "$1 $2到期",
+       "expiringblock": "终止于$1 $2",
        "anononlyblock": "仅匿名用户",
        "noautoblockblock": "自动封禁停用",
        "createaccountblock": "账户创建停用",
        "lockedbyandtime": "(由 {{GENDER:$1|$1}} 于$2 $3执行)",
        "move-page": "移动$1",
        "move-page-legend": "移动页面",
-       "movepagetext": "您可以使用下面的表单来重命名一个页面,同时将其修订历史移动到新页面。\n同时老的条目将会被重定向到新条目。\n您可以自动地将重定向更新到原条目。\n如果您不选择这样做的话,请检查[[Special:DoubleRedirects|双重]]或[[Special:BrokenRedirects|损坏重定向]]链接。\n您有责任确保链接会被正确指向他们应该被指向的地方。\n\n注意:即使新条目已经有对应页面,此页面也'''不会'''被移动,除非新页面无任何编辑历史或是重定向页。\n这意味着您可在误操作后将页面移回原处,同时,您也无法覆盖现有页面。\n\n'''警告!'''\n对这样一个经常被访问的页面而言这可能是一个重大且唐突的更改;\n请在行动前先了解您的修改可能带来的一切后果。",
-       "movepagetext-noredirectfixer": "用下面的表单来重命名一个页面,并将其修订历史同时移动到新页面。\n老的页面将成为新页面的重定向页。\n请检查[[Special:DoubleRedirects|双重重定向]]或[[Special:BrokenRedirects|损坏重定向]]链接。\n您应当负责确定所有链接依然会链到指定的页面。\n\n注意如果新页面已经有内容的话,页面将'''不会'''被移动,\n除非新页面无内容或是重定向页,而且没有修订历史。\n这意味着您再必要时可以在移动到新页面后再移回老的页面,\n同时您也无法覆盖现有页面。\n\n'''警告!'''\n对一个经常被访问的页面而言这可能是一个重大与唐突的更改;\n请在行动前先确定您了解其所可能带来的后果。",
+       "movepagetext": "您可以使用下面的表单来重命名一个页面,同时将其版本历史移动到新页面。同时老的条目将会被重定向到新条目。您可以自动地将重定向更新到原条目。如果您不选择这样做的话,请检查[[Special:DoubleRedirects|双重]]或[[Special:BrokenRedirects|损坏重定向]]链接。您有责任确保链接会被正确指向他们应该被指向的地方。\n\n注意:即使新条目已经有对应页面,此页面也'''不会'''被移动,除非新页面无任何编辑历史或是重定向页。这意味着您可在误操作后将页面移回原处,同时,您也无法覆盖现有页面。\n\n'''警告!'''对这样一个经常被访问的页面而言这可能是一个重大且唐突的更改;请在行动前先了解您的修改可能带来的一切后果。",
+       "movepagetext-noredirectfixer": "用下面的表单来重命名一个页面,并将其版本历史同时移动到新页面。\n老的页面将成为新页面的重定向页。\n请检查[[Special:DoubleRedirects|双重重定向]]或[[Special:BrokenRedirects|损坏重定向]]链接。\n您应当负责确定所有链接依然会链到指定的页面。\n\n注意如果新页面已经有内容的话,页面将'''不会'''被移动,\n除非新页面无内容或是重定向页,而且没有版本历史。\n这意味着您再必要时可以在移动到新页面后再移回老的页面,\n同时您也无法覆盖现有页面。\n\n'''警告!'''\n对一个经常被访问的页面而言这可能是一个重大与唐突的更改;\n请在行动前先确定您了解其所可能带来的后果。",
        "movepagetalktext": "有关的讨论页将被自动与该页面一起移动,'''除非''':\n*新页面已经有一个包含内容的讨论页,或者\n*您不勾选下面的复选框。\n\n在这些情况下,您在必要时必须手工移动或合并页面。",
        "movearticle": "移动页面:",
        "moveuserpage-warning": "'''警告:'''你将移动一个用户页面。请注意,只有该页面会被移动,该用户''不''会被更名。",
        "move-over-sharedrepo": "== 文件已存在 ==\n[[:$1]]已于共享资源存在,将文件移动到此标题会覆盖共享资源中的文件。",
        "file-exists-sharedrepo": "同名文件已于共享资源存在。\n请选择另一个文件名。",
        "export": "导出页面",
-       "exporttext": "您可以将特定页面或一组页面的文本以及编辑历史以 XML 格式导出;这样可以将有关页面通过“[[Special:Import|导入页面]]”导入到另一个运行 MediaWiki 的网站。\n\n要导出页面,请在下面的文本框中输入页面标题,每行一个标题,并选择您是否需要导出带有页面历史的以前的修订版本,或是只选择导出带有最后一次编辑信息的当前修订版本。\n\n此外您还可以利用链接导出文件,例如您可以使用[[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]导出“[[{{MediaWiki:Mainpage}}]]”页面。",
+       "exporttext": "您可以将特定页面或一组页面的文本以及编辑历史以 XML 格式导出;这样可以将有关页面通过“[[Special:Import|导入页面]]”导入到另一个运行 MediaWiki 的网站。\n\n要导出页面,请在下面的文本框中输入页面标题,每行一个标题,并选择您是否需要导出带有页面历史的以前的版本,或是只选择导出带有最后一次编辑信息的当前版本。\n\n此外您还可以利用链接导出文件,例如您可以使用[[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]导出“[[{{MediaWiki:Mainpage}}]]”页面。",
        "exportall": "导出所有页面",
        "exportcuronly": "仅包含当前版本,而不是完整历史。",
        "exportnohistory": "----\n'''注意:'''由于性能原因,从此表单导出页面的全部历史已被禁用。",
        "thumbnail_image-failure-limit": "近期尝试生成此缩略图失败太多次($1次或更多)。请稍后再试。",
        "import": "导入页面",
        "importinterwiki": "跨wiki导入",
-       "import-interwiki-text": "选择要导入的wiki和页面标题,导入修订的日期和编辑者名称会被保存。所有的跨wiki导入操作都将记录到[[Special:Log/import|导入日志]]。",
+       "import-interwiki-text": "选择要导入的wiki和页面标题,导入版本的日期和编辑者名称会被保存。所有的跨wiki导入操作都将记录到[[Special:Log/import|导入日志]]。",
        "import-interwiki-source": "来源wiki/页面:",
-       "import-interwiki-history": "复制此页的所有历史修订版本",
+       "import-interwiki-history": "复制此页的所有历史版本",
        "import-interwiki-templates": "包含所有模板",
        "import-interwiki-submit": "导入",
        "import-interwiki-namespace": "目标名字空间:",
        "importuploaderrortemp": "上传导入文件失败。临时文件夹已遗失。",
        "import-parse-failure": "XML导入语法失败",
        "import-noarticle": "没有页面作导入!",
-       "import-nonewrevisions": "没有导入修订(所有都已存在或因错误跳过)。",
+       "import-nonewrevisions": "没有导入版本(所有都已存在或因错误跳过)。",
        "xml-error-string": "$1于行$2,列$3($4字节):$5",
        "import-upload": "上传XML数据",
        "import-token-mismatch": "会话数据遗失。请重试。",
        "import-error-special": "页面“$1”未导入,因为它需要使用一个不能创建页面的特殊名字空间。",
        "import-error-invalid": "页面“$1”未能导入,因为它的名字无效。",
        "import-error-unserialize": "页面“$1”的版本$2无法反序列化。此版本使用内容模型$3序列化为$4。",
-       "import-error-bad-location": "在此wiki使用了内容模式$3的修订版本$2不能被保存至“$1”,这是因为此模式在此页面不被支持。",
+       "import-error-bad-location": "在此wiki使用了内容模式$3的版本$2不能被保存至“$1”,这是因为此模式在此页面不被支持。",
        "import-options-wrong": "{{PLURAL:$2|选项}}出错:<nowiki>$1</nowiki>",
        "import-rootpage-invalid": "根页面的标题无效。",
        "import-rootpage-nosubpage": "名字空间为“$1”的根页面不允许子页面。",
        "tooltip-t-upload": "上传文件",
        "tooltip-t-specialpages": "所有特殊页面的列表",
        "tooltip-t-print": "本页面的可打印版本",
-       "tooltip-t-permalink": "本页面该版本的永久链接",
+       "tooltip-t-permalink": "本页面该版本的固定链接",
        "tooltip-ca-nstab-main": "查看内容页面",
        "tooltip-ca-nstab-user": "查看用户页面",
        "tooltip-ca-nstab-media": "查看媒体文件页面",
        "tooltip-preferences-save": "保存系统设置",
        "tooltip-summary": "请输入简短的摘要",
        "interlanguage-link-title": "$1 – $2",
+       "interlanguage-link-title-nonlang": "$1——$2",
        "common.css": "/* 放置于这里的CSS将应用于所有皮肤 */",
-       "monobook.css": "/* 放置于这里的CSS将影响使用MonoBook皮肤的用户 */",
-       "vector.css": "/* 放置于这里的CSS将影响使用Vector皮肤的用户 */",
        "print.css": "/* 放置于这里的CSS将影响打印输出 */",
        "noscript.css": "/* 放置于这里的CSS将影响停用JavaScript的用户 */",
        "group-autoconfirmed.css": "/* 放置于这里的CSS将只影响自动确认用户 */",
        "group-sysop.css": "/* 放置于这里的CSS将只影响管理员 */",
        "group-bureaucrat.css": "/* 放置于这里的CSS将只影响机行政员 */",
        "common.js": "/* 这里的任何JavaScript将为所有用户在每次页面载入时加载。 */",
-       "monobook.js": "/* 这里的任何JavaScript将为使用MonoBook皮肤的用户加载 */",
-       "vector.js": "/* 这里的任何JavaScript将为使用Vector皮肤的用户加载 */",
        "group-autoconfirmed.js": "/* 这里的任何JavaScript将只为自动确认用户加载 */",
        "group-bot.js": "/* 这里的任何JavaScript将只为机器人加载 */",
        "group-sysop.js": "/* 这里的任何JavaScript将只为管理员加载 */",
        "creditspage": "页面编辑名单",
        "nocredits": "本页面没有编辑名单信息。",
        "spamprotectiontitle": "垃圾链接过滤器",
-       "spamprotectiontext": "您要保存的文本被垃圾过滤器阻止。\n这可能是由于一个链往匹配黑名单的外部站点的链接引起的。",
+       "spamprotectiontext": "您要保存的文字被垃圾信息过滤器拦截。这可能是由黑名单内外部网站链接引发的。",
        "spamprotectionmatch": "以下文本触发了我们的垃圾链接过滤器:$1",
        "spambot_username": "MediaWiki垃圾链接清理器",
        "spam_reverting": "恢复至不包含$1的链接的最后版本",
-       "spam_blanking": "消隐所有包含链接至$1的修订",
+       "spam_blanking": "消隐所有包含链接至$1的版本",
        "spam_deleting": "正在删除所有包含至$1的版本",
        "simpleantispam-label": "反垃圾检查。\n'''不要'''加入这个!",
        "pageinfo-title": "“$1”的信息",
        "markaspatrolleddiff": "标记为已巡查",
        "markaspatrolledtext": "标记此页面为已巡查",
        "markedaspatrolled": "标记为已检查",
-       "markedaspatrolledtext": "[[:$1]]的已选中修订版本已被标识为已巡查。",
+       "markedaspatrolledtext": "[[:$1]]的已选中版本已被标识为已巡查。",
        "rcpatroldisabled": "最新更改检查被关闭",
        "rcpatroldisabledtext": "最近更改巡查功能目前已关闭。",
        "markedaspatrollederror": "不能标志为已检查",
        "filedeleteerror-short": "删除文件发生错误:$1",
        "filedeleteerror-long": "删除文件时出错:\n\n$1",
        "filedelete-missing": "文件“$1”不存在而无法删除。",
-       "filedelete-old-unregistered": "所指定的文件修订“$1”在数据库中不存在。",
+       "filedelete-old-unregistered": "所指定的文件版本“$1”在数据库中不存在。",
        "filedelete-current-unregistered": "所指定的文件“$1”在数据库中不存在。",
        "filedelete-archive-read-only": "存档目录“$1”在网页服务器中不可写。",
        "previousdiff": "←上一编辑",
        "exif-meteringmode-2": "中心加权平均测量",
        "exif-meteringmode-3": "点测",
        "exif-meteringmode-4": "多点测",
-       "exif-meteringmode-5": "模式测量",
+       "exif-meteringmode-5": "模式",
        "exif-meteringmode-6": "局部测量",
        "exif-meteringmode-255": "其他",
        "exif-lightsource-0": "未知",
        "confirmemail_sent": "确认邮件已发送。",
        "confirmemail_oncreate": "一个确认代码已被发送到您的邮箱。登录时无需使用该代码,但若要启用在此wiki上的电子邮件相关功能,则必须先提交此代码。",
        "confirmemail_sendfailed": "{{SITENAME}}不能发送确认邮件,请检查您的邮箱地址是否包含无效字符。\n\n邮件发送器的返回信息:$1",
-       "confirmemail_invalid": "无效的确认码,该代码可能已经过期。",
+       "confirmemail_invalid": "无效的确认码。该确认码可能已经到期。",
        "confirmemail_needlogin": "请$1以确认您的电子邮件地址。",
        "confirmemail_success": "您的邮箱已经被确认。您现在可以[[Special:UserLogin|登录]]并使用此网站了。",
        "confirmemail_loggedin": "你的电子邮件地址现在已经确认。",
        "confirm-watch-top": "将此页添加到您的监视吗?",
        "confirm-unwatch-button": "确定",
        "confirm-unwatch-top": "从监视列表中删除此页吗?",
+       "semicolon-separator": ";",
        "comma-separator": "、",
        "colon-separator": ":",
        "pipe-separator": "&#32;|&#32;",
        "imgmultipageprev": "← 上一页",
        "imgmultipagenext": "下一页 →",
        "imgmultigo": "提交!",
-       "imgmultigoto": "å\88°第$1页",
+       "imgmultigoto": "å\89\8då¾\80第$1页",
        "img-lang-default": "(默认语言)",
-       "img-lang-info": "在$1找到此图像。$2",
-       "img-lang-go": "",
+       "img-lang-info": "以$1生成本图像。$2",
+       "img-lang-go": "提交",
        "ascending_abbrev": "升",
        "descending_abbrev": "降",
        "table_pager_next": "下一页",
        "version-hook-name": "钩名",
        "version-hook-subscribedby": "署名",
        "version-version": "(版本 $1)",
+       "version-no-ext-name": "[无名称]",
        "version-license": "MediaWiki协议",
        "version-ext-license": "许可协议",
        "version-ext-colheader-name": "扩展程序",
        "version-ext-colheader-credits": "作者",
        "version-license-title": "$1的许可协议",
        "version-license-not-found": "没有找到与此拓展相关的授权信息。",
-       "version-credits-title": "用于$1的信用",
+       "version-credits-title": "$1贡献者名单",
        "version-credits-not-found": "没有找到与此拓展相关的信用信息。",
        "version-poweredby-credits": "本Wiki由'''[https://www.mediawiki.org/ MediaWiki]'''驱动,版权所有 © 2001-$1 $2。",
        "version-poweredby-others": "其他",
index ebac1b2..6af7ecd 100644 (file)
                        "Yuyu",
                        "乌拉跨氪",
                        "아라",
-                       "Vincent Liu"
+                       "Vincent Liu",
+                       "Mywood",
+                       "Cwek"
                ]
        },
        "tog-underline": "連結底線:",
        "tog-hideminor": "隱藏最近變更中的小修訂",
        "tog-hidepatrolled": "隱藏最近更改中巡查過的編輯",
        "tog-newpageshidepatrolled": "隱藏新頁面清單中巡查過的頁面",
-       "tog-extendwatchlist": "展開監視列表以顯示含最近以外的所有變更",
-       "tog-usenewrc": "依頁面分類顯示最近變更和監視列表中的修改",
+       "tog-extendwatchlist": "展開監視清單顯示包含最近以外的所有變更",
+       "tog-usenewrc": "依最近變更與監視清單頁面分類顯示變更",
        "tog-numberheadings": "標題自動編號",
        "tog-showtoolbar": "顯示編輯工具列",
        "tog-editondblclick": "啟用滑鼠雙擊編輯頁面",
        "tog-editsectiononrightclick": "啟用滑鼠右鍵點選章節標題編輯",
-       "tog-watchcreations": "將我建立的頁面和上傳的檔案加入監視列表",
-       "tog-watchdefault": "將我編輯的頁面和檔案加入監視列表",
-       "tog-watchmoves": "將我移動的頁面和檔案加入監視列表",
-       "tog-watchdeletion": "將我刪除的頁面和檔案加入監視列表",
+       "tog-watchcreations": "將我建立的頁面和上傳的檔案加入監視清單",
+       "tog-watchdefault": "將我編輯的頁面和檔案新增至監視清單",
+       "tog-watchmoves": "將我移動的頁面和檔案加入監視清單",
+       "tog-watchdeletion": "將我刪除的頁面和檔案新增至監視清單",
        "tog-minordefault": "預設標記所有的編輯為小修訂",
        "tog-previewontop": "顯示預覽於編輯框上方",
        "tog-previewonfirst": "第一次編輯時顯示預覽",
-       "tog-enotifwatchlistpages": "當我的監視列表中的頁面或檔案有變更時,發送電子郵件通知我",
+       "tog-enotifwatchlistpages": "當我的監視清單中的頁面或檔案有變更時,發送電子郵件通知我",
        "tog-enotifusertalkpages": "當我的對話頁面有變更時,發送電子郵件通知我",
        "tog-enotifminoredits": "當頁面與檔案有小修訂時,發送電子郵件通知我",
        "tog-enotifrevealaddr": "在通知信件中顯示我的電子郵件位址",
        "tog-fancysig": "將簽名視為 Wikitext 語言 (不自動產生連結)",
        "tog-uselivepreview": "使用即時預覽 (測試中)",
        "tog-forceeditsummary": "未填寫編輯摘要時提示我",
-       "tog-watchlisthideown": "隱藏監視列表中我的編輯",
-       "tog-watchlisthidebots": "隱藏監視列表中機器人的編輯",
-       "tog-watchlisthideminor": "隱藏監視列表中的小修訂",
-       "tog-watchlisthideliu": "隱藏監視列表中已登入使用者的編輯",
-       "tog-watchlisthideanons": "隱藏監視列表中匿名使用者的編輯",
-       "tog-watchlisthidepatrolled": "隱藏監視列表中已巡查的編輯",
+       "tog-watchlisthideown": "隱藏監視清單中我自己的編輯",
+       "tog-watchlisthidebots": "隱藏監視清單中機器人的編輯",
+       "tog-watchlisthideminor": "隱藏監視清單中的小修訂",
+       "tog-watchlisthideliu": "隱藏監視清單中已登入使用者的編輯",
+       "tog-watchlisthideanons": "隱藏監視清單中匿名使用者的編輯",
+       "tog-watchlisthidepatrolled": "隱藏監視清單中已巡查的編輯",
        "tog-ccmeonemails": "發送郵件給他人時,也送一份副本到我的電子郵件信箱",
        "tog-diffonly": "比對版本差異時下面不顯示頁面內容",
        "tog-showhiddencats": "顯示隱藏分類",
        "qbmyoptions": "我的頁面",
        "faq": "常見問答",
        "faqpage": "Project:FAQ",
-       "vector-action-addsection": "加入主題",
-       "vector-action-delete": "刪除",
-       "vector-action-move": "移動",
-       "vector-action-protect": "保護",
-       "vector-action-undelete": "取消刪除",
-       "vector-action-unprotect": "變更保護",
-       "vector-view-create": "建立",
-       "vector-view-edit": "編輯",
-       "vector-view-history": "檢視歷史",
-       "vector-view-view": "閱讀",
-       "vector-view-viewsource": "檢視原始碼",
        "actions": "動作",
        "namespaces": "命名空間",
        "variants": "變體",
        "history_short": "歷史",
        "updatedmarker": "自我最後一次訪問以後的更新",
        "printableversion": "可列印版",
-       "permalink": "永久連結",
+       "permalink": "固定連結",
        "print": "列印",
        "view": "檢視",
        "view-foreign": "用 $1 檢視",
        "categorypage": "檢視分類頁面",
        "viewtalkpage": "檢視討論頁面",
        "otherlanguages": "其他語言",
-       "redirectedfrom": "(自 $1 重新導向)",
-       "redirectpagesub": "重新導向頁面",
+       "redirectedfrom": "(重定向自$1)",
+       "redirectpagesub": "重向頁面",
        "lastmodifiedat": "此頁面最後修訂於 $1 $2。",
        "viewcount": "此頁面已被檢視過 $1 次。",
        "protectedpage": "受保護頁面",
        "nstab-project": "專案頁面",
        "nstab-image": "檔案",
        "nstab-mediawiki": "訊息",
-       "nstab-template": "樣ç\89\88",
+       "nstab-template": "模æ\9d¿",
        "nstab-help": "說明頁面",
        "nstab-category": "分類",
        "nosuchaction": "無此動作",
        "yourname": "使用者名稱:",
        "userlogin-yourname": "使用者名稱",
        "userlogin-yourname-ph": "輸入您的使用者名稱",
-       "createacct-another-username-ph": "輸入帳號名稱",
+       "createacct-another-username-ph": "輸入使用者名稱",
        "yourpassword": "您的密碼:",
        "userlogin-yourpassword": "密碼",
        "userlogin-yourpassword-ph": "輸入您的密碼",
        "passwordremindertitle": "{{SITENAME}} 的新臨時密碼",
        "passwordremindertext": "不明人士 (可能是您自己,來自 IP 位址 $1) 要求重設在 {{SITENAME}} ($4) 的密碼。\n給使用者 \"$2\" 的臨時密碼設為 \"$3\"。\n如果這個動作是您做的,您需要立即登入並設定一個新的密碼,\n您的臨時密碼將於{{PLURAL:$5|一|$5}}天內過期。\n\n如果不是您要求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略此訊息並且繼續使用您原本的密碼。",
        "noemail": "使用者 \"$1\" 未登記電子郵件地址。",
-       "noemailcreate": "您需要提供一個有效的電子郵件地址",
+       "noemailcreate": "您需要提供一個有效的電子郵件地址",
        "passwordsent": "使用者 \"$1\" 的新密碼已寄出至當出登記的電子郵件地址,\n請稍後收到信件後再登入。",
        "blocked-mailpassword": "您的 IP 位址已被封鎖不允許編輯,密碼復原的功能也同樣被禁止使用以防止被濫用。",
        "eauthentsent": "以發送一封確認信到您所設定的電子郵件地址。\n在未收到其它電子郵件前,您必須先依照信件中的指示,確認這個帳號確實是您本人。",
        "resetpass_header": "變更帳號密碼",
        "oldpassword": "舊密碼:",
        "newpassword": "新密碼:",
-       "retypenew": "確認密碼:",
+       "retypenew": "重新輸入新密碼:",
        "resetpass_submit": "設定密碼並登入",
        "changepassword-success": "您的密碼已變更成功!",
        "changepassword-throttled": "您最近嘗試了太多次登入。\n請等待 $1 後再試。",
        "resettokens-legend": "重設密鑰",
        "resettokens-tokens": "密鑰:",
        "resettokens-token-label": "$1 (目前為 $2)",
-       "resettokens-watchlist-token": "用來訂閱 [[Special:Watchlist|監視列表]] Atom/RSS 的密鑰",
+       "resettokens-watchlist-token": "用來訂閱 [[Special:Watchlist|監視清單]] Atom/RSS 的密鑰",
        "resettokens-done": "已重設密鑰。",
        "resettokens-resetbutton": "重設已選擇的密鑰",
        "bold_sample": "粗體文字",
        "savearticle": "儲存頁面",
        "preview": "預覽",
        "showpreview": "顯示預覽",
-       "showdiff": "顯示差異",
+       "showdiff": "顯示變更",
        "anoneditwarning": "<strong>警告:</strong>您尚未登入。\n您的 IP 位址將記錄在此頁的編輯歷史中。",
        "anonpreviewwarning": "<em>您尚未登入。儲存頁面會將您的 IP 位址記錄在此頁面的編輯歷史中。</em>",
        "missingsummary": "<strong>提醒:</strong>您未填寫編輯摘要。\n若您再點選 \"{{int:savearticle}}\" 一次,將略過摘要直接儲存您的編輯。",
        "editwarning-warning": "離開此頁面可能會令您遺失之前所作的所有更改。\n若您已經登入,您可在偏好設定的 \"{{int:prefs-editing}}\" 項目關閉此警告。",
        "editpage-notsupportedcontentformat-title": "不支援此內容格式",
        "editpage-notsupportedcontentformat-text": "內容語法 $2 不支援使用 $1 格式的內容。",
-       "content-model-wikitext": "維基文字",
+       "content-model-wikitext": "Wikitext",
        "content-model-text": "純文字",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
        "currentrev": "最新修訂",
        "currentrev-asof": "於 $1 的最新修訂",
        "revisionasof": "於 $1 的修訂",
-       "revision-info": "於 $1 由 $2 所做的修訂",
+       "revision-info": "於 $1 由 {{GENDER:$6|$2}} 所做的修訂 $7",
        "previousrevision": "←上個修訂",
        "nextrevision": "下個修訂→",
        "currentrevisionlink": "最新修訂",
        "mergehistory-reason": "原因:",
        "mergelog": "合併日誌",
        "pagemerge-logentry": "已合併 [[$1]] 至 [[$2]] (修訂更新至 $3)",
-       "revertmerge": "解除合併",
+       "revertmerge": "取消合併",
        "mergelogpagetext": "以下是最近合併頁面歷史的清單。",
        "history-title": "\"$1\" 的修訂歷史",
        "difference-title": "$1:修訂間的差異",
        "difference-missing-revision": "{{PLURAL:$2|1次修訂|$2 次修訂}}差異($1)不存在。\n\n這通常是因為過時的頁面修訂差異鏈接被刪除。\n詳情請閱[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]。",
        "searchresults": "搜尋結果",
        "searchresults-title": "\"$1\" 的搜尋結果",
-       "toomanymatches": "太多符合條件的結果,請嘗試使用較複雜的查詢",
        "titlematches": "頁面標題符合",
        "textmatches": "頁面內容符合",
        "notextmatches": "沒有符合的頁面內容",
        "search-result-size": "$1 ($2 個字)",
        "search-result-category-size": "$1 位成員 ($2 個子分類,$3 個檔案)",
        "search-result-score": "相關度:$1%",
-       "search-redirect": "(重新導向至 $1)",
+       "search-redirect": "(重定向自 $1)",
        "search-section": "(章節 $1)",
        "search-file-match": "(符合檔案內容)",
        "search-suggest": "您指的是不是:$1",
        "search-interwiki-default": "來自 $1 的結果:",
        "search-interwiki-more": "(更多)",
        "search-relatedarticle": "相關",
-       "searcheverything-enable": "搜尋所有命名空間",
        "searchrelated": "相關",
        "searchall": "全部",
        "showingresults": "以下顯示從第 <strong>$2</strong> 筆開始,共 {{PLURAL:$1|<strong>1</strong> 筆結果|<strong>$1</strong> 筆結果}}:",
        "powersearch-togglelabel": "請選擇:",
        "powersearch-toggleall": "全部",
        "powersearch-togglenone": "無",
+       "powersearch-remember": "記住選項用於以後搜索",
        "search-external": "外部搜尋",
        "searchdisabled": "{{SITENAME}} 已停用搜尋功能。\n您可以改透過 Google 搜尋。\n請注意,在 Google 中搜尋到的 {{SITENAME}} 頁面內容可能不是最新的。",
        "search-error": "搜尋時發生錯誤:$1",
        "prefs-user-pages": "使用者頁面",
        "prefs-personal": "使用者基本資料",
        "prefs-rc": "最近變更",
-       "prefs-watchlist": "監視列表",
-       "prefs-watchlist-days": "監視列表中顯示的天數:",
+       "prefs-watchlist": "監視清單",
+       "prefs-watchlist-days": "監視清單中顯示的天數:",
        "prefs-watchlist-days-max": "最多 $1 {{PLURAL:$1|天}}",
-       "prefs-watchlist-edits": "展開監視列表中顯示的變更數量上限:",
+       "prefs-watchlist-edits": "展開監視清單中顯示的變更數量上限:",
        "prefs-watchlist-edits-max": "數量上限:1000",
-       "prefs-watchlist-token": "監視列表密鑰:",
+       "prefs-watchlist-token": "監視清單密鑰:",
        "prefs-misc": "其他",
        "prefs-resetpass": "變更密碼",
        "prefs-changeemail": "變更電子郵件",
        "saveprefs": "儲存",
        "restoreprefs": "還原所有預設設定 (所有項目)",
        "prefs-editing": "編輯",
-       "rows": "數:",
-       "columns": "數:",
+       "rows": "數:",
+       "columns": "數:",
        "searchresultshead": "搜尋",
        "stub-threshold": "<a href=\"#\" class=\"stub\">短頁面連結</a>格式門檻值 (位元組):",
        "stub-threshold-disabled": "已停用",
        "recentchangesdays-max": "最多 $1 {{PLURAL:$1|天}}",
        "recentchangescount": "預設顯示的編輯數:",
        "prefs-help-recentchangescount": "這包含最近變更、頁面歷史以及日誌。",
-       "prefs-help-watchlist-token2": "訂閱您的監視列表所需的密鑰。\n任何人只要知道密鑰就能夠讀取您的監視列表,所以請勿任意與它人共享。\n若有需要 [[Special:ResetTokens|您可重設密鑰]]。",
+       "prefs-help-watchlist-token2": "訂閱您的監視清單所需的密鑰。\n任何人只要知道密鑰就能夠讀取您的監視列表,所以請勿任意與它人共享。\n若有需要 [[Special:ResetTokens|您可重設密鑰]]。",
        "savedprefs": "您的偏好設定已儲存。",
        "timezonelegend": "時區:",
        "localtime": "當地時間:",
        "allowemail": "啟用來自其他使用者的郵件通知功能",
        "prefs-searchoptions": "搜尋",
        "prefs-namespaces": "命名空間",
-       "defaultns": "或搜尋命名空間:",
        "default": "預設",
        "prefs-files": "檔案",
        "prefs-custom-css": "自訂 CSS",
        "right-move-rootuserpages": "移動根使用者頁面",
        "right-move-categorypages": "移動分類頁面",
        "right-movefile": "移動檔案",
-       "right-suppressredirect": "移å\8b\95é \81é\9d¢æ\99\82ä¸\8d建ç«\8bä¾\86æº\90ç\9a\84é\87\8dæ\96°å°\8eå\90\91é \81é\9d¢",
+       "right-suppressredirect": "移å\8b\95é \81é\9d¢æ\99\82ä¸\8då\9c¨å\8e\9fé \81é\9d¢å»ºç«\8bé\87\8då®\9aå\90\91",
        "right-upload": "上傳檔案",
        "right-reupload": "覆蓋現有的檔案",
        "right-reupload-own": "覆蓋自己上傳的檔案",
        "right-edituserjs": "編輯其他使用者的 JavaScript 檔案",
        "right-editmyusercss": "編輯自己的使用者 CSS 檔",
        "right-editmyuserjs": "編輯自己的使用者 JavaScript 檔",
-       "right-viewmywatchlist": "檢視自己的監視列表",
-       "right-editmywatchlist": "編輯自己的監視列表。注意,即使無此權限,某些操作仍會新增頁面至監視列表。",
+       "right-viewmywatchlist": "檢視自己的監視清單",
+       "right-editmywatchlist": "編輯自己的監視清單。注意,即使無此權限,某些操作仍會新增頁面至監視清單。",
        "right-viewmyprivateinfo": "檢視自己的私隱資料 (如:電子郵件地址及真實姓名)",
        "right-editmyprivateinfo": "編輯自己的私隱資料 (如:電子郵件地址及真實姓名)",
        "right-editmyoptions": "編輯自己的偏好設定",
        "action-userrights-interwiki": "編輯在其它 Wiki 上的使用者權限",
        "action-siteadmin": "鎖定和解除鎖定資料庫",
        "action-sendemail": "發送電子郵件",
-       "action-editmywatchlist": "編輯您的監視列表",
-       "action-viewmywatchlist": "查看您的監視列表",
+       "action-editmywatchlist": "編輯您的監視清單",
+       "action-viewmywatchlist": "查看您的監視清單",
        "action-viewmyprivateinfo": "查看您的個人資料",
        "action-editmyprivateinfo": "編輯您的個人資料",
        "nchanges": "$1 次變更",
        "recentchanges-label-unpatrolled": "該編輯尚未巡查",
        "recentchanges-label-plusminus": "該頁面變更的大小 (位元組)",
        "recentchanges-legend-heading": "'''說明:'''",
-       "recentchanges-legend-newpage": "(請參考 [[Special:NewPages|最新頁面]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (請參考 [[Special:NewPages|最新頁面]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "rcnotefrom": "以下為自 <strong>$2</strong> 以來的變更 (最多顯示 <strong>$1</strong> 筆)。",
        "rclistfrom": "顯示自 $3 $2 以來的最近變更",
        "recentchangeslinked-feed": "相關變更",
        "recentchangeslinked-toolbox": "相關變更",
        "recentchangeslinked-title": "與 \"$1\" 相關的變更",
-       "recentchangeslinked-summary": "此頁面列出指定頁面連結到的所有頁面中 (或指定分類中的所有成員) 有做變更的頁面清單。\n有在 [[Special:Watchlist|您的監視列表]] 中的頁面會以 <strong>粗體</strong> 標示。",
+       "recentchangeslinked-summary": "此頁面列出指定頁面連結到的所有頁面中 (或指定分類中的所有成員) 有做變更的頁面清單。\n有在 [[Special:Watchlist|您的監視清單]] 中的頁面會以 <strong>粗體</strong> 標示。",
        "recentchangeslinked-page": "頁面名稱:",
        "recentchangeslinked-to": "改顯示連結至指定頁面的變更",
        "upload": "上傳檔案",
        "largefileserver": "此檔案大小超出伺服器設定的允許範圍。",
        "emptyfile": "您上傳的檔案為空的。\n可能是檔案名輸入錯誤。\n請檢查您是否真的要上傳空檔案。",
        "windows-nonascii-filename": "本 Wiki 不支援使用特殊符號的檔案名稱。",
-       "fileexists": "已存在相同名稱的檔案,若不確定是否要變更它,請檢查 <strong>[[:$1]]</strong>。\n[[$1|thumb]]",
+       "fileexists": "已存在相同名稱的檔案,若{{GENDER:|您}}不確定是否要變更它,請檢查 <strong>[[:$1]]</strong>。\n[[$1|thumb]]",
        "filepageexists": "此檔案的描述頁面 <strong>[[:$1]]</strong> 已存在,但目前沒有使用此名稱的檔案。\n您在此輸入的摘要不會儲存到該描述頁面,\n您必須手動編輯該描述頁面。\n[[$1|thumb]]",
        "fileexists-extension": "類似的檔案名稱已存在:[[$2|thumb]]\n* 上傳中的檔案名稱:<strong>[[:$1]]</strong>\n* 已存在的檔案名稱:<strong>[[:$2]]</strong>\n請選擇使用其他名稱。",
        "fileexists-thumbnail-yes": "此檔案似乎已為縮小的圖片 <em>(縮圖)</em>。\n[[$1|thumb]]\n請檢查檔案 <strong>[[:$1]]</strong>。\n若原始圖片確實為此尺寸,則無須另外上傳縮圖。",
        "upload-file-error-text": "嘗試在伺服器上建立臨時檔案時發生內部錯誤。\n請連絡 [[Special:ListUsers/sysop|管理員]]。",
        "upload-misc-error": "不明的上傳錯誤",
        "upload-misc-error-text": "上傳時發生不明錯誤。\n請檢查您的 URL 是否有效且可存取,然後再重試一次。\n如果仍有問題,請聯絡 [[Special:ListUsers/sysop|管理員]]。",
-       "upload-too-many-redirects": "URL 中包含太多重新導向資訊",
+       "upload-too-many-redirects": "URL 中包含太多重定向",
        "upload-http-error": "發生 HTTP 錯誤:$1",
        "upload-copy-upload-invalid-domain": "此網域不允許複製上傳的檔案。",
        "backend-fail-stream": "無法傳輸檔案 \"$1\"。",
        "backend-fail-connect": "無法連結至儲存庫後端 \"$1\"。",
        "backend-fail-internal": "儲存庫後端 \"$1\" 發生了不明的錯誤。",
        "backend-fail-contenttype": "無法辨識儲存於 \"$1\" 的檔案內容類型。",
-       "backend-fail-batchsize": "å­\98å\84²å¾\8c端被給äº\88äº\86ã\80\8c$1ã\80\8d次æª\94æ¡\88 {{PLURAL:$1|æ\93\8dä½\9c}} ï¼\9bé\99\90å\88¶æ\98¯$2次{{PLURAL:$2|操作}}。",
+       "backend-fail-batchsize": "å\84²å­\98庫å¾\8c端使ç\94¨äº\86 $1 å\80\8bæ\89¹æ¬¡æª\94{{PLURAL:$2|æ\93\8dä½\9c}}ï¼\9b系統é\99\90å\88¶ç\82º $2 å\80\8b{{PLURAL:$2|操作}}。",
        "backend-fail-usable": "由於權限不足或目錄/容器遺失,無法讀取或寫入檔案 \"$1\"。",
        "filejournal-fail-dbconnect": "無法連接到儲存庫後端 \"$1\" 的日誌資料庫。",
        "filejournal-fail-dbquery": "無法更新儲存庫後端 \"$1\" 的日誌資料庫。",
        "lockmanager-fail-acquirelock": "無法取得 \"$1\" 的鎖定狀態。",
        "lockmanager-fail-openlock": "無法開啟 \"$1\" 的鎖定檔案。",
        "lockmanager-fail-releaselock": "無法釋放 \"$1\" 的鎖定狀態。",
-       "lockmanager-fail-db-bucket": "不能在$1池中聯繫到足夠鎖數據庫。",
+       "lockmanager-fail-db-bucket": "無法聯繫於清單 $1 中足夠要鎖定資料庫。",
        "lockmanager-fail-db-release": "無法釋放資料庫 $1 的鎖定狀態。",
        "lockmanager-fail-svr-acquire": "無法取得伺服器 $1 的鎖定狀態。",
        "lockmanager-fail-svr-release": "無法釋放伺服器 $1 的鎖定狀態。",
        "linkstoimage-more": "超過$1個頁面連接到這個檔案。\n此處只列出首$1個連接到此檔案的頁面。\n您也可以查看[[Special:WhatLinksHere/$2|完整的清單]]。",
        "nolinkstoimage": "沒有頁面連接到本檔案。",
        "morelinkstoimage": "檢視連接到這個檔案的[[Special:WhatLinksHere/$1|更多連結]]。",
-       "linkstoimage-redirect": "$1 (檔案重新導向至) $2",
+       "linkstoimage-redirect": "$1(檔案重定向)$2",
        "duplicatesoffile": "以下 $1 個檔案與此檔案重覆 ([[Special:FileDuplicateSearch/$2|了解詳細資訊]]):",
        "sharedupload": "此檔案來自 $1 且可能被其他專案所使用。",
        "sharedupload-desc-there": "此檔案來自 $1 且可能被其他專案所使用。\n請參考 [$2 檔案描述頁面] 了解進一步資訊。",
        "mimetype": "MIME 類型:",
        "download": "下載",
        "unwatchedpages": "未監視的頁面",
-       "listredirects": "重新導向頁面清單",
+       "listredirects": "重向頁面清單",
        "listduplicatedfiles": "重複檔案列表",
        "listduplicatedfiles-summary": "以下列表中某檔案之最新版本與其他檔案之最新版本重複。進包含本地檔案",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] 有[[$3|其他 $2 個重複檔案]]。",
        "randomincategory-nopages": "[[:Category:$1]]中沒有頁面。",
        "randomincategory-selectcategory": "從分類中獲取隨機頁面:$1 $2",
        "randomincategory-selectcategory-submit": "執行",
-       "randomredirect": "隨機重新導向",
-       "randomredirect-nopages": "在命名空間 \"$1\" 中沒有重新導向頁面。",
+       "randomredirect": "隨機重向",
+       "randomredirect-nopages": "在命名空間\"$1\"中沒有任何重定向頁面。",
        "statistics": "統計",
        "statistics-header-pages": "頁面統計",
        "statistics-header-edits": "編輯統計",
        "statistics-header-hooks": "其它統計",
        "statistics-articles": "內容頁面",
        "statistics-pages": "頁面",
-       "statistics-pages-desc": "在 Wiki 上所有的頁面,包含對話頁面、重新導向頁面...等。",
+       "statistics-pages-desc": "在 wiki 上所有的頁面,包括對話頁面、重定向頁面等。",
        "statistics-files": "已經上傳的檔案",
        "statistics-edits": "自 {{SITENAME}} 成立以來的頁面編輯數",
        "statistics-edits-average": "每頁平均編輯數",
        "pageswithprop-submit": "執行",
        "pageswithprop-prophidden-long": "已隱藏過長的屬性值 ($1)",
        "pageswithprop-prophidden-binary": "已隱藏二進位屬性值 ($1)",
-       "doubleredirects": "雙重的重新導向頁面",
+       "doubleredirects": "雙重重定向",
        "doubleredirectstext": "這一頁列出所有重定向頁面重定向到另一個重定向頁的頁面。每一行都包含到第一和第二個重定向頁面的連結,以及第二個重定向頁面的目標,通常顯示的都會是\"真正\"的目標頁面,也就是第一個重定向頁面應該指向的頁面。\n<del>已劃去</del>的為已經解決之項目。",
-       "double-redirect-fixed-move": "[[$1]] 已完成移動。\n此頁面已自動更新並重新導向至 [[$2]]。",
+       "double-redirect-fixed-move": "[[$1]] 已完成移動。\n此頁面已自動更新並重向至 [[$2]]。",
        "double-redirect-fixed-maintenance": "作為維護工作自動修復於[[$1]]至[[$2]]之雙重重定向。",
-       "double-redirect-fixer": "重新導向修正器",
-       "brokenredirects": "損壞的重新導向頁面",
-       "brokenredirectstext": "以下的重新導向頁面連結到不存在的頁面:",
+       "double-redirect-fixer": "重定向修正者",
+       "brokenredirects": "損壞的重向頁面",
+       "brokenredirectstext": "以下的重定向頁面均指向不存在的頁面:",
        "brokenredirects-edit": "編輯",
        "brokenredirects-delete": "刪除",
        "withoutinterwiki": "未有語言連結的頁面",
        "fewestrevisions": "最少修訂的頁面",
        "nbytes": "$1 個位元組",
        "ncategories": "$1 個分類",
-       "ninterwikis": "$1 個跨維基連結",
+       "ninterwikis": "$1 個 Interwiki 連結",
        "nlinks": "$1 個連結",
        "nmembers": "$1 個成員",
        "nmemberschanged": "$1 → $2 個成員",
        "wantedtemplates": "需要的樣版",
        "mostlinked": "最多連結頁面",
        "mostlinkedcategories": "最多連結分類",
-       "mostlinkedtemplates": "最多連結的樣版",
+       "mostlinkedtemplates": "最多被嵌入包含的頁面",
        "mostcategories": "最多分類頁面",
        "mostimages": "最多連結檔案",
-       "mostinterwikis": "最多跨維基連結的頁面",
+       "mostinterwikis": "最多 Interwiki 連結的頁面",
        "mostrevisions": "最多修訂頁面",
        "prefixindex": "所有頁面與字首",
        "prefixindex-namespace": "所有含字首的頁面 ($1 命名空間)",
        "protectedpages-indef": "只顯示無限期的保護頁面",
        "protectedpages-summary": "此頁面列出目前受保護的頁面。 欲查詢受保護標題清單,請參考 [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]]。",
        "protectedpages-cascade": "只顯示連鎖的保護頁面",
-       "protectedpages-noredirect": "隱藏重新導向頁面",
+       "protectedpages-noredirect": "隱藏重向頁面",
        "protectedpagesempty": "在這些參數下沒有頁面正在保護。",
        "protectedpages-timestamp": "日期時間",
        "protectedpages-page": "頁面",
        "allpagesprefix": "顯示以此為字首頁面:",
        "allpagesbadtitle": "指定的頁面標題無效、包含內部語言或內部 Wiki 的字首。\n它可能包含一個或多個的不能用於標題的字元。",
        "allpages-bad-ns": "{{SITENAME}} 沒有 \"$1\" 命名空間。",
-       "allpages-hide-redirects": "隱藏重新導向頁面",
+       "allpages-hide-redirects": "隱藏重向頁面",
        "cachedspecial-viewing-cached-ttl": "你正在瀏覽本頁的緩存版本,至多可能存在$1的延遲。",
        "cachedspecial-viewing-cached-ts": "您正在閱讀此頁的緩存版本,這可能不是完整的版本。",
        "cachedspecial-refresh-now": "查看最新。",
        "emailnotarget": "收件人不存在或無效的使用者名稱。",
        "emailtarget": "輸入收件人使用者名稱",
        "emailusername": "使用者名稱:",
-       "emailusernamesubmit": "提交",
+       "emailusernamesubmit": "送出",
        "email-legend": "發送電子郵件給另一位 {{SITENAME}} 使用者",
        "emailfrom": "寄件人:",
        "emailto": "收件人:",
        "emailsent": "電子郵件已發送",
        "emailsenttext": "您的電子郵件訊息已經送出。",
        "emailuserfooter": "這封電子郵件是由 $1 透過 {{SITENAME}} 的 \"發送信件給使用者\" 功能寄給 $2。",
-       "usermessage-summary": "給系統æ¶\88息。",
-       "usermessage-editor": "系統界面",
-       "watchlist": "監視列表",
-       "mywatchlist": "監視列表",
-       "watchlistfor2": "$1的監視列表 $2",
-       "nowatchlist": "您的監視列表為空。",
-       "watchlistanontext": "請$1以檢視或編輯您的監視列表。",
-       "watchnologin": "未登入",
-       "addwatch": "加至監視列表",
-       "addedwatchtext": "已將頁面 \"[[:$1]]\" 加入您的 [[Special:Watchlist|監視列表]]。若此頁面及其對話頁面有任何更動都會在監視列表中列出。",
-       "addedwatchtext-short": "已將頁面 \"$1\" 加入您的監視列表。",
-       "removewatch": "å\81\9cæ­¢ç\9b£è¦\96",
-       "removedwatchtext": "[[:$1]]已經從[[Special:Watchlist|您的監視頁面]]中移除。",
-       "removedwatchtext-short": "已將頁面 \"$1\" 從您的監視列表移除。",
+       "usermessage-summary": "ç\95\99給系統è¨\8a息。",
+       "usermessage-editor": "系統訊息",
+       "watchlist": "監視清單",
+       "mywatchlist": "監視清單",
+       "watchlistfor2": "$1 的監視清單 $2",
+       "nowatchlist": "您的監視清單沒有任何項目。",
+       "watchlistanontext": "請 $1 以檢視或編輯您的監視清單。",
+       "watchnologin": "未登入",
+       "addwatch": "新增至監視清單",
+       "addedwatchtext": "已於[[Special:Watchlist|您的監視清單]]新增頁面 \"[[:$1]]\"。\n未來對此頁面及其關聯的對話頁面的變更將會在此清單中列出。",
+       "addedwatchtext-short": "已於您的監視清單新增頁面 \"$1\"。",
+       "removewatch": "å¾\9eç\9b£è¦\96æ¸\85å\96®ä¸­ç§»é\99¤",
+       "removedwatchtext": "已於[[Special:Watchlist|您的監視清單]]移除頁面 \"[[:$1]]\"。",
+       "removedwatchtext-short": "已於您的監視清單移除頁面 \"$1\"。",
        "watch": "監視",
-       "watchthispage": "ç\9b£è¦\96æ\9c¬é \81",
+       "watchthispage": "ç\9b£è¦\96æ­¤é \81é\9d¢",
        "unwatch": "取消監視",
        "unwatchthispage": "停止監視",
-       "notanarticle": "不是頁面",
+       "notanarticle": "非內容的頁面",
        "notvisiblerev": "最後一次由其他使用者所作的修訂已經被刪除",
-       "watchlist-details": "您的監視列表上共有 $1 個頁面 (不包含對話頁面)。",
-       "wlheader-enotif": "已經啟動電子郵件通知功能。",
+       "watchlist-details": "您的監視清單上共有 $1 個頁面 (不包含對話頁面)。",
+       "wlheader-enotif": "已開啟電子郵件通知功能。",
        "wlheader-showupdated": "在您最後一次檢視過後修改的頁面會以 <strong>粗體</strong> 顯示。",
        "wlnote2": "以下為截至 $2 $3 最近 <strong>$1</strong> 小時的變更。",
        "wlshowlast": "顯示最近 $1 小時,$2 天,$3 的修改",
-       "watchlist-options": "監視列表選項",
+       "watchlist-options": "監視清單選項",
        "watching": "正在監視...",
        "unwatching": "正在停止監視...",
-       "watcherrortext": "更改「$1」的監視列表設定時發生錯誤。",
-       "enotif_reset": "將所有頁面標為已檢視",
+       "watcherrortext": "變更 \"$1\" 的監視清單設定時發生錯誤。",
+       "enotif_reset": "標記所有頁面為已檢視",
        "enotif_impersonal_salutation": "{{SITENAME}} 使用者",
        "enotif_subject_deleted": "{{SITENAME}} $2 已刪除頁面 $1",
        "enotif_subject_created": "{{SITENAME}} $2 已建立頁面 $1",
        "enotif_lastvisited": "請參考 $1 檢視自您上次檢視後所有的變更。",
        "enotif_lastdiff": "請參考 $1 檢視此變更。",
        "enotif_anon_editor": "匿名使用者 $1",
-       "enotif_body": "$WATCHINGUSERNAME 您好,\n\n$PAGEINTRO $NEWPAGE\n\n編輯摘要:$PAGESUMMARY $PAGEMINOREDIT\n\n編輯者聯絡方式:\n信箱:$PAGEEDITOR_EMAIL\n本站:$PAGEEDITOR_WIKI\n\n在您檢視該頁面之前,接下來的變更系統不會再向您發出通知。您也可以在監視列表中重設您所有監視頁面的通知狀態。\n\n{{SITENAME}} 通知系統啟\n\n--\n更改您的電子郵件通知設定,請至:\n{{canonicalurl:{{#special:Preferences}}}}\n\n更改您的監視列表設定,請至:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\n從監視列表中刪除此頁面,請至:\n$UNWATCHURL\n\n回函並取得進一步協助:\n$HELPPAGE",
+       "enotif_body": "$WATCHINGUSERNAME 您好,\n\n$PAGEINTRO $NEWPAGE\n\n編輯摘要:$PAGESUMMARY $PAGEMINOREDIT\n\n編輯者聯絡方式:\n信箱:$PAGEEDITOR_EMAIL\n本站:$PAGEEDITOR_WIKI\n\n在您檢視該頁面之前,接下來的變更系統不會再向您發出通知。您也可以在監視清單中重設您所有監視頁面的通知狀態。\n\n{{SITENAME}} 通知系統啟\n\n--\n更改您的電子郵件通知設定,請至:\n{{canonicalurl:{{#special:Preferences}}}}\n\n更改您的監視清單設定,請至:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\n從監視清單中刪除此頁面,請至:\n$UNWATCHURL\n\n回函並取得進一步協助:\n$HELPPAGE",
        "created": "建立了",
        "changed": "更改",
        "deletepage": "刪除頁面",
        "excontent": "內容為:\"$1\"",
        "excontentauthor": "內容為:\"$1\" (且僅有一位貢獻者 \"[[Special:Contributions/$2|$2]]\")",
        "exbeforeblank": "被清空前的內容為:\"$1\"",
-       "delete-confirm": "刪除「$1」",
+       "delete-confirm": "刪除 \"$1\"",
        "delete-legend": "刪除",
        "historywarning": "<strong>警告:</strong>您正要刪除的頁面內含有約 $1 次{{PLURAL:$1|的修訂}}歷史:",
        "confirmdeletetext": "您正要刪除一個頁面或圖片以及其所有歷史。\n請確定您了解要進行此項操作所造成的後果,同時確認您的行為符合[[{{MediaWiki:Policy-url}}]] 規範。",
        "deletecomment": "原因:",
        "deleteotherreason": "其它/額外的原因:",
        "deletereasonotherlist": "其它理由",
-       "deletereason-dropdown": "*常見的刪除原因\n** 濫發廣告訊息\n** 破壞資料\n** 侵犯版權\n** 作者請求\n** 損壞的重新導向頁面",
+       "deletereason-dropdown": "* 常見的刪除原因\n** 濫發廣告訊息\n** 破壞\n** 侵犯版權\n** 作者請求\n** 損壞的重定向",
        "delete-edit-reasonlist": "編輯刪除理由",
        "delete-toobig": "這個頁面有一個十分大量的編輯歷史,超過$1次修訂。刪除此類頁面的動作已經被限制,以防止在{{SITENAME}}上的意外擾亂。",
        "delete-warning-toobig": "這個頁面有一個十分大量的編輯歷史,超過$1次修訂。刪除它可能會擾亂{{SITENAME}}的資料庫操作;在繼續此動作前請小心。",
        "viewdeletedpage": "檢視已刪除的頁面",
        "undeletepagetext": "以下的$1個頁面已經被刪除,但依然在檔案中並可以被恢復。\n檔案庫可能被定時清理。",
        "undelete-fieldset-title": "還原修訂",
-       "undeleteextrahelp": "恢復整個頁面時,請清除所有複選框後按 '''''{{int:undeletebtn}}''''' 。\n恢復特定版本時,請選擇相應版本前的複選框後按'''''{{int:undeletebtn}}''''' 。\n按 '''''{{int:undeletereset}}''''' 將清除評論內容及所有複選框。",
-       "undeleterevisions": "$1版本存檔",
+       "undeleteextrahelp": "若要還原所有的頁面歷史,請取消勾選所有核選方塊並點選 <strong><em>{{int:undeletebtn}}</em></strong>。\n若要還原指定的頁面歷史,請勾選要還原的修訂核選方塊並點選 <strong><em>{{int:undeletebtn}}</em></strong>。",
+       "undeleterevisions": "已封存 $1 個修訂",
        "undeletehistory": "若您還原該頁面,所有的修訂歷史也會一併還原。\n若刪除之後已有使用相同名稱建立的新頁面,還原的修訂歷史會出現在此頁面之前的歷史中。",
-       "undeleterevdel": "如果把最新修訂部份刪除,反刪除便無法進行。如果遇到這種情況,您必須反選或反隱藏最新已刪除的修訂。",
-       "undeletehistorynoadmin": "此頁面已經被刪除。\n以下為刪除原因的摘要並包含刪除之前有那些使用者曾編輯此頁面。\n只有管理者可以檢視實際被刪除的修訂內容。",
+       "undeleterevdel": "若最新頁面或檔案修訂被部份刪除,將無法執行取消刪除的動作。\n這種情況您必須取選勾選或取消隱藏已刪除的最新修訂。",
+       "undeletehistorynoadmin": "已刪除此頁面。\n以下摘要顯示刪除原因與刪除前所有編輯過此頁面的使用者詳細資料。\n只有管理員可檢視實際被刪除的文字內容。",
        "undelete-revision": "由 $3 刪除的 $1 (於 $4 $5) 修訂:",
-       "undeleterevision-missing": "此版本的內容不正確或已經遺失。可能連結錯誤、被移除或已經被恢復。",
-       "undelete-nodiff": "æ\89¾ä¸\8då\88°å\85\88å\89\8dç\9a\84ä¿®è¨\82ç\89\88æ\9c¬。",
+       "undeleterevision-missing": "無效或遺失的修訂。\n您可能使用了錯誤的連結,或該修訂已從封存中還原或刪除。",
+       "undelete-nodiff": "æ\9f¥ç\84¡å\85\88å\89\8dç\9a\84ä¿®è¨\82。",
        "undeletebtn": "還原",
-       "undeletelink": "檢視還原",
+       "undeletelink": "檢視/還原",
        "undeleteviewlink": "檢視",
        "undeleteinvert": "反向選擇",
        "undeletecomment": "原因:",
-       "undeletedrevisions": "$1個修訂版本已經恢復",
-       "undeletedrevisions-files": "$1 個版本和 $2 個檔案被恢復",
-       "undeletedfiles": "$1 個檔案被恢復",
-       "cannotundelete": "恢復失敗:$1",
-       "undeletedpage": "'''$1已經被恢復''' 請參考[[Special:Log/delete|刪除日誌]]來查詢刪除及恢復記錄。",
-       "undelete-header": "如要查詢最近的記錄請參閱[[Special:Log/delete|刪除日誌]]。",
-       "undelete-search-title": "搜已刪除頁面",
+       "undeletedrevisions": "已還原 $1 個修訂",
+       "undeletedrevisions-files": "已還原 $1 個修訂和 $2 個檔案",
+       "undeletedfiles": "已還原 $1 個檔案",
+       "cannotundelete": "取消刪除失敗:\n$1",
+       "undeletedpage": "<strong>已還原 $1</strong>\n\n請參考 [[Special:Log/delete|刪除日誌]] 以查詢最近刪除及還原的記錄。",
+       "undelete-header": "請參考 [[Special:Log/delete|刪除日誌]] 查詢最近刪除的頁面。",
+       "undelete-search-title": "搜已刪除頁面",
        "undelete-search-box": "搜尋已刪除頁面",
-       "undelete-search-prefix": "顯示頁面自:",
+       "undelete-search-prefix": "顯示頁面開始自:",
        "undelete-search-submit": "搜尋",
-       "undelete-no-results": "刪除記錄裡沒有符合的結果。",
-       "undelete-filename-mismatch": "不能刪除帶有時間截記的檔案修訂 $1: 檔案不匹配",
-       "undelete-bad-store-key": "不能刪除帶有時間截記的檔案修訂 $1: 檔案於刪除前遺失。",
-       "undelete-cleanup-error": "刪除無用的存檔檔案「$1」時發生錯誤。",
-       "undelete-missing-filearchive": "由於檔案存檔 ID $1 不在資料庫中,不能在檔案存檔中恢復。它可能已經反刪除了。",
-       "undelete-error": "恢復已刪除頁面時出錯",
-       "undelete-error-short": "å\8f\8då\88ªé\99¤æª\94æ¡\88æ\99\82ç\99¼ç\94\9fé\8c¯èª¤: $1",
-       "undelete-error-long": "當進行反刪除檔案時遇到錯誤:\n\n$1",
-       "undelete-show-file-confirm": "確定要檢視在 $2 $3 ,\"<nowiki>$1</nowiki>\"的已刪除修訂版本嗎?",
+       "undelete-no-results": "刪除記錄裡沒有符合的頁面。",
+       "undelete-filename-mismatch": "無法取消刪除時間為 $1 的檔案修訂:檔案名稱不符。",
+       "undelete-bad-store-key": "無法取消刪除時間為 $1 的檔案修訂:在刪除前檔案已遺失。",
+       "undelete-cleanup-error": "刪除未使用的封存檔案 \"$1\" 時發生錯誤。",
+       "undelete-missing-filearchive": "資料庫不存在檔案封存 ID $1,無法還原檔案。\n該檔案可能已經取消刪除。",
+       "undelete-error": "取消刪除頁面錯誤",
+       "undelete-error-short": "å\8f\96æ¶\88å\88ªé\99¤æª\94æ¡\88é\8c¯èª¤ï¼\9a$1",
+       "undelete-error-long": "取消刪除檔案時發生錯誤:\n\n$1",
+       "undelete-show-file-confirm": "您確定要檢視檔案 \"<nowiki>$1</nowiki>\" 於 $2 $3 已刪除的修訂?",
        "undelete-show-file-submit": "是",
        "namespace": "命名空間:",
        "invert": "反向選擇",
-       "tooltip-invert": "勾選此核選方塊以隱藏在已選擇命名空間中的頁面變更 (若有勾擇相關命名空間)",
+       "tooltip-invert": "勾選此核選方塊以隱藏選擇命名空間中的頁面變更 (若勾選相關命名空間,則會同時隱藏相關命名空間)",
        "namespace_association": "相關命名空間",
-       "tooltip-namespace_association": "勾選此核選方塊以包含選擇命名空間相關的對話或主題命名空間",
+       "tooltip-namespace_association": "勾選此核選方塊以包含選擇命名空間相關的對話或主題命名空間",
        "blanknamespace": "(主要)",
        "contributions": "{{GENDER:$1|使用者}}貢獻",
        "contributions-title": "$1 的使用者貢獻",
        "linkshere": "以下頁面連結到[[:$1]]:",
        "nolinkshere": "沒有頁面連結到[[:$1]]。",
        "nolinkshere-ns": "已選擇的命名空間中沒有頁面連結到 [[:$1]]。",
-       "isredirect": "重新導向頁面",
+       "isredirect": "重向頁面",
        "istemplate": "引用",
        "isimage": "檔案連結",
        "whatlinkshere-prev": "前 $1 筆",
        "whatlinkshere-next": "後 $1 筆",
        "whatlinkshere-links": "← 連入",
-       "whatlinkshere-hideredirs": "$1 重新導向頁面",
+       "whatlinkshere-hideredirs": "$1 重向頁面",
        "whatlinkshere-hidetrans": "$1 引用",
        "whatlinkshere-hidelinks": "$1 連結",
        "whatlinkshere-hideimages": "$1 檔案連結",
        "ipbreason": "原因:",
        "ipbreason-dropdown": "*常見的封鎖原因\n** 填寫不實資訊\n** 刪除頁面內容\n** 散佈外部廣告連結\n** 在頁面填寫無意義文字\n** 無禮的行為、攻擊/騷擾別人\n** 濫用多個帳號\n** 使用不受歡迎的使用者名稱",
        "ipb-hardblock": "避免使用此 IP 位址登入的使用者編輯",
-       "ipbcreateaccount": "阻止創建新賬號",
-       "ipbemailban": "避免使用者發送電子郵件",
+       "ipbcreateaccount": "禁止建立帳號",
+       "ipbemailban": "禁止使用者發送電子郵件",
        "ipbenableautoblock": "自動封鎖此使用者最後使用的 IP 位置,以及所有之後嘗試編輯使用的 IP 位址",
        "ipbsubmit": "查封該地址",
        "ipbother": "其它時間:",
        "ipb-disableusertalk": "避免在封鎖此使用者的期間編輯自己的對話頁面",
        "ipb-change-block": "使用現有設定重新封鎖使用者",
        "ipb-confirm": "確認封鎖",
-       "badipaddress": "無效IP地址",
+       "badipaddress": "無效的 IP 位址",
        "blockipsuccesssub": "封鎖成功",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] 已經被封鎖。<br />\n請參考 [[Special:BlockList|封鎖清單]] 以檢查目前的封鎖。",
        "ipb-blockingself": "您要封鎖自己!您確定要這樣做嗎?",
        "ipb-confirmhideuser": "您要封鎖一位使用者並且 \"隱藏\" 該使用者,這會禁止顯示所有出現在清單及記錄中的使用者名稱。\n你確定要這樣做?",
-       "ipb-confirmaction": "如果您確信這樣做,請檢查底部的「{{int:ipb-confirm}}」部分。",
+       "ipb-confirmaction": "若您確定要這樣做,請檢查下方的 \"{{int:ipb-confirm}}\" 欄位。",
        "ipb-edit-dropdown": "編輯封鎖原因",
        "ipb-unblock-addr": "解除封鎖 $1",
        "ipb-unblock": "解除封鎖使用者名稱或 IP 位址",
        "unblock-hideuser": "由於此使用者名稱已被設為隱藏,您無法解除封鎖這個使用者。",
        "ipb_cant_unblock": "錯誤:查無封鎖 ID $1,可能已被解除封鎖。",
        "ipb_blocked_as_range": "錯誤:IP 位址 $1 並不是直接被封鎖,因此無法直接解除封鎖。\n此 IP 位址在 $2 的封鎖範圍之中,您可以解決此範圍的封鎖。",
-       "ip_range_invalid": "無效的IP範圍。",
+       "ip_range_invalid": "無效的 IP 範圍。",
        "ip_range_toolarge": "不允許封鎖範圍大於 /$1。",
        "proxyblocker": "代理封鎖器",
        "proxyblockreason": "因您的 IP 位址是開放代理伺服器,已被封鎖。\n請聯繫您的網路服務供應商或您所在組織的技術支援,告知他們此嚴重的安全性問題。",
        "cant-see-hidden-user": "您欲封鎖的使用者已經被封鎖並且隱藏。\n您沒有隱藏使用者的權限,您無法檢視或編輯該使用者的封鎖狀態。",
        "ipbblocked": "因您已被封鎖,故無法封鎖或解除封鎖其他使用者。",
        "ipbnounblockself": "不允許解除封鎖自己。",
-       "lockdb": "禁止更改資料庫",
-       "unlockdb": "開放更改資料庫",
+       "lockdb": "鎖定資料庫",
+       "unlockdb": "解除鎖定資料庫",
        "lockdbtext": "鎖定資料庫將會中止所有使用者編輯頁面、更改偏好設定、編輯監視清單與其他需要更動到資料庫的操作。\n請確認您是否要這樣做,並在維護作業結束時解除資料庫的鎖定。",
-       "unlockdbtext": "取消鎖定資料庫會恢復所有使用者編輯頁面、更改偏好設定、編輯監視清單與其他需要更動到資料庫的操作。\n請確認您是否要這樣做。",
-       "lockconfirm": "是的,我確實想要封鎖資料庫。",
-       "unlockconfirm": "是的,我確實想要開放資料庫。",
-       "lockbtn": "資料庫上鎖",
-       "unlockbtn": "開放資料庫",
-       "locknoconfirm": "您並沒有勾選確認按鈕。",
-       "lockdbsuccesssub": "資料庫成功上鎖",
-       "unlockdbsuccesssub": "資料庫開放",
-       "lockdbsuccesstext": "{{SITENAME}}資料庫已經上鎖。\n<br />請記住在維護完成後重新開放資料庫。",
-       "unlockdbsuccesstext": "{{SITENAME}}資料庫重新開放。",
-       "lockfilenotwritable": "資料庫鎖定檔案不可寫入。要鎖定和解鎖資料庫,該檔案必須對網路伺服器可寫入。",
-       "databasenotlocked": "資料庫沒有鎖定。",
-       "lockedbyandtime": "在$2的$3由$1",
-       "move-page": "移動$1",
+       "unlockdbtext": "解除鎖定資料庫會恢復所有使用者編輯頁面、更改偏好設定、編輯監視清單與其他需要更動到資料庫的操作。\n請確認您是否要這樣做。",
+       "lockconfirm": "是的,我想要鎖定資料庫。",
+       "unlockconfirm": "是的,我想要解除鎖定資料庫。",
+       "lockbtn": "鎖定資料庫",
+       "unlockbtn": "解除鎖定資料庫",
+       "locknoconfirm": "您未勾選確認核選方塊。",
+       "lockdbsuccesssub": "已成功鎖定資料庫",
+       "unlockdbsuccesssub": "已移除資料庫鎖定",
+       "lockdbsuccesstext": "已鎖定資料庫。<br />\n請記得在維護完成後 [[Special:UnlockDB|解除鎖定]] 資料庫。",
+       "unlockdbsuccesstext": "已解除鎖定資料庫。",
+       "lockfilenotwritable": "沒有權限寫入資料庫鎖定檔案。\n網頁伺服器需要該檔案的寫入權限以鎖定和解除鎖定資料庫。",
+       "databasenotlocked": "資料庫尚未鎖定。",
+       "lockedbyandtime": "(由 {{GENDER:$1|$1}} 於 $2 的 $3)",
+       "move-page": "移動 $1",
        "move-page-legend": "移動頁面",
-       "movepagetext": "使ç\94¨ä»¥ä¸\8b表å\96®ä¾\86é\87\8dæ\96°å\91½å\90\8dä¸\80å\80\8bé \81é\9d¢ç\9a\84å\90\8d稱ï¼\8c並å°\87æ\89\80æ\9c\89é \81é\9d¢ç\9a\84æ­·å\8f²è¨\98é\8c\84ä¸\80併移è\87³æ\96°ç\9a\84é \81é\9d¢ï¼\8c\nè\88\8aæ¨\99é¡\8cç\9a\84é \81é\9d¢å°\87æ\9c\83è®\8aæ\88\90é\87\8dæ\96°å°\8eå\90\91é \81é\9d¢ï¼\8cå°\8eå\90\91è\87³ä½¿ç\94¨æ\96°æ¨\99é¡\8cç\9a\84é \81é\9d¢ã\80\82\næ\82¨å\8f¯ä»¥é\81¸æ\93\87è\87ªå\8b\95æ\9b´æ\96°å°\87æ\89\80æ\9c\89å°\8eå\90\91è\87³è\88\8aé \81é\9d¢ç\9a\84é\87\8dæ\96°å°\8eå\90\91é \81é\9d¢æ\94¹å°\8eå\90\91å\88°æ\96°ç\9a\84é \81é\9d¢ï¼\8c\nè\8b¥æ\82¨é\81¸æ\93\87ä¸\8d使ç\94¨è\87ªå\8b\95æ\9b´æ\96°ï¼\8cè«\8bè¨\98å¾\97檢æ\9f¥ [[Special:DoubleRedirects|é\9b\99é\87\8dç\9a\84é\87\8dæ\96°å°\8eå\90\91é \81é\9d¢]] æ\88\96 [[Special:BrokenRedirects|æ\90\8då£\9eç\9a\84é\87\8dæ\96°å°\8eå\90\91é \81é\9d¢]]ï¼\8c\næ\82¨æ\9c\89責任è®\93é\80£çµ\90維æ\8c\81æ\9c\89æ\95\88並ä¸\94è\83½å¤ ç¹¼çº\8cé\80£çµ\90å\88°æ­£ç¢ºç\9a\84æ\96°é \81é\9d¢ã\80\82\n\nè«\8b注æ\84\8fï¼\8cè\8b¥æ\96°ç\9a\84é \81é\9d¢å\90\8d稱已ç¶\93被使ç\94¨ï¼\8cå\89\87æ­¤é \81é\9d¢å°\87<strong>ä¸\8dæ\9c\83</strong>被移å\8b\95ï¼\8cé\99¤é\9d\9eæ\96°å\90\8d稱å­\98å\9c¨ç\9a\84æ\98¯é\87\8dæ\96°å°\8eå\90\91é \81é\9d¢ä¸\94æ²\92æ\9c\89ä»»ä½\95ç\9a\84編修è¨\98é\8c\84ã\80\82\né\80\99å\80\8bæ\84\8fæ\80\9dæ\8c\87ç\9a\84æ\98¯ï¼\8cæ\82¨å\8f¯å°\87å\9b å¤±èª¤è\80\8c移å\8b\95è\87³å\85¶ä»\96å\90\8d稱ç\9a\84é \81é\9d¢å¾©å\8e\9fç\82ºè\88\8aç\9a\84å\90\8d稱ï¼\8c並ä¸\94æ\82¨ä¸\8då\8f¯ä»¥è¦\86è\93\8bä»»ä½\95å·²å­\98å\9c¨ç\9a\84é \81é\9d¢ã\80\82\n\n<strong>è­¦å\91\8aï¼\81</strong>\né\80\99å\80\8bå\8b\95ä½\9cå°\8då\8f\97æ­¡è¿\8eç\9a\84é \81é\9d¢å\8f¯è\83½æ\98¯ä¸\80å\80\8bé\87\8d大è\88\87å\94\90çª\81ç\9a\84æ\9b´æ\94¹ï¼\9b\nè«\8bå\9c¨è¡\8cå\8b\95å\89\8d確èª\8dæ\82¨å·²äº\86解å\8f¯è\83½å¸¶ä¾\86後果。",
-       "movepagetext-noredirectfixer": "使ç\94¨ä»¥ä¸\8b表å\96®ä¾\86é\87\8dæ\96°å\91½å\90\8dä¸\80å\80\8bé \81é\9d¢ç\9a\84å\90\8d稱ï¼\8c並å°\87æ\89\80æ\9c\89é \81é\9d¢ç\9a\84æ­·å\8f²è¨\98é\8c\84ä¸\80併移è\87³æ\96°ç\9a\84é \81é\9d¢ï¼\8c\nè\88\8aæ¨\99é¡\8cç\9a\84é \81é\9d¢å°\87æ\9c\83è®\8aæ\88\90é\87\8dæ\96°å°\8eå\90\91é \81é\9d¢ï¼\8cå°\8eå\90\91è\87³ä½¿ç\94¨æ\96°æ¨\99é¡\8cç\9a\84é \81é\9d¢ã\80\82\nè«\8bè¨\98å¾\97檢æ\9f¥ [[Special:DoubleRedirects|é\9b\99é\87\8då°\8eå\90\91é \81é\9d¢]] æ\88\96 [[Special:BrokenRedirects|中æ\96·ç\9a\84å°\8eå\90\91é \81é\9d¢]]ï¼\8c\næ\82¨æ\9c\89責任è®\93é\80£çµ\90維æ\8c\81æ\9c\89æ\95\88並ä¸\94è\83½å¤ ç¹¼çº\8cé\80£çµ\90å\88°æ­£ç¢ºç\9a\84æ\96°é \81é\9d¢ã\80\82\n\nè«\8b注æ\84\8fï¼\8cè\8b¥æ\96°ç\9a\84é \81é\9d¢å\90\8d稱已ç¶\93被使ç\94¨ï¼\8cå\89\87æ­¤é \81é\9d¢å°\87<strong>ä¸\8dæ\9c\83</strong>被移å\8b\95ï¼\8cé\99¤é\9d\9eæ\96°å\90\8d稱å­\98å\9c¨ç\9a\84æ\98¯é\87\8dæ\96°å°\8eå\90\91é \81é\9d¢ä¸\94æ²\92æ\9c\89ä»»ä½\95ç\9a\84編修è¨\98é\8c\84ã\80\82\né\80\99å\80\8bæ\84\8fæ\80\9dæ\8c\87ç\9a\84æ\98¯ï¼\8cæ\82¨å\8f¯å°\87å\9b å¤±èª¤è\80\8c移å\8b\95è\87³å\85¶ä»\96å\90\8d稱ç\9a\84é \81é\9d¢å¾©å\8e\9fç\82ºè\88\8aç\9a\84å\90\8d稱ï¼\8c並ä¸\94æ\82¨ä¸\8då\8f¯ä»¥è¦\86è\93\8bä»»ä½\95å·²å­\98å\9c¨ç\9a\84é \81é\9d¢ã\80\82\n\n<strong>è­¦å\91\8aï¼\81</strong>\né\80\99å\80\8bå\8b\95ä½\9cå°\8då\8f\97æ­¡è¿\8eç\9a\84é \81é\9d¢å\8f¯è\83½æ\98¯ä¸\80å\80\8bé\87\8d大è\88\87å\94\90çª\81ç\9a\84æ\9b´æ\94¹ï¼\9b\nè«\8bå\9c¨è¡\8cå\8b\95å\89\8d確èª\8dæ\82¨å·²äº\86解å\8f¯è\83½å¸¶ä¾\86後果。",
+       "movepagetext": "以ä¸\8b表格å\8f¯ä»¥ç\94¨ä¾\86é\87\8dæ\96°å\91½å\90\8dé \81é\9d¢ï¼\8c並å°\87該é \81é\9d¢ç\9a\84æ\89\80æ\9c\89æ­·å\8f²è¨\98é\8c\84ä¸\80併移è\87³æ\93\81æ\9c\89æ\96°å\90\8d稱ç\9a\84é \81é\9d¢ã\80\82\nè\88\8aæ¨\99é¡\8cç\9a\84é \81é\9d¢å°\87æ\9c\83è®\8aæ\88\90é\87\8då®\9aå\90\91é \81é\9d¢ï¼\8cæ\8c\87å\90\91使ç\94¨æ\96°æ¨\99é¡\8cç\9a\84é \81é\9d¢ã\80\82\næ\82¨å\8f¯ä»¥é\81¸æ\93\87è\87ªå\8b\95æ\9b´æ\96°æ\89\80æ\9c\89æ\8c\87å\90\91è\88\8aé \81é\9d¢ç\9a\84é\87\8då®\9aå\90\91ï¼\8cè®\93å®\83å\80\91æ\94¹ç\82ºæ\8c\87å\90\91æ\96°é \81é\9d¢ã\80\82\nè\8b¥æ\82¨é\81¸æ\93\87ä¸\8dè\87ªå\8b\95æ\9b´æ\96°ï¼\8cè«\8b檢æ\9f¥æ\9c\89æ²\92æ\9c\89[[Special:DoubleRedirects|é\9b\99é\87\8dé\87\8då®\9aå\90\91]]æ\88\96[[Special:BrokenRedirects|æ\90\8då£\9eç\9a\84é\87\8då®\9aå\90\91]]é\9c\80è¦\81修正ã\80\82\næ\82¨æ\9c\89責任è®\93é\80£çµ\90ç¹¼çº\8cæ\8c\87å\90\91正確ç\9a\84å\9c°æ\96¹ã\80\82\n\nè«\8b注æ\84\8fï¼\8cè\8b¥æ\96°ç\9a\84é \81é\9d¢å\90\8d稱已ç¶\93被使ç\94¨ï¼\8cå\89\87æ­¤é \81é\9d¢å°\87<strong>ä¸\8dæ\9c\83</strong>移å\8b\95è\87³è©²è\99\95ï¼\8cé\99¤é\9d\9eæ\96°å\90\8d稱ä¸\8bæ\98¯å\80\8bé\87\8då®\9aå\90\91é \81é\9d¢è\80\8cä¸\94æ²\92æ\9c\89ä»»ä½\95編輯è¨\98é\8c\84ã\80\82\nå\8d³æ\98¯èªªï¼\8cæ\82¨å\8f¯ä»¥å°\87é\8c¯èª¤ç§»å\8b\95è\87³å\85¶ä»\96å\90\8d稱ç\9a\84é \81é\9d¢é\82\84å\8e\9få\88°å\8e\9fæ\9c\89å\90\8d稱ï¼\8cä½\86ä¸\8dè\83½è¦\86è\93\8bä»»ä½\95ç\8f¾æ\9c\89ç\9a\84é \81é\9d¢ã\80\82\n\n<strong>è­¦å\91\8aï¼\81</strong>\né\80\99å\80\8bå\8b\95ä½\9cå°\8då\8f\97æ­¡è¿\8eç\9a\84é \81é\9d¢ä¾\86說å\8f¯è\83½æ\98¯é\87\8d大è\80\8cå\94\90çª\81ç\9a\84æ\9b´æ\94¹ï¼\9b\nå\9c¨è¡\8cå\8b\95å\89\8dè«\8bå\85\88確èª\8dæ\82¨äº\86解移å\8b\95å\8f¯è\83½å¸¶ä¾\86ç\9a\84後果。",
+       "movepagetext-noredirectfixer": "以ä¸\8b表格å\8f¯ä»¥ç\94¨ä¾\86é\87\8dæ\96°å\91½å\90\8dé \81é\9d¢ï¼\8c並å°\87該é \81é\9d¢ç\9a\84æ\89\80æ\9c\89æ­·å\8f²è¨\98é\8c\84ä¸\80併移è\87³æ\93\81æ\9c\89æ\96°å\90\8d稱ç\9a\84é \81é\9d¢ã\80\82\nè\88\8aæ¨\99é¡\8cç\9a\84é \81é\9d¢å°\87æ\9c\83è®\8aæ\88\90é\87\8då®\9aå\90\91é \81é\9d¢ï¼\8cæ\8c\87å\90\91使ç\94¨æ\96°æ¨\99é¡\8cç\9a\84é \81é\9d¢ã\80\82\nè«\8b檢æ\9f¥æ\9c\89æ²\92æ\9c\89[[Special:DoubleRedirects|é\9b\99é\87\8dé\87\8då®\9aå\90\91]]æ\88\96[[Special:BrokenRedirects|æ\90\8då£\9eç\9a\84é\87\8då®\9aå\90\91]]é\9c\80è¦\81修正ã\80\82\næ\82¨æ\9c\89責任è®\93é\80£çµ\90ç¹¼çº\8cæ\8c\87å\90\91正確ç\9a\84å\9c°æ\96¹ã\80\82\n\nè«\8b注æ\84\8fï¼\8cè\8b¥æ\96°ç\9a\84é \81é\9d¢å\90\8d稱已ç¶\93被使ç\94¨ï¼\8cå\89\87æ­¤é \81é\9d¢å°\87<strong>ä¸\8dæ\9c\83</strong>移å\8b\95è\87³è©²è\99\95ï¼\8cé\99¤é\9d\9eæ\96°å\90\8d稱ä¸\8bæ\98¯å\80\8bé\87\8då®\9aå\90\91é \81é\9d¢è\80\8cä¸\94æ²\92æ\9c\89ä»»ä½\95編輯è¨\98é\8c\84ã\80\82\nå\8d³æ\98¯èªªï¼\8cæ\82¨å\8f¯ä»¥å°\87é\8c¯èª¤ç§»å\8b\95è\87³å\85¶ä»\96å\90\8d稱ç\9a\84é \81é\9d¢é\82\84å\8e\9få\88°å\8e\9fæ\9c\89å\90\8d稱ï¼\8cä½\86ä¸\8dè\83½è¦\86è\93\8bä»»ä½\95ç\8f¾æ\9c\89ç\9a\84é \81é\9d¢ã\80\82\n\n<strong>è­¦å\91\8aï¼\81</strong>\né\80\99å\80\8bå\8b\95ä½\9cå°\8då\8f\97æ­¡è¿\8eç\9a\84é \81é\9d¢ä¾\86說å\8f¯è\83½æ\98¯é\87\8d大è\80\8cå\94\90çª\81ç\9a\84æ\9b´æ\94¹ï¼\9b\nå\9c¨è¡\8cå\8b\95å\89\8dè«\8bå\85\88確èª\8dæ\82¨äº\86解移å\8b\95å\8f¯è\83½å¸¶ä¾\86ç\9a\84後果。",
        "movepagetalktext": "相關的的對話頁面 (如果有的話) 會自動與該頁面一起移動,<strong>除非:</strong>\n*新的名稱已有一個存在的對話頁面,或\n*您未勾選此核選方塊。\n\n在上述情況下,若有必要您必須手動移動或合併已存在的頁面。",
-       "movearticle": "移動頁面:",
-       "moveuserpage-warning": "<strong>警告:</strong> 您正要移動使用者頁面,請注意只有使用者頁面會變更名稱,並<em>不會</em>重新命名使用者。",
-       "movecategorypage-warning": "<strong>警告:</strong>您將要移動分類頁面。請注意此操作只頁面,舊分類中的頁面將<em>不會</em>移動到新的分類。",
+       "movearticle": "移動頁面",
+       "moveuserpage-warning": "<strong>警告:</strong>您正要移動使用者頁面,請注意只有使用者頁面會變更名稱,並<em>不會</em>重新命名使用者。",
+       "movecategorypage-warning": "<strong>警告:</strong>您正要移動分類頁面。請注意此操作只會移動頁面,在舊分類中的頁面將<em>不會</em>移動到新的分類。",
        "movenologintext": "您必須是已註冊的使用者並且 [[Special:UserLogin|登入]] 才可移動頁面。",
        "movenotallowed": "您沒有權限移動頁面。",
        "movenotallowedfile": "您沒有權限移動檔案。",
        "movepagebtn": "移動頁面",
        "pagemovedsub": "移動成功",
        "movepage-moved": "<strong>已移動 \"$1\" 至 \"$2\"</strong>",
-       "movepage-moved-redirect": "已建立重新導向頁面。",
-       "movepage-moved-noredirect": "已禁止建立重新導向頁面。",
-       "articleexists": "該名字的頁面已經存在,或者您選擇的名字無效。請再選一個名字。",
-       "cantmove-titleprotected": "您不可以移動這個頁面到這個位置,因為該新標題已經被保護以防止建立。",
+       "movepage-moved-redirect": "已建立重向頁面。",
+       "movepage-moved-noredirect": "已禁止建立重向頁面。",
+       "articleexists": "該頁面名稱已存在,或您選擇的名稱無效。\n請改選擇其他名稱。",
+       "cantmove-titleprotected": "您選擇的新標題已被禁止使用,您不可移動頁面到該位置。",
        "movetalk": "移動相關的對話頁面",
        "move-subpages": "移動子頁面 (共 $1 頁)",
        "move-talk-subpages": "移動對話頁面的子頁面 (共 $1 頁)",
-       "movepage-page-exists": "頁面 $1 已經存在,不可以自動地覆寫。",
-       "movepage-page-moved": "頁面 $1 已經移動到 $2。",
-       "movepage-page-unmoved": "頁面 $1 不可以移動到 $2。",
-       "movepage-max-pages": "最多有$1個頁面已經移動同時不可以自動地再移動更多。",
+       "movepage-page-exists": "頁面 $1 已存在,無法自動覆蓋。",
+       "movepage-page-moved": "已移動頁面 $1 到 $2。",
+       "movepage-page-unmoved": "無法移動頁面 $1 到 $2。",
+       "movepage-max-pages": "移動頁面的上限為 $1 頁,超出限制的頁面將不會自動移動。",
        "movelogpage": "移動日誌",
-       "movelogpagetext": "以下是所有移動的頁面清單:",
+       "movelogpagetext": "以下是所有移動頁面的動作記錄清單。",
        "movesubpage": "{{PLURAL:$1|子頁面}}",
-       "movesubpagetext": "這個頁面有$1個子頁面列示如下。",
-       "movenosubpage": "這個頁面沒有子頁面。",
+       "movesubpagetext": "此頁面有 $1 個子頁面如下所示。",
+       "movenosubpage": "此頁面沒有任何子頁面。",
        "movereason": "原因",
        "revertmove": "還原",
        "delete_and_move": "刪除並移動",
-       "delete_and_move_text": "==需要刪除==\n\n目標頁面\"[[:$1]]\"已經存在。{{GENDER:|你|妳|你}}確認需要刪除原頁面並以進行移動嗎?",
-       "delete_and_move_confirm": "是的,刪除頁面",
-       "delete_and_move_reason": "å\88ªé\99¤ä»¥ä¾¿ç§»å\8b\95[[$1]]",
-       "selfmove": "原始標題與目標標題相同,您不能移動一頁覆蓋本身。",
+       "delete_and_move_text": "== 需要刪除 ==\n目標頁面 \"[[:$1]]\" 已存在。\n您是否要刪除該頁面以完成移動?",
+       "delete_and_move_confirm": "是的,刪除頁面",
+       "delete_and_move_reason": "å·²å\88ªé\99¤è®\93ä¾\86è\87ª [[$1]] é \81é\9d¢å\8f¯ç§»å\8b\95",
+       "selfmove": "原始標題與目標標題相同,\n無法移動頁面至自己。",
        "immobile-source-namespace": "無法移動在命名空間 \"$1\" 中的頁面",
-       "immobile-target-namespace": "不可以將頁面移動到「$1」空間名中",
-       "immobile-target-namespace-iw": "垮維基連結在移動頁面中是無效的目標。",
-       "immobile-source-page": "這個頁面不能移動。",
-       "immobile-target-page": "無法移動至目標標題。",
-       "bad-target-model": "æ\89\80é\9c\80ç\9a\84ç\9b®ç\9a\84å\9c°ä½¿ç\94¨ä¸\8då\90\8cç\9a\84å\85§å®¹æ¨¡å¼\8fã\80\82ä¸\8då\8f¯ä»¥å¾\9e$1è½\89æ\8f\9bå\88° $2 。",
+       "immobile-target-namespace": "無法移動頁面至命名空間 \"$1\"",
+       "immobile-target-namespace-iw": "移動頁面不可使用 Interwiki 連結做為目標。",
+       "immobile-source-page": "此頁面無法移動。",
+       "immobile-target-page": "無法移動至目標標題。",
+       "bad-target-model": "æ\8c\87å®\9aç\9a\84ç\9b®æ¨\99å\9c°ä½¿ç\94¨ä¸\8då\90\8cç\9a\84å\85§å®¹æ¨¡å\9e\8bã\80\82ç\84¡æ³\95è½\89æ\8f\9b $1 ç\82º $2。",
        "imagenocrossnamespace": "不可以移動檔案到非檔案命名空間",
        "nonfile-cannot-move-to-file": "不可以移動非檔案到檔案命名空間",
-       "imagetypemismatch": "該新副檔名不匹配它的類型",
-       "imageinvalidfilename": "目標檔案名稱是無效的",
-       "fix-double-redirects": "更新導向到原標題的任何重新導向頁面",
-       "move-leave-redirect": "留下重新定向",
+       "imagetypemismatch": "新的檔案副檔名不符合該檔案的類型",
+       "imageinvalidfilename": "目標檔案名稱無效",
+       "fix-double-redirects": "更新所有指向原標題的重定向",
+       "move-leave-redirect": "留下重定向頁面",
        "protectedpagemovewarning": "<strong>警告:</strong>本頁已經被保護,只有擁有管理員權限的使用者才可移動。\n以下提供最近的日誌以便參考:",
        "semiprotectedpagemovewarning": "<strong>注意:</strong>本頁已經被保護,只有已註冊的使用者才可移動。\n以下提供最近的日誌以便參考:",
-       "move-over-sharedrepo": "== 檔案已存在 ==\n[[:$1]]已於共享資源存在,將檔案移動到此標題會覆蓋共享資源中的檔案。",
-       "file-exists-sharedrepo": "同名檔案已於共享資源存在。\n請選擇另一個檔案名。",
+       "move-over-sharedrepo": "== 檔案已存在 ==\n[[:$1]] 已存在於共用檔案庫,將檔案移動到此標題會覆蓋該共用檔案。",
+       "file-exists-sharedrepo": "選擇的檔案名稱於共用檔案庫已有其他檔案使用。\n請改選擇其他名稱。",
        "export": "匯出頁面",
-       "exporttext": "æ\82¨å\8f¯ä»¥å°\87ç\89¹å®\9aé \81é\9d¢æ\88\96ä¸\80çµ\84é \81é\9d¢ç\9a\84æ\96\87å­\97以å\8f\8a編輯歷å\8f²ä»¥XMLæ ¼å¼\8få\8c¯å\87ºï¼\9bé\80\99樣å\8f¯ä»¥å°\87æ\9c\89é\97\9cé \81é\9d¢é\80\8fé\81\8eã\80\8c[[Special:Import|å\8c¯å\85¥é \81é\9d¢]]ã\80\8dé \81é\9d¢å\8c¯å\85¥å\88°å\8f¦ä¸\80å\80\8bå\9f·è¡\8cMediaWikiç\9a\84網ç«\99ã\80\82\n\nè¦\81å\8c¯å\87ºé \81é\9d¢ï¼\8cè«\8bå\9c¨ä¸\8bé\9d¢ç\9a\84æ\96\87å­\97æ¡\86中輸å\85¥é \81é\9d¢æ¨\99é¡\8cï¼\8cæ¯\8fè¡\8cä¸\80å\80\8bæ¨\99é¡\8cï¼\8c並é\81¸æ\93\87{{GENDER:|ä½ |妳|ä½ }}æ\98¯å\90¦é\9c\80è¦\81å\8c¯å\87ºå¸¶æ\9c\89é \81é\9d¢æ­·å\8f²ç\9a\84以å\89\8dç\9a\84ä¿®è¨\82ç\89\88æ\9c¬ï¼\8cæ\88\96æ\98¯å\8fªé\81¸æ\93\87å\8c¯å\87ºå¸¶æ\9c\89æ\9c\80å¾\8cä¸\80次編輯è¨\8aæ\81¯ç\9a\84ç\9b®å\89\8dä¿®è¨\82ç\89\88æ\9c¬ã\80\82\n\næ­¤å¤\96{{GENDER:|ä½ |妳|ä½ }}é\82\84å\8f¯ä»¥å\88©ç\94¨é\80£çµ\90å\8c¯å\87ºæª\94æ¡\88ï¼\8cä¾\8bå¦\82{{GENDER:|ä½ |妳|ä½ }}å\8f¯ä»¥ä½¿ç\94¨[[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]å\8c¯å\87ºã\80\8c[[{{MediaWiki:Mainpage}}]]ã\80\8dé \81é\9d¢。",
-       "exportall": "å°\8e出所有頁面",
-       "exportcuronly": "å\8fªå°\8eå\87ºç\95¶å\89\8dç\89\88æ\9c¬ï¼\8cä¸\8då\90«å®\8cæ\95´æ­·å\8f²ç\89\88æ\9c¬",
-       "exportnohistory": "----\n'''注意:''' 由於性能原因,從此表單匯出頁面的全部歷史已被停用。",
-       "exportlistauthors": "為每個頁面包含貢獻者的完整列表",
+       "exporttext": "æ\82¨å\8f¯ä»¥å\8c¯å\87ºæ\8c\87å®\9aé \81é\9d¢æ\88\96å¤\9aé \81ç\9a\84æ\96\87å­\97è\88\87編輯歷å\8f²ï¼\8c使ç\94¨ XML æ ¼å¼\8få\8c\85è£\9dã\80\82\né\80\99äº\9bæª\94æ¡\88å\8f¯ä»¥å\8c¯å\85¥è\87³å\85¶ä»\96使ç\94¨ MediaWiki ç\9a\84 Wikiï¼\8cé\80\8fé\81\8e [[Special:Import|å\8c¯å\85¥é \81é\9d¢]]ã\80\82\n\nè¦\81å\8c¯å\87ºé \81é\9d¢ï¼\8cè«\8bå\9c¨ä¸\8bæ\96¹æ\96\87å­\97æ\96¹å¡\8a中輸å\85¥é \81é\9d¢æ¨\99é¡\8cï¼\8cä¸\80å\80\8bæ¨\99é¡\8c使ç\94¨ä¸\80è¡\8cï¼\8c並é\81¸æ\93\87æ\98¯å\90¦è¦\81å\8c¯å\87ºç\9b®å\89\8dç\9a\84ä¿®è¨\82å\90«æ\89\80æ\9c\89ç\9a\84æ­·å\8f²ä¿®è¨\82è¨\98é\8c\84ï¼\8cæ\88\96è\80\85å\8fªå\8c¯å\87ºç\9b®å\89\8dç\9a\84ä¿®è¨\82è\88\87æ\9c\80å¾\8c編輯ç\9a\84è³\87è¨\8aã\80\82\n\nå\9c¨æ\96\87å­\97æ\96¹å¡\8a中æ\82¨ä¹\9få\8f¯ä½¿ç\94¨é\80£çµ\90ï¼\8cå¦\82ï¼\9a[[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] ä»£è¡¨å\8c¯å\87ºé \81é\9d¢ \"[[{{MediaWiki:Mainpage}}]]\"。",
+       "exportall": "å\8c¯出所有頁面",
+       "exportcuronly": "å\8fªå\8c\85å\90«ç\9b®å\89\8dä¿®è¨\82ï¼\8cä¸\8då\8c\85å\90«å®\8cæ\95´ç\9a\84ä¿®è¨\82æ­·å\8f²",
+       "exportnohistory": "----\n<strong>注意:</strong>因避免伺服器效能問題,已停用匯出頁面的所有歷史記錄。",
+       "exportlistauthors": "包含每個頁面完整的貢獻人員清單",
        "export-submit": "匯出",
-       "export-addcattext": "由分類中加入頁面:",
+       "export-addcattext": "使用分類新增頁面:",
        "export-addcat": "新增",
-       "export-addnstext": "由命名空間加入頁面:",
+       "export-addnstext": "使用命名空間新增頁面:",
        "export-addns": "新增",
-       "export-download": "å\8f¦存為檔案",
+       "export-download": "å\84²存為檔案",
        "export-templates": "包含樣版",
-       "export-pagelinks": "包含到這個深度連結之頁面:",
-       "allmessages": "系統界面",
+       "export-pagelinks": "包含連結的頁面深度:",
+       "allmessages": "系統訊息",
        "allmessagesname": "名稱",
        "allmessagesdefault": "預設的訊息文字",
-       "allmessagescurrent": "ç\8f¾æ\99\82的訊息文字",
+       "allmessagescurrent": "ç\9b®å\89\8d的訊息文字",
        "allmessagestext": "此處列出所有在 MediaWiki 命名空間中系統訊息。\n若您想參與官方的 MediaWiki 在地化,請參考 [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki 在地化] 與 [//translatewiki.net translatewiki.net]。",
-       "allmessagesnotsupportedDB": "這個頁面無法使用,因為'''$wgUseDatabaseMessages'''已被設定關閉。",
+       "allmessagesnotsupportedDB": "已停用 <strong>$wgUseDatabaseMessages</strong> 設定,無法使用此頁面。",
        "allmessages-filter-legend": "搜尋",
-       "allmessages-filter": "以è\87ªå®\9aç\8b\80æ³\81é\81\8e濾:",
+       "allmessages-filter": "ä¾\9dä¿®æ\94¹ç\8b\80æ³\81æ\90\9cå°\8b:",
        "allmessages-filter-unmodified": "未修改",
        "allmessages-filter-all": "全部",
-       "allmessages-filter-modified": "修改",
-       "allmessages-prefix": "以字首搜尋:",
+       "allmessages-filter-modified": "修改",
+       "allmessages-prefix": "ä¾\9d字首搜尋:",
        "allmessages-language": "語言:",
        "allmessages-filter-submit": "執行",
        "allmessages-filter-translate": "翻譯",
        "thumbnail-more": "放大",
-       "filemissing": "無法找到檔案",
-       "thumbnail_error": "建立縮圖錯誤$1",
-       "thumbnail_error_remote": "$1發出的電子郵件:\n$2",
-       "djvu_page_error": "DjVu頁面超出範圍",
-       "djvu_no_xml": "無法在DjVu檔案中擷取XML",
+       "filemissing": "檔案遺失",
+       "thumbnail_error": "建立縮圖錯誤$1",
+       "thumbnail_error_remote": "來自 $1 錯誤訊息:\n$2",
+       "djvu_page_error": "DjVu 頁面超出範圍",
+       "djvu_no_xml": "無法在 DjVu 檔案中擷取 XML",
        "thumbnail-temp-create": "無法建立臨時縮圖檔案",
-       "thumbnail-dest-create": "ç\84¡æ³\95å°\87縮ç\95¥å\9c\96ä¿\9då­\98å\88°ç\9b®æ¨\99å\9c°é»\9e",
-       "thumbnail_invalid_params": "不正確的縮圖參數",
+       "thumbnail-dest-create": "ç\84¡æ³\95å\84²å­\98縮å\9c\96è\87³ç\9b®æ¨\99",
+       "thumbnail_invalid_params": "無效的縮圖參數",
        "thumbnail_dest_directory": "無法建立目標目錄",
-       "thumbnail_image-type": "圖片類型不支援",
-       "thumbnail_gd-library": "未完成的GD設定: 功能遺失 $1",
-       "thumbnail_image-missing": "檔案似乎遺失: $1",
-       "thumbnail_image-failure-limit": "æ\96°è¿\91å\98\97試ç\94\9fæ\88\90此縮ç\95¥å\9c\96失æ\95\97太å¤\9aï¼\88$1次æ\88\96以ä¸\8aï¼\89ã\80\82請稍後再試。",
+       "thumbnail_image-type": "不支援的圖片類型",
+       "thumbnail_gd-library": "未完成 GD 設定:缺少函數 $1",
+       "thumbnail_image-missing": "檔案遺失:$1",
+       "thumbnail_image-failure-limit": "æ\9c\80è¿\91顯示此縮å\9c\96å·²ç\99¼ç\94\9f太å¤\9a次失æ\95\97 ($1 æ¬¡æ\88\96æ\9b´å¤\9a)ï¼\8c請稍後再試。",
        "import": "匯入頁面",
-       "importinterwiki": "跨 wiki 匯入",
-       "import-interwiki-text": "選擇一個 wiki 和頁面標題以進行匯入。\n修訂日期和編輯者名字將同時被儲存。\n所有的跨 wiki 匯入操作被記錄在[[Special:Log/import|匯入日誌]]。",
-       "import-interwiki-source": "來源維基/頁面:",
-       "import-interwiki-history": "複製此頁的所有歷史修訂版本",
+       "importinterwiki": "Transwiki 匯入",
+       "import-interwiki-text": "請選擇一個 Wiki 與頁面標題以進行匯入。\n會同時記錄修訂日期和編輯者的名稱。\n所有的 Transwiki 匯入操作會被記錄在 [[Special:Log/import|匯入日誌]]。",
+       "import-interwiki-source": "來源 Wiki/頁面:",
+       "import-interwiki-history": "複製此頁的所有歷史修訂",
        "import-interwiki-templates": "包含所有樣版",
        "import-interwiki-submit": "匯入",
        "import-interwiki-namespace": "目標命名空間:",
-       "import-interwiki-rootpage": "目標根頁(可選):",
+       "import-interwiki-rootpage": "目標根頁面 (選填):",
        "import-upload-filename": "檔案名稱:",
-       "import-comment": "註解:",
-       "importtext": "請使用[[Special:Export|匯出功能]]從來源維基匯出檔案,\n儲存到您的電腦中並上傳到這裡。",
+       "import-comment": "è©\95è«\96ï¼\9a",
+       "importtext": "請使用 [[Special:Export|匯出工具]] 從來源 Wiki 匯出檔案,\n儲存至您的電腦後再上傳到這裡。",
        "importstart": "正在匯入頁面...",
-       "import-revision-count": "$1個修訂",
+       "import-revision-count": "$1 個修訂",
        "importnopages": "沒有匯入的頁面。",
-       "imported-log-entries": "å\8c¯å\85¥äº\86$1é \85æ\97¥èª\8cè¨\98é\8c\84。",
-       "importfailed": "匯入失敗<nowiki>$1</nowiki>",
-       "importunknownsource": "未知的源匯入類型",
-       "importcantopen": "無法打開匯入檔案",
-       "importbadinterwiki": "損壞的內部 wiki 連結",
+       "imported-log-entries": "å·²å\8c¯å\85¥ $1 ç­\86æ\97¥èª\8cé \85ç\9b®。",
+       "importfailed": "匯入失敗<nowiki>$1</nowiki>",
+       "importunknownsource": "不明的來源匯入類型",
+       "importcantopen": "無法開啟匯入檔案",
+       "importbadinterwiki": "無效的 Interwiki 連結",
        "importsuccess": "匯入完成!",
-       "importnosources": "跨Wiki匯入源沒有定義,同時不允許直接的歷史上傳。",
-       "importnofile": "æ²\92æ\9c\89上傳匯入檔案。",
-       "importuploaderrorsize": "上載匯入檔案失敗。檔案大於可以允許的上傳大小。",
-       "importuploaderrorpartial": "上載匯入檔案失敗。檔案只有部份已經上傳。",
-       "importuploaderrortemp": "上載匯入檔案失敗。臨時資料夾已遺失。",
-       "import-parse-failure": "XML匯入語法失敗",
-       "import-noarticle": "沒有頁面作匯入!",
-       "import-nonewrevisions": "並無修訂導入(全數已存在,或出錯而跳過)。",
+       "importnosources": "未定義任何 Transwiki 匯入來源且已關閉使用歷史記錄上傳功能。",
+       "importnofile": "æ\9cª上傳匯入檔案。",
+       "importuploaderrorsize": "上載匯入檔案失敗。\n檔案大小超過允許上傳大小。",
+       "importuploaderrorpartial": "上載匯入檔案失敗。\n僅上傳部份檔案。",
+       "importuploaderrortemp": "上載匯入檔案失敗。\n遺失臨時資料夾。",
+       "import-parse-failure": "XML 匯入分析失敗",
+       "import-noarticle": "沒有任何可匯入的頁面!",
+       "import-nonewrevisions": "未匯入任何修訂 (修訂已存在,或因錯誤跳過)。",
        "xml-error-string": "$1 於行 $2,欄 $3 ($4 位元組):$5",
-       "import-upload": "上傳XML資料",
-       "import-token-mismatch": "小節資料遺失。請再嘗試。",
-       "import-invalid-interwiki": "ä¸\8dè\83½å\9c¨æ\8c\87å®\9aç\9a\84wiki匯入。",
-       "import-error-edit": "「$1」無法導入,因為您不准編輯它。",
-       "import-error-create": "您沒有建立頁面的權限,無法匯入頁面 \"$1\"。",
-       "import-error-interwiki": "頁面\"$1\"未能導入,這是因為他的頁面名稱預留了供跨維基連結使用。",
-       "import-error-special": "無法匯入頁面 \"$1\",匯入的頁面屬於不允許頁面的特殊命名空間。",
-       "import-error-invalid": "「$1」不能導入,因為名字無效。",
-       "import-error-unserialize": "頁面「$1」的修訂版本「$2」不能反序列。該修訂版本是以$3內容模式序列為$4。",
-       "import-error-bad-location": "æ\96¼æ­¤wiki使ç\94¨ç\9a\84å\85§å®¹æ¨¡å¼\8f$3ç\9a\84ä¿®è¨\82ç\89\88æ\9c¬$2並ç\84¡å\8f¯è\83½å­\98å\84²ç\82ºã\80\8c$1ã\80\8dï¼\8cé\80\99æ\98¯å\9b ç\82ºæ­¤ç¨®æ¨¡å¼\8fæ\96¼è©²é \81é\9d¢ç\84¡æ³\95æ\94¯æ\8f´。",
-       "import-options-wrong": "{{PLURAL:$2|選項}}出錯:<nowiki>$1</nowiki>",
-       "import-rootpage-invalid": "指定的根頁標題無效。",
+       "import-upload": "上傳 XML 資料",
+       "import-token-mismatch": "連線階段資料遺失。\n請再試一次。",
+       "import-invalid-interwiki": "ä¸\8dè\83½å¾\9eæ\8c\87å®\9aç\9a\84 Wiki 匯入。",
+       "import-error-edit": "您沒有權限編輯頁面 \"$1\",無法匯入。",
+       "import-error-create": "您沒有權限建立頁面 \"$1\",無法匯入。",
+       "import-error-interwiki": "頁面 \"$1\" 的名稱已保留作為外部連結 (Interwiki) 使用,無法匯入。",
+       "import-error-special": "頁面 \"$1\" 屬於不允許頁面的特殊命名空間,無法匯入。",
+       "import-error-invalid": "頁面 \"$1\" 名稱無效,無法匯入。",
+       "import-error-unserialize": "頁面 \"$1\" 的修訂 $2 無法反序列反。 此修訂使用 $3 內容模型以 $4 的方式序列化。",
+       "import-error-bad-location": "æ­¤ Wiki ç\9a\84é \81é\9d¢ \"$1\" ä¸\8dæ\94¯æ\8f´ä½¿ç\94¨å\85§å®¹æ¨¡å\9e\8b $3ï¼\8cä¿®è¨\82 $2 ç\84¡æ³\95å\84²å­\98è\87³è©²é \81é\9d¢ 。",
+       "import-options-wrong": "{{PLURAL:$2|選項}}錯誤:<nowiki>$1</nowiki>",
+       "import-rootpage-invalid": "指定的根頁標題無效。",
        "import-rootpage-nosubpage": "命名空間 \"$1\" 的根頁面不允許子頁面。",
        "importlogpage": "匯入日誌",
-       "importlogpagetext": "來自其它 wiki 的行政性的帶編輯歷史匯入頁面。",
-       "import-logentry-upload": "透過檔案上傳匯入 $1",
+       "importlogpagetext": "管理性匯入其他 Wiki 的頁面及編輯歷史記錄。",
+       "import-logentry-upload": "使用檔案上傳匯入 [[$1]]",
        "import-logentry-upload-detail": "$1 個修訂",
-       "import-logentry-interwiki": "跨 Wiki $1",
+       "import-logentry-interwiki": "Transwiki 頁面 $1",
        "import-logentry-interwiki-detail": "來自 $2 的 $1 個修訂",
        "javascripttest": "JavaScript 測試",
        "javascripttest-title": "執行 $1 測試。",
        "tooltip-pt-mytalk": "您的對話頁面",
        "tooltip-pt-anontalk": "對於來自此IP地址編輯的對話",
        "tooltip-pt-preferences": "您的偏好設定",
-       "tooltip-pt-watchlist": "您所監視頁面的變更列表",
-       "tooltip-pt-mycontris": "您的貢獻列表",
-       "tooltip-pt-login": "雖可不登入,但仍建議您登入。",
+       "tooltip-pt-watchlist": "您監視變更頁面清單",
+       "tooltip-pt-mycontris": "您的貢獻清單",
+       "tooltip-pt-login": "儘管非必要,仍建議您登入。",
        "tooltip-pt-logout": "登出",
-       "tooltip-ca-talk": "關於頁面正文的討論",
-       "tooltip-ca-edit": "您可以編輯此頁,請在儲存之前先預覽一下。",
+       "tooltip-ca-talk": "有關頁面內容的討論",
+       "tooltip-ca-edit": "您可以編輯此頁,請在儲存之前先預覽。",
        "tooltip-ca-addsection": "開始一個新章節",
-       "tooltip-ca-viewsource": "該頁面已被保護。您可以檢視該頁原始碼",
-       "tooltip-ca-history": "æ\9c¬é \81é\9d¢ç\9a\84æ\97©å\89\8dä¿®è¨\82ç\89\88æ\9c¬",
-       "tooltip-ca-protect": "保護這個頁面",
-       "tooltip-ca-unprotect": "更改此頁保護",
-       "tooltip-ca-delete": "å\88ªé\99¤æ\9c¬é \81",
-       "tooltip-ca-undelete": "將這個頁面恢復到被刪除以前的狀態",
-       "tooltip-ca-move": "移å\8b\95æ\9c¬é \81",
-       "tooltip-ca-watch": "將此頁面加入監視列表",
-       "tooltip-ca-unwatch": "將此頁面從監視列表中移除",
-       "tooltip-search": "搜尋{{SITENAME}}",
-       "tooltip-search-go": "如果相同的標題存在的話便直接前往該頁面",
-       "tooltip-search-fulltext": "搜尋文字的頁面",
-       "tooltip-p-logo": "訪問首頁",
-       "tooltip-n-mainpage": "訪問首頁",
-       "tooltip-n-mainpage-description": "訪問首頁",
+       "tooltip-ca-viewsource": "此頁面已被保護。\n您可檢視此頁面原始碼",
+       "tooltip-ca-history": "æ­¤é \81é\9d¢å\85\88å\89\8dç\9a\84ä¿®è¨\82",
+       "tooltip-ca-protect": "保護頁面",
+       "tooltip-ca-unprotect": "變更此頁面保護",
+       "tooltip-ca-delete": "å\88ªé\99¤æ­¤é \81é\9d¢",
+       "tooltip-ca-undelete": "還原此頁面至刪除以前的狀態",
+       "tooltip-ca-move": "移å\8b\95æ­¤é \81é\9d¢",
+       "tooltip-ca-watch": "將此頁面加入您的監視清單",
+       "tooltip-ca-unwatch": "將此頁面從監視清單中移除",
+       "tooltip-search": "搜尋 {{SITENAME}}",
+       "tooltip-search-go": "若與此名稱相符的頁面存在,前往該頁面",
+       "tooltip-search-fulltext": "搜尋使用此文字的頁面",
+       "tooltip-p-logo": "參觀主頁面",
+       "tooltip-n-mainpage": "參觀主頁面",
+       "tooltip-n-mainpage-description": "參觀主頁面",
        "tooltip-n-portal": "關於本專案、您可以做什麼、哪裡可以找到事情",
        "tooltip-n-currentevents": "提供目前新聞事件的背景資料",
        "tooltip-n-recentchanges": "列出此 Wiki 中的最近變更清單",
-       "tooltip-n-randompage": "隨機入一個頁面",
-       "tooltip-n-help": "尋求協助",
-       "tooltip-t-whatlinkshere": "列出所有與本頁相連的頁面",
+       "tooltip-n-randompage": "隨機入一個頁面",
+       "tooltip-n-help": "尋求協助的地方",
+       "tooltip-t-whatlinkshere": "列出所有連結此頁面的頁面",
        "tooltip-t-recentchangeslinked": "此頁面連結到其他頁面的最近變更",
-       "tooltip-feed-rss": "è¨\82é\96±æ\9c¬é \81é\9d¢æ­·å\8f²ç\9a\84RSSè³\87è¨\8a",
-       "tooltip-feed-atom": "è¨\82é\96±æ\9c¬é \81é\9d¢æ­·å\8f²ç\9a\84 Atom Feed",
-       "tooltip-t-contributions": "檢è¦\96該使ç\94¨è\80\85ç\9a\84è²¢ç\8d»å\88\97表",
+       "tooltip-feed-rss": "è¨\82é\96±æ­¤é \81é\9d¢ç\9a\84 RSS feed",
+       "tooltip-feed-atom": "è¨\82é\96±æ­¤é \81é\9d¢ç\9a\84 Atom feed",
+       "tooltip-t-contributions": "此使ç\94¨è\80\85ç\9a\84è²¢ç\8d»æ¸\85å\96®",
        "tooltip-t-emailuser": "發送電子郵件給這個使用者",
        "tooltip-t-upload": "上傳檔案",
        "tooltip-t-specialpages": "全部特殊頁面的列表",
-       "tooltip-t-print": "頁面的可列印版本",
-       "tooltip-t-permalink": "這個頁面修訂版本的永久連結",
+       "tooltip-t-print": "頁面的可列印版本",
+       "tooltip-t-permalink": "此頁面修訂的固定連結",
        "tooltip-ca-nstab-main": "檢視頁面內容",
        "tooltip-ca-nstab-user": "檢視使用者頁面",
        "tooltip-ca-nstab-media": "檢視媒體頁面",
-       "tooltip-ca-nstab-special": "æ\9c¬é \81é\9d¢æ\9c\83é\9a¨è\91\97è³\87æ\96\99庫ç\9a\84æ\95¸æ\93\9aå\8d³æ\99\82æ\9b´æ\96°ï¼\8cä»»ä½\95人å\9d\87ä¸\8dè\83½ç\9b´æ\8e¥編輯",
+       "tooltip-ca-nstab-special": "æ­¤é \81é\9d¢ç\82ºç\89¹æ®\8aé \81é\9d¢ï¼\8cç\84¡æ³\95編輯",
        "tooltip-ca-nstab-project": "檢視專案頁面",
        "tooltip-ca-nstab-image": "檢視檔案頁面",
        "tooltip-ca-nstab-mediawiki": "檢視系統資訊",
        "tooltip-ca-nstab-help": "檢視說明頁面",
        "tooltip-ca-nstab-category": "檢視分類頁面",
        "tooltip-minoredit": "標記為小修訂",
-       "tooltip-save": "保存您的修改",
-       "tooltip-preview": "預覽您的編輯,請先使用本功能再保存!",
-       "tooltip-diff": "顯示您對頁面的貢獻",
-       "tooltip-compareselectedversions": "檢è¦\96æ\9c¬é \81被é»\9eé\81¸ç\9a\84å\85©å\80\8bä¿®è¨\82ç\89\88æ\9c¬間的差異",
-       "tooltip-watch": "將此頁加入您的監視列表",
+       "tooltip-save": "儲存您的變更",
+       "tooltip-preview": "請在儲存前預覽您的變更!",
+       "tooltip-diff": "顯示您對內容所做的變更",
+       "tooltip-compareselectedversions": "檢è¦\96æ­¤é \81å\85©å\80\8bå·²é\81¸æ\93\87ç\9a\84ä¿®è¨\82間的差異",
+       "tooltip-watch": "將此頁加入您的監視清單",
        "tooltip-watchlistedit-normal-submit": "移除標題",
-       "tooltip-watchlistedit-raw-submit": "更新監視列表",
-       "tooltip-recreate": "重建該頁面,無論是否被刪除。",
+       "tooltip-watchlistedit-raw-submit": "更新監視清單",
+       "tooltip-recreate": "無論是否被刪除,重新建立該頁面。",
        "tooltip-upload": "開始上傳",
        "tooltip-rollback": "點選 \"還原\" 還原至上位貢獻者對此頁面的編輯",
        "tooltip-undo": "\"還原\" 可還原此編輯並以預覽模式開啟編輯表單,讓您可在摘要中加入原因。",
        "tooltip-preferences-save": "儲存偏好設定",
-       "tooltip-summary": "輸å\85¥ä¸\80å\80\8bç°¡ç\9f­ç\9a\84摘要",
+       "tooltip-summary": "è«\8b輸å\85¥ç°¡ç\9f­摘要",
        "interlanguage-link-title": "$1 – $2",
        "common.css": "/* 此 CSS 會套用至所有的介面外觀 */",
-       "monobook.css": "/* 此 CSS 會影響使用 Monobook 介面外觀的使用者 */",
-       "vector.css": "/* 此 CSS 會影響使用 Vector 介面外觀的使用者 */",
        "print.css": "/* 此 CSS 會影響列印版輸出 */",
        "noscript.css": "/* 此 CSS 會影響沒有啓用 JavaScript 的使用者 */",
        "group-autoconfirmed.css": "/* 此 CSS 會影響自動確認的使用者 */",
        "group-sysop.css": "/* 此 CSS 會影響管理員 */",
        "group-bureaucrat.css": "/* 此 CSS 會影響行政員 */",
        "common.js": "/* 此 JavaScript 會用於使用者載入的每一個頁面。 */",
-       "monobook.js": "/* 此 JavaScript 會用於使用 Monobook 介面外觀使用者 */",
-       "vector.js": "/* 此 JavaScript 會用於使用 Vector 介面外觀使用者 */",
        "anonymous": "{{SITENAME}} 的匿名{{PLURAL:$1|使用者}}",
        "siteuser": "{{SITENAME}} 使用者 $1",
-       "anonuser": "{{SITENAME}}匿名使用者 $1",
+       "anonuser": "{{SITENAME}} 匿名使用者 $1",
        "lastmodifiedatby": "此頁由 $3 於 $1 $2 的最後更改。",
-       "othercontribs": "在$1的工作基礎上。",
+       "othercontribs": "此頁面由 $1 所貢獻。",
        "others": "其他",
-       "siteusers": "{{SITENAME}} {{PLURAL:$2|使用者}}$1",
-       "anonusers": "{{SITENAME}} 匿名{{PLURAL:$2|使用者}}$1",
-       "creditspage": "é \81é\9d¢è\87´è¬\9d",
-       "nocredits": "該頁沒有致謝名單訊息。",
-       "spamprotectiontitle": "垃圾過濾器",
-       "spamprotectiontext": "您欲儲存的文字內容已被垃圾過濾器封鎖,\n可能因您的內容包含了已封鎖的外部連結。",
-       "spamprotectionmatch": "觸發了我們的垃圾過濾器的文本如下:$1",
-       "spambot_username": "MediaWiki å»£å\91\8aæ¸\85é\99¤",
-       "spam_reverting": "還原到未包含連結至 $1 的最新修訂",
-       "spam_blanking": "所有包含連結至$1的修訂,清空",
-       "spam_deleting": "所有包含連結至$1的修訂,刪除中",
-       "simpleantispam-label": "反濫發電郵檢查。\n'''不要'''加入這個!",
-       "pageinfo-title": "「$1」的信息",
-       "pageinfo-not-current": "抱歉,無法提供之前修訂版本的資訊。",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|使用者}} $1",
+       "anonusers": "{{SITENAME}} 匿名{{PLURAL:$2|使用者}} $1",
+       "creditspage": "é \81é\9d¢è£½ä½\9c群",
+       "nocredits": "此頁面沒有製作群資訊。",
+       "spamprotectiontitle": "垃圾訊息過濾程式",
+       "spamprotectiontext": "您輸入文字內容已被垃圾訊息過濾程式禁止儲存,\n可能因您的內容包含了已封鎖的外部連結。",
+       "spamprotectionmatch": "以下文字內容觸發垃圾訊息過濾程式:$1",
+       "spambot_username": "MediaWiki å\9e\83å\9c¾è¨\8aæ\81¯æ¸\85ç\90\86",
+       "spam_reverting": "還原至未包含 $1 連結的最新修訂",
+       "spam_blanking": "所有修訂均包含 $1 連結,清空中",
+       "spam_deleting": "所有修訂均包含 $1 連結,刪除中",
+       "simpleantispam-label": "防垃圾訊息檢查用。\n請 <strong>勿</strong> 填寫此欄位!",
+       "pageinfo-title": "\"$1\" 的資訊",
+       "pageinfo-not-current": "抱歉,無法提供先前修訂的資訊。",
        "pageinfo-header-basic": "基本資訊",
        "pageinfo-header-edits": "編輯歷史",
-       "pageinfo-header-restrictions": "保護頁面",
+       "pageinfo-header-restrictions": "頁面保護",
        "pageinfo-header-properties": "頁面屬性",
        "pageinfo-display-title": "顯示標題",
        "pageinfo-default-sort": "預設排序字:",
        "pageinfo-article-id": "頁面編號",
        "pageinfo-language": "頁面內容語言",
        "pageinfo-content-model": "頁面內容模型",
-       "pageinfo-robot-policy": "機械人索引",
-       "pageinfo-robot-index": "容許",
-       "pageinfo-robot-noindex": "阻止",
-       "pageinfo-views": "觀看次數",
-       "pageinfo-watchers": "頁面監視者數",
-       "pageinfo-few-watchers": "少於$1名監視者",
-       "pageinfo-redirects-name": "重新導向至此頁面的數量",
+       "pageinfo-robot-policy": "由機器人建立索引",
+       "pageinfo-robot-index": "å\85\81許",
+       "pageinfo-robot-noindex": "不允許",
+       "pageinfo-views": "檢視次數",
+       "pageinfo-watchers": "頁面監視者數",
+       "pageinfo-few-watchers": "少於 $1 名監視者",
+       "pageinfo-redirects-name": "指向此頁面的重定向數量",
        "pageinfo-subpages-name": "此頁面的子頁面",
-       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|筆重新導向頁面}}; $3 {{PLURAL:$3|筆非重新導向頁面}})",
+       "pageinfo-subpages-value": "$1($2 個重定向頁面; $3 個非重定向頁面)",
        "pageinfo-firstuser": "頁面的建立者",
        "pageinfo-firsttime": "頁面創建日期",
        "pageinfo-lastuser": "最近編輯者",
        "pageinfo-templates": "引用的樣版 ($1)",
        "pageinfo-transclusions": "頁面被引用於 ($1)",
        "pageinfo-toolboxlink": "頁面資訊",
-       "pageinfo-redirectsto": "重新導向至",
+       "pageinfo-redirectsto": "重向至",
        "pageinfo-redirectsto-info": "資訊",
-       "pageinfo-contentpage": "計算為內容頁",
+       "pageinfo-contentpage": "作為內容頁面計算",
        "pageinfo-contentpage-yes": "是",
-       "pageinfo-protect-cascading": "從此開始連鎖保護",
+       "pageinfo-protect-cascading": "從此開始連鎖保護",
        "pageinfo-protect-cascading-yes": "是",
-       "pageinfo-protect-cascading-from": "從此連鎖保護",
+       "pageinfo-protect-cascading-from": "連鎖保護來自",
        "pageinfo-category-info": "分類資訊",
        "pageinfo-category-pages": "頁面數量",
        "pageinfo-category-subcats": "子分類數量",
        "pageinfo-category-files": "編輯數量",
        "markaspatrolleddiff": "標記為已巡查",
        "markaspatrolledtext": "標記此頁面為已巡查",
-       "markedaspatrolled": "標記為已檢查",
-       "markedaspatrolledtext": "[[:$1]]的已選定修訂版本已被標識為已巡查。",
-       "rcpatroldisabled": "已停用最近變更檢查",
-       "rcpatroldisabledtext": "最新更改檢查的功能目前已關閉。",
-       "markedaspatrollederror": "不能標誌為已檢查",
-       "markedaspatrollederrortext": "{{GENDER:|你|妳|你}}需要指定某個版本才能標誌為已檢查。",
-       "markedaspatrollederror-noautopatrol": "您無法將{{GENDER:|你|妳|你}}自己所作的更改標記為已檢查。",
-       "markedaspatrollednotify": "$1的更改已標記為已巡查。",
-       "markedaspatrollederrornotify": "標記為巡查失敗。",
+       "markedaspatrolled": "己標記為已巡查",
+       "markedaspatrolledtext": "已標記選擇的修訂 [[:$1]] 為已巡查。",
+       "rcpatroldisabled": "最近變更巡查已停用",
+       "rcpatroldisabledtext": "最新變更巡查的功能目前已停用。",
+       "markedaspatrollederror": "無法標記為已巡查",
+       "markedaspatrollederrortext": "您需指定要標記為已巡查的修訂。",
+       "markedaspatrollederror-noautopatrol": "您無法將自己所作的變更標記為已巡查。",
+       "markedaspatrollednotify": "頁面 $1 的變更已標記為已巡查。",
+       "markedaspatrollederrornotify": "æ¨\99è¨\98ç\82ºå·²å·¡æ\9f¥å¤±æ\95\97ã\80\82",
        "patrol-log-page": "巡查日誌",
        "patrol-log-header": "這是已巡查的修訂版本的日誌。",
-       "log-show-hide-patrol": "$1巡查記錄",
-       "deletedrevision": "已刪除舊版本$1",
-       "filedeleteerror-short": "刪除檔案發生錯誤$1",
-       "filedeleteerror-long": "當刪除檔案時遇到錯誤:\n\n$1",
-       "filedelete-missing": "因為檔案「$1」不存在,所以它不可以刪除。",
-       "filedelete-old-unregistered": "所指定的檔案修訂「$1」在資料庫中不存在。",
-       "filedelete-current-unregistered": "所指定的檔案「$1」在資料庫中不存在。",
-       "filedelete-archive-read-only": "存檔目錄「$1」在網頁伺服器中不可寫。",
+       "log-show-hide-patrol": "$1 巡查日誌",
+       "deletedrevision": "已刪除舊修訂 $1",
+       "filedeleteerror-short": "刪除檔案發生錯誤$1",
+       "filedeleteerror-long": "刪除檔案時發生錯誤:\n\n$1",
+       "filedelete-missing": "檔案 \"$1\" 不存在,無法刪除。",
+       "filedelete-old-unregistered": "資料庫中不存在指定的檔案修訂 \"$1\"。",
+       "filedelete-current-unregistered": "資料庫中不存在指定的檔案 \"$1\"。",
+       "filedelete-archive-read-only": "網頁伺服器無封存目錄 \"$1\" 的寫入權限。",
        "previousdiff": "← 較舊編輯",
        "nextdiff": "較新編輯 →",
        "mediawarning": "<strong>警告</strong>:此檔案類型可能包含惡意代碼。\n若執行可能對您的系統造成損害。",
        "file-no-thumb-animation": "<strong>注意:由於技術限制,此檔案縮圖無動畫效果。</strong>",
        "file-no-thumb-animation-gif": "<strong>注意:由於技術限制,此類型高解析度 GIF 圖片無動畫效果。</strong>",
        "newimages": "最新檔案圖庫",
-       "imagelisttext": "以下是按$2排列的'''$1'''個檔案列表。",
+       "imagelisttext": "以下為 <strong>$1</strong> 清單,$2 排序。",
        "newimages-summary": "此特殊頁面中顯示最新上傳的檔案。",
        "newimages-legend": "搜尋",
-       "newimages-label": "檔案名稱 (或部份):",
-       "newimages-showbots": "顯示機械人上載",
-       "noimages": "無可檢視圖片。",
+       "newimages-label": "檔案名稱 (或部份檔名):",
+       "newimages-showbots": "顯示由機器人上傳的檔案",
+       "noimages": "無任何圖片。",
        "ilsubmit": "搜尋",
-       "bydate": "日期",
-       "sp-newimages-showfrom": "從$1 $2開始顯示新檔案",
+       "bydate": "日期",
+       "sp-newimages-showfrom": "顯示自 $1 $2 以來的新檔案",
        "seconds": "$1 秒",
        "minutes": "$1 分鍾",
        "hours": "$1 小時",
        "just-now": "剛才",
        "hours-ago": "$1 小時前",
        "minutes-ago": "$1 分鐘前",
-       "seconds-ago": "$1 秒前",
-       "monday-at": "æ\96¼æ\98\9fæ\9c\9fä¸\80 $1",
-       "tuesday-at": "æ\96¼æ\98\9fæ\9c\9fäº\8c $1",
-       "wednesday-at": "æ\96¼æ\98\9fæ\9c\9fä¸\89 $1",
-       "thursday-at": "æ\96¼æ\98\9fæ\9c\9få\9b\9b $1",
-       "friday-at": "æ\96¼æ\98\9fæ\9c\9fäº\94 $1",
-       "saturday-at": "æ\96¼æ\98\9fæ\9c\9få\85­ $1",
-       "sunday-at": "æ\96¼æ\98\9fæ\9c\9fæ\97¥ $1",
-       "yesterday-at": "昨天 $1",
-       "bad_image_list": "請按照下列格式編寫:\n\n只有(以 * 開頭)列出的項目會被考慮。\n每一行的第一個連結必須是損毀檔案的連結。\n然後同一行後方的連結會被視為例外,即是該檔案可以在哪些頁面內被顯示。",
+       "seconds-ago": "$1 秒前",
+       "monday-at": "æ\98\9fæ\9c\9fä¸\80æ\96¼ $1",
+       "tuesday-at": "æ\98\9fæ\9c\9fäº\8cæ\96¼ $1",
+       "wednesday-at": "æ\98\9fæ\9c\9fä¸\89æ\96¼ $1",
+       "thursday-at": "æ\98\9fæ\9c\9få\9b\9bæ\96¼ $1",
+       "friday-at": "æ\98\9fæ\9c\9fäº\94æ\96¼ $1",
+       "saturday-at": "æ\98\9fæ\9c\9få\85­æ\96¼ $1",
+       "sunday-at": "æ\98\9fæ\9c\9fæ\97¥æ\96¼ $1",
+       "yesterday-at": "昨天 $1",
+       "bad_image_list": "請依照下列格式:\n\n僅清單項目有效 (以 * 開頭)。\n每一行的第一個連結必須是不良檔案的連結。\n同一行除第一個以外的連結會被作為例外清單,例如:檔案所在的頁面。",
        "variantname-zh-hans": "‪中文(简体)",
        "variantname-zh-hant": "‪繁體中文",
        "variantname-zh-cn": "大陸簡體",
        "exif-sharpness": "銳利度",
        "exif-devicesettingdescription": "設備設定描述",
        "exif-subjectdistancerange": "主體距離範圍",
-       "exif-imageuniqueid": "唯一影像 ID",
+       "exif-imageuniqueid": "唯一影像識別碼",
        "exif-gpsversionid": "GPS 標籤版本",
        "exif-gpslatituderef": "北緯或南緯",
        "exif-gpslatitude": "緯度",
        "exif-contact": "聯絡資訊",
        "exif-writer": "作家",
        "exif-languagecode": "語言",
-       "exif-iimversion": "IIM版本",
-       "exif-iimcategory": "類別",
+       "exif-iimversion": "IIM 版本",
+       "exif-iimcategory": "分類",
        "exif-iimsupplementalcategory": "補充分類",
-       "exif-datetimeexpires": "這個日期後不要使用",
-       "exif-datetimereleased": "發表日",
-       "exif-originaltransmissionref": "å\82³è¼¸ä½\8dç½®å\8e\9f代碼",
-       "exif-identifier": "標識符號",
-       "exif-lens": "使用鏡頭",
-       "exif-serialnumber": "相機序號",
+       "exif-datetimeexpires": "於此日期後請勿使用",
+       "exif-datetimereleased": "發佈於",
+       "exif-originaltransmissionref": "å\8e\9få§\8bå\82³è¼¸ä½\8dç½®代碼",
+       "exif-identifier": "識別碼",
+       "exif-lens": "使用鏡頭",
+       "exif-serialnumber": "相機序號",
        "exif-cameraownername": "相機持有人",
        "exif-label": "標籤",
        "exif-datetimemetadata": "資料定義最後修改日期",
-       "exif-nickname": "非正式圖片名",
-       "exif-rating": "評分(最高5分)",
-       "exif-rightscertificate": "權利管理證書",
+       "exif-nickname": "非正式的影像名稱",
+       "exif-rating": "評分 (共 5 分)",
+       "exif-rightscertificate": "版權管理證書",
        "exif-copyrighted": "版權狀態",
        "exif-copyrightowner": "版權持有人",
        "exif-usageterms": "使用條款",
-       "exif-webstatement": "網ä¸\8aç\89\88æ¬\8a說明",
-       "exif-originaldocumentid": "文件的唯一ID",
-       "exif-licenseurl": "版權許可的連結",
-       "exif-morepermissionsurl": "替代的許可信息",
-       "exif-attributionurl": "當重時,請連結至",
-       "exif-preferredattributionname": "當重時,請署名",
+       "exif-webstatement": "ç·\9aä¸\8aç\89\88æ¬\8aè\81²明",
+       "exif-originaldocumentid": "原始文件唯一識別碼",
+       "exif-licenseurl": "版權授權連結",
+       "exif-morepermissionsurl": "替代授權資訊",
+       "exif-attributionurl": "當重複使用此作品時,請連結至",
+       "exif-preferredattributionname": "當重複使用此作品時,請署名",
        "exif-pngfilecomment": "PNG 檔案備註",
        "exif-disclaimer": "免責聲明",
        "exif-contentwarning": "內容警告",
        "exif-copyrighted-false": "版權所屬者不明",
        "exif-unknowndate": "未知的日期",
        "exif-orientation-1": "標準",
-       "exif-orientation-2": "水翻轉",
-       "exif-orientation-3": "旋轉180°",
+       "exif-orientation-2": "水翻轉",
+       "exif-orientation-3": "旋轉 180°",
        "exif-orientation-4": "垂直翻轉",
-       "exif-orientation-5": "旋轉90° 逆時針並垂直翻轉",
-       "exif-orientation-6": "逆時針旋轉90°",
-       "exif-orientation-7": "旋轉90° 順時針並垂直翻轉",
-       "exif-orientation-8": "順時針旋轉90°",
+       "exif-orientation-5": "逆時針旋轉 90° 並垂直翻轉",
+       "exif-orientation-6": "逆時針旋轉 90°",
+       "exif-orientation-7": "順時針旋轉 90° 並垂直翻轉",
+       "exif-orientation-8": "順時針旋轉 90°",
        "exif-planarconfiguration-1": "矮胖格式",
        "exif-planarconfiguration-2": "平面格式",
        "exif-colorspace-65535": "顏色未校準",
        "exif-componentsconfiguration-0": "不存在",
        "exif-exposureprogram-0": "未定義",
        "exif-exposureprogram-1": "手動",
-       "exif-exposureprogram-2": "標準式",
-       "exif-exposureprogram-3": "光圈優先模式",
-       "exif-exposureprogram-4": "快門優先模式",
-       "exif-exposureprogram-5": "藝術程式(景深優先)",
-       "exif-exposureprogram-6": "運動程式(快速快門速度優先)",
-       "exif-exposureprogram-7": "肖像模式(適用於背景在焦距以外的近距攝影)",
-       "exif-exposureprogram-8": "風景模式(適用於背景在焦距上的風景照片)",
-       "exif-subjectdistance-value": "$1",
+       "exif-exposureprogram-2": "標準式",
+       "exif-exposureprogram-3": "光圈優先",
+       "exif-exposureprogram-4": "快門優先",
+       "exif-exposureprogram-5": "藝術程式 (景深優先)",
+       "exif-exposureprogram-6": "運動模式 (快速快門優先)",
+       "exif-exposureprogram-7": "人像模式 (用於近距離照片,對焦不在背景)",
+       "exif-exposureprogram-8": "風景模式 (用於風景照片,對焦在背景)",
+       "exif-subjectdistance-value": "$1 尺",
        "exif-meteringmode-0": "未知",
-       "exif-meteringmode-1": "平均水準",
-       "exif-meteringmode-2": "中心加權平均測量",
+       "exif-meteringmode-1": "平均",
+       "exif-meteringmode-2": "中心加權平均",
        "exif-meteringmode-3": "點測",
        "exif-meteringmode-4": "多點測",
-       "exif-meteringmode-5": "模式測量",
-       "exif-meteringmode-6": "局部測量",
+       "exif-meteringmode-5": "模式",
+       "exif-meteringmode-6": "部分",
        "exif-meteringmode-255": "其他",
        "exif-lightsource-0": "未知",
-       "exif-lightsource-1": "日光",
-       "exif-lightsource-2": "光燈",
-       "exif-lightsource-3": "鎢絲燈(白熾燈)",
+       "exif-lightsource-1": "日光",
+       "exif-lightsource-2": "光燈",
+       "exif-lightsource-3": "鎢絲燈 (白熾燈)",
        "exif-lightsource-4": "閃光燈",
        "exif-lightsource-9": "晴天",
        "exif-lightsource-10": "多雲",
-       "exif-lightsource-11": "深色調陰影",
-       "exif-lightsource-12": "日光熒光燈(色溫 D 5700    7100K)",
-       "exif-lightsource-13": "日溫白色熒光燈(N 4600    5400K)",
-       "exif-lightsource-14": "å\86·ç\99½è\89²ç\86\92å\85\89ç\87\88ï¼\88W 3900    4500Kï¼\89",
-       "exif-lightsource-15": "白色熒光 (WW 3200 – 3700K)",
-       "exif-lightsource-17": "標準燈光A",
-       "exif-lightsource-18": "標準燈光B",
-       "exif-lightsource-19": "標準燈光C",
-       "exif-lightsource-24": "ISO攝影棚鎢燈",
+       "exif-lightsource-11": "陰暗處",
+       "exif-lightsource-12": "日光螢光燈 (D 5700 - 7100K)",
+       "exif-lightsource-13": "白天螢光燈 (N 4600 - 5400K)",
+       "exif-lightsource-14": "å\86·ç\99½è\9e¢å\85\89ç\87\88 (W 3900 - 4500K)",
+       "exif-lightsource-15": "白色螢光燈 (WW 3200 - 3700K)",
+       "exif-lightsource-17": "標準燈光 A",
+       "exif-lightsource-18": "標準燈光 B",
+       "exif-lightsource-19": "標準燈光 C",
+       "exif-lightsource-24": "ISO 攝影室鎢絲燈",
        "exif-lightsource-255": "其他光源",
-       "exif-flash-fired-0": "閃光燈無開火",
-       "exif-flash-fired-1": "閃光燈開火",
-       "exif-flash-return-0": "無頻閃測器功能",
-       "exif-flash-return-2": "頻閃測器未偵測到光",
-       "exif-flash-return-3": "頻閃測器偵測到光",
-       "exif-flash-mode-1": "強制閃光燈開",
-       "exif-flash-mode-2": "強制閃光抑制",
+       "exif-flash-fired-0": "閃光燈未開啟",
+       "exif-flash-fired-1": "閃光燈已開啟",
+       "exif-flash-return-0": "無頻閃測器功能",
+       "exif-flash-return-2": "頻閃測器未偵測到光",
+       "exif-flash-return-3": "頻閃測器偵測到光",
+       "exif-flash-mode-1": "強制閃光燈開",
+       "exif-flash-mode-2": "強制閃光燈關閉",
        "exif-flash-mode-3": "自動模式",
        "exif-flash-function-1": "無閃光燈功能",
-       "exif-flash-redeye-1": "紅眼減退模式",
+       "exif-flash-redeye-1": "防紅眼模式",
        "exif-focalplaneresolutionunit-2": "英寸",
        "exif-sensingmethod-1": "未定義",
        "exif-sensingmethod-2": "一塊彩色區域傳感器",
        "exif-whitebalance-1": "手動白平衡",
        "exif-scenecapturetype-0": "標準",
        "exif-scenecapturetype-1": "風景",
-       "exif-scenecapturetype-2": "像",
+       "exif-scenecapturetype-2": "像",
        "exif-scenecapturetype-3": "夜景",
        "exif-gaincontrol-0": "無",
        "exif-gaincontrol-1": "低增益",
        "exif-gpslatitude-s": "南緯",
        "exif-gpslongitude-e": "東經",
        "exif-gpslongitude-w": "西經",
-       "exif-gpsaltitude-above-sealevel": "海拔$1 {{PLURAL:$1|米}}",
-       "exif-gpsaltitude-below-sealevel": "海拔負$1{{PLURAL:$1|米}}",
+       "exif-gpsaltitude-above-sealevel": "海拔 $1 {{PLURAL:$1|公尺}}",
+       "exif-gpsaltitude-below-sealevel": "海拔負 $1 {{PLURAL:$1|公尺}}",
        "exif-gpsstatus-a": "測量過程",
        "exif-gpsstatus-v": "互動測量",
        "exif-gpsmeasuremode-2": "二維測量",
        "exif-gpsmeasuremode-3": "三維測量",
-       "exif-gpsspeed-k": "公里每小時",
-       "exif-gpsspeed-m": "英里每小時",
-       "exif-gpsspeed-n": "海里每小時(節)",
+       "exif-gpsspeed-k": "每小時公里",
+       "exif-gpsspeed-m": "每小時英里",
+       "exif-gpsspeed-n": "節 (海浬/小時)",
        "exif-gpsdestdistance-k": "公里",
        "exif-gpsdestdistance-m": "英里",
        "exif-gpsdestdistance-n": "海里",
-       "exif-gpsdop-excellent": "好 ($1)",
-       "exif-gpsdop-good": "良( $1 )",
-       "exif-gpsdop-moderate": "中等( $1 )",
-       "exif-gpsdop-fair": "一般($1)",
-       "exif-gpsdop-poor": "不佳( $1 )",
-       "exif-objectcycle-a": "限於上午",
-       "exif-objectcycle-p": "限於下午",
+       "exif-gpsdop-excellent": "非常好 ($1)",
+       "exif-gpsdop-good": "良好 ($1)",
+       "exif-gpsdop-moderate": "普通 ($1)",
+       "exif-gpsdop-fair": "差 ($1)",
+       "exif-gpsdop-poor": "非常差 ($1)",
+       "exif-objectcycle-a": "上午",
+       "exif-objectcycle-p": "下午",
        "exif-objectcycle-b": "上午與下午",
-       "exif-gpsdirection-t": "真方位",
-       "exif-gpsdirection-m": "地磁方",
+       "exif-gpsdirection-t": "真實方向",
+       "exif-gpsdirection-m": "地磁方",
        "exif-ycbcrpositioning-1": "置中",
        "exif-ycbcrpositioning-2": "聯合選址",
        "exif-dc-contributor": "貢獻者",
        "exif-dc-type": "介質類型",
        "exif-rating-rejected": "拒絕",
        "exif-isospeedratings-overflow": "大於 65535",
-       "exif-iimcategory-ace": "藝術,文化和娛樂",
+       "exif-iimcategory-ace": "藝術、文化與娛樂",
        "exif-iimcategory-clj": "犯罪與法律",
-       "exif-iimcategory-dis": "災​​害事故",
+       "exif-iimcategory-dis": "災​​害事故",
        "exif-iimcategory-fin": "經濟與商業",
        "exif-iimcategory-edu": "教育",
        "exif-iimcategory-evn": "環境",
        "exif-iimcategory-hth": "健康",
-       "exif-iimcategory-hum": "人類利益",
-       "exif-iimcategory-lab": "å\8b\9eå·¥",
-       "exif-iimcategory-lif": "生活休閒",
+       "exif-iimcategory-hum": "人情世故",
+       "exif-iimcategory-lab": "å\8b\9eå\8b\95",
+       "exif-iimcategory-lif": "生活休閒",
        "exif-iimcategory-pol": "政治",
-       "exif-iimcategory-rel": "宗教信仰",
-       "exif-iimcategory-sci": "科技",
+       "exif-iimcategory-rel": "宗教信仰",
+       "exif-iimcategory-sci": "科學與科技",
        "exif-iimcategory-soi": "社會問題",
        "exif-iimcategory-spo": "體育",
-       "exif-iimcategory-war": "戰爭,衝突和動盪",
+       "exif-iimcategory-war": "戰爭、衝突與動亂",
        "exif-iimcategory-wea": "天氣",
        "exif-urgency-normal": "正常 ($1)",
-       "exif-urgency-low": "低( $1 )",
+       "exif-urgency-low": "低 ($1)",
        "exif-urgency-high": "高 ($1)",
        "exif-urgency-other": "使用者自訂優先權 ($1)",
        "watchlistall2": "全部",
        "confirmemail_body_set": "不明人士 (可能是您自己,來自 IP 位址 $1)  已將在 {{SITENAME}} 帳號 \"$2\" 的電子郵件地址設定至此。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以啟用在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
        "confirmemail_invalidated": "電郵地址確認已取消",
        "invalidateemail": "取消電郵確認",
-       "scarytranscludedisabled": "[跨wiki轉換代碼不可用]",
+       "scarytranscludedisabled": "[Interwiki 轉換代碼不可用]",
        "scarytranscludefailed": "[樣版 $1 讀取失敗]",
        "scarytranscludefailed-httpstatus": "[樣版 $1 讀取失敗:HTTP $2]",
        "scarytranscludetoolong": "[URL 地址太長]",
        "confirm-purge-top": "要清除此頁面的快取嗎?",
        "confirm-purge-bottom": "清理一頁將會清除快取以及強迫顯示最現時之修訂版本。",
        "confirm-watch-button": "確定",
-       "confirm-watch-top": "監視此頁?",
+       "confirm-watch-top": "新增此頁面至您的監視清單?",
        "confirm-unwatch-button": "確定",
-       "confirm-unwatch-top": "停止監視此頁?",
+       "confirm-unwatch-top": "從您的監視清單中移除此頁面?",
+       "semicolon-separator": ";",
        "comma-separator": "、",
        "colon-separator": ":",
        "word-separator": "",
        "parentheses": " ($1)",
-       "quotation-marks": "「$1」",
+       "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← 上一頁",
        "imgmultipagenext": "下一頁 →",
        "imgmultigo": "確定!",
-       "imgmultigoto": "å\88°ç¬¬$1頁",
+       "imgmultigoto": "å\89\8då¾\80第 $1 頁",
        "img-lang-default": "(預設語言)",
-       "img-lang-info": "於$1呈現此圖像。$2",
-       "img-lang-go": "",
-       "ascending_abbrev": "升",
-       "descending_abbrev": "é\81\9eæ¸\9b",
+       "img-lang-info": "顯示此圖片於 $1。$2",
+       "img-lang-go": "前往",
+       "ascending_abbrev": "升",
+       "descending_abbrev": "é\99\8då\86ª",
        "table_pager_next": "下一頁",
        "table_pager_prev": "上一頁",
        "table_pager_first": "第一頁",
        "table_pager_limit_submit": "送出",
        "table_pager_empty": "沒有結果",
        "autosumm-blank": "清空頁面",
-       "autosumm-replace": "以ã\80\8c$1ã\80\8dæ\9b¿æ\8f\9b內容",
-       "autoredircomment": "é\87\8dæ\96°å°\8eå\90\91é \81é\9d¢至 [[$1]]",
+       "autosumm-replace": "使ç\94¨ \"$1\" å\8f\96代內容",
+       "autoredircomment": "é \81é\9d¢å·²é\87\8då®\9aå\90\91至 [[$1]]",
        "autosumm-new": "已建立頁面,內容為 \"$1\"",
        "size-bytes": "$1 位元組",
-       "lag-warn-normal": "過去$1秒內的更改未必會在這個清單中顯示。",
-       "lag-warn-high": "由於資料庫的過度延遲,過去$1秒內的更改未必會在這個清單中顯示。",
-       "watchlistedit-normal-title": "編輯監視列表",
-       "watchlistedit-normal-legend": "從監視列表中移除標題",
-       "watchlistedit-normal-explain": "在您的監視列表中的標題在下面顯示。要移除一個標題,在它前面剔一下,接著點擊「{{int:Watchlistedit-normal-submit}}」。您亦可以[[Special:EditWatchlist/raw|編輯原始監視列表]]。",
+       "lag-warn-normal": "此清單可能不會顯示最近 $1 {{PLURAL:$1|秒}}內的變更。",
+       "lag-warn-high": "由於資料庫回應延遲,此清單可能不會顯示最近 $1 {{PLURAL:$1|秒}}內的變更。",
+       "watchlistedit-normal-title": "編輯監視清單",
+       "watchlistedit-normal-legend": "從監視清單中移除標題",
+       "watchlistedit-normal-explain": "下方顯示在您監視清單中的標題。\n要移除標題,請勾選該標題旁的核選方塊並點選 \"{{int:Watchlistedit-normal-submit}}\"。\n您也可 [[Special:EditWatchlist/raw|編輯原始監視清單]]。",
        "watchlistedit-normal-submit": "移除標題",
-       "watchlistedit-normal-done": "$1個標題已經從您的監視列表中移除:",
-       "watchlistedit-raw-title": "編輯原始監視列表",
-       "watchlistedit-raw-legend": "編輯原始監視列表",
-       "watchlistedit-raw-explain": "您的監視列表中的標題在下面顯示,同時亦都可以透過編輯這個表去加入以及移除標題;一行一個標題。當完成以後,點擊{{int:Watchlistedit-raw-submit}}。{{GENDER:|你|妳|你}}亦都可以去用[[Special:EditWatchlist|標準編輯器]]。",
+       "watchlistedit-normal-done": "已於您的監視清單中移除 $1 個標題:",
+       "watchlistedit-raw-title": "編輯原始監視清單",
+       "watchlistedit-raw-legend": "編輯原始監視清單",
+       "watchlistedit-raw-explain": "下方顯示在您監視清單中的標題,您可透過編輯來新增與移除清單項目,一個標題一行。\n完成編輯後,請點選 \"{{int:Watchlistedit-raw-submit}}\"。\n您也可 [[Special:EditWatchlist|使用標準編輯器]]。",
        "watchlistedit-raw-titles": "標題:",
-       "watchlistedit-raw-submit": "更新監視列表",
-       "watchlistedit-raw-done": "您的監視列表已經更新。",
-       "watchlistedit-raw-added": "已經加入了$1個標題:",
-       "watchlistedit-raw-removed": "å·²ç\93移é\99¤äº\86$1å\80\8bæ¨\99é¡\8c:",
-       "watchlistedit-clear-title": "已清除監視列表",
-       "watchlistedit-clear-legend": "清除監視列表",
-       "watchlistedit-clear-explain": "所有標題將會從你的監視列表中刪除",
+       "watchlistedit-raw-submit": "更新監視清單",
+       "watchlistedit-raw-done": "已更新您的監視清單。",
+       "watchlistedit-raw-added": "已新增 $1 個標題:",
+       "watchlistedit-raw-removed": "已移é\99¤ $1 å\80\8bæ¨\99é¡\8cï¼\9a",
+       "watchlistedit-clear-title": "已清空監視清單",
+       "watchlistedit-clear-legend": "清空監視清單",
+       "watchlistedit-clear-explain": "將會移除您的監視清單中所有的標題",
        "watchlistedit-clear-titles": "標題:",
-       "watchlistedit-clear-submit": "清除監視列表(這是永久!)",
-       "watchlistedit-clear-done": "您的監視列表已經清除。",
-       "watchlistedit-clear-removed": "å·²ç\93移é\99¤äº\86$1個標題:",
-       "watchlistedit-too-many": "有太多的頁面要在此處顯示。",
-       "watchlisttools-clear": "清除監視列表",
-       "watchlisttools-view": "檢視相關更改",
-       "watchlisttools-edit": "檢視並編輯監視列表",
-       "watchlisttools-raw": "編輯原始監視列表",
-       "signature": "[[{{ns:user}}:$1|$2]]([[{{ns:user_talk}}:$1|對話]])",
-       "unknown_extension_tag": "ä¸\8dæ\98\8eç\9a\84æ\93´å±\95æ¨\99籤ã\80\8c$1ã\80\8d",
-       "duplicate-defaultsort": "警告: 預設的排序鍵「$2」覆蓋先前的預設排序鍵「$1」。",
+       "watchlistedit-clear-submit": "清空監視清單(無法還原)",
+       "watchlistedit-clear-done": "已清空您的監視清單。",
+       "watchlistedit-clear-removed": "已移é\99¤ $1 個標題:",
+       "watchlistedit-too-many": "太多要在此處顯示的頁面。",
+       "watchlisttools-clear": "清空監視清單",
+       "watchlisttools-view": "檢視相關變更",
+       "watchlisttools-edit": "檢視並編輯監視清單",
+       "watchlisttools-raw": "編輯原始監視清單",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|對話]])",
+       "unknown_extension_tag": "ä¸\8dæ\98\8eç\9a\84æ\93´å\85\85æ¨\99籤 \"$1\"",
+       "duplicate-defaultsort": "<strong>警告:</strong>預設的排序鍵 \"$2\" 會覆蓋先前預設的排序鍵 \"$1\"。",
        "version": "版本",
        "version-extensions": "已安裝的擴充套件",
        "version-specialpages": "特殊頁面",
        "version-entrypoints-header-entrypoint": "入口",
        "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath 條目路徑]",
-       "redirect": "依檔案、使用者、頁面或修訂 ID 重新導向",
-       "redirect-legend": "重新導向至檔案或頁面",
-       "redirect-summary": "此特殊頁面可用來重新導向至檔案 (指定檔案名稱)、頁面 (指定修訂 ID 或頁面 ID) 或使用者頁面 (指定使用者 ID)。用法:[[{{#Special:Redirect}}/file/Example.jpg]]、[[{{#Special:Redirect}}/page/64308]]、[[{{#Special:Redirect}}/revision/328429]] 或 [[{{#Special:Redirect}}/user/101]]。",
+       "redirect": "指向檔案、使用者、頁面或修訂 ID 的重定向",
+       "redirect-legend": "重向至檔案或頁面",
+       "redirect-summary": "此特殊頁面可用來建立重定向,指向任何檔案(指定檔案名)、頁面(指定修訂 ID 或頁面 ID)或使用者頁面(指定使用者 ID)。用法:[[{{#Special:Redirect}}/file/Example.jpg]]、[[{{#Special:Redirect}}/page/64308]]、[[{{#Special:Redirect}}/revision/328429]] 或 [[{{#Special:Redirect}}/user/101]]。",
        "redirect-submit": "執行",
        "redirect-lookup": "尋找:",
        "redirect-value": "值:",
        "specialpages-group-pages": "頁面清單",
        "specialpages-group-pagetools": "頁面工具",
        "specialpages-group-wiki": "資料和工具",
-       "specialpages-group-redirects": "重新導向相關特殊頁面",
+       "specialpages-group-redirects": "重定向到別處的特殊頁面",
        "specialpages-group-spam": "反垃圾訊息工具",
        "blankpage": "空白頁面",
        "intentionallyblankpage": "此頁面被故意設為空白。",
        "revdelete-restricted": "已套用對管理員的限制",
        "revdelete-unrestricted": "已移除對管理員的限制",
        "logentry-move-move": "$1 {{GENDER:$2|已移動}}頁面 $3 至 $4",
-       "logentry-move-move-noredirect": "$1 {{GENDER:$2|已移動}}頁面 $3 至 $4,未留重新導向頁面",
-       "logentry-move-move_redir": "$1 {{GENDER:$2|已移動}}頁面 $3 覆蓋重新導向頁面至 $4",
-       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|已移動}}頁面 $3 覆蓋重新導向頁面至 $4,未留重新導向頁面",
+       "logentry-move-move-noredirect": "$1 已移動頁面 $3 至 $4,不留重定向",
+       "logentry-move-move_redir": "$1 已移動頁面 $3 至 $4 並覆蓋原有重定向",
+       "logentry-move-move_redir-noredirect": "$1 已移動頁面 $3 至 $4 並覆蓋原有重定向,不留重定向",
        "logentry-patrol-patrol": "$1 {{GENDER:$2|已標記}}頁面 $3 的修訂 $4 為已巡查",
        "logentry-patrol-patrol-auto": "$1 已自動{{GENDER:$2|標記}}頁面 $3 的修訂 $4 為已巡查",
        "logentry-newusers-newusers": "已{{GENDER:$2|建立}}使用者帳號 $1",
        "feedback-bugnew": "我已經檢查過。報告一個新的bug",
        "searchsuggest-search": "搜尋",
        "searchsuggest-containing": "包含...",
-       "api-error-badaccess-groups": "您沒有權限在此維基項目上傳文件。",
+       "api-error-badaccess-groups": "您沒有權限在此 Wiki 上傳檔案。",
        "api-error-badtoken": "內部錯誤:標記無效。",
        "api-error-copyuploaddisabled": "通過URL上傳的功能已被此伺服器禁用。",
        "api-error-duplicate": "在網站上已經具有相同內容的{{PLURAL:$1|[$2 另一個文件]|[$2 另一些文件]}}。",
        "api-error-hookaborted": "你試圖進行的修改被一個擴展鉤子終止。",
        "api-error-http": "內部錯誤:無法連接到伺服器。",
        "api-error-illegal-filename": "檔案名不允許。",
-       "api-error-internal-error": "內部錯誤:此維基項目在處理你的上傳數據時出現了錯誤。",
-       "api-error-invalid-file-key": "內部錯誤:臨時存儲中找不到文件。",
+       "api-error-internal-error": "內部錯誤:此 Wiki 在處理你的上傳時發生錯誤。",
+       "api-error-invalid-file-key": "內部錯誤:於臨時儲存庫中查無檔案。",
        "api-error-missingparam": "內部錯誤:請求中缺少參數。",
        "api-error-missingresult": "內部錯誤:無法確定複製是否成功。",
        "api-error-mustbeloggedin": "您必須登錄後再上傳文件。",
index dfa1dba..a8eb197 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Abkhazian (Аҧсшәа)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 4686447..755a249 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Achinese (Acèh)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index f0c4336..797bfda 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Tunisian Spoken Arabic (   زَوُن)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 7e5d1e2..a8190b3 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Afrikaans (Afrikaans)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index d6d72e8..f205526 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Akan (Akan)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 7fce53f..588cf34 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Gheg Albanian (Gegë)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 7ac1667..64b938e 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Amharic (አማርኛ)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 2325100..7ec924e 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Aragonese (aragonés)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 4a132ba..aa1d9d1 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Old English (Ænglisc)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
@@ -24,11 +23,16 @@ $namespaceNames = array(
 
 $namespaceAliases = array(
        'Gesprec'       => NS_TALK,
+       'Motung'        => NS_TALK,
        'Brucend'       => NS_USER,
        'Brucendmotung' => NS_USER_TALK,
        'Biliþgesprec'  => NS_FILE_TALK,
+       'Biliþmotung'   => NS_FILE_TALK,
        'Bysengesprec'  => NS_TEMPLATE_TALK,
+       'Bysenmotung'   => NS_TEMPLATE_TALK,
        'Helpgesprec'   => NS_HELP_TALK,
+       'Helpmotung'    => NS_HELP_TALK,
        'Floccgesprec'  => NS_CATEGORY_TALK,
+       'Floccmotung'   => NS_CATEGORY_TALK,
 );
 
index 3577b12..fb6adc7 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Angika (अङ्गिका)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 6109535..dd9b06f 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Arabic (العربية)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
@@ -30,6 +29,7 @@ $datePreferences = array(
        'ymd',
        'hijri',
        'ISO 8601',
+       'jMY',
 );
 
 /**
@@ -79,6 +79,10 @@ $dateFormats = array(
        'ISO 8601 time' => 'xnH:xni:xns',
        'ISO 8601 date' => 'xnY-xnm-xnd',
        'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
+
+       'jMY time' => 'H:i',
+       'jMY date' => 'j M Y',
+       'jMY both' => 'H:i، j M Y', # Arabic comma
 );
 
 $digitTransformTable = array(
index 3f8f7c8..cd514d3 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Aramaic (ܐܪܡܝܐ)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index d52a134..723bd7b 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Mapuche (mapudungun)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 518c907..0fcf660 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Algerian Spoken Arabic (جزائري)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index c059840..8e2b71f 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Egyptian Spoken Arabic (مصرى)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 4d99a71..3d6e1f2 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Assamese (অসমীয়া)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 20a5ba9..824242b 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Asturian (asturianu)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 4ddc8ff..d3e5134 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Avaric (авар)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index d98d431..076d402 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Kotava (Kotava)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index d9ff9cd..e065664 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Aymara (Aymar aru)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index e04efb5..b218e3c 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Azerbaijani (azərbaycanca)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 8fbb201..63c88a8 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** South Azerbaijani (تورکجه)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 5faaca0..aaf6c2b 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Bashkir (башҡортса)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 68c824d..af37630 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Bavarian (Boarisch)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index e5072e9..5b978e7 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Batak Toba (Batak Toba)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 4fbe2bd..8449512 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Batak Toba (Batak Toba)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index e9ac286..f5ade22 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Southern Balochi (بلوچی مکرانی)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 43a51f8..6f22ac5 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Bikol Central (Bikol Central)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 7a9ffa8..d97cc9c 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Belarusian (беларуская)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
@@ -64,7 +63,7 @@ $dateFormats = array(
        'dmy both' => 'H:i, j xg Y',
 );
 
-# Per discussion on http://translatewiki.net/wiki/Thread:Support/Customization_of number format
+# Per discussion on https://translatewiki.net/wiki/Thread:Support/Customization_of number format
 $separatorTransformTable = array(
        ',' => "\xc2\xa0", # nbsp
        '.' => ','
index 4d77137..6ff8220 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Belarusian (Taraškievica orthography) (беларуская (тарашкевіца)‎)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 805e9de..3fb3606 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Bulgarian (български)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 1ec602b..4453bd1 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Bihari (भोजपुरी)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 81ab875..e90797a 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Bhojpuri (भोजपुरी)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 7151244..88d8d6e 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Banjar (Bahasa Banjar)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 9dea18a..9c2ec69 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Bambara (bamanankan)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index d06ccac..154115a 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Bengali (বাংলা)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 5bcffa9..7fa2477 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Tibetan (བོད་ཡིག)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index a912748..c2867b2 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Bishnupria Manipuri (বিষ্ণুপ্রিয়া মণিপুরী)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index b6ffd71..e8a3ee0 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Bakhtiari (بختياري)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 3451ee2..7824ba4 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Breton (brezhoneg)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 557db7e..57413ac 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Bosnian (bosanski)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index b85dadd..fd135c9 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Buginese (ᨅᨔ ᨕᨘᨁᨗ)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 3529d74..2259641 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** буряад (буряад)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 48a86fc..6cfb988 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Catalan (català)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 7ae7cde..c60d0b3 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Chavacano de Zamboanga (Chavacano de Zamboanga)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 074e145..c9b8a86 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Min Dong Chinese (Mìng-dĕ̤ng-ngṳ̄)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 77c8c22..d8e07ae 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Chechen (нохчийн)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 772e646..7c81c41 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Cebuano (Cebuano)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index d6b7c70..ba89284 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Chamorro (Chamoru)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index a3f42ae..dd19174 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Sorani Kurdish (کوردی)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 0f5667e..6f24cbf 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Corsican (corsu)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 067dd1e..f85461f 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Crimean Turkish (Qırımtatarca)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 8870f94..3729a78 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Crimean Turkish (Cyrillic script) (къырымтатарджа (Кирилл)‎)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 2a82925..7fb5df0 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Crimean Turkish (Latin script) (qırımtatarca (Latin)‎)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 6632f7b..2718a48 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Czech (čeština)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 7bc1221..34dbf77 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Kashubian (kaszëbsczi)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 8e13d04..08494b0 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Church Slavic (словѣньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 2eec986..0fff4d0 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Chuvash (Чӑвашла)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 55ed354..35cf273 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Welsh (Cymraeg)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 3449685..075369e 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Danish (dansk)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 88803e6..1d97c23 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** German (Deutsch)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
@@ -202,7 +201,7 @@ $magicWords = array(
        'subjectpagenamee'          => array( '1', 'HAUPTSEITENNAME_URL', 'VORDERSEITE_URL', 'HAUPTSEITE_URL', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
        'subst'                     => array( '0', 'ERS:', 'SUBST:' ),
        'safesubst'                 => array( '0', 'SICHER_ERS:', 'SICHERERS:', 'SAFESUBST:' ),
-       'img_thumbnail'             => array( '1', 'miniatur', 'mini', 'thumbnail', 'thumb' ),
+       'img_thumbnail'             => array( '1', 'mini', 'miniatur', 'thumbnail', 'thumb' ),
        'img_manualthumb'           => array( '1', 'miniatur=$1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
        'img_right'                 => array( '1', 'rechts', 'right' ),
        'img_left'                  => array( '1', 'links', 'left' ),
index e073b97..0d64e7c 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Austrian German (Österreichisches Deutsch)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index eb2858d..4c3f1db 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Swiss High German (Schweizer Hochdeutsch)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index f5e213d..bda548a 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** 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
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 89713dc..12d3b96 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Zazaki (Zazaki)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index c34af25..4cffd2b 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Lower Sorbian (dolnoserbski)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 66f2b3d..ea00e95 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Central Dusun (Dusun Bundu-liwan)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 6856800..1f49212 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Divehi (ދިވެހިބަސް)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index b900f4a..df1f3fa 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Dzongkha (ཇོང་ཁ)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 5351a29..c56bee6 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Emiliàn (Emiliàn)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index b2627ff..c6bcc46 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Greek (Ελληνικά)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index c73acfd..fa4b65a 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** 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
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 39036d7..07a0467 100644 (file)
@@ -1,15 +1,10 @@
 <?php
 /**
- * This is the default English localisation file
+ * This is the default English localisation file containing language specific
+ * information excluding interface strings, which are stored in JSON files.
  *
- * END USERS: DO NOT EDIT THIS FILE DIRECTLY!
- *
- * Changes in this file will be lost during software upgrades.
- * You can make your customizations on the wiki.
- * While logged in as administrator, go to [[Special:Allmessages]]
- * and edit the MediaWiki:* pages listed there.
- *
- * See MessagesQqq.php for message documentation incl. usage of parameters
+ * Please see https://www.mediawiki.org/wiki/Localisation for more information.
+ * To improve a translation please visit https://translatewiki.net
  */
 
 /**
@@ -435,7 +430,7 @@ $specialPageAliases = array(
        'Mostinterwikis'            => array( 'MostInterwikis' ),
        'Mostlinked'                => array( 'MostLinkedPages', 'MostLinked' ),
        'Mostlinkedcategories'      => array( 'MostLinkedCategories', 'MostUsedCategories' ),
-       'Mostlinkedtemplates'       => array( 'MostLinkedTemplates', 'MostUsedTemplates' ),
+       'Mostlinkedtemplates'       => array( 'MostTranscludedPages', 'MostLinkedTemplates', 'MostUsedTemplates' ),
        'Mostrevisions'             => array( 'MostRevisions' ),
        'Movepage'                  => array( 'MovePage' ),
        'Mycontributions'           => array( 'MyContributions' ),
index da9897e..025c2ca 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** British English (British English)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index bf408d1..6935d00 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /**
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index c905c2c..49f3ae9 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Esperanto (Esperanto)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 5291c6c..2b4b8b9 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Spanish (español)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 49c2cbc..e30b242 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Estonian (eesti)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index b775300..64316d8 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Basque (euskara)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index e94c79a..1af959b 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Extremaduran (estremeñu)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 3ae6b75..88afbe7 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Persian (فارسی)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 04ee745..02dd6d2 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Fulah (Fulfulde)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index ccaa055..50558ee 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Finnish (suomi)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 5f9fa64..85e5e0f 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** meänkieli (meänkieli)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 400b1ad..d138eb4 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Faroese (føroyskt)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 98ef56e..cd5359b 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** French (français)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index b9f7e22..c6e497b 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Cajun French (français cadien)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index b466bdd..ac16028 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Franco-Provençal (arpetan)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 6872d96..7ad9d50 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Northern Frisian (Nordfriisk)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index dc6a088..52fdee8 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Friulian (furlan)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index a0cd663..e02baf0 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Western Frisian (Frysk)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index d9d37a2..6238b48 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Irish (Gaeilge)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 0eb6451..390e658 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Gagauz (Gagauz)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index b4aede9..0cf0883 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Gan (贛語)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 949222d..d852ddf 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Simplified Gan script (赣语(简体)‎)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index dff9b73..cafba75 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Traditional Gan script (贛語(繁體)‎)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 5e75d06..f7bc2ff 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Scottish Gaelic (Gàidhlig)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 6000a5c..e30f724 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Galician (galego)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 6a03f6b..c2e5433 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Gilaki (گیلکی)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index f02a573..b746212 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Guarani (Avañe'ẽ)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 0f13f5a..6e8ff0b 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Gothic (Gothic)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 5a604ae..7e66a00 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Ancient Greek (Ἀρχαία ἑλληνικὴ)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index ffa3b36..7cbe696 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Swiss German (Alemannisch)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index bfb0cc3..3fc9f6b 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Gujarati (ગુજરાતી)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 3853f31..d849d45 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Manx (Gaelg)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 9835d9f..df1d1fe 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Hakka (客家語/Hak-kâ-ngî)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 4dd4907..723eac8 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Hawaiian (Hawai`i)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index bb87f04..60f9bf8 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Hebrew (עברית)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index d876250..9abd595 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Hindi (हिन्दी)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 3d572f2..87e7ede 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Fiji Hindi (Fiji Hindi/फ़ीजी हिन्दी)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 30b97f7..daa741a 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Fiji Hindi (Latin script) (Fiji Hindi)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 808c0dd..53cbf54 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Croatian (hrvatski)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 562f357..8108c6b 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Hunsrik (Hunsrik)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index ef4906a..947e6b1 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Upper Sorbian (hornjoserbsce)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 3cbe369..5e4b1e4 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Haitian (Kreyòl ayisyen)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index a7e1213..eca285e 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Hungarian (magyar)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 69f1ca9..ea23ef0 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Armenian (Հայերեն)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index a758d7e..744ac9d 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Interlingua (interlingua)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 48507d4..4ea207d 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Indonesian (Bahasa Indonesia)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index ea35693..748f82b 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Interlingue (Interlingue)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 5652bea..1756106 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Igbo (Igbo)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 5638d12..6f4f23a 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Sichuan Yi (ꆇꉙ)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 99a30a5..c09a241 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Iloko (Ilokano)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index f99d009..c7f1c83 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Ingush (ГӀалгӀай)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index a6b26ed..f7e5221 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Ido (Ido)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index edf97fb..effce71 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Icelandic (íslenska)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index ca49c72..b3f301b 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Italian (italiano)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 43914e3..6a0e6ee 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Inuktitut (ᐃᓄᒃᑎᑐᑦ/inuktitut)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index d134ca3..ebb52ce 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Japanese (日本語)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index fdcfeee..029b050 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Jutish (jysk)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index b3067d6..4c6bff4 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Javanese (Basa Jawa)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index dd98bc6..1006422 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Georgian (ქართული)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 9817721..44b7224 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Kara-Kalpak (Qaraqalpaqsha)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 29d1bc6..f2e8676 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Kabyle (Taqbaylit)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index bf4cdef..4617b3b 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Kabardian
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 40de17e..9800eb5 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Адыгэбзэ (Адыгэбзэ)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 2fd8ace..5893175 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Kongo (Kongo)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index d936acc..4cd2495 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Khowar (کھوار)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 0945738..9ae9438 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Kirmanjki (Kırmancki)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 36d5f9b..ce30e55 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Kazakh (қазақша)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 5315e57..3fcc4cc 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Kazakh (Arabic script) (قازاقشا (تٴوتە)‏)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index eeafab8..56c43dd 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Kazakh (China) (‫قازاقشا (جۇنگو)‬)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 6445379..3e1b7ab 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Kazakh (Cyrillic script) (қазақша (кирил)‎)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 231259a..448d25c 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Kazakh (Kazakhstan) (‪Қазақша (Қазақстан)‬)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index f59d215..76aff5b 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Kazakh (Latin script) (qazaqşa (latın)‎)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 05627f9..82eb920 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Kazakh (Turkey) (‪Qazaqşa (Türkïya)‬)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index eccc6bc..b379252 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Kalaallisut (kalaallisut)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 8209826..faceb17 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Khmer (ភាសាខ្មែរ)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 463dd5e..cede41c 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Kannada (ಕನ್ನಡ)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index fb28c6a..ec0e973 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Korean (한국어)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 3ac6f08..4ef098d 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Korean (한국어(조선))
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 60ff28e..0296bf7 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Komi-Permyak (Перем Коми)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 6c90370..d7826be 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Karachay-Balkar (къарачай-малкъар)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index bbb26a8..e7010f4 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Kashmiri (कॉशुर / کٲشُر)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index dae8ab6..89f877f 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Kashmiri (Arabic script) (کٲشُر)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index e8f907d..020d412 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Kashmiri (Devanagari script) (कॉशुर)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 6602ec7..23cf2ba 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Colognian (Ripoarisch)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 0c71b1b..5da5f28 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Kurdish (Kurdî / كوردی)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index ef3322f..471bfaf 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** كوردي (عەرەبی)‏ (كوردي (عەرەبی)‏)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 7b9ba96..f42a893 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Kurdish (Latin script) (Kurdî (latînî)‎)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 97da660..d6df404 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Komi (коми)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index da83c01..1b7c78c 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Cornish (kernowek)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 6211e86..5400778 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Kyrgyz (Кыргызча)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index ff84a0a..9f3d904 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Latin (Latina)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index bafaa10..cbeb69e 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Ladino (Ladino)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 1f1431b..4ae749a 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Luxembourgish (Lëtzebuergesch)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index ea2eb11..c3b0ae4 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** лакку (лакку)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 1a0612d..27b6e86 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Lezghian (лезги)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 3123a65..8edc487 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Lingua Franca Nova (Lingua Franca Nova)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 8bf7659..4efd38c 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Limburgish (Limburgs)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 8719a96..8cc1a21 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Ligure (Ligure)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 3e82513..b76f6d6 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Līvõ kēļ (Līvõ kēļ)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 754fd27..12dc58c 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** lumbaart (lumbaart)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 7cd53c6..4838e0f 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Lingala (lingála)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 9eb57f0..1bcf6a3 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Lao (ລາວ)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 82b279b..1a23b3f 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** لوری (لوری)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 5e7ebcb..a2ce260 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Lithuanian (lietuvių)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 256c331..1dd60f8 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Latgalian (latgaļu)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 4332ab6..7205e6c 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Latvian (latviešu)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 3b55e9a..d5437da 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Literary Chinese (文言)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 5d0bca7..4ef414f 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Lazuri (Lazuri)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index dd62842..09ae5a6 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Maithili (मैथिली)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 9224068..f76bcaa 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Basa Banyumasan (Basa Banyumasan)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 7d68635..274b724 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Moksha (мокшень)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index d90a408..1153500 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Malagasy (Malagasy)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index e962ec0..9ab687a 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Eastern Mari (олык марий)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 2e6dde9..5ab67ae 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Minangkabau (Baso Minangkabau)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index af941e2..063b8d9 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Macedonian (македонски)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index b4c5cc3..718ab28 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Malayalam (മലയാളം)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 091051b..667108a 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Mongolian (монгол)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 4e89969..3690a27 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Moldavian (молдовеняскэ)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 1027ead..0bbbf8c 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Marathi (मराठी)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 4ddc73c..a1203e9 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Hill Mari (кырык мары)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index d2b91f6..b6da373 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Malay (Bahasa Melayu)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index f0f4132..e5dd967 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Maltese (Malti)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 19cb50e..e651123 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Mirandese (Mirandés)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 1e27039..8d39899 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Burmese (မြန်မာဘာသာ)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 848ca7c..f6b688e 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Erzya (эрзянь)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index df793f3..ad73dc1 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Mazanderani (مازِرونی)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 78fc7ce..444d74a 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Nāhuatl (Nāhuatl)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index e6f9613..8d0d14c 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Min Nan Chinese (Bân-lâm-gú)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 43e7f5e..59e24fa 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Neapolitan (Napulitano)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 9452c94..83e736f 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Norwegian Bokmål (norsk bokmål)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index bae8d3d..3397894 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Low German (Plattdüütsch)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 908f74b..fdb33e4 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Low Saxon (Netherlands) (Nedersaksies)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index d786f09..7184f6c 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Nepali (नेपाली)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 96af2fa..5e2e9bc 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Newari (नेपाल भाषा)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index d8c5d57..c90908f 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Dutch (Nederlands)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 9cc9f57..695d5cc 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Nederlands (informeel)‎ (Nederlands (informeel)‎)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 91b30fe..9d99964 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Norwegian Nynorsk (norsk nynorsk)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index b041b38..ebe42f4 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Northern Sotho (Sesotho sa Leboa)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 05b91ca..74b5ca1 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Navajo (Diné bizaad)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 3057f1a..925513c 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Occitan (occitan)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 8b0b7b1..db25e5a 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Oriya (ଓଡ଼ିଆ)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 8473eac..5eaccf6 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Ossetic (Ирон)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index b8d0849..3c512d7 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Punjabi (ਪੰਜਾਬੀ)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 176df1b..9d592e9 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Picard (Picard)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 44c39c7..5c835dc 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Deitsch (Deitsch)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 943eb40..472b7bf 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Plautdietsch (Plautdietsch)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 390bbf4..c0832fd 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Pälzisch (Pälzisch)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 661d7be..fd599a1 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Pali (पालि)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index aba939d..c591faa 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Polish (polski)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 8fdccf0..1945b96 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Piedmontese (Piemontèis)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index a89124c..e7f45f1 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Western Punjabi (پنجابی)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 7be93a6..0ca2a49 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Pontic (Ποντιακά)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 808767c..fbc9419 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Pashto (پښتو)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index dcc0742..5dd94ab 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Portuguese (português)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index e202ce3..b981b37 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Brazilian Portuguese (português do Brasil)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 8017778..63d6513 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Quechua (Runa Simi)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index e9e257c..458d60a 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Runa shimi (Runa shimi)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 356f50c..8d3c300 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Romagnol (Rumagnôl)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index c82e472..b31dd5c 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Romansh (rumantsch)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index f825428..d61c007 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Romani (Romani)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 17e201a..a3c15c6 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Romanian (română)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 0a17a16..0924ab1 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** tarandíne (tarandíne)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 9820e92..9098d85 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Russian (русский)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 52eb06f..bdfcd8e 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Rusyn (русиньскый)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index ce2d0ce..4f4bde0 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Megleno-Romanian (Vlăheşte)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 5a3b29d..29b1d94 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Megleno-Romanian (Cyrillic script) (Влахесте)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 37e01a8..5995152 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Megleno-Romanian (Latin script) (Vlăheşte)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index cbb6430..6b15283 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Sanskrit (संस्कृतम्)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 7b72066..4897268 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Sakha (саха тыла)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 9227ee0..b8b8f64 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Sardinian (sardu)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index aed48d1..d06e726 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Sicilian (sicilianu)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 814e184..adfc05e 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Sindhi (سنڌي)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index d4c01f4..4ab9c11 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Sassaresu (Sassaresu)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 2192a56..1917f32 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Northern Sami (sámegiella)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 6a44a4c..c6081f3 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Sango (Sängö)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 3e8dee8..06b8cfb 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Samogitian (žemaitėška)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 62b4582..c5dbf12 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Serbo-Croatian (srpskohrvatski / српскохрватски)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index f068931..1ac48a0 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Sinhala (සිංහල)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index bb017b0..83155da 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Slovak (slovenčina)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index afb9508..ea6b569 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Slovenian (slovenščina)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index a0f5e38..6754233 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Lower Silesian (Schläsch)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index ad4bf5b..3c27597 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Albanian (shqip)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 3994de8..2bf0156 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Serbian (српски / srpski)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 28a0faa..017b4d0 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Serbian (Cyrillic script) (српски (ћирилица)‎)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index c793793..6a5817c 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Serbian (Latin script) (srpski (latinica)‎)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 9b8a43b..5ec55fa 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Sranan Tongo (Sranantongo)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 565fa10..c8d9c30 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Seeltersk (Seeltersk)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 247f698..87c6921 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Sundanese (Basa Sunda)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 915704f..b359c26 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Swedish (svenska)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index f48b676..c653de3 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Swahili (Kiswahili)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 43a5dab..282373c 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Silesian (ślůnski)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index e8d9758..22f0b33 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Tamil (தமிழ்)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 347aa9c..4ff8d2d 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Tulu (ತುಳು)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index bccce7e..b5f131a 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Telugu (తెలుగు)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 509ef2e..c48704a 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Tetum (tetun)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 2a0e7fd..b77ffc8 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Tajik (Тоҷикӣ)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 3b00372..85ccad7 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Tajik (Cyrillic script) (тоҷикӣ)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 6c55ed0..7825ae9 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Thai (ไทย)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index c358df8..a6dedaa 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Turkmen (Türkmençe)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 97ec2f3..799dc34 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Tagalog (Tagalog)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 6ba0e41..5a9b68c 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** толышә зывон (толышә зывон)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 0fb89d5..fe4e5d4 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Tok Pisin (Tok Pisin)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 904dca6..e08c9fc 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Turkish (Türkçe)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 32cee15..0228801 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Tatar (татарча/tatarça)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index daa5d57..bc26d31 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Tatar (Cyrillic script) (татарча)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index b09789b..09b5590 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Tatar (Latin script) (tatarça)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index a5aa042..5e994a3 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Tahitian (Reo Mā`ohi)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index de694e4..41f21e5 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Tuvinian (тыва дыл)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 98bea8a..62bf716 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Udmurt (удмурт)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 0e92975..f2668f4 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Uighur (Uyghurche‎ / ئۇيغۇرچە)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 0869bed..2cd2208 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Uyghur (Arabic script) (ئۇيغۇرچە)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 9c56aec..e18fc46 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Ukrainian (українська)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index f1afd03..7ee1fe8 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Urdu (اردو)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 223cc5f..1c474cc 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Uzbek (oʻzbekcha)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 7e7afb2..9242d83 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** vèneto (vèneto)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 75a419e..b9af298 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Veps (vepsän kel’)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index eb727ce..1712c05 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Vietnamese (Tiếng Việt)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index ed67a39..380fcc2 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** West-Vlams (West-Vlams)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 0615786..2ec847b 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Upper Franconian (Mainfränkisch)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 8023663..eb2f4aa 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Volapük (Volapük)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 4e3a2f4..75e1ced 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Votic (Vaďďa)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 0d4d901..a8113b8 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Võro (Võro)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index f7ae9af..b22ba06 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Walloon (walon)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index dcde51e..92bde37 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Waray (Winaray)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 87c8d4b..0a96d07 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Wolof (Wolof)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 60d2677..477f76a 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Wu (吴语)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 577e0aa..dd38d54 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Kalmyk (хальмг)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 9f987f2..bd587bc 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Mingrelian (მარგალური)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 7d0b0d2..9b6dad4 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Yiddish (ייִדיש)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 761ae07..4c56649 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Yoruba (Yorùbá)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 96f640c..12711d1 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Cantonese (粵語)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index da4620a..f46ecc2 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Zhuang (Vahcuengh)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 2b36283..33a53a9 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Zeeuws (Zeêuws)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 7b62257..9d0573d 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Chinese (中文)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 3e1455d..b887a00 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Chinese (China) (‪中文(中国大陆)‬)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index b6606f6..fa72339 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Simplified Chinese (中文(简体)‎)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 10075a7..be18e0b 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Traditional Chinese (中文(繁體)‎)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index d4d5a05..d7675d1 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Chinese (Hong Kong) (‪中文(香港)‬)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 37be152..b63c84b 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** ‪Chinese (Macau) (‪中文(澳門)‬)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 01b5524..efe358e 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** ‪Chinese (Malaysia)‬ (‪中文(马来西亚)‬)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index c0c1911..48e79cf 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Chinese (Singapore) (‪中文(新加坡)‬)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 13474a6..067f7dd 100644 (file)
@@ -1,8 +1,7 @@
 <?php
 /** Chinese (Taiwan) (‪中文(台灣)‬)
  *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
+ * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
index 14eaeab..c1d93ef 100644 (file)
@@ -26,10 +26,10 @@ CREATE TABLE /*_*/uploadstash (
 
        us_status varchar(50) not null,
 
-       -- file properties from File::getPropsFromPath.  these may prove unnecessary.
+       -- file properties from FSFile::getProps().  these may prove unnecessary.
        --
        us_size int unsigned NOT NULL,
-       -- this hash comes from File::sha1Base36(), and is 31 characters
+       -- this hash comes from FSFile::getSha1Base36(), and is 31 characters
        us_sha1 varchar(31) NOT NULL,
        us_mime varchar(255),
        -- Media type as defined by the MEDIATYPE_xxx constants, should duplicate definition in the image table
diff --git a/maintenance/archives/patch-watchlist-user-notificationtimestamp-index.sql b/maintenance/archives/patch-watchlist-user-notificationtimestamp-index.sql
new file mode 100644 (file)
index 0000000..22ae44f
--- /dev/null
@@ -0,0 +1,4 @@
+--
+-- Creates the wl_user_notificationtimestamp index for the watchlist table
+--
+CREATE INDEX /*i*/wl_user_notificationtimestamp ON /*_*/watchlist (wl_user, wl_notificationtimestamp);
index bf57244..1542a8c 100644 (file)
@@ -26,8 +26,6 @@ require_once __DIR__ . '/Maintenance.php';
 /**
  * Maintenance script to convert user options to the new `user_properties` table.
  *
- * Do each user sequentially, since accounts can't be deleted
- *
  * @ingroup Maintenance
  */
 class ConvertUserOptions extends Maintenance {
@@ -37,6 +35,7 @@ class ConvertUserOptions extends Maintenance {
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Convert user options from old to new system";
+               $this->setBatchSize( 50 );
        }
 
        public function execute() {
@@ -50,14 +49,19 @@ class ConvertUserOptions extends Maintenance {
                        return;
                }
                while ( $id !== null ) {
-                       $idCond = 'user_id > ' . $dbw->addQuotes( $id );
-                       $optCond = "user_options != " . $dbw->addQuotes( '' ); // For compatibility
-                       $res = $dbw->select( 'user', '*',
-                               array( $optCond, $idCond ), __METHOD__,
-                               array( 'LIMIT' => 50, 'FOR UPDATE' )
+                       $res = $dbw->select( 'user',
+                               array( 'user_id', 'user_options' ),
+                               array(
+                                       'user_id > ' . $dbw->addQuotes( $id ),
+                                       "user_options != " . $dbw->addQuotes( '' ),
+                               ),
+                               __METHOD__,
+                               array(
+                                       'ORDER BY' => 'user_id',
+                                       'LIMIT' => $this->mBatchSize,
+                               )
                        );
                        $id = $this->convertOptionBatch( $res, $dbw );
-                       $dbw->commit( __METHOD__ );
 
                        wfWaitForSlaves();
 
@@ -77,12 +81,29 @@ class ConvertUserOptions extends Maintenance {
                $id = null;
                foreach ( $res as $row ) {
                        $this->mConversionCount++;
+                       $insertRows = array();
+                       foreach ( explode( "\n", $row->user_options ) as $s ) {
+                               $m = array();
+                               if ( !preg_match( "/^(.[^=]*)=(.*)$/", $s, $m ) ) {
+                                       continue;
+                               }
 
-                       $u = User::newFromRow( $row );
+                               // MW < 1.16 would save even default values. Filter them out
+                               // here (as in User) to avoid adding many unnecessary rows.
+                               $defaultOption = User::getDefaultOption( $m[1] );
+                               if ( is_null( $defaultOption ) || $m[2] != $defaultOption ) {
+                                       $insertRows[] = array(
+                                               'up_user' => $row->user_id,
+                                               'up_property' => $m[1],
+                                               'up_value' => $m[2],
+                                       );
+                               }
+                       }
 
-                       $u->saveSettings();
+                       if ( count( $insertRows ) ) {
+                               $dbw->insert( 'user_properties', $insertRows, __METHOD__, array( 'IGNORE' ) );
+                       }
 
-                       // Do this here as saveSettings() doesn't set user_options to '' anymore!
                        $dbw->update(
                                'user',
                                array( 'user_options' => '' ),
index 1a54df1..a07cbc2 100644 (file)
@@ -59,7 +59,7 @@ class DeleteEqualMessages extends Maintenance {
                // Normalise message names for NS_MEDIAWIKI page_title
                $messageNames = array_map( array( $wgContLang, 'ucfirst' ), $messageNames );
 
-               $statuses = AllmessagesTablePager::getCustomisedStatuses( $messageNames, $langCode, $nonContLang );
+               $statuses = AllMessagesTablePager::getCustomisedStatuses( $messageNames, $langCode, $nonContLang );
                // getCustomisedStatuses is stripping the sub page from the page titles, add it back
                $titleSuffix = $nonContLang ? "/$langCode" : '';
 
index 7ce8794..3c5bef0 100644 (file)
@@ -4,7 +4,7 @@
 # and previous home directory location
 # The binary path is returned in $PHP if any
 
-for binary in $PHP `which php || true` "$DEV/php/bin/php" "$HOME/.mediawiki/php/bin/php" "$HOME/.mwphp/bin/php" ]; do
+for binary in $PHP $(which php || true) "$DEV/php/bin/php" "$HOME/.mediawiki/php/bin/php" "$HOME/.mwphp/bin/php" ]; do
        if [ -x "$binary" ]; then
                if "$binary" -r 'exit((int)!version_compare(PHP_VERSION, "5.4", ">="));'; then
                        PHP="$binary"
index dfd1959..888c2dc 100644 (file)
@@ -59,7 +59,7 @@ class DumpLinks extends Maintenance {
                $lastPage = null;
                foreach ( $result as $row ) {
                        if ( $lastPage != $row->page_id ) {
-                               if ( isset( $lastPage ) ) {
+                               if ( $lastPage !== null ) {
                                        $this->output( "\n" );
                                }
                                $page = Title::makeTitle( $row->page_namespace, $row->page_title );
@@ -69,7 +69,7 @@ class DumpLinks extends Maintenance {
                        $link = Title::makeTitle( $row->pl_namespace, $row->pl_title );
                        $this->output( " " . $link->getPrefixedURL() );
                }
-               if ( isset( $lastPage ) ) {
+               if ( $lastPage !== null ) {
                        $this->output( "\n" );
                }
        }
index 86c01f4..9929cf9 100644 (file)
@@ -63,6 +63,8 @@ class FindHooks extends Maintenance {
                $documented = $this->getHooksFromDoc( $IP . '/docs/hooks.txt' );
                $potential = array();
                $bad = array();
+
+               // TODO: Don't hardcode the list of directories
                $pathinc = array(
                        $IP . '/',
                        $IP . '/includes/',
@@ -90,6 +92,7 @@ class FindHooks extends Maintenance {
                        $IP . '/includes/json/',
                        $IP . '/includes/logging/',
                        $IP . '/includes/media/',
+                       $IP . '/includes/page/',
                        $IP . '/includes/parser/',
                        $IP . '/includes/rcfeed/',
                        $IP . '/includes/resourceloader/',
@@ -99,6 +102,7 @@ class FindHooks extends Maintenance {
                        $IP . '/includes/specialpage/',
                        $IP . '/includes/specials/',
                        $IP . '/includes/upload/',
+                       $IP . '/includes/utils/',
                        $IP . '/languages/',
                        $IP . '/maintenance/',
                        $IP . '/maintenance/language/',
@@ -106,6 +110,8 @@ class FindHooks extends Maintenance {
                        $IP . '/tests/parser/',
                        $IP . '/tests/phpunit/suites/',
                        $IP . '/skins/',
+                       $IP . '/skins/MonoBook/',
+                       $IP . '/skins/Vector/',
                );
 
                foreach ( $pathinc as $dir ) {
index 0b3cdba..a678a92 100644 (file)
@@ -44,13 +44,14 @@ class FixDoubleRedirects extends Maintenance {
        public function execute() {
                $async = $this->getOption( 'async', false );
                $dryrun = $this->getOption( 'dry-run', false );
-               $title = $this->getOption( 'title' );
 
-               if ( isset( $title ) ) {
-                       $title = Title::newFromText( $title );
+               if ( $this->hasOption( 'title' ) ) {
+                       $title = Title::newFromText( $this->getOption( 'title' ) );
                        if ( !$title || !$title->isRedirect() ) {
                                $this->error( $title->getPrefixedText() . " is not a redirect!\n", true );
                        }
+               } else {
+                       $title = null;
                }
 
                $dbr = wfGetDB( DB_SLAVE );
@@ -75,7 +76,7 @@ class FixDoubleRedirects extends Maintenance {
                        'pb.page_is_redirect' => 1,
                );
 
-               if ( isset( $title ) ) {
+               if ( $title != null ) {
                        $conds['pb.page_namespace'] = $title->getNamespace();
                        $conds['pb.page_title'] = $title->getDBkey();
                }
index c43851e..1930a22 100644 (file)
@@ -244,9 +244,6 @@ class GenerateSitemap extends Maintenance {
         * @return null|string
         */
        private static function init_path( $fspath ) {
-               if ( !isset( $fspath ) ) {
-                       return null;
-               }
                # Create directory if needed
                if ( $fspath && !is_dir( $fspath ) ) {
                        wfMkdirParents( $fspath, null, __METHOD__ ) or die( "Can not create directory $fspath.\n" );
index 3dd4a9e..ae70441 100644 (file)
@@ -177,7 +177,7 @@ if ( $count > 0 ) {
                        if ( isset( $options['skip-dupes'] ) ) {
                                $repo = $image->getRepo();
                                # XXX: we end up calculating this again when actually uploading. that sucks.
-                               $sha1 = File::sha1Base36( $file );
+                               $sha1 = FSFile::getSha1Base36FromPath( $file );
 
                                $dupes = $repo->findBySha1( $sha1 );
 
diff --git a/maintenance/language/listVariants.php b/maintenance/language/listVariants.php
new file mode 100644 (file)
index 0000000..4bff891
--- /dev/null
@@ -0,0 +1,73 @@
+<?php
+/**
+ * Lists all language variants
+ *
+ * Copyright © 2014 MediaWiki developers
+ * https://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+require_once dirname( __DIR__ ) . '/Maintenance.php';
+
+/**
+ * @since 1.24
+ */
+class ListVariants extends Maintenance {
+
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = 'Outputs a list of language variants';
+               $this->addOption( 'flat', 'Output variants in a flat list' );
+               $this->addOption( 'json', 'Output variants as JSON' );
+       }
+
+       public function execute() {
+               $variantLangs = array();
+               $variants = array();
+               foreach ( LanguageConverter::$languagesWithVariants as $langCode ) {
+                       $lang = Language::factory( $langCode );
+                       if ( count( $lang->getVariants() ) > 1 ) {
+                               $variants += array_flip( $lang->getVariants() );
+                               $variantLangs[$langCode] = $lang->getVariants();
+                       }
+               }
+               $variants = array_keys( $variants );
+               sort( $variants );
+               $result = $this->hasOption( 'flat' ) ? $variants : $variantLangs;
+
+               // Not using $this->output() because muting makes no sense here
+               if ( $this->hasOption( 'json' ) ) {
+                       echo FormatJson::encode( $result, true ) . "\n";
+               } else {
+                       foreach ( $result as $key => $value ) {
+                               if ( is_array( $value ) ) {
+                                       echo "$key\n";
+                                       foreach ( $value as $variant ) {
+                                               echo "   $variant\n";
+                                       }
+                               } else {
+                                       echo "$value\n";
+                               }
+                       }
+               }
+       }
+}
+
+$maintClass = 'ListVariants';
+require_once RUN_MAINTENANCE_IF_MAIN;
index fb8db08..bccf366 100644 (file)
@@ -736,12 +736,12 @@ CREATE TABLE /*_*/uploadstash (
   -- chunk counter starts at 0, current offset is stored in us_size
   us_chunk_inx int NULL,
 
-  -- Serialized file properties from File::getPropsFromPath
+  -- Serialized file properties from FSFile::getProps()
   us_props nvarchar(max),
 
   -- file size in bytes
   us_size int NOT NULL,
-  -- this hash comes from File::sha1Base36(), and is 31 characters
+  -- this hash comes from FSFile::getSha1Base36(), and is 31 characters
   us_sha1 nvarchar(31) NOT NULL,
   us_mime nvarchar(255),
   -- Media type as defined by the MEDIATYPE_xxx constants, should duplicate definition in the image table
index a152091..ea86e88 100644 (file)
@@ -208,35 +208,29 @@ class NamespaceConflictChecker extends Maintenance {
         * @return array
         */
        private function getConflicts( $ns, $name ) {
-               $page = 'page';
-               $table = $this->db->tableName( $page );
-
-               $prefix = $this->db->strencode( $name );
-               $encNamespace = $this->db->addQuotes( $ns );
-
-               $titleSql = "TRIM(LEADING '$prefix:' FROM {$page}_title)";
+               $titleSql = "TRIM(LEADING {$this->db->addQuotes( "$name:" )} FROM page_title)";
                if ( $ns == 0 ) {
                        // An interwiki; try an alternate encoding with '-' for ':'
-                       $titleSql = $this->db->buildConcat( array( "'$prefix-'", $titleSql ) );
+                       $titleSql = $this->db->buildConcat( array(
+                               $this->db->addQuotes( "$name-" ),
+                               $titleSql,
+                       ) );
                }
 
-               $sql = "SELECT {$page}_id    AS id,
-                                          {$page}_title AS oldtitle,
-                                          $encNamespace + {$page}_namespace AS namespace,
-                                  $titleSql     AS title,
-                                  {$page}_namespace AS oldnamespace
-                                 FROM {$table}
-                                WHERE ( {$page}_namespace=0 OR {$page}_namespace=1 )
-                                  AND {$page}_title " . $this->db->buildLike( $name . ':', $this->db->anyString() );
-
-               $result = $this->db->query( $sql, __METHOD__ );
-
-               $set = array();
-               foreach ( $result as $row ) {
-                       $set[] = $row;
-               }
-
-               return $set;
+               return iterator_to_array( $this->db->select( 'page',
+                       array(
+                               'id' => 'page_id',
+                               'oldtitle' => 'page_title',
+                               'namespace' => $this->db->addQuotes( $ns ) . ' + page_namespace',
+                               'title' => $titleSql,
+                               'oldnamespace' => 'page_namespace',
+                       ),
+                       array(
+                               'page_namespace' => array( 0, 1 ),
+                               'page_title' . $this->db->buildLike( "$name:", $this->db->anyString() ),
+                       ),
+                       __METHOD__
+               ) );
        }
 
        /**
index 21d9104..d172363 100644 (file)
@@ -57,28 +57,24 @@ class NextJobDB extends Maintenance {
                        return; // no DBs with jobs or cache is both empty and locked
                }
 
-               do {
-                       $again = false;
-
-                       $candidates = array(); // list of (type, db)
-                       // Flatten the tree of candidates into a flat list so that a random
-                       // item can be selected, weighing each queue (type/db tuple) equally.
-                       foreach ( $pendingDBs as $type => $dbs ) {
-                               if (
-                                       ( is_array( $types ) && in_array( $type, $types ) ) ||
-                                       ( $types === false && !in_array( $type, $wgJobTypesExcludedFromDefaultQueue ) )
-                               ) {
-                                       foreach ( $dbs as $db ) {
-                                               $candidates[] = array( $type, $db );
-                                       }
+               $candidates = array(); // list of (type, db)
+               // Flatten the tree of candidates into a flat list so that a random
+               // item can be selected, weighing each queue (type/db tuple) equally.
+               foreach ( $pendingDBs as $type => $dbs ) {
+                       if (
+                               ( is_array( $types ) && in_array( $type, $types ) ) ||
+                               ( $types === false && !in_array( $type, $wgJobTypesExcludedFromDefaultQueue ) )
+                       ) {
+                               foreach ( $dbs as $db ) {
+                                       $candidates[] = array( $type, $db );
                                }
                        }
-                       if ( !count( $candidates ) ) {
-                               return; // no jobs for this type
-                       }
+               }
+               if ( !count( $candidates ) ) {
+                       return; // no jobs for this type
+               }
 
-                       list( $type, $db ) = $candidates[mt_rand( 0, count( $candidates ) - 1 )];
-               } while ( $again );
+               list( $type, $db ) = $candidates[mt_rand( 0, count( $candidates ) - 1 )];
 
                if ( $this->hasOption( 'types' ) ) {
                        $this->output( $db . " " . $type . "\n" );
index abbfd3a..be8cbdb 100644 (file)
@@ -448,6 +448,7 @@ CREATE TABLE watchlist (
 );
 CREATE UNIQUE INDEX wl_user_namespace_title ON watchlist (wl_namespace, wl_title, wl_user);
 CREATE INDEX wl_user ON watchlist (wl_user);
+CREATE INDEX wl_user_notificationtimestamp ON watchlist (wl_user, wl_notificationtimestamp);
 
 
 CREATE TABLE interwiki (
index 203d795..f4b0505 100644 (file)
@@ -179,13 +179,6 @@ class RebuildRecentchanges extends Maintenance {
                // Some logs don't go in RC. This should check for that
                $basicRCLogs = array_diff( $wgLogTypes, array_keys( $wgLogRestrictions ) );
 
-               // Escape...blah blah
-               $selectLogs = array();
-               foreach ( $basicRCLogs as $logtype ) {
-                       $safetype = $dbw->strencode( $logtype );
-                       $selectLogs[] = "'$safetype'";
-               }
-
                $cutoff = time() - $wgRCMaxAge;
                list( $logging, $page ) = $dbw->tableNamesN( 'logging', 'page' );
                $dbw->insertSelect(
@@ -219,7 +212,7 @@ class RebuildRecentchanges extends Maintenance {
                        array(
                                'log_timestamp > ' . $dbw->addQuotes( $dbw->timestamp( $cutoff ) ),
                                'log_user=user_id',
-                               'log_type IN(' . implode( ',', $selectLogs ) . ')'
+                               'log_type' => $basicRCLogs,
                        ),
                        __METHOD__,
                        array(), // INSERT options
index 1b8d618..4f1fbbd 100644 (file)
@@ -1001,12 +1001,12 @@ CREATE TABLE /*_*/uploadstash (
   -- chunk counter starts at 0, current offset is stored in us_size
   us_chunk_inx int unsigned NULL,
 
-  -- Serialized file properties from File::getPropsFromPath
+  -- Serialized file properties from FSFile::getProps()
   us_props blob,
 
   -- file size in bytes
   us_size int unsigned NOT NULL,
-  -- this hash comes from File::sha1Base36(), and is 31 characters
+  -- this hash comes from FSFile::getSha1Base36(), and is 31 characters
   us_sha1 varchar(31) NOT NULL,
   us_mime varchar(255),
   -- Media type as defined by the MEDIATYPE_xxx constants, should duplicate definition in the image table
@@ -1129,6 +1129,7 @@ CREATE TABLE /*_*/watchlist (
 
 CREATE UNIQUE INDEX /*i*/wl_user ON /*_*/watchlist (wl_user, wl_namespace, wl_title);
 CREATE INDEX /*i*/namespace_title ON /*_*/watchlist (wl_namespace, wl_title);
+CREATE INDEX /*i*/wl_user_notificationtimestamp ON /*_*/watchlist (wl_user, wl_notificationtimestamp);
 
 
 --
index 5c2ab89..fd62910 100644 (file)
@@ -83,54 +83,28 @@ return array(
         */
        'mediawiki.skinning.elements' => array(
                'styles' => array(
-                       'common/commonElements.css' => array( 'media' => 'screen' ),
+                       'commonElements.css' => array( 'media' => 'screen' ),
                ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
+               'remoteSkinPath' => 'common',
+               'localBasePath' => $GLOBALS['wgStyleDirectory'] . '/common',
        ),
        'mediawiki.skinning.content' => array(
                'styles' => array(
-                       'common/commonElements.css' => array( 'media' => 'screen' ),
-                       'common/commonContent.css' => array( 'media' => 'screen' ),
+                       'commonElements.css' => array( 'media' => 'screen' ),
+                       'commonContent.css' => array( 'media' => 'screen' ),
                ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
+               'remoteSkinPath' => 'common',
+               'localBasePath' => $GLOBALS['wgStyleDirectory'] . '/common',
        ),
        'mediawiki.skinning.interface' => array(
                // Used in the web installer. Test it after modifying this definition!
                'styles' => array(
-                       'common/commonElements.css' => array( 'media' => 'screen' ),
-                       'common/commonContent.css' => array( 'media' => 'screen' ),
-                       'common/commonInterface.css' => array( 'media' => 'screen' ),
-               ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
-       ),
-
-       // Temporarily kept for backwards-compatibility with generated HTML
-       'skins.common.elements' => array(
-               'styles' => array(
-                       'common/commonElements.css' => array( 'media' => 'screen' ),
-               ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
-       ),
-       'skins.common.content' => array(
-               'styles' => array(
-                       'common/commonElements.css' => array( 'media' => 'screen' ),
-                       'common/commonContent.css' => array( 'media' => 'screen' ),
+                       'commonElements.css' => array( 'media' => 'screen' ),
+                       'commonContent.css' => array( 'media' => 'screen' ),
+                       'commonInterface.css' => array( 'media' => 'screen' ),
                ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
-       ),
-       'skins.common.interface' => array(
-               'styles' => array(
-                       'common/commonElements.css' => array( 'media' => 'screen' ),
-                       'common/commonContent.css' => array( 'media' => 'screen' ),
-                       'common/commonInterface.css' => array( 'media' => 'screen' ),
-               ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
+               'remoteSkinPath' => 'common',
+               'localBasePath' => $GLOBALS['wgStyleDirectory'] . '/common',
        ),
 
        'mediawiki.skinning.content.parsoid' => array(
@@ -139,54 +113,22 @@ return array(
                // skin over-rides common content styling.
                'skinStyles' => array(
                        'default' => 'resources/src/mediawiki.skinning/content.parsoid.less',
+                       'minerva' => array(),
                ),
                'targets' => array( 'desktop', 'mobile' ),
        ),
 
-       /**
-        * Skins
-        * Be careful not to add 'scripts' to these modules,
-        * since they are loaded with OutputPage::addModuleStyles so that the skin styles
-        * apply without javascript.
-        * If a skin needs custom js in the interface, register a separate module
-        * and add it to the load queue with OutputPage::addModules.
-        *
-        * See Vector for an example.
-        */
-       'skins.vector.styles' => array(
-               // Used in the web installer. Test it after modifying this definition!
-               'styles' => array(
-                       'vector/screen.less' => array( 'media' => 'screen' ),
-                       'vector/screen-hd.less' => array( 'media' => 'screen and (min-width: 982px)' ),
-               ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
-       ),
-       'skins.monobook.styles' => array(
-               'styles' => array(
-                       'monobook/main.css' => array( 'media' => 'screen' ),
-               ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
-       ),
-       'skins.vector.js' => array(
-               'scripts' => array(
-                       'vector/collapsibleTabs.js',
-                       'vector/vector.js',
-               ),
-               'position' => 'top',
-               'dependencies' => 'jquery.throttle-debounce',
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
-       ),
-
        /* jQuery */
 
        'jquery' => array(
-               'scripts' => array(
-                       'resources/lib/jquery/jquery.js',
-                       'resources/lib/jquery/jquery.migrate.js',
-               ),
+               'scripts' => ( $GLOBALS['wgIncludejQueryMigrate'] ?
+                       array(
+                               'resources/lib/jquery/jquery.js',
+                               'resources/lib/jquery/jquery.migrate.js'
+                       ) :
+                       array(
+                               'resources/lib/jquery/jquery.js'
+                       ) ),
                'debugRaw' => false,
                'targets' => array( 'desktop', 'mobile' ),
        ),
@@ -376,13 +318,12 @@ return array(
 
        /* jQuery UI */
 
-       // Core
        'jquery.ui.core' => array(
                'scripts' => 'resources/lib/jquery.ui/jquery.ui.core.js',
                'skinStyles' => array(
                        'default' => array(
-                               'resources/lib/jquery.ui/themes/default/jquery.ui.core.css',
-                               'resources/lib/jquery.ui/themes/default/jquery.ui.theme.css',
+                               'resources/lib/jquery.ui/themes/smoothness/jquery.ui.core.css',
+                               'resources/lib/jquery.ui/themes/smoothness/jquery.ui.theme.css',
                        ),
                        'vector' => array(
                                'resources/src/jquery.ui-themes/vector/jquery.ui.core.css',
@@ -391,79 +332,40 @@ return array(
                ),
                'group' => 'jquery.ui',
        ),
-       'jquery.ui.widget' => array(
-               'scripts' => 'resources/lib/jquery.ui/jquery.ui.widget.js',
-               'group' => 'jquery.ui',
-       ),
-       'jquery.ui.mouse' => array(
-               'scripts' => 'resources/lib/jquery.ui/jquery.ui.mouse.js',
-               'dependencies' => 'jquery.ui.widget',
-               'group' => 'jquery.ui',
-       ),
-       'jquery.ui.position' => array(
-               'scripts' => 'resources/lib/jquery.ui/jquery.ui.position.js',
-               'group' => 'jquery.ui',
-       ),
-       // Interactions
-       'jquery.ui.draggable' => array(
-               'scripts' => 'resources/lib/jquery.ui/jquery.ui.draggable.js',
-               'dependencies' => array( 'jquery.ui.core', 'jquery.ui.mouse', 'jquery.ui.widget' ),
-               'group' => 'jquery.ui',
-       ),
-       'jquery.ui.droppable' => array(
-               'scripts' => 'resources/lib/jquery.ui/jquery.ui.droppable.js',
-               'dependencies' => array(
-                       'jquery.ui.core', 'jquery.ui.mouse', 'jquery.ui.widget', 'jquery.ui.draggable',
-               ),
-               'group' => 'jquery.ui',
-       ),
-       'jquery.ui.resizable' => array(
-               'scripts' => 'resources/lib/jquery.ui/jquery.ui.resizable.js',
-               'skinStyles' => array(
-                       'default' => 'resources/lib/jquery.ui/themes/default/jquery.ui.resizable.css',
-                       'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.resizable.css',
-               ),
-               'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget', 'jquery.ui.mouse' ),
-               'group' => 'jquery.ui',
-       ),
-       'jquery.ui.selectable' => array(
-               'scripts' => 'resources/lib/jquery.ui/jquery.ui.selectable.js',
-               'skinStyles' => array(
-                       'default' => 'resources/lib/jquery.ui/themes/default/jquery.ui.selectable.css',
-                       'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.selectable.css',
-               ),
-               'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget', 'jquery.ui.mouse' ),
-               'group' => 'jquery.ui',
-       ),
-       'jquery.ui.sortable' => array(
-               'scripts' => 'resources/lib/jquery.ui/jquery.ui.sortable.js',
-               'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget', 'jquery.ui.mouse' ),
-               'group' => 'jquery.ui',
-       ),
-       // Widgets
        'jquery.ui.accordion' => array(
                'scripts' => 'resources/lib/jquery.ui/jquery.ui.accordion.js',
-               'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget' ),
+               'dependencies' => array(
+                       'jquery.ui.core',
+                       'jquery.ui.widget',
+               ),
                'skinStyles' => array(
-                       'default' => 'resources/lib/jquery.ui/themes/default/jquery.ui.accordion.css',
+                       'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.accordion.css',
                        'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.accordion.css',
                ),
                'group' => 'jquery.ui',
        ),
        'jquery.ui.autocomplete' => array(
                'scripts' => 'resources/lib/jquery.ui/jquery.ui.autocomplete.js',
-               'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget', 'jquery.ui.position' ),
+               'dependencies' => array(
+                       'jquery.ui.core',
+                       'jquery.ui.widget',
+                       'jquery.ui.position',
+                       'jquery.ui.menu',
+               ),
                'skinStyles' => array(
-                       'default' => 'resources/lib/jquery.ui/themes/default/jquery.ui.autocomplete.css',
+                       'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.autocomplete.css',
                        'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.autocomplete.css',
                ),
                'group' => 'jquery.ui',
        ),
        'jquery.ui.button' => array(
                'scripts' => 'resources/lib/jquery.ui/jquery.ui.button.js',
-               'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget' ),
+               'dependencies' => array(
+                       'jquery.ui.core',
+                       'jquery.ui.widget',
+               ),
                'skinStyles' => array(
-                       'default' => 'resources/lib/jquery.ui/themes/default/jquery.ui.button.css',
+                       'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.button.css',
                        'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.button.css',
                ),
                'group' => 'jquery.ui',
@@ -472,12 +374,13 @@ return array(
                'scripts' => 'resources/lib/jquery.ui/jquery.ui.datepicker.js',
                'dependencies' => 'jquery.ui.core',
                'skinStyles' => array(
-                       'default' => 'resources/lib/jquery.ui/themes/default/jquery.ui.datepicker.css',
+                       'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.datepicker.css',
                        'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.datepicker.css',
                ),
                'languageScripts' => array(
                        'af' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-af.js',
                        'ar' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ar.js',
+                       'ar-dz' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ar-DZ.js',
                        'az' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-az.js',
                        'bg' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-bg.js',
                        'bs' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-bs.js',
@@ -486,7 +389,9 @@ return array(
                        'da' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-da.js',
                        'de' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-de.js',
                        'el' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-el.js',
+                       'en-au' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-en-AU.js',
                        'en-gb' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-en-GB.js',
+                       'en-nz' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-en-NZ.js',
                        'eo' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-eo.js',
                        'es' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-es.js',
                        'et' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-et.js',
@@ -495,6 +400,7 @@ return array(
                        'fi' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fi.js',
                        'fo' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fo.js',
                        'fr' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fr.js',
+                       'fr-ch' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fr-CH.js',
                        'gl' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-gl.js',
                        'he' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-he.js',
                        'hi' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-hi.js',
@@ -516,6 +422,7 @@ return array(
                        'ml' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ml.js',
                        'ms' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ms.js',
                        'nl' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-nl.js',
+                       'nl-be' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-nl-BE.js',
                        'no' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-no.js',
                        'pl' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-pl.js',
                        'pt' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-pt.js',
@@ -531,6 +438,7 @@ return array(
                        'sv' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sv.js',
                        'ta' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ta.js',
                        'th' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-th.js',
+                       'tj' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-tj.js',
                        'tr' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-tr.js',
                        'uk' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-uk.js',
                        'vi' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-vi.js',
@@ -552,105 +460,218 @@ return array(
                        'jquery.ui.resizable',
                ),
                'skinStyles' => array(
-                       'default' => 'resources/lib/jquery.ui/themes/default/jquery.ui.dialog.css',
+                       'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.dialog.css',
                        'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.dialog.css',
                ),
                'group' => 'jquery.ui',
        ),
+       'jquery.ui.draggable' => array(
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.draggable.js',
+               'dependencies' => array(
+                       'jquery.ui.core',
+                       'jquery.ui.mouse',
+                       'jquery.ui.widget',
+               ),
+               'group' => 'jquery.ui',
+       ),
+       'jquery.ui.droppable' => array(
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.droppable.js',
+               'dependencies' => array(
+                       'jquery.ui.core',
+                       'jquery.ui.mouse',
+                       'jquery.ui.widget',
+                       'jquery.ui.draggable',
+               ),
+               'group' => 'jquery.ui',
+       ),
+       'jquery.ui.menu' => array(
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.menu.js',
+               'dependencies' => array(
+                       'jquery.ui.core',
+                       'jquery.ui.widget',
+                       'jquery.ui.position',
+               ),
+               'skinStyles' => array(
+                       'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.menu.css',
+               ),
+               'group' => 'jquery.ui',
+       ),
+       'jquery.ui.mouse' => array(
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.mouse.js',
+               'dependencies' => 'jquery.ui.widget',
+               'group' => 'jquery.ui',
+       ),
+       'jquery.ui.position' => array(
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.position.js',
+               'group' => 'jquery.ui',
+       ),
        'jquery.ui.progressbar' => array(
                'scripts' => 'resources/lib/jquery.ui/jquery.ui.progressbar.js',
-               'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget' ),
+               'dependencies' => array(
+                       'jquery.ui.core',
+                       'jquery.ui.widget',
+               ),
                'skinStyles' => array(
-                       'default' => 'resources/lib/jquery.ui/themes/default/jquery.ui.progressbar.css',
+                       'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.progressbar.css',
                        'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.progressbar.css',
                ),
                'group' => 'jquery.ui',
        ),
+       'jquery.ui.resizable' => array(
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.resizable.js',
+               'dependencies' => array(
+                       'jquery.ui.core',
+                       'jquery.ui.widget',
+                       'jquery.ui.mouse',
+               ),
+               'skinStyles' => array(
+                       'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.resizable.css',
+                       'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.resizable.css',
+               ),
+               'group' => 'jquery.ui',
+       ),
+       'jquery.ui.selectable' => array(
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.selectable.js',
+               'dependencies' => array(
+                       'jquery.ui.core',
+                       'jquery.ui.widget',
+                       'jquery.ui.mouse',
+               ),
+               'skinStyles' => array(
+                       'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.selectable.css',
+                       'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.selectable.css',
+               ),
+               'group' => 'jquery.ui',
+       ),
        'jquery.ui.slider' => array(
                'scripts' => 'resources/lib/jquery.ui/jquery.ui.slider.js',
-               'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget', 'jquery.ui.mouse' ),
+               'dependencies' => array(
+                       'jquery.ui.core',
+                       'jquery.ui.widget',
+                       'jquery.ui.mouse',
+               ),
                'skinStyles' => array(
-                       'default' => 'resources/lib/jquery.ui/themes/default/jquery.ui.slider.css',
+                       'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.slider.css',
                        'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.slider.css',
                ),
                'group' => 'jquery.ui',
        ),
+       'jquery.ui.sortable' => array(
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.sortable.js',
+               'dependencies' => array(
+                       'jquery.ui.core',
+                       'jquery.ui.mouse',
+                       'jquery.ui.widget',
+               ),
+               'group' => 'jquery.ui',
+       ),
+       'jquery.ui.spinner' => array(
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.spinner.js',
+               'dependencies' => array(
+                       'jquery.ui.core',
+                       'jquery.ui.widget',
+                       'jquery.ui.button',
+               ),
+               'skinStyles' => array(
+                       'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.spinner.css',
+               ),
+               'group' => 'jquery.ui',
+       ),
        'jquery.ui.tabs' => array(
                'scripts' => 'resources/lib/jquery.ui/jquery.ui.tabs.js',
-               'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget' ),
+               'dependencies' => array(
+                       'jquery.ui.core',
+                       'jquery.ui.widget',
+               ),
                'skinStyles' => array(
-                       'default' => 'resources/lib/jquery.ui/themes/default/jquery.ui.tabs.css',
+                       'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.tabs.css',
                        'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.tabs.css',
                ),
                'group' => 'jquery.ui',
        ),
+       'jquery.ui.tooltip' => array(
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.tooltip.js',
+               'dependencies' => array(
+                       'jquery.ui.core',
+                       'jquery.ui.widget',
+                       'jquery.ui.position',
+               ),
+               'skinStyles' => array(
+                       'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.tooltip.css',
+               ),
+               'group' => 'jquery.ui',
+       ),
+       'jquery.ui.widget' => array(
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.widget.js',
+               'group' => 'jquery.ui',
+       ),
        // Effects
        'jquery.effects.core' => array(
-               'scripts' => 'resources/lib/jquery.effects/jquery.effects.core.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.effect.js',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.blind' => array(
-               'scripts' => 'resources/lib/jquery.effects/jquery.effects.blind.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.effect-blind.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.bounce' => array(
-               'scripts' => 'resources/lib/jquery.effects/jquery.effects.bounce.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.effect-bounce.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.clip' => array(
-               'scripts' => 'resources/lib/jquery.effects/jquery.effects.clip.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.effect-clip.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.drop' => array(
-               'scripts' => 'resources/lib/jquery.effects/jquery.effects.drop.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.effect-drop.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.explode' => array(
-               'scripts' => 'resources/lib/jquery.effects/jquery.effects.explode.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.effect-explode.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.fade' => array(
-               'scripts' => 'resources/lib/jquery.effects/jquery.effects.fade.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.effect-fade.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.fold' => array(
-               'scripts' => 'resources/lib/jquery.effects/jquery.effects.fold.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.effect-fold.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.highlight' => array(
-               'scripts' => 'resources/lib/jquery.effects/jquery.effects.highlight.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.effect-highlight.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.pulsate' => array(
-               'scripts' => 'resources/lib/jquery.effects/jquery.effects.pulsate.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.effect-pulsate.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.scale' => array(
-               'scripts' => 'resources/lib/jquery.effects/jquery.effects.scale.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.effect-scale.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.shake' => array(
-               'scripts' => 'resources/lib/jquery.effects/jquery.effects.shake.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.effect-shake.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.slide' => array(
-               'scripts' => 'resources/lib/jquery.effects/jquery.effects.slide.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.effect-slide.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.transfer' => array(
-               'scripts' => 'resources/lib/jquery.effects/jquery.effects.transfer.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.effect-transfer.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
@@ -918,7 +939,6 @@ return array(
                        'jquery.accessKeyLabel',
                        'jquery.mwExtension',
                        'mediawiki.notify',
-                       'mediawiki.toc', // bug 64765
                ),
                'position' => 'top', // For $wgPreloadJavaScriptMwUtil
                'targets' => array( 'desktop', 'mobile' ),
@@ -964,6 +984,7 @@ return array(
        ),
        'mediawiki.action.history' => array(
                'scripts' => 'resources/src/mediawiki.action/mediawiki.action.history.js',
+               'styles' => 'resources/src/mediawiki.action/mediawiki.action.history.css',
                'group' => 'mediawiki.action.history',
        ),
        'mediawiki.action.history.diff' => array(
@@ -1168,7 +1189,7 @@ return array(
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.js',
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.css',
                'skinStyles' => array(
-                       'vector' => 'skins/vector/special.less',
+                       'vector' => 'skins/Vector/special.less', // FIXME this should use $wgStyleDirectory
                ),
        ),
        'mediawiki.special.block' => array(
@@ -1217,7 +1238,7 @@ return array(
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.preferences.css',
                'position' => 'top',
                'skinStyles' => array(
-                       'vector' => 'skins/vector/special.preferences.less',
+                       'vector' => 'skins/Vector/special.preferences.less', // FIXME this should use $wgStyleDirectory
                ),
                'messages' => array(
                        'prefs-tabs-navigation-hint',
diff --git a/resources/lib/jquery.effects/jquery.effects.blind.js b/resources/lib/jquery.effects/jquery.effects.blind.js
deleted file mode 100644 (file)
index ac25bbd..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/*!
- * 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.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Blind
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.blind = function(o) {
-
-       return this.queue(function() {
-
-               // Create element
-               var el = $(this), props = ['position','top','bottom','left','right'];
-
-               // Set options
-               var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
-               var direction = o.options.direction || 'vertical'; // Default direction
-
-               // Adjust
-               $.effects.save(el, props); el.show(); // Save & Show
-               var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
-               var ref = (direction == 'vertical') ? 'height' : 'width';
-               var distance = (direction == 'vertical') ? wrapper.height() : wrapper.width();
-               if(mode == 'show') wrapper.css(ref, 0); // Shift
-
-               // Animation
-               var animation = {};
-               animation[ref] = mode == 'show' ? distance : 0;
-
-               // Animate
-               wrapper.animate(animation, o.duration, o.options.easing, function() {
-                       if(mode == 'hide') el.hide(); // Hide
-                       $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
-                       if(o.callback) o.callback.apply(el[0], arguments); // Callback
-                       el.dequeue();
-               });
-
-       });
-
-};
-
-})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.bounce.js b/resources/lib/jquery.effects/jquery.effects.bounce.js
deleted file mode 100644 (file)
index 1169d77..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-/*!
- * 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.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Bounce
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.bounce = function(o) {
-
-       return this.queue(function() {
-
-               // Create element
-               var el = $(this), props = ['position','top','bottom','left','right'];
-
-               // Set options
-               var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
-               var direction = o.options.direction || 'up'; // Default direction
-               var distance = o.options.distance || 20; // Default distance
-               var times = o.options.times || 5; // Default # of times
-               var speed = o.duration || 250; // Default speed per bounce
-               if (/show|hide/.test(mode)) props.push('opacity'); // Avoid touching opacity to prevent clearType and PNG issues in IE
-
-               // Adjust
-               $.effects.save(el, props); el.show(); // Save & Show
-               $.effects.createWrapper(el); // Create Wrapper
-               var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
-               var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
-               var distance = o.options.distance || (ref == 'top' ? el.outerHeight(true) / 3 : el.outerWidth(true) / 3);
-               if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift
-               if (mode == 'hide') distance = distance / (times * 2);
-               if (mode != 'hide') times--;
-
-               // Animate
-               if (mode == 'show') { // Show Bounce
-                       var animation = {opacity: 1};
-                       animation[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
-                       el.animate(animation, speed / 2, o.options.easing);
-                       distance = distance / 2;
-                       times--;
-               };
-               for (var i = 0; i < times; i++) { // Bounces
-                       var animation1 = {}, animation2 = {};
-                       animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
-                       animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
-                       el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing);
-                       distance = (mode == 'hide') ? distance * 2 : distance / 2;
-               };
-               if (mode == 'hide') { // Last Bounce
-                       var animation = {opacity: 0};
-                       animation[ref] = (motion == 'pos' ? '-=' : '+=')  + distance;
-                       el.animate(animation, speed / 2, o.options.easing, function(){
-                               el.hide(); // Hide
-                               $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
-                               if(o.callback) o.callback.apply(this, arguments); // Callback
-                       });
-               } else {
-                       var animation1 = {}, animation2 = {};
-                       animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
-                       animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
-                       el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing, function(){
-                               $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
-                               if(o.callback) o.callback.apply(this, arguments); // Callback
-                       });
-               };
-               el.queue('fx', function() { el.dequeue(); });
-               el.dequeue();
-       });
-
-};
-
-})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.clip.js b/resources/lib/jquery.effects/jquery.effects.clip.js
deleted file mode 100644 (file)
index edd51a6..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/*!
- * 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.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Clip
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.clip = function(o) {
-
-       return this.queue(function() {
-
-               // Create element
-               var el = $(this), props = ['position','top','bottom','left','right','height','width'];
-
-               // Set options
-               var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
-               var direction = o.options.direction || 'vertical'; // Default direction
-
-               // Adjust
-               $.effects.save(el, props); el.show(); // Save & Show
-               var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
-               var animate = el[0].tagName == 'IMG' ? wrapper : el;
-               var ref = {
-                       size: (direction == 'vertical') ? 'height' : 'width',
-                       position: (direction == 'vertical') ? 'top' : 'left'
-               };
-               var distance = (direction == 'vertical') ? animate.height() : animate.width();
-               if(mode == 'show') { animate.css(ref.size, 0); animate.css(ref.position, distance / 2); } // Shift
-
-               // Animation
-               var animation = {};
-               animation[ref.size] = mode == 'show' ? distance : 0;
-               animation[ref.position] = mode == 'show' ? 0 : distance / 2;
-
-               // Animate
-               animate.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
-                       if(mode == 'hide') el.hide(); // Hide
-                       $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
-                       if(o.callback) o.callback.apply(el[0], arguments); // Callback
-                       el.dequeue();
-               }});
-
-       });
-
-};
-
-})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.core.js b/resources/lib/jquery.effects/jquery.effects.core.js
deleted file mode 100644 (file)
index 7fd946f..0000000
+++ /dev/null
@@ -1,612 +0,0 @@
-/*!
- * jQuery UI Effects 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/
- */
-;jQuery.effects || (function($, undefined) {
-
-$.effects = {};
-
-
-
-/******************************************************************************/
-/****************************** COLOR ANIMATIONS ******************************/
-/******************************************************************************/
-
-// override the animation for color styles
-$.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor',
-       'borderRightColor', 'borderTopColor', 'borderColor', 'color', 'outlineColor'],
-function(i, attr) {
-       $.fx.step[attr] = function(fx) {
-               if (!fx.colorInit) {
-                       fx.start = getColor(fx.elem, attr);
-                       fx.end = getRGB(fx.end);
-                       fx.colorInit = true;
-               }
-
-               fx.elem.style[attr] = 'rgb(' +
-                       Math.max(Math.min(parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0], 10), 255), 0) + ',' +
-                       Math.max(Math.min(parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1], 10), 255), 0) + ',' +
-                       Math.max(Math.min(parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2], 10), 255), 0) + ')';
-       };
-});
-
-// Color Conversion functions from highlightFade
-// By Blair Mitchelmore
-// http://jquery.offput.ca/highlightFade/
-
-// Parse strings looking for color tuples [255,255,255]
-function getRGB(color) {
-               var result;
-
-               // Check if we're already dealing with an array of colors
-               if ( color && color.constructor == Array && color.length == 3 )
-                               return color;
-
-               // Look for rgb(num,num,num)
-               if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))
-                               return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)];
-
-               // Look for rgb(num%,num%,num%)
-               if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color))
-                               return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];
-
-               // Look for #a0b1c2
-               if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))
-                               return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];
-
-               // Look for #fff
-               if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))
-                               return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];
-
-               // Look for rgba(0, 0, 0, 0) == transparent in Safari 3
-               if (result = /rgba\(0, 0, 0, 0\)/.exec(color))
-                               return colors['transparent'];
-
-               // Otherwise, we're most likely dealing with a named color
-               return colors[$.trim(color).toLowerCase()];
-}
-
-function getColor(elem, attr) {
-               var color;
-
-               do {
-                               // jQuery <1.4.3 uses curCSS, in 1.4.3 - 1.7.2 curCSS = css, 1.8+ only has css
-                               color = ($.curCSS || $.css)(elem, attr);
-
-                               // Keep going until we find an element that has color, or we hit the body
-                               if ( color != '' && color != 'transparent' || $.nodeName(elem, "body") )
-                                               break;
-
-                               attr = "backgroundColor";
-               } while ( elem = elem.parentNode );
-
-               return getRGB(color);
-};
-
-// Some named colors to work with
-// From Interface by Stefan Petre
-// http://interface.eyecon.ro/
-
-var colors = {
-       aqua:[0,255,255],
-       azure:[240,255,255],
-       beige:[245,245,220],
-       black:[0,0,0],
-       blue:[0,0,255],
-       brown:[165,42,42],
-       cyan:[0,255,255],
-       darkblue:[0,0,139],
-       darkcyan:[0,139,139],
-       darkgrey:[169,169,169],
-       darkgreen:[0,100,0],
-       darkkhaki:[189,183,107],
-       darkmagenta:[139,0,139],
-       darkolivegreen:[85,107,47],
-       darkorange:[255,140,0],
-       darkorchid:[153,50,204],
-       darkred:[139,0,0],
-       darksalmon:[233,150,122],
-       darkviolet:[148,0,211],
-       fuchsia:[255,0,255],
-       gold:[255,215,0],
-       green:[0,128,0],
-       indigo:[75,0,130],
-       khaki:[240,230,140],
-       lightblue:[173,216,230],
-       lightcyan:[224,255,255],
-       lightgreen:[144,238,144],
-       lightgrey:[211,211,211],
-       lightpink:[255,182,193],
-       lightyellow:[255,255,224],
-       lime:[0,255,0],
-       magenta:[255,0,255],
-       maroon:[128,0,0],
-       navy:[0,0,128],
-       olive:[128,128,0],
-       orange:[255,165,0],
-       pink:[255,192,203],
-       purple:[128,0,128],
-       violet:[128,0,128],
-       red:[255,0,0],
-       silver:[192,192,192],
-       white:[255,255,255],
-       yellow:[255,255,0],
-       transparent: [255,255,255]
-};
-
-
-
-/******************************************************************************/
-/****************************** CLASS ANIMATIONS ******************************/
-/******************************************************************************/
-
-var classAnimationActions = ['add', 'remove', 'toggle'],
-       shorthandStyles = {
-               border: 1,
-               borderBottom: 1,
-               borderColor: 1,
-               borderLeft: 1,
-               borderRight: 1,
-               borderTop: 1,
-               borderWidth: 1,
-               margin: 1,
-               padding: 1
-       };
-
-function getElementStyles() {
-       var style = document.defaultView
-                       ? document.defaultView.getComputedStyle(this, null)
-                       : this.currentStyle,
-               newStyle = {},
-               key,
-               camelCase;
-
-       // webkit enumerates style porperties
-       if (style && style.length && style[0] && style[style[0]]) {
-               var len = style.length;
-               while (len--) {
-                       key = style[len];
-                       if (typeof style[key] == 'string') {
-                               camelCase = key.replace(/\-(\w)/g, function(all, letter){
-                                       return letter.toUpperCase();
-                               });
-                               newStyle[camelCase] = style[key];
-                       }
-               }
-       } else {
-               for (key in style) {
-                       if (typeof style[key] === 'string') {
-                               newStyle[key] = style[key];
-                       }
-               }
-       }
-       
-       return newStyle;
-}
-
-function filterStyles(styles) {
-       var name, value;
-       for (name in styles) {
-               value = styles[name];
-               if (
-                       // ignore null and undefined values
-                       value == null ||
-                       // ignore functions (when does this occur?)
-                       $.isFunction(value) ||
-                       // shorthand styles that need to be expanded
-                       name in shorthandStyles ||
-                       // ignore scrollbars (break in IE)
-                       (/scrollbar/).test(name) ||
-
-                       // only colors or values that can be converted to numbers
-                       (!(/color/i).test(name) && isNaN(parseFloat(value)))
-               ) {
-                       delete styles[name];
-               }
-       }
-       
-       return styles;
-}
-
-function styleDifference(oldStyle, newStyle) {
-       var diff = { _: 0 }, // http://dev.jquery.com/ticket/5459
-               name;
-
-       for (name in newStyle) {
-               if (oldStyle[name] != newStyle[name]) {
-                       diff[name] = newStyle[name];
-               }
-       }
-
-       return diff;
-}
-
-$.effects.animateClass = function(value, duration, easing, callback) {
-       if ($.isFunction(easing)) {
-               callback = easing;
-               easing = null;
-       }
-
-       return this.queue(function() {
-               var that = $(this),
-                       originalStyleAttr = that.attr('style') || ' ',
-                       originalStyle = filterStyles(getElementStyles.call(this)),
-                       newStyle,
-                       className = that.attr('class') || "";
-
-               $.each(classAnimationActions, function(i, action) {
-                       if (value[action]) {
-                               that[action + 'Class'](value[action]);
-                       }
-               });
-               newStyle = filterStyles(getElementStyles.call(this));
-               that.attr('class', className);
-
-               that.animate(styleDifference(originalStyle, newStyle), {
-                       queue: false,
-                       duration: duration,
-                       easing: easing,
-                       complete: function() {
-                               $.each(classAnimationActions, function(i, action) {
-                                       if (value[action]) { that[action + 'Class'](value[action]); }
-                               });
-                               // work around bug in IE by clearing the cssText before setting it
-                               if (typeof that.attr('style') == 'object') {
-                                       that.attr('style').cssText = '';
-                                       that.attr('style').cssText = originalStyleAttr;
-                               } else {
-                                       that.attr('style', originalStyleAttr);
-                               }
-                               if (callback) { callback.apply(this, arguments); }
-                               $.dequeue( this );
-                       }
-               });
-       });
-};
-
-$.fn.extend({
-       _addClass: $.fn.addClass,
-       addClass: function(classNames, speed, easing, callback) {
-               return speed ? $.effects.animateClass.apply(this, [{ add: classNames },speed,easing,callback]) : this._addClass(classNames);
-       },
-
-       _removeClass: $.fn.removeClass,
-       removeClass: function(classNames,speed,easing,callback) {
-               return speed ? $.effects.animateClass.apply(this, [{ remove: classNames },speed,easing,callback]) : this._removeClass(classNames);
-       },
-
-       _toggleClass: $.fn.toggleClass,
-       toggleClass: function(classNames, force, speed, easing, callback) {
-               if ( typeof force == "boolean" || force === undefined ) {
-                       if ( !speed ) {
-                               // without speed parameter;
-                               return this._toggleClass(classNames, force);
-                       } else {
-                               return $.effects.animateClass.apply(this, [(force?{add:classNames}:{remove:classNames}),speed,easing,callback]);
-                       }
-               } else {
-                       // without switch parameter;
-                       return $.effects.animateClass.apply(this, [{ toggle: classNames },force,speed,easing]);
-               }
-       },
-
-       switchClass: function(remove,add,speed,easing,callback) {
-               return $.effects.animateClass.apply(this, [{ add: add, remove: remove },speed,easing,callback]);
-       }
-});
-
-
-
-/******************************************************************************/
-/*********************************** EFFECTS **********************************/
-/******************************************************************************/
-
-$.extend($.effects, {
-       version: "1.8.24",
-
-       // Saves a set of properties in a data storage
-       save: function(element, set) {
-               for(var i=0; i < set.length; i++) {
-                       if(set[i] !== null) element.data("ec.storage."+set[i], element[0].style[set[i]]);
-               }
-       },
-
-       // Restores a set of previously saved properties from a data storage
-       restore: function(element, set) {
-               for(var i=0; i < set.length; i++) {
-                       if(set[i] !== null) element.css(set[i], element.data("ec.storage."+set[i]));
-               }
-       },
-
-       setMode: function(el, mode) {
-               if (mode == 'toggle') mode = el.is(':hidden') ? 'show' : 'hide'; // Set for toggle
-               return mode;
-       },
-
-       getBaseline: function(origin, original) { // Translates a [top,left] array into a baseline value
-               // this should be a little more flexible in the future to handle a string & hash
-               var y, x;
-               switch (origin[0]) {
-                       case 'top': y = 0; break;
-                       case 'middle': y = 0.5; break;
-                       case 'bottom': y = 1; break;
-                       default: y = origin[0] / original.height;
-               };
-               switch (origin[1]) {
-                       case 'left': x = 0; break;
-                       case 'center': x = 0.5; break;
-                       case 'right': x = 1; break;
-                       default: x = origin[1] / original.width;
-               };
-               return {x: x, y: y};
-       },
-
-       // Wraps the element around a wrapper that copies position properties
-       createWrapper: function(element) {
-
-               // if the element is already wrapped, return it
-               if (element.parent().is('.ui-effects-wrapper')) {
-                       return element.parent();
-               }
-
-               // wrap the element
-               var props = {
-                               width: element.outerWidth(true),
-                               height: element.outerHeight(true),
-                               'float': element.css('float')
-                       },
-                       wrapper = $('<div></div>')
-                               .addClass('ui-effects-wrapper')
-                               .css({
-                                       fontSize: '100%',
-                                       background: 'transparent',
-                                       border: 'none',
-                                       margin: 0,
-                                       padding: 0
-                               }),
-                       active = document.activeElement;
-
-               // support: Firefox
-               // Firefox incorrectly exposes anonymous content
-               // https://bugzilla.mozilla.org/show_bug.cgi?id=561664
-               try {
-                       active.id;
-               } catch( e ) {
-                       active = document.body;
-               }
-
-               element.wrap( wrapper );
-
-               // Fixes #7595 - Elements lose focus when wrapped.
-               if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
-                       $( active ).focus();
-               }
-               
-               wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually loose the reference to the wrapped element
-
-               // transfer positioning properties to the wrapper
-               if (element.css('position') == 'static') {
-                       wrapper.css({ position: 'relative' });
-                       element.css({ position: 'relative' });
-               } else {
-                       $.extend(props, {
-                               position: element.css('position'),
-                               zIndex: element.css('z-index')
-                       });
-                       $.each(['top', 'left', 'bottom', 'right'], function(i, pos) {
-                               props[pos] = element.css(pos);
-                               if (isNaN(parseInt(props[pos], 10))) {
-                                       props[pos] = 'auto';
-                               }
-                       });
-                       element.css({position: 'relative', top: 0, left: 0, right: 'auto', bottom: 'auto' });
-               }
-
-               return wrapper.css(props).show();
-       },
-
-       removeWrapper: function(element) {
-               var parent,
-                       active = document.activeElement;
-               
-               if (element.parent().is('.ui-effects-wrapper')) {
-                       parent = element.parent().replaceWith(element);
-                       // Fixes #7595 - Elements lose focus when wrapped.
-                       if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
-                               $( active ).focus();
-                       }
-                       return parent;
-               }
-                       
-               return element;
-       },
-
-       setTransition: function(element, list, factor, value) {
-               value = value || {};
-               $.each(list, function(i, x){
-                       var unit = element.cssUnit(x);
-                       if (unit[0] > 0) value[x] = unit[0] * factor + unit[1];
-               });
-               return value;
-       }
-});
-
-
-function _normalizeArguments(effect, options, speed, callback) {
-       // shift params for method overloading
-       if (typeof effect == 'object') {
-               callback = options;
-               speed = null;
-               options = effect;
-               effect = options.effect;
-       }
-       if ($.isFunction(options)) {
-               callback = options;
-               speed = null;
-               options = {};
-       }
-        if (typeof options == 'number' || $.fx.speeds[options]) {
-               callback = speed;
-               speed = options;
-               options = {};
-       }
-       if ($.isFunction(speed)) {
-               callback = speed;
-               speed = null;
-       }
-
-       options = options || {};
-
-       speed = speed || options.duration;
-       speed = $.fx.off ? 0 : typeof speed == 'number'
-               ? speed : speed in $.fx.speeds ? $.fx.speeds[speed] : $.fx.speeds._default;
-
-       callback = callback || options.complete;
-
-       return [effect, options, speed, callback];
-}
-
-function standardSpeed( speed ) {
-       // valid standard speeds
-       if ( !speed || typeof speed === "number" || $.fx.speeds[ speed ] ) {
-               return true;
-       }
-       
-       // invalid strings - treat as "normal" speed
-       if ( typeof speed === "string" && !$.effects[ speed ] ) {
-               return true;
-       }
-       
-       return false;
-}
-
-$.fn.extend({
-       effect: function(effect, options, speed, callback) {
-               var args = _normalizeArguments.apply(this, arguments),
-                       // TODO: make effects take actual parameters instead of a hash
-                       args2 = {
-                               options: args[1],
-                               duration: args[2],
-                               callback: args[3]
-                       },
-                       mode = args2.options.mode,
-                       effectMethod = $.effects[effect];
-               
-               if ( $.fx.off || !effectMethod ) {
-                       // delegate to the original method (e.g., .show()) if possible
-                       if ( mode ) {
-                               return this[ mode ]( args2.duration, args2.callback );
-                       } else {
-                               return this.each(function() {
-                                       if ( args2.callback ) {
-                                               args2.callback.call( this );
-                                       }
-                               });
-                       }
-               }
-               
-               return effectMethod.call(this, args2);
-       },
-
-       _show: $.fn.show,
-       show: function(speed) {
-               if ( standardSpeed( speed ) ) {
-                       return this._show.apply(this, arguments);
-               } else {
-                       var args = _normalizeArguments.apply(this, arguments);
-                       args[1].mode = 'show';
-                       return this.effect.apply(this, args);
-               }
-       },
-
-       _hide: $.fn.hide,
-       hide: function(speed) {
-               if ( standardSpeed( speed ) ) {
-                       return this._hide.apply(this, arguments);
-               } else {
-                       var args = _normalizeArguments.apply(this, arguments);
-                       args[1].mode = 'hide';
-                       return this.effect.apply(this, args);
-               }
-       },
-
-       // jQuery core overloads toggle and creates _toggle
-       __toggle: $.fn.toggle,
-       toggle: function(speed) {
-               if ( standardSpeed( speed ) || typeof speed === "boolean" || $.isFunction( speed ) ) {
-                       return this.__toggle.apply(this, arguments);
-               } else {
-                       var args = _normalizeArguments.apply(this, arguments);
-                       args[1].mode = 'toggle';
-                       return this.effect.apply(this, args);
-               }
-       },
-
-       // helper functions
-       cssUnit: function(key) {
-               var style = this.css(key), val = [];
-               $.each( ['em','px','%','pt'], function(i, unit){
-                       if(style.indexOf(unit) > 0)
-                               val = [parseFloat(style), unit];
-               });
-               return val;
-       }
-});
-
-
-
-/******************************************************************************/
-/*********************************** EASING ***********************************/
-/******************************************************************************/
-
-// based on easing equations from Robert Penner (http://www.robertpenner.com/easing)
-
-var baseEasings = {};
-
-$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {
-       baseEasings[ name ] = function( p ) {
-               return Math.pow( p, i + 2 );
-       };
-});
-
-$.extend( baseEasings, {
-       Sine: function ( p ) {
-               return 1 - Math.cos( p * Math.PI / 2 );
-       },
-       Circ: function ( p ) {
-               return 1 - Math.sqrt( 1 - p * p );
-       },
-       Elastic: function( p ) {
-               return p === 0 || p === 1 ? p :
-                       -Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 );
-       },
-       Back: function( p ) {
-               return p * p * ( 3 * p - 2 );
-       },
-       Bounce: function ( p ) {
-               var pow2,
-                       bounce = 4;
-
-               while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
-               return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );
-       }
-});
-
-$.each( baseEasings, function( name, easeIn ) {
-       $.easing[ "easeIn" + name ] = easeIn;
-       $.easing[ "easeOut" + name ] = function( p ) {
-               return 1 - easeIn( 1 - p );
-       };
-       $.easing[ "easeInOut" + name ] = function( p ) {
-               return p < .5 ?
-                       easeIn( p * 2 ) / 2 :
-                       easeIn( p * -2 + 2 ) / -2 + 1;
-       };
-});
-
-})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.drop.js b/resources/lib/jquery.effects/jquery.effects.drop.js
deleted file mode 100644 (file)
index 97e5abd..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/*!
- * 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.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Drop
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.drop = function(o) {
-
-       return this.queue(function() {
-
-               // Create element
-               var el = $(this), props = ['position','top','bottom','left','right','opacity'];
-
-               // Set options
-               var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
-               var direction = o.options.direction || 'left'; // Default Direction
-
-               // Adjust
-               $.effects.save(el, props); el.show(); // Save & Show
-               $.effects.createWrapper(el); // Create Wrapper
-               var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
-               var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
-               var distance = o.options.distance || (ref == 'top' ? el.outerHeight( true ) / 2 : el.outerWidth( true ) / 2);
-               if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift
-
-               // Animation
-               var animation = {opacity: mode == 'show' ? 1 : 0};
-               animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;
-
-               // Animate
-               el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
-                       if(mode == 'hide') el.hide(); // Hide
-                       $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
-                       if(o.callback) o.callback.apply(this, arguments); // Callback
-                       el.dequeue();
-               }});
-
-       });
-
-};
-
-})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.explode.js b/resources/lib/jquery.effects/jquery.effects.explode.js
deleted file mode 100644 (file)
index f63e47a..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-/*!
- * 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.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Explode
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.explode = function(o) {
-
-       return this.queue(function() {
-
-       var rows = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3;
-       var cells = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3;
-
-       o.options.mode = o.options.mode == 'toggle' ? ($(this).is(':visible') ? 'hide' : 'show') : o.options.mode;
-       var el = $(this).show().css('visibility', 'hidden');
-       var offset = el.offset();
-
-       //Substract the margins - not fixing the problem yet.
-       offset.top -= parseInt(el.css("marginTop"),10) || 0;
-       offset.left -= parseInt(el.css("marginLeft"),10) || 0;
-
-       var width = el.outerWidth(true);
-       var height = el.outerHeight(true);
-
-       for(var i=0;i<rows;i++) { // =
-               for(var j=0;j<cells;j++) { // ||
-                       el
-                               .clone()
-                               .appendTo('body')
-                               .wrap('<div></div>')
-                               .css({
-                                       position: 'absolute',
-                                       visibility: 'visible',
-                                       left: -j*(width/cells),
-                                       top: -i*(height/rows)
-                               })
-                               .parent()
-                               .addClass('ui-effects-explode')
-                               .css({
-                                       position: 'absolute',
-                                       overflow: 'hidden',
-                                       width: width/cells,
-                                       height: height/rows,
-                                       left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? (j-Math.floor(cells/2))*(width/cells) : 0),
-                                       top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? (i-Math.floor(rows/2))*(height/rows) : 0),
-                                       opacity: o.options.mode == 'show' ? 0 : 1
-                               }).animate({
-                                       left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? 0 : (j-Math.floor(cells/2))*(width/cells)),
-                                       top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? 0 : (i-Math.floor(rows/2))*(height/rows)),
-                                       opacity: o.options.mode == 'show' ? 1 : 0
-                               }, o.duration || 500);
-               }
-       }
-
-       // Set a timeout, to call the callback approx. when the other animations have finished
-       setTimeout(function() {
-
-               o.options.mode == 'show' ? el.css({ visibility: 'visible' }) : el.css({ visibility: 'visible' }).hide();
-                               if(o.callback) o.callback.apply(el[0]); // Callback
-                               el.dequeue();
-
-                               $('div.ui-effects-explode').remove();
-
-       }, o.duration || 500);
-
-
-       });
-
-};
-
-})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.fade.js b/resources/lib/jquery.effects/jquery.effects.fade.js
deleted file mode 100644 (file)
index 7aa37b1..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/*!
- * 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.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Fade
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.fade = function(o) {
-       return this.queue(function() {
-               var elem = $(this),
-                       mode = $.effects.setMode(elem, o.options.mode || 'hide');
-
-               elem.animate({ opacity: mode }, {
-                       queue: false,
-                       duration: o.duration,
-                       easing: o.options.easing,
-                       complete: function() {
-                               (o.callback && o.callback.apply(this, arguments));
-                               elem.dequeue();
-                       }
-               });
-       });
-};
-
-})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.fold.js b/resources/lib/jquery.effects/jquery.effects.fold.js
deleted file mode 100644 (file)
index 06cc553..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-/*!
- * 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.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Fold
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.fold = function(o) {
-
-       return this.queue(function() {
-
-               // Create element
-               var el = $(this), props = ['position','top','bottom','left','right'];
-
-               // Set options
-               var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
-               var size = o.options.size || 15; // Default fold size
-               var horizFirst = !(!o.options.horizFirst); // Ensure a boolean value
-               var duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2;
-
-               // Adjust
-               $.effects.save(el, props); el.show(); // Save & Show
-               var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
-               var widthFirst = ((mode == 'show') != horizFirst);
-               var ref = widthFirst ? ['width', 'height'] : ['height', 'width'];
-               var distance = widthFirst ? [wrapper.width(), wrapper.height()] : [wrapper.height(), wrapper.width()];
-               var percent = /([0-9]+)%/.exec(size);
-               if(percent) size = parseInt(percent[1],10) / 100 * distance[mode == 'hide' ? 0 : 1];
-               if(mode == 'show') wrapper.css(horizFirst ? {height: 0, width: size} : {height: size, width: 0}); // Shift
-
-               // Animation
-               var animation1 = {}, animation2 = {};
-               animation1[ref[0]] = mode == 'show' ? distance[0] : size;
-               animation2[ref[1]] = mode == 'show' ? distance[1] : 0;
-
-               // Animate
-               wrapper.animate(animation1, duration, o.options.easing)
-               .animate(animation2, duration, o.options.easing, function() {
-                       if(mode == 'hide') el.hide(); // Hide
-                       $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
-                       if(o.callback) o.callback.apply(el[0], arguments); // Callback
-                       el.dequeue();
-               });
-
-       });
-
-};
-
-})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.highlight.js b/resources/lib/jquery.effects/jquery.effects.highlight.js
deleted file mode 100644 (file)
index ad9e7bd..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/*!
- * 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.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Highlight
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.highlight = function(o) {
-       return this.queue(function() {
-               var elem = $(this),
-                       props = ['backgroundImage', 'backgroundColor', 'opacity'],
-                       mode = $.effects.setMode(elem, o.options.mode || 'show'),
-                       animation = {
-                               backgroundColor: elem.css('backgroundColor')
-                       };
-
-               if (mode == 'hide') {
-                       animation.opacity = 0;
-               }
-
-               $.effects.save(elem, props);
-               elem
-                       .show()
-                       .css({
-                               backgroundImage: 'none',
-                               backgroundColor: o.options.color || '#ffff99'
-                       })
-                       .animate(animation, {
-                               queue: false,
-                               duration: o.duration,
-                               easing: o.options.easing,
-                               complete: function() {
-                                       (mode == 'hide' && elem.hide());
-                                       $.effects.restore(elem, props);
-                                       (mode == 'show' && !$.support.opacity && this.style.removeAttribute('filter'));
-                                       (o.callback && o.callback.apply(this, arguments));
-                                       elem.dequeue();
-                               }
-                       });
-       });
-};
-
-})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.pulsate.js b/resources/lib/jquery.effects/jquery.effects.pulsate.js
deleted file mode 100644 (file)
index d730bee..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/*!
- * 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.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Pulsate
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.pulsate = function(o) {
-       return this.queue(function() {
-               var elem = $(this),
-                       mode = $.effects.setMode(elem, o.options.mode || 'show'),
-                       times = ((o.options.times || 5) * 2) - 1,
-                       duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2,
-                       isVisible = elem.is(':visible'),
-                       animateTo = 0;
-
-               if (!isVisible) {
-                       elem.css('opacity', 0).show();
-                       animateTo = 1;
-               }
-
-               if ((mode == 'hide' && isVisible) || (mode == 'show' && !isVisible)) {
-                       times--;
-               }
-
-               for (var i = 0; i < times; i++) {
-                       elem.animate({ opacity: animateTo }, duration, o.options.easing);
-                       animateTo = (animateTo + 1) % 2;
-               }
-
-               elem.animate({ opacity: animateTo }, duration, o.options.easing, function() {
-                       if (animateTo == 0) {
-                               elem.hide();
-                       }
-                       (o.callback && o.callback.apply(this, arguments));
-               });
-
-               elem
-                       .queue('fx', function() { elem.dequeue(); })
-                       .dequeue();
-       });
-};
-
-})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.scale.js b/resources/lib/jquery.effects/jquery.effects.scale.js
deleted file mode 100644 (file)
index 52d1871..0000000
+++ /dev/null
@@ -1,178 +0,0 @@
-/*!
- * 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.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Scale
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.puff = function(o) {
-       return this.queue(function() {
-               var elem = $(this),
-                       mode = $.effects.setMode(elem, o.options.mode || 'hide'),
-                       percent = parseInt(o.options.percent, 10) || 150,
-                       factor = percent / 100,
-                       original = { height: elem.height(), width: elem.width() };
-
-               $.extend(o.options, {
-                       fade: true,
-                       mode: mode,
-                       percent: mode == 'hide' ? percent : 100,
-                       from: mode == 'hide'
-                               ? original
-                               : {
-                                       height: original.height * factor,
-                                       width: original.width * factor
-                               }
-               });
-
-               elem.effect('scale', o.options, o.duration, o.callback);
-               elem.dequeue();
-       });
-};
-
-$.effects.scale = function(o) {
-
-       return this.queue(function() {
-
-               // Create element
-               var el = $(this);
-
-               // Set options
-               var options = $.extend(true, {}, o.options);
-               var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
-               var percent = parseInt(o.options.percent,10) || (parseInt(o.options.percent,10) == 0 ? 0 : (mode == 'hide' ? 0 : 100)); // Set default scaling percent
-               var direction = o.options.direction || 'both'; // Set default axis
-               var origin = o.options.origin; // The origin of the scaling
-               if (mode != 'effect') { // Set default origin and restore for show/hide
-                       options.origin = origin || ['middle','center'];
-                       options.restore = true;
-               }
-               var original = {height: el.height(), width: el.width()}; // Save original
-               el.from = o.options.from || (mode == 'show' ? {height: 0, width: 0} : original); // Default from state
-
-               // Adjust
-               var factor = { // Set scaling factor
-                       y: direction != 'horizontal' ? (percent / 100) : 1,
-                       x: direction != 'vertical' ? (percent / 100) : 1
-               };
-               el.to = {height: original.height * factor.y, width: original.width * factor.x}; // Set to state
-
-               if (o.options.fade) { // Fade option to support puff
-                       if (mode == 'show') {el.from.opacity = 0; el.to.opacity = 1;};
-                       if (mode == 'hide') {el.from.opacity = 1; el.to.opacity = 0;};
-               };
-
-               // Animation
-               options.from = el.from; options.to = el.to; options.mode = mode;
-
-               // Animate
-               el.effect('size', options, o.duration, o.callback);
-               el.dequeue();
-       });
-
-};
-
-$.effects.size = function(o) {
-
-       return this.queue(function() {
-
-               // Create element
-               var el = $(this), props = ['position','top','bottom','left','right','width','height','overflow','opacity'];
-               var props1 = ['position','top','bottom','left','right','overflow','opacity']; // Always restore
-               var props2 = ['width','height','overflow']; // Copy for children
-               var cProps = ['fontSize'];
-               var vProps = ['borderTopWidth', 'borderBottomWidth', 'paddingTop', 'paddingBottom'];
-               var hProps = ['borderLeftWidth', 'borderRightWidth', 'paddingLeft', 'paddingRight'];
-
-               // Set options
-               var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
-               var restore = o.options.restore || false; // Default restore
-               var scale = o.options.scale || 'both'; // Default scale mode
-               var origin = o.options.origin; // The origin of the sizing
-               var original = {height: el.height(), width: el.width()}; // Save original
-               el.from = o.options.from || original; // Default from state
-               el.to = o.options.to || original; // Default to state
-               // Adjust
-               if (origin) { // Calculate baseline shifts
-                       var baseline = $.effects.getBaseline(origin, original);
-                       el.from.top = (original.height - el.from.height) * baseline.y;
-                       el.from.left = (original.width - el.from.width) * baseline.x;
-                       el.to.top = (original.height - el.to.height) * baseline.y;
-                       el.to.left = (original.width - el.to.width) * baseline.x;
-               };
-               var factor = { // Set scaling factor
-                       from: {y: el.from.height / original.height, x: el.from.width / original.width},
-                       to: {y: el.to.height / original.height, x: el.to.width / original.width}
-               };
-               if (scale == 'box' || scale == 'both') { // Scale the css box
-                       if (factor.from.y != factor.to.y) { // Vertical props scaling
-                               props = props.concat(vProps);
-                               el.from = $.effects.setTransition(el, vProps, factor.from.y, el.from);
-                               el.to = $.effects.setTransition(el, vProps, factor.to.y, el.to);
-                       };
-                       if (factor.from.x != factor.to.x) { // Horizontal props scaling
-                               props = props.concat(hProps);
-                               el.from = $.effects.setTransition(el, hProps, factor.from.x, el.from);
-                               el.to = $.effects.setTransition(el, hProps, factor.to.x, el.to);
-                       };
-               };
-               if (scale == 'content' || scale == 'both') { // Scale the content
-                       if (factor.from.y != factor.to.y) { // Vertical props scaling
-                               props = props.concat(cProps);
-                               el.from = $.effects.setTransition(el, cProps, factor.from.y, el.from);
-                               el.to = $.effects.setTransition(el, cProps, factor.to.y, el.to);
-                       };
-               };
-               $.effects.save(el, restore ? props : props1); el.show(); // Save & Show
-               $.effects.createWrapper(el); // Create Wrapper
-               el.css('overflow','hidden').css(el.from); // Shift
-
-               // Animate
-               if (scale == 'content' || scale == 'both') { // Scale the children
-                       vProps = vProps.concat(['marginTop','marginBottom']).concat(cProps); // Add margins/font-size
-                       hProps = hProps.concat(['marginLeft','marginRight']); // Add margins
-                       props2 = props.concat(vProps).concat(hProps); // Concat
-                       el.find("*[width]").each(function(){
-                               var child = $(this);
-                               if (restore) $.effects.save(child, props2);
-                               var c_original = {height: child.height(), width: child.width()}; // Save original
-                               child.from = {height: c_original.height * factor.from.y, width: c_original.width * factor.from.x};
-                               child.to = {height: c_original.height * factor.to.y, width: c_original.width * factor.to.x};
-                               if (factor.from.y != factor.to.y) { // Vertical props scaling
-                                       child.from = $.effects.setTransition(child, vProps, factor.from.y, child.from);
-                                       child.to = $.effects.setTransition(child, vProps, factor.to.y, child.to);
-                               };
-                               if (factor.from.x != factor.to.x) { // Horizontal props scaling
-                                       child.from = $.effects.setTransition(child, hProps, factor.from.x, child.from);
-                                       child.to = $.effects.setTransition(child, hProps, factor.to.x, child.to);
-                               };
-                               child.css(child.from); // Shift children
-                               child.animate(child.to, o.duration, o.options.easing, function(){
-                                       if (restore) $.effects.restore(child, props2); // Restore children
-                               }); // Animate children
-                       });
-               };
-
-               // Animate
-               el.animate(el.to, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
-                       if (el.to.opacity === 0) {
-                               el.css('opacity', el.from.opacity);
-                       }
-                       if(mode == 'hide') el.hide(); // Hide
-                       $.effects.restore(el, restore ? props : props1); $.effects.removeWrapper(el); // Restore
-                       if(o.callback) o.callback.apply(this, arguments); // Callback
-                       el.dequeue();
-               }});
-
-       });
-
-};
-
-})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.shake.js b/resources/lib/jquery.effects/jquery.effects.shake.js
deleted file mode 100644 (file)
index 44b8ea4..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-/*!
- * 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.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Shake
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.shake = function(o) {
-
-       return this.queue(function() {
-
-               // Create element
-               var el = $(this), props = ['position','top','bottom','left','right'];
-
-               // Set options
-               var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
-               var direction = o.options.direction || 'left'; // Default direction
-               var distance = o.options.distance || 20; // Default distance
-               var times = o.options.times || 3; // Default # of times
-               var speed = o.duration || o.options.duration || 140; // Default speed per shake
-
-               // Adjust
-               $.effects.save(el, props); el.show(); // Save & Show
-               $.effects.createWrapper(el); // Create Wrapper
-               var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
-               var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
-
-               // Animation
-               var animation = {}, animation1 = {}, animation2 = {};
-               animation[ref] = (motion == 'pos' ? '-=' : '+=')  + distance;
-               animation1[ref] = (motion == 'pos' ? '+=' : '-=')  + distance * 2;
-               animation2[ref] = (motion == 'pos' ? '-=' : '+=')  + distance * 2;
-
-               // Animate
-               el.animate(animation, speed, o.options.easing);
-               for (var i = 1; i < times; i++) { // Shakes
-                       el.animate(animation1, speed, o.options.easing).animate(animation2, speed, o.options.easing);
-               };
-               el.animate(animation1, speed, o.options.easing).
-               animate(animation, speed / 2, o.options.easing, function(){ // Last shake
-                       $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
-                       if(o.callback) o.callback.apply(this, arguments); // Callback
-               });
-               el.queue('fx', function() { el.dequeue(); });
-               el.dequeue();
-       });
-
-};
-
-})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.slide.js b/resources/lib/jquery.effects/jquery.effects.slide.js
deleted file mode 100644 (file)
index 502e6c9..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/*!
- * 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.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Slide
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.slide = function(o) {
-
-       return this.queue(function() {
-
-               // Create element
-               var el = $(this), props = ['position','top','bottom','left','right'];
-
-               // Set options
-               var mode = $.effects.setMode(el, o.options.mode || 'show'); // Set Mode
-               var direction = o.options.direction || 'left'; // Default Direction
-
-               // Adjust
-               $.effects.save(el, props); el.show(); // Save & Show
-               $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
-               var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
-               var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
-               var distance = o.options.distance || (ref == 'top' ? el.outerHeight( true ) : el.outerWidth( true ));
-               if (mode == 'show') el.css(ref, motion == 'pos' ? (isNaN(distance) ? "-" + distance : -distance) : distance); // Shift
-
-               // Animation
-               var animation = {};
-               animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;
-
-               // Animate
-               el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
-                       if(mode == 'hide') el.hide(); // Hide
-                       $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
-                       if(o.callback) o.callback.apply(this, arguments); // Callback
-                       el.dequeue();
-               }});
-
-       });
-
-};
-
-})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.transfer.js b/resources/lib/jquery.effects/jquery.effects.transfer.js
deleted file mode 100644 (file)
index 4ee4ae8..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*!
- * 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.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Transfer
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.transfer = function(o) {
-       return this.queue(function() {
-               var elem = $(this),
-                       target = $(o.options.to),
-                       endPosition = target.offset(),
-                       animation = {
-                               top: endPosition.top,
-                               left: endPosition.left,
-                               height: target.innerHeight(),
-                               width: target.innerWidth()
-                       },
-                       startPosition = elem.offset(),
-                       transfer = $('<div class="ui-effects-transfer"></div>')
-                               .appendTo(document.body)
-                               .addClass(o.options.className)
-                               .css({
-                                       top: startPosition.top,
-                                       left: startPosition.left,
-                                       height: elem.innerHeight(),
-                                       width: elem.innerWidth(),
-                                       position: 'absolute'
-                               })
-                               .animate(animation, o.duration, o.options.easing, function() {
-                                       transfer.remove();
-                                       (o.callback && o.callback.apply(elem[0], arguments));
-                                       elem.dequeue();
-                               });
-       });
-};
-
-})(jQuery);
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ar-DZ.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ar-DZ.js
new file mode 100644 (file)
index 0000000..7b175af
--- /dev/null
@@ -0,0 +1,23 @@
+/* Algerian Arabic Translation for jQuery UI date picker plugin. (can be used for Tunisia)*/
+/* Mohamed Cherif BOUCHELAGHEM -- cherifbouchelaghem@yahoo.fr */
+
+jQuery(function($){
+       $.datepicker.regional['ar-DZ'] = {
+               closeText: 'إغلاق',
+               prevText: '&#x3C;السابق',
+               nextText: 'التالي&#x3E;',
+               currentText: 'اليوم',
+               monthNames: ['جانفي', 'فيفري', 'مارس', 'أفريل', 'ماي', 'جوان',
+               'جويلية', 'أوت', 'سبتمبر','أكتوبر', 'نوفمبر', 'ديسمبر'],
+               monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+               dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+               dayNamesShort: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+               dayNamesMin: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+               weekHeader: 'أسبوع',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 6,
+               isRTL: true,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['ar-DZ']);
+});
index 8a9218d..cef0f08 100644 (file)
@@ -4,8 +4,8 @@
 jQuery(function($){
        $.datepicker.regional['ar'] = {
                closeText: 'إغلاق',
-               prevText: '&#x3c;السابق',
-               nextText: 'التالي&#x3e;',
+               prevText: '&#x3C;السابق',
+               nextText: 'التالي&#x3E;',
                currentText: 'اليوم',
                monthNames: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'مايو', 'حزيران',
                'تموز', 'آب', 'أيلول',       'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['ar']);
-});
\ No newline at end of file
+});
index 57802a4..a133a9e 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($) {
        $.datepicker.regional['az'] = {
                closeText: 'Bağla',
-               prevText: '&#x3c;Geri',
-               nextText: 'İrəli&#x3e;',
+               prevText: '&#x3C;Geri',
+               nextText: 'İrəli&#x3E;',
                currentText: 'Bugün',
                monthNames: ['Yanvar','Fevral','Mart','Aprel','May','İyun',
                'İyul','Avqust','Sentyabr','Oktyabr','Noyabr','Dekabr'],
@@ -20,4 +20,4 @@ jQuery(function($) {
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['az']);
-});
\ No newline at end of file
+});
index c19d20f..86ab885 100644 (file)
@@ -1,24 +1,24 @@
 /* Bulgarian initialisation for the jQuery UI date picker plugin. */
 /* Written by Stoyan Kyosev (http://svest.org). */
 jQuery(function($){
-    $.datepicker.regional['bg'] = {
-        closeText: 'затвори',
-        prevText: '&#x3c;назад',
-        nextText: 'напред&#x3e;',
-               nextBigText: '&#x3e;&#x3e;',
-        currentText: 'днес',
-        monthNames: ['Януари','Февруари','Март','Април','Май','Юни',
-        'Юли','Август','Септември','Октомври','Ноември','Декември'],
-        monthNamesShort: ['Яну','Фев','Мар','Апр','Май','Юни',
-        'Юли','Авг','Сеп','Окт','Нов','Дек'],
-        dayNames: ['Неделя','Понеделник','Вторник','Сряда','Четвъртък','Петък','Събота'],
-        dayNamesShort: ['Нед','Пон','Вто','Сря','Чет','Пет','Съб'],
-        dayNamesMin: ['Не','По','Вт','Ср','Че','Пе','Съ'],
+       $.datepicker.regional['bg'] = {
+               closeText: 'затвори',
+               prevText: '&#x3C;назад',
+               nextText: 'напред&#x3E;',
+               nextBigText: '&#x3E;&#x3E;',
+               currentText: 'днес',
+               monthNames: ['Януари','Февруари','Март','Април','Май','Юни',
+               'Юли','Август','Септември','Октомври','Ноември','Декември'],
+               monthNamesShort: ['Яну','Фев','Мар','Апр','Май','Юни',
+               'Юли','Авг','Сеп','Окт','Нов','Дек'],
+               dayNames: ['Неделя','Понеделник','Вторник','Сряда','Четвъртък','Петък','Събота'],
+               dayNamesShort: ['Нед','Пон','Вто','Сря','Чет','Пет','Съб'],
+               dayNamesMin: ['Не','По','Вт','Ср','Че','Пе','Съ'],
                weekHeader: 'Wk',
-        dateFormat: 'dd.mm.yy',
+               dateFormat: 'dd.mm.yy',
                firstDay: 1,
-        isRTL: false,
+               isRTL: false,
                showMonthAfterYear: false,
                yearSuffix: ''};
-    $.datepicker.setDefaults($.datepicker.regional['bg']);
+       $.datepicker.setDefaults($.datepicker.regional['bg']);
 });
index d4dc8b0..f08870f 100644 (file)
@@ -2,10 +2,10 @@
 /* Written by Kenan Konjo. */
 jQuery(function($){
        $.datepicker.regional['bs'] = {
-               closeText: 'Zatvori', 
-               prevText: '&#x3c;', 
-               nextText: '&#x3e;', 
-               currentText: 'Danas', 
+               closeText: 'Zatvori',
+               prevText: '&#x3C;',
+               nextText: '&#x3E;',
+               currentText: 'Danas',
                monthNames: ['Januar','Februar','Mart','April','Maj','Juni',
                'Juli','August','Septembar','Oktobar','Novembar','Decembar'],
                monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['bs']);
-});
\ No newline at end of file
+});
index b128e69..a10b549 100644 (file)
@@ -1,23 +1,23 @@
-/* Inicialització en català per a l'extenció 'calendar' per jQuery. */
+/* Inicialització en català per a l'extensió 'UI date picker' per jQuery. */
 /* Writers: (joan.leon@gmail.com). */
 jQuery(function($){
        $.datepicker.regional['ca'] = {
-               closeText: 'Tancar',
-               prevText: '&#x3c;Ant',
-               nextText: 'Seg&#x3e;',
+               closeText: 'Tanca',
+               prevText: 'Anterior',
+               nextText: 'Següent',
                currentText: 'Avui',
-               monthNames: ['Gener','Febrer','Mar&ccedil;','Abril','Maig','Juny',
-               'Juliol','Agost','Setembre','Octubre','Novembre','Desembre'],
-               monthNamesShort: ['Gen','Feb','Mar','Abr','Mai','Jun',
-               'Jul','Ago','Set','Oct','Nov','Des'],
-               dayNames: ['Diumenge','Dilluns','Dimarts','Dimecres','Dijous','Divendres','Dissabte'],
-               dayNamesShort: ['Dug','Dln','Dmt','Dmc','Djs','Dvn','Dsb'],
-               dayNamesMin: ['Dg','Dl','Dt','Dc','Dj','Dv','Ds'],
-               weekHeader: 'Sm',
+               monthNames: ['gener','febrer','març','abril','maig','juny',
+               'juliol','agost','setembre','octubre','novembre','desembre'],
+               monthNamesShort: ['gen','feb','març','abr','maig','juny',
+               'jul','ag','set','oct','nov','des'],
+               dayNames: ['diumenge','dilluns','dimarts','dimecres','dijous','divendres','dissabte'],
+               dayNamesShort: ['dg','dl','dt','dc','dj','dv','ds'],
+               dayNamesMin: ['dg','dl','dt','dc','dj','dv','ds'],
+               weekHeader: 'Set',
                dateFormat: 'dd/mm/yy',
                firstDay: 1,
                isRTL: false,
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['ca']);
-});
\ No newline at end of file
+});
index 9805bcd..b96b1a5 100644 (file)
@@ -3,11 +3,11 @@
 jQuery(function($){
        $.datepicker.regional['cs'] = {
                closeText: 'Zavřít',
-               prevText: '&#x3c;Dříve',
-               nextText: 'Později&#x3e;',
+               prevText: '&#x3C;Dříve',
+               nextText: 'Později&#x3E;',
                currentText: 'Nyní',
                monthNames: ['leden','únor','březen','duben','květen','červen',
-        'červenec','srpen','září','říjen','listopad','prosinec'],
+               'červenec','srpen','září','říjen','listopad','prosinec'],
                monthNamesShort: ['led','úno','bře','dub','kvě','čer',
                'čvc','srp','zář','říj','lis','pro'],
                dayNames: ['neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota'],
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-cy-GB.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-cy-GB.js
new file mode 100644 (file)
index 0000000..cf3a38e
--- /dev/null
@@ -0,0 +1,23 @@
+/* Welsh/UK initialisation for the jQuery UI date picker plugin. */
+/* Written by William Griffiths. */
+jQuery(function($){
+       $.datepicker.regional['cy-GB'] = {
+               closeText: 'Done',
+               prevText: 'Prev',
+               nextText: 'Next',
+               currentText: 'Today',
+               monthNames: ['Ionawr','Chwefror','Mawrth','Ebrill','Mai','Mehefin',
+               'Gorffennaf','Awst','Medi','Hydref','Tachwedd','Rhagfyr'],
+               monthNamesShort: ['Ion', 'Chw', 'Maw', 'Ebr', 'Mai', 'Meh',
+               'Gor', 'Aws', 'Med', 'Hyd', 'Tac', 'Rha'],
+               dayNames: ['Dydd Sul', 'Dydd Llun', 'Dydd Mawrth', 'Dydd Mercher', 'Dydd Iau', 'Dydd Gwener', 'Dydd Sadwrn'],
+               dayNamesShort: ['Sul', 'Llu', 'Maw', 'Mer', 'Iau', 'Gwe', 'Sad'],
+               dayNamesMin: ['Su','Ll','Ma','Me','Ia','Gw','Sa'],
+               weekHeader: 'Wy',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['cy-GB']);
+});
index 176044e..7e42948 100644 (file)
@@ -1,23 +1,23 @@
 /* Danish initialisation for the jQuery UI date picker plugin. */
 /* Written by Jan Christensen ( deletestuff@gmail.com). */
 jQuery(function($){
-    $.datepicker.regional['da'] = {
+       $.datepicker.regional['da'] = {
                closeText: 'Luk',
-        prevText: '&#x3c;Forrige',
-               nextText: 'Næste&#x3e;',
+               prevText: '&#x3C;Forrige',
+               nextText: 'Næste&#x3E;',
                currentText: 'Idag',
-        monthNames: ['Januar','Februar','Marts','April','Maj','Juni',
-        'Juli','August','September','Oktober','November','December'],
-        monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
-        'Jul','Aug','Sep','Okt','Nov','Dec'],
+               monthNames: ['Januar','Februar','Marts','April','Maj','Juni',
+               'Juli','August','September','Oktober','November','December'],
+               monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+               'Jul','Aug','Sep','Okt','Nov','Dec'],
                dayNames: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'],
                dayNamesShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'],
                dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'],
                weekHeader: 'Uge',
-        dateFormat: 'dd-mm-yy',
+               dateFormat: 'dd-mm-yy',
                firstDay: 1,
                isRTL: false,
                showMonthAfterYear: false,
                yearSuffix: ''};
-    $.datepicker.setDefaults($.datepicker.regional['da']);
+       $.datepicker.setDefaults($.datepicker.regional['da']);
 });
index f3ef9e8..cfe9175 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['de'] = {
                closeText: 'schließen',
-               prevText: '&#x3c;zurück',
-               nextText: 'Vor&#x3e;',
+               prevText: '&#x3C;zurück',
+               nextText: 'Vor&#x3E;',
                currentText: 'heute',
                monthNames: ['Januar','Februar','März','April','Mai','Juni',
                'Juli','August','September','Oktober','November','Dezember'],
index 6d775f9..1ac4756 100644 (file)
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['el']);
-});
\ No newline at end of file
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-en-AU.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-en-AU.js
new file mode 100644 (file)
index 0000000..c1a1020
--- /dev/null
@@ -0,0 +1,23 @@
+/* English/Australia initialisation for the jQuery UI date picker plugin. */
+/* Based on the en-GB initialisation. */
+jQuery(function($){
+       $.datepicker.regional['en-AU'] = {
+               closeText: 'Done',
+               prevText: 'Prev',
+               nextText: 'Next',
+               currentText: 'Today',
+               monthNames: ['January','February','March','April','May','June',
+               'July','August','September','October','November','December'],
+               monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+               'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+               dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+               dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+               dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
+               weekHeader: 'Wk',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['en-AU']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-en-NZ.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-en-NZ.js
new file mode 100644 (file)
index 0000000..7819df0
--- /dev/null
@@ -0,0 +1,23 @@
+/* English/New Zealand initialisation for the jQuery UI date picker plugin. */
+/* Based on the en-GB initialisation. */
+jQuery(function($){
+       $.datepicker.regional['en-NZ'] = {
+               closeText: 'Done',
+               prevText: 'Prev',
+               nextText: 'Next',
+               currentText: 'Today',
+               monthNames: ['January','February','March','April','May','June',
+               'July','August','September','October','November','December'],
+               monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+               'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+               dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+               dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+               dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
+               weekHeader: 'Wk',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['en-NZ']);
+});
index 6cabc2c..39e44fc 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['eo'] = {
                closeText: 'Fermi',
-               prevText: '&lt;Anta',
-               nextText: 'Sekv&gt;',
+               prevText: '&#x3C;Anta',
+               nextText: 'Sekv&#x3E;',
                currentText: 'Nuna',
                monthNames: ['Januaro','Februaro','Marto','Aprilo','Majo','Junio',
                'Julio','Aŭgusto','Septembro','Oktobro','Novembro','Decembro'],
index a02133d..97a2d6e 100644 (file)
@@ -3,16 +3,16 @@
 jQuery(function($){
        $.datepicker.regional['es'] = {
                closeText: 'Cerrar',
-               prevText: '&#x3c;Ant',
-               nextText: 'Sig&#x3e;',
+               prevText: '&#x3C;Ant',
+               nextText: 'Sig&#x3E;',
                currentText: 'Hoy',
                monthNames: ['Enero','Febrero','Marzo','Abril','Mayo','Junio',
                'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'],
                monthNamesShort: ['Ene','Feb','Mar','Abr','May','Jun',
                'Jul','Ago','Sep','Oct','Nov','Dic'],
-               dayNames: ['Domingo','Lunes','Martes','Mi&eacute;rcoles','Jueves','Viernes','S&aacute;bado'],
-               dayNamesShort: ['Dom','Lun','Mar','Mi&eacute;','Juv','Vie','S&aacute;b'],
-               dayNamesMin: ['Do','Lu','Ma','Mi','Ju','Vi','S&aacute;'],
+               dayNames: ['Domingo','Lunes','Martes','Miércoles','Jueves','Viernes','Sábado'],
+               dayNamesShort: ['Dom','Lun','Mar','Mié','Juv','Vie','Sáb'],
+               dayNamesMin: ['Do','Lu','Ma','Mi','Ju','Vi','Sá'],
                weekHeader: 'Sm',
                dateFormat: 'dd/mm/yy',
                firstDay: 1,
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['es']);
-});
\ No newline at end of file
+});
index 32702b2..62cbea8 100644 (file)
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['et']);
-}); 
\ No newline at end of file
+});
index ff66e49..a71db2c 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['eu'] = {
                closeText: 'Egina',
-               prevText: '&#x3c;Aur',
-               nextText: 'Hur&#x3e;',
+               prevText: '&#x3C;Aur',
+               nextText: 'Hur&#x3E;',
                currentText: 'Gaur',
                monthNames: ['urtarrila','otsaila','martxoa','apirila','maiatza','ekaina',
                        'uztaila','abuztua','iraila','urria','azaroa','abendua'],
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['eu']);
-});
\ No newline at end of file
+});
index be8acd2..bb957f6 100644 (file)
@@ -37,7 +37,7 @@ jQuery(function($) {
                        'س',
                        'چ',
                        'پ',
-                       'ج', 
+                       'ج',
                        'ش'
                ],
                dayNamesMin: [
@@ -46,7 +46,7 @@ jQuery(function($) {
                        'س',
                        'چ',
                        'پ',
-                       'ج', 
+                       'ج',
                        'ش'
                ],
                weekHeader: 'هف',
@@ -56,4 +56,4 @@ jQuery(function($) {
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['fa']);
-});
\ No newline at end of file
+});
index 4c5adda..bd6d994 100644 (file)
@@ -5,11 +5,11 @@ jQuery(function($){
                closeText: 'Sulje',
                prevText: '&#xAB;Edellinen',
                nextText: 'Seuraava&#xBB;',
-               currentText: 'T&#xE4;n&#xE4;&#xE4;n',
-               monthNames: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kes&#xE4;kuu',
-               'Hein&#xE4;kuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'],
-               monthNamesShort: ['Tammi','Helmi','Maalis','Huhti','Touko','Kes&#xE4;',
-               'Hein&#xE4;','Elo','Syys','Loka','Marras','Joulu'],
+               currentText: 'Tänään',
+               monthNames: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kesäkuu',
+               'Heinäkuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'],
+               monthNamesShort: ['Tammi','Helmi','Maalis','Huhti','Touko','Kesä',
+               'Heinä','Elo','Syys','Loka','Marras','Joulu'],
                dayNamesShort: ['Su','Ma','Ti','Ke','To','Pe','La'],
                dayNames: ['Sunnuntai','Maanantai','Tiistai','Keskiviikko','Torstai','Perjantai','Lauantai'],
                dayNamesMin: ['Su','Ma','Ti','Ke','To','Pe','La'],
index 8a6cb99..cb0e3de 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['fo'] = {
                closeText: 'Lat aftur',
-               prevText: '&#x3c;Fyrra',
-               nextText: 'Næsta&#x3e;',
+               prevText: '&#x3C;Fyrra',
+               nextText: 'Næsta&#x3E;',
                currentText: 'Í dag',
                monthNames: ['Januar','Februar','Mars','Apríl','Mei','Juni',
                'Juli','August','September','Oktober','November','Desember'],
@@ -15,7 +15,7 @@ jQuery(function($){
                dayNamesMin: ['Su','Má','Tý','Mi','Hó','Fr','Le'],
                weekHeader: 'Vk',
                dateFormat: 'dd-mm-yy',
-               firstDay: 0,
+               firstDay: 1,
                isRTL: false,
                showMonthAfterYear: false,
                yearSuffix: ''};
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fr-CH.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fr-CH.js
new file mode 100644 (file)
index 0000000..e574537
--- /dev/null
@@ -0,0 +1,23 @@
+/* Swiss-French initialisation for the jQuery UI date picker plugin. */
+/* Written Martin Voelkle (martin.voelkle@e-tc.ch). */
+jQuery(function($){
+       $.datepicker.regional['fr-CH'] = {
+               closeText: 'Fermer',
+               prevText: '&#x3C;Préc',
+               nextText: 'Suiv&#x3E;',
+               currentText: 'Courant',
+               monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin',
+               'Juillet','Août','Septembre','Octobre','Novembre','Décembre'],
+               monthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Jun',
+               'Jul','Aoû','Sep','Oct','Nov','Déc'],
+               dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],
+               dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'],
+               dayNamesMin: ['Di','Lu','Ma','Me','Je','Ve','Sa'],
+               weekHeader: 'Sm',
+               dateFormat: 'dd.mm.yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['fr-CH']);
+});
index 7e79363..934afd1 100644 (file)
@@ -1,7 +1,7 @@
 /* French initialisation for the jQuery UI date picker plugin. */
 /* Written by Keith Wood (kbwood{at}iinet.com.au),
-              Stéphane Nahmani (sholby@sholby.net),
-              Stéphane Raimbault <stephane.raimbault@gmail.com> */
+                         Stéphane Nahmani (sholby@sholby.net),
+                         Stéphane Raimbault <stephane.raimbault@gmail.com> */
 jQuery(function($){
        $.datepicker.regional['fr'] = {
                closeText: 'Fermer',
index 278403e..59b989a 100644 (file)
@@ -3,16 +3,16 @@
 jQuery(function($){
        $.datepicker.regional['gl'] = {
                closeText: 'Pechar',
-               prevText: '&#x3c;Ant',
-               nextText: 'Seg&#x3e;',
+               prevText: '&#x3C;Ant',
+               nextText: 'Seg&#x3E;',
                currentText: 'Hoxe',
                monthNames: ['Xaneiro','Febreiro','Marzo','Abril','Maio','Xuño',
                'Xullo','Agosto','Setembro','Outubro','Novembro','Decembro'],
                monthNamesShort: ['Xan','Feb','Mar','Abr','Mai','Xuñ',
                'Xul','Ago','Set','Out','Nov','Dec'],
-               dayNames: ['Domingo','Luns','Martes','M&eacute;rcores','Xoves','Venres','S&aacute;bado'],
-               dayNamesShort: ['Dom','Lun','Mar','M&eacute;r','Xov','Ven','S&aacute;b'],
-               dayNamesMin: ['Do','Lu','Ma','M&eacute;','Xo','Ve','S&aacute;'],
+               dayNames: ['Domingo','Luns','Martes','Mércores','Xoves','Venres','Sábado'],
+               dayNamesShort: ['Dom','Lun','Mar','Mér','Xov','Ven','Sáb'],
+               dayNamesMin: ['Do','Lu','Ma','Mé','Xo','Ve','Sá'],
                weekHeader: 'Sm',
                dateFormat: 'dd/mm/yy',
                firstDay: 1,
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['gl']);
-});
\ No newline at end of file
+});
index 135cdec..b9e8dee 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['he'] = {
                closeText: 'סגור',
-               prevText: '&#x3c;הקודם',
-               nextText: 'הבא&#x3e;',
+               prevText: '&#x3C;הקודם',
+               nextText: 'הבא&#x3E;',
                currentText: 'היום',
                monthNames: ['ינואר','פברואר','מרץ','אפריל','מאי','יוני',
                'יולי','אוגוסט','ספטמבר','אוקטובר','נובמבר','דצמבר'],
index 1eb3dd9..2fe37b6 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['hr'] = {
                closeText: 'Zatvori',
-               prevText: '&#x3c;',
-               nextText: '&#x3e;',
+               prevText: '&#x3C;',
+               nextText: '&#x3E;',
                currentText: 'Danas',
                monthNames: ['Siječanj','Veljača','Ožujak','Travanj','Svibanj','Lipanj',
                'Srpanj','Kolovoz','Rujan','Listopad','Studeni','Prosinac'],
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['hr']);
-});
\ No newline at end of file
+});
index c6cc194..6d4eca5 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['hy'] = {
                closeText: 'Փակել',
-               prevText: '&#x3c;Նախ.',
-               nextText: 'Հաջ.&#x3e;',
+               prevText: '&#x3C;Նախ.',
+               nextText: 'Հաջ.&#x3E;',
                currentText: 'Այսօր',
                monthNames: ['Հունվար','Փետրվար','Մարտ','Ապրիլ','Մայիս','Հունիս',
                'Հուլիս','Օգոստոս','Սեպտեմբեր','Հոկտեմբեր','Նոյեմբեր','Դեկտեմբեր'],
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['hy']);
-});
\ No newline at end of file
+});
index c626fbb..6327fa6 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['id'] = {
                closeText: 'Tutup',
-               prevText: '&#x3c;mundur',
-               nextText: 'maju&#x3e;',
+               prevText: '&#x3C;mundur',
+               nextText: 'maju&#x3E;',
                currentText: 'hari ini',
                monthNames: ['Januari','Februari','Maret','April','Mei','Juni',
                'Juli','Agustus','September','Oktober','Nopember','Desember'],
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['id']);
-});
\ No newline at end of file
+});
index c53235a..925341a 100644 (file)
@@ -3,16 +3,16 @@
 jQuery(function($){
        $.datepicker.regional['is'] = {
                closeText: 'Loka',
-               prevText: '&#x3c; Fyrri',
-               nextText: 'N&aelig;sti &#x3e;',
-               currentText: '&Iacute; dag',
-               monthNames: ['Jan&uacute;ar','Febr&uacute;ar','Mars','Apr&iacute;l','Ma&iacute','J&uacute;n&iacute;',
-               'J&uacute;l&iacute;','&Aacute;g&uacute;st','September','Okt&oacute;ber','N&oacute;vember','Desember'],
-               monthNamesShort: ['Jan','Feb','Mar','Apr','Ma&iacute;','J&uacute;n',
-               'J&uacute;l','&Aacute;g&uacute;','Sep','Okt','N&oacute;v','Des'],
-               dayNames: ['Sunnudagur','M&aacute;nudagur','&THORN;ri&eth;judagur','Mi&eth;vikudagur','Fimmtudagur','F&ouml;studagur','Laugardagur'],
-               dayNamesShort: ['Sun','M&aacute;n','&THORN;ri','Mi&eth;','Fim','F&ouml;s','Lau'],
-               dayNamesMin: ['Su','M&aacute;','&THORN;r','Mi','Fi','F&ouml;','La'],
+               prevText: '&#x3C; Fyrri',
+               nextText: 'Næsti &#x3E;',
+               currentText: 'Í dag',
+               monthNames: ['Janúar','Febrúar','Mars','Apríl','Maí','Júní',
+               'Júlí','Ágúst','September','Október','Nóvember','Desember'],
+               monthNamesShort: ['Jan','Feb','Mar','Apr','Maí','Jún',
+               'Júl','Ágú','Sep','Okt','Nóv','Des'],
+               dayNames: ['Sunnudagur','Mánudagur','Þriðjudagur','Miðvikudagur','Fimmtudagur','Föstudagur','Laugardagur'],
+               dayNamesShort: ['Sun','Mán','Þri','Mið','Fim','Fös','Lau'],
+               dayNamesMin: ['Su','Má','Þr','Mi','Fi','Fö','La'],
                weekHeader: 'Vika',
                dateFormat: 'dd/mm/yy',
                firstDay: 0,
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['is']);
-});
\ No newline at end of file
+});
index 59da2df..a01f043 100644 (file)
@@ -3,14 +3,14 @@
 jQuery(function($){
        $.datepicker.regional['it'] = {
                closeText: 'Chiudi',
-               prevText: '&#x3c;Prec',
-               nextText: 'Succ&#x3e;',
+               prevText: '&#x3C;Prec',
+               nextText: 'Succ&#x3E;',
                currentText: 'Oggi',
                monthNames: ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno',
                        'Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'],
                monthNamesShort: ['Gen','Feb','Mar','Apr','Mag','Giu',
                        'Lug','Ago','Set','Ott','Nov','Dic'],
-               dayNames: ['Domenica','Luned&#236','Marted&#236','Mercoled&#236','Gioved&#236','Venerd&#236','Sabato'],
+               dayNames: ['Domenica','Lunedì','Martedì','Mercoledì','Giovedì','Venerdì','Sabato'],
                dayNamesShort: ['Dom','Lun','Mar','Mer','Gio','Ven','Sab'],
                dayNamesMin: ['Do','Lu','Ma','Me','Gi','Ve','Sa'],
                weekHeader: 'Sm',
index 7eb4268..4d0b63c 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['ja'] = {
                closeText: '閉じる',
-               prevText: '&#x3c;前',
-               nextText: '次&#x3e;',
+               prevText: '&#x3C;前',
+               nextText: '次&#x3E;',
                currentText: '今日',
                monthNames: ['1月','2月','3月','4月','5月','6月',
                '7月','8月','9月','10月','11月','12月'],
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: true,
                yearSuffix: '年'};
        $.datepicker.setDefaults($.datepicker.regional['ja']);
-});
\ No newline at end of file
+});
index 79e3f24..dcd6a65 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['kk'] = {
                closeText: 'Жабу',
-               prevText: '&#x3c;Алдыңғы',
-               nextText: 'Келесі&#x3e;',
+               prevText: '&#x3C;Алдыңғы',
+               nextText: 'Келесі&#x3E;',
                currentText: 'Бүгін',
                monthNames: ['Қаңтар','Ақпан','Наурыз','Сәуір','Мамыр','Маусым',
                'Шілде','Тамыз','Қыркүйек','Қазан','Қараша','Желтоқсан'],
index 0411242..af36f3d 100644 (file)
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: true,
                yearSuffix: '년'};
        $.datepicker.setDefaults($.datepicker.regional['ko']);
-});
\ No newline at end of file
+});
index 67d5119..1afaaac 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['lt'] = {
                closeText: 'Uždaryti',
-               prevText: '&#x3c;Atgal',
-               nextText: 'Pirmyn&#x3e;',
+               prevText: '&#x3C;Atgal',
+               nextText: 'Pirmyn&#x3E;',
                currentText: 'Šiandien',
                monthNames: ['Sausis','Vasaris','Kovas','Balandis','Gegužė','Birželis',
                'Liepa','Rugpjūtis','Rugsėjis','Spalis','Lapkritis','Gruodis'],
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['lt']);
-});
\ No newline at end of file
+});
index 003934e..28cc102 100644 (file)
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['lv']);
-});
\ No newline at end of file
+});
index 1e3432c..9b8f460 100644 (file)
@@ -3,7 +3,7 @@
 jQuery(function($){
        $.datepicker.regional['ml'] = {
                closeText: 'ശരി',
-               prevText: 'മുന്നത്തെ',  
+               prevText: 'മുന്നത്തെ',
                nextText: 'അടുത്തത് ',
                currentText: 'ഇന്ന്',
                monthNames: ['ജനുവരി','ഫെബ്രുവരി','മാര്‍ച്ച്','ഏപ്രില്‍','മേയ്','ജൂണ്‍',
index e953ac0..e70de72 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['ms'] = {
                closeText: 'Tutup',
-               prevText: '&#x3c;Sebelum',
-               nextText: 'Selepas&#x3e;',
+               prevText: '&#x3C;Sebelum',
+               nextText: 'Selepas&#x3E;',
                currentText: 'hari ini',
                monthNames: ['Januari','Februari','Mac','April','Mei','Jun',
                'Julai','Ogos','September','Oktober','November','Disember'],
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['ms']);
-});
\ No newline at end of file
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-nl-BE.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-nl-BE.js
new file mode 100644 (file)
index 0000000..7b3cdf4
--- /dev/null
@@ -0,0 +1,23 @@
+/* Dutch (Belgium) initialisation for the jQuery UI date picker plugin. */
+/* David De Sloovere @DavidDeSloovere */
+jQuery(function($){
+       $.datepicker.regional['nl-BE'] = {
+               closeText: 'Sluiten',
+               prevText: '←',
+               nextText: '→',
+               currentText: 'Vandaag',
+               monthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni',
+               'juli', 'augustus', 'september', 'oktober', 'november', 'december'],
+               monthNamesShort: ['jan', 'feb', 'mrt', 'apr', 'mei', 'jun',
+               'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],
+               dayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],
+               dayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'],
+               dayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
+               weekHeader: 'Wk',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['nl-BE']);
+});
index 781fe61..203f160 100644 (file)
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional.nl);
-});
\ No newline at end of file
+});
index 2507043..d36e430 100644 (file)
@@ -2,22 +2,22 @@
 /* Written by Naimdjon Takhirov (naimdjon@gmail.com). */
 
 jQuery(function($){
-  $.datepicker.regional['no'] = {
-    closeText: 'Lukk',
-    prevText: '&laquo;Forrige',
-    nextText: 'Neste&raquo;',
-    currentText: 'I dag',
-    monthNames: ['januar','februar','mars','april','mai','juni','juli','august','september','oktober','november','desember'],
-    monthNamesShort: ['jan','feb','mar','apr','mai','jun','jul','aug','sep','okt','nov','des'],
-    dayNamesShort: ['søn','man','tir','ons','tor','fre','lør'],
-    dayNames: ['søndag','mandag','tirsdag','onsdag','torsdag','fredag','lørdag'],
-    dayNamesMin: ['sø','ma','ti','on','to','fr','lø'],
-    weekHeader: 'Uke',
-    dateFormat: 'dd.mm.yy',
-    firstDay: 1,
-    isRTL: false,
-    showMonthAfterYear: false,
-    yearSuffix: ''
-  };
-  $.datepicker.setDefaults($.datepicker.regional['no']);
+       $.datepicker.regional['no'] = {
+               closeText: 'Lukk',
+               prevText: '&#xAB;Forrige',
+               nextText: 'Neste&#xBB;',
+               currentText: 'I dag',
+               monthNames: ['januar','februar','mars','april','mai','juni','juli','august','september','oktober','november','desember'],
+               monthNamesShort: ['jan','feb','mar','apr','mai','jun','jul','aug','sep','okt','nov','des'],
+               dayNamesShort: ['søn','man','tir','ons','tor','fre','lør'],
+               dayNames: ['søndag','mandag','tirsdag','onsdag','torsdag','fredag','lørdag'],
+               dayNamesMin: ['sø','ma','ti','on','to','fr','lø'],
+               weekHeader: 'Uke',
+               dateFormat: 'dd.mm.yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''
+       };
+       $.datepicker.setDefaults($.datepicker.regional['no']);
 });
index 61fa29c..0ffc515 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['pl'] = {
                closeText: 'Zamknij',
-               prevText: '&#x3c;Poprzedni',
-               nextText: 'Następny&#x3e;',
+               prevText: '&#x3C;Poprzedni',
+               nextText: 'Następny&#x3E;',
                currentText: 'Dziś',
                monthNames: ['Styczeń','Luty','Marzec','Kwiecień','Maj','Czerwiec',
                'Lipiec','Sierpień','Wrzesień','Październik','Listopad','Grudzień'],
index 3cc8c79..521967e 100644 (file)
@@ -3,16 +3,16 @@
 jQuery(function($){
        $.datepicker.regional['pt-BR'] = {
                closeText: 'Fechar',
-               prevText: '&#x3c;Anterior',
-               nextText: 'Pr&oacute;ximo&#x3e;',
+               prevText: '&#x3C;Anterior',
+               nextText: 'Próximo&#x3E;',
                currentText: 'Hoje',
-               monthNames: ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho',
+               monthNames: ['Janeiro','Fevereiro','Março','Abril','Maio','Junho',
                'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
                monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
                'Jul','Ago','Set','Out','Nov','Dez'],
-               dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','S&aacute;bado'],
-               dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
-               dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+               dayNames: ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'],
+               dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
+               dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
                weekHeader: 'Sm',
                dateFormat: 'dd/mm/yy',
                firstDay: 0,
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['pt-BR']);
-});
\ No newline at end of file
+});
index f09f5ae..999f20e 100644 (file)
@@ -2,16 +2,16 @@
 jQuery(function($){
        $.datepicker.regional['pt'] = {
                closeText: 'Fechar',
-               prevText: '&#x3c;Anterior',
+               prevText: '&#x3C;Anterior',
                nextText: 'Seguinte',
                currentText: 'Hoje',
-               monthNames: ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho',
+               monthNames: ['Janeiro','Fevereiro','Março','Abril','Maio','Junho',
                'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
                monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
                'Jul','Ago','Set','Out','Nov','Dez'],
-               dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','S&aacute;bado'],
-               dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
-               dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+               dayNames: ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'],
+               dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
+               dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
                weekHeader: 'Sem',
                dateFormat: 'dd/mm/yy',
                firstDay: 0,
@@ -19,4 +19,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['pt']);
-});
\ No newline at end of file
+});
index cf03cd4..22ed216 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['rm'] = {
                closeText: 'Serrar',
-               prevText: '&#x3c;Suandant',
-               nextText: 'Precedent&#x3e;',
+               prevText: '&#x3C;Suandant',
+               nextText: 'Precedent&#x3E;',
                currentText: 'Actual',
                monthNames: ['Schaner','Favrer','Mars','Avrigl','Matg','Zercladur', 'Fanadur','Avust','Settember','October','November','December'],
                monthNamesShort: ['Scha','Fev','Mar','Avr','Matg','Zer', 'Fan','Avu','Sett','Oct','Nov','Dec'],
index 6b140af..a988270 100644 (file)
@@ -6,8 +6,8 @@
 jQuery(function($){
        $.datepicker.regional['ro'] = {
                closeText: 'Închide',
-               prevText: '&laquo; Luna precedentă',
-               nextText: 'Luna următoare &raquo;',
+               prevText: '&#xAB; Luna precedentă',
+               nextText: 'Luna următoare &#xBB;',
                currentText: 'Azi',
                monthNames: ['Ianuarie','Februarie','Martie','Aprilie','Mai','Iunie',
                'Iulie','August','Septembrie','Octombrie','Noiembrie','Decembrie'],
index 50a4613..a519714 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['ru'] = {
                closeText: 'Закрыть',
-               prevText: '&#x3c;Пред',
-               nextText: 'След&#x3e;',
+               prevText: '&#x3C;Пред',
+               nextText: 'След&#x3E;',
                currentText: 'Сегодня',
                monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь',
                'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['ru']);
-});
\ No newline at end of file
+});
index 078d1b0..83ae8e8 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['sk'] = {
                closeText: 'Zavrieť',
-               prevText: '&#x3c;Predchádzajúci',
-               nextText: 'Nasledujúci&#x3e;',
+               prevText: '&#x3C;Predchádzajúci',
+               nextText: 'Nasledujúci&#x3E;',
                currentText: 'Dnes',
                monthNames: ['Január','Február','Marec','Apríl','Máj','Jún',
                'Júl','August','September','Október','November','December'],
index 5165501..048a47a 100644 (file)
@@ -1,19 +1,19 @@
 /* Slovenian initialisation for the jQuery UI date picker plugin. */
 /* Written by Jaka Jancar (jaka@kubje.org). */
-/* c = &#x10D;, s = &#x161; z = &#x17E; C = &#x10C; S = &#x160; Z = &#x17D; */
+/* c = č, s = š z = ž C = Č S = Š Z = Ž */
 jQuery(function($){
        $.datepicker.regional['sl'] = {
                closeText: 'Zapri',
-               prevText: '&lt;Prej&#x161;nji',
-               nextText: 'Naslednji&gt;',
+               prevText: '&#x3C;Prejšnji',
+               nextText: 'Naslednji&#x3E;',
                currentText: 'Trenutni',
                monthNames: ['Januar','Februar','Marec','April','Maj','Junij',
                'Julij','Avgust','September','Oktober','November','December'],
                monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
                'Jul','Avg','Sep','Okt','Nov','Dec'],
-               dayNames: ['Nedelja','Ponedeljek','Torek','Sreda','&#x10C;etrtek','Petek','Sobota'],
-               dayNamesShort: ['Ned','Pon','Tor','Sre','&#x10C;et','Pet','Sob'],
-               dayNamesMin: ['Ne','Po','To','Sr','&#x10C;e','Pe','So'],
+               dayNames: ['Nedelja','Ponedeljek','Torek','Sreda','Četrtek','Petek','Sobota'],
+               dayNamesShort: ['Ned','Pon','Tor','Sre','Čet','Pet','Sob'],
+               dayNamesMin: ['Ne','Po','To','Sr','Če','Pe','So'],
                weekHeader: 'Teden',
                dateFormat: 'dd.mm.yy',
                firstDay: 1,
index 21974c5..d6086a7 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['sq'] = {
                closeText: 'mbylle',
-               prevText: '&#x3c;mbrapa',
-               nextText: 'Përpara&#x3e;',
+               prevText: '&#x3C;mbrapa',
+               nextText: 'Përpara&#x3E;',
                currentText: 'sot',
                monthNames: ['Janar','Shkurt','Mars','Prill','Maj','Qershor',
                'Korrik','Gusht','Shtator','Tetor','Nëntor','Dhjetor'],
index e7a8683..6d5d042 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['sr-SR'] = {
                closeText: 'Zatvori',
-               prevText: '&#x3c;',
-               nextText: '&#x3e;',
+               prevText: '&#x3C;',
+               nextText: '&#x3E;',
                currentText: 'Danas',
                monthNames: ['Januar','Februar','Mart','April','Maj','Jun',
                'Jul','Avgust','Septembar','Oktobar','Novembar','Decembar'],
index 0bd240e..d4e1d9a 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['sr'] = {
                closeText: 'Затвори',
-               prevText: '&#x3c;',
-               nextText: '&#x3e;',
+               prevText: '&#x3C;',
+               nextText: '&#x3E;',
                currentText: 'Данас',
                monthNames: ['Јануар','Фебруар','Март','Април','Мај','Јун',
                'Јул','Август','Септембар','Октобар','Новембар','Децембар'],
index e5f549f..cbb5ad1 100644 (file)
@@ -1,23 +1,23 @@
 /* Swedish initialisation for the jQuery UI date picker plugin. */
 /* Written by Anders Ekdahl ( anders@nomadiz.se). */
 jQuery(function($){
-    $.datepicker.regional['sv'] = {
+       $.datepicker.regional['sv'] = {
                closeText: 'Stäng',
-        prevText: '&laquo;Förra',
-               nextText: 'Nästa&raquo;',
+               prevText: '&#xAB;Förra',
+               nextText: 'Nästa&#xBB;',
                currentText: 'Idag',
-        monthNames: ['Januari','Februari','Mars','April','Maj','Juni',
-        'Juli','Augusti','September','Oktober','November','December'],
-        monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
-        'Jul','Aug','Sep','Okt','Nov','Dec'],
+               monthNames: ['Januari','Februari','Mars','April','Maj','Juni',
+               'Juli','Augusti','September','Oktober','November','December'],
+               monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+               'Jul','Aug','Sep','Okt','Nov','Dec'],
                dayNamesShort: ['Sön','Mån','Tis','Ons','Tor','Fre','Lör'],
                dayNames: ['Söndag','Måndag','Tisdag','Onsdag','Torsdag','Fredag','Lördag'],
                dayNamesMin: ['Sö','Må','Ti','On','To','Fr','Lö'],
                weekHeader: 'Ve',
-        dateFormat: 'yy-mm-dd',
+               dateFormat: 'yy-mm-dd',
                firstDay: 1,
                isRTL: false,
                showMonthAfterYear: false,
                yearSuffix: ''};
-    $.datepicker.setDefaults($.datepicker.regional['sv']);
+       $.datepicker.setDefaults($.datepicker.regional['sv']);
 });
index 2e5300c..aecfd27 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['th'] = {
                closeText: 'ปิด',
-               prevText: '&laquo;&nbsp;ย้อน',
-               nextText: 'ถัดไป&nbsp;&raquo;',
+               prevText: '&#xAB;&#xA0;ย้อน',
+               nextText: 'ถัดไป&#xA0;&#xBB;',
                currentText: 'วันนี้',
                monthNames: ['มกราคม','กุมภาพันธ์','มีนาคม','เมษายน','พฤษภาคม','มิถุนายน',
                'กรกฎาคม','สิงหาคม','กันยายน','ตุลาคม','พฤศจิกายน','ธันวาคม'],
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['th']);
-});
\ No newline at end of file
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-tj.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-tj.js
new file mode 100644 (file)
index 0000000..9a20e4d
--- /dev/null
@@ -0,0 +1,23 @@
+/* Tajiki (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Abdurahmon Saidov (saidovab@gmail.com). */
+jQuery(function($){
+       $.datepicker.regional['tj'] = {
+               closeText: 'Идома',
+               prevText: '&#x3c;Қафо',
+               nextText: 'Пеш&#x3e;',
+               currentText: 'Имрӯз',
+               monthNames: ['Январ','Феврал','Март','Апрел','Май','Июн',
+               'Июл','Август','Сентябр','Октябр','Ноябр','Декабр'],
+               monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн',
+               'Июл','Авг','Сен','Окт','Ноя','Дек'],
+               dayNames: ['якшанбе','душанбе','сешанбе','чоршанбе','панҷшанбе','ҷумъа','шанбе'],
+               dayNamesShort: ['якш','душ','сеш','чор','пан','ҷум','шан'],
+               dayNamesMin: ['Як','Дш','Сш','Чш','Пш','Ҷм','Шн'],
+               weekHeader: 'Хф',
+               dateFormat: 'dd.mm.yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['tj']);
+});
index dedfc7f..75b583a 100644 (file)
@@ -3,7 +3,7 @@
 jQuery(function($){
        $.datepicker.regional['tr'] = {
                closeText: 'kapat',
-               prevText: '&#x3c;geri',
+               prevText: '&#x3C;geri',
                nextText: 'ileri&#x3e',
                currentText: 'bugün',
                monthNames: ['Ocak','Şubat','Mart','Nisan','Mayıs','Haziran',
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['tr']);
-});
\ No newline at end of file
+});
index 2718f5d..2bdc82f 100644 (file)
@@ -4,8 +4,8 @@
 jQuery(function($){
        $.datepicker.regional['uk'] = {
                closeText: 'Закрити',
-               prevText: '&#x3c;',
-               nextText: '&#x3e;',
+               prevText: '&#x3C;',
+               nextText: '&#x3E;',
                currentText: 'Сьогодні',
                monthNames: ['Січень','Лютий','Березень','Квітень','Травень','Червень',
                'Липень','Серпень','Вересень','Жовтень','Листопад','Грудень'],
@@ -21,4 +21,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['uk']);
-});
\ No newline at end of file
+});
index 1d8f7bb..b49e7eb 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['vi'] = {
                closeText: 'Đóng',
-               prevText: '&#x3c;Trước',
-               nextText: 'Tiếp&#x3e;',
+               prevText: '&#x3C;Trước',
+               nextText: 'Tiếp&#x3E;',
                currentText: 'Hôm nay',
                monthNames: ['Tháng Một', 'Tháng Hai', 'Tháng Ba', 'Tháng Tư', 'Tháng Năm', 'Tháng Sáu',
                'Tháng Bảy', 'Tháng Tám', 'Tháng Chín', 'Tháng Mười', 'Tháng Mười Một', 'Tháng Mười Hai'],
index 83f2825..d337e4a 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['zh-CN'] = {
                closeText: '关闭',
-               prevText: '&#x3c;上月',
-               nextText: '下月&#x3e;',
+               prevText: '&#x3C;上月',
+               nextText: '下月&#x3E;',
                currentText: '今天',
                monthNames: ['一月','二月','三月','四月','五月','六月',
                '七月','八月','九月','十月','十一月','十二月'],
index 11189d3..ef6f4e7 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['zh-HK'] = {
                closeText: '關閉',
-               prevText: '&#x3c;上月',
-               nextText: '下月&#x3e;',
+               prevText: '&#x3C;上月',
+               nextText: '下月&#x3E;',
                currentText: '今天',
                monthNames: ['一月','二月','三月','四月','五月','六月',
                '七月','八月','九月','十月','十一月','十二月'],
index 089498b..b9105ea 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['zh-TW'] = {
                closeText: '關閉',
-               prevText: '&#x3c;上月',
-               nextText: '下月&#x3e;',
+               prevText: '&#x3C;上月',
+               nextText: '下月&#x3E;',
                currentText: '今天',
                monthNames: ['一月','二月','三月','四月','五月','六月',
                '七月','八月','九月','十月','十一月','十二月'],
index dc1ba60..55bbecb 100644 (file)
@@ -1,11 +1,12 @@
 /*!
- * jQuery UI Accordion 1.8.24
+ * jQuery UI Accordion 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Accordion
+ * http://api.jqueryui.com/accordion/
  *
  * Depends:
  *     jquery.ui.core.js
  */
 (function( $, undefined ) {
 
+var uid = 0,
+       hideProps = {},
+       showProps = {};
+
+hideProps.height = hideProps.paddingTop = hideProps.paddingBottom =
+       hideProps.borderTopWidth = hideProps.borderBottomWidth = "hide";
+showProps.height = showProps.paddingTop = showProps.paddingBottom =
+       showProps.borderTopWidth = showProps.borderBottomWidth = "show";
+
 $.widget( "ui.accordion", {
+       version: "1.9.2",
        options: {
                active: 0,
-               animated: "slide",
-               autoHeight: true,
-               clearStyle: false,
+               animate: {},
                collapsible: false,
                event: "click",
-               fillSpace: false,
                header: "> li > :first-child,> :not(li):even",
+               heightStyle: "auto",
                icons: {
-                       header: "ui-icon-triangle-1-e",
-                       headerSelected: "ui-icon-triangle-1-s"
+                       activeHeader: "ui-icon-triangle-1-s",
+                       header: "ui-icon-triangle-1-e"
                },
-               navigation: false,
-               navigationFilter: function() {
-                       return this.href.toLowerCase() === location.href.toLowerCase();
-               }
+
+               // callbacks
+               activate: null,
+               beforeActivate: null
        },
 
        _create: function() {
-               var self = this,
-                       options = self.options;
-
-               self.running = 0;
-
-               self.element
-                       .addClass( "ui-accordion ui-widget ui-helper-reset" )
-                       // in lack of child-selectors in CSS
-                       // we need to mark top-LIs in a UL-accordion for some IE-fix
-                       .children( "li" )
-                               .addClass( "ui-accordion-li-fix" );
-
-               self.headers = self.element.find( options.header )
-                       .addClass( "ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" )
-                       .bind( "mouseenter.accordion", function() {
-                               if ( options.disabled ) {
-                                       return;
-                               }
-                               $( this ).addClass( "ui-state-hover" );
-                       })
-                       .bind( "mouseleave.accordion", function() {
-                               if ( options.disabled ) {
-                                       return;
-                               }
-                               $( this ).removeClass( "ui-state-hover" );
-                       })
-                       .bind( "focus.accordion", function() {
-                               if ( options.disabled ) {
-                                       return;
-                               }
-                               $( this ).addClass( "ui-state-focus" );
-                       })
-                       .bind( "blur.accordion", function() {
-                               if ( options.disabled ) {
-                                       return;
-                               }
-                               $( this ).removeClass( "ui-state-focus" );
-                       });
+               var accordionId = this.accordionId = "ui-accordion-" +
+                               (this.element.attr( "id" ) || ++uid),
+                       options = this.options;
 
-               self.headers.next()
-                       .addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" );
+               this.prevShow = this.prevHide = $();
+               this.element.addClass( "ui-accordion ui-widget ui-helper-reset" );
 
-               if ( options.navigation ) {
-                       var current = self.element.find( "a" ).filter( options.navigationFilter ).eq( 0 );
-                       if ( current.length ) {
-                               var header = current.closest( ".ui-accordion-header" );
-                               if ( header.length ) {
-                                       // anchor within header
-                                       self.active = header;
-                               } else {
-                                       // anchor within content
-                                       self.active = current.closest( ".ui-accordion-content" ).prev();
-                               }
-                       }
+               this.headers = this.element.find( options.header )
+                       .addClass( "ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" );
+               this._hoverable( this.headers );
+               this._focusable( this.headers );
+
+               this.headers.next()
+                       .addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" )
+                       .hide();
+
+               // don't allow collapsible: false and active: false / null
+               if ( !options.collapsible && (options.active === false || options.active == null) ) {
+                       options.active = 0;
+               }
+               // handle negative values
+               if ( options.active < 0 ) {
+                       options.active += this.headers.length;
                }
+               this.active = this._findActive( options.active )
+                       .addClass( "ui-accordion-header-active ui-state-active" )
+                       .toggleClass( "ui-corner-all ui-corner-top" );
+               this.active.next()
+                       .addClass( "ui-accordion-content-active" )
+                       .show();
 
-               self.active = self._findActive( self.active || options.active )
-                       .addClass( "ui-state-default ui-state-active" )
-                       .toggleClass( "ui-corner-all" )
-                       .toggleClass( "ui-corner-top" );
-               self.active.next().addClass( "ui-accordion-content-active" );
+               this._createIcons();
+               this.refresh();
 
-               self._createIcons();
-               self.resize();
-               
                // ARIA
-               self.element.attr( "role", "tablist" );
+               this.element.attr( "role", "tablist" );
 
-               self.headers
+               this.headers
                        .attr( "role", "tab" )
-                       .bind( "keydown.accordion", function( event ) {
-                               return self._keydown( event );
+                       .each(function( i ) {
+                               var header = $( this ),
+                                       headerId = header.attr( "id" ),
+                                       panel = header.next(),
+                                       panelId = panel.attr( "id" );
+                               if ( !headerId ) {
+                                       headerId = accordionId + "-header-" + i;
+                                       header.attr( "id", headerId );
+                               }
+                               if ( !panelId ) {
+                                       panelId = accordionId + "-panel-" + i;
+                                       panel.attr( "id", panelId );
+                               }
+                               header.attr( "aria-controls", panelId );
+                               panel.attr( "aria-labelledby", headerId );
                        })
                        .next()
                                .attr( "role", "tabpanel" );
 
-               self.headers
-                       .not( self.active || "" )
+               this.headers
+                       .not( this.active )
                        .attr({
-                               "aria-expanded": "false",
                                "aria-selected": "false",
                                tabIndex: -1
                        })
                        .next()
+                               .attr({
+                                       "aria-expanded": "false",
+                                       "aria-hidden": "true"
+                               })
                                .hide();
 
                // make sure at least one header is in the tab order
-               if ( !self.active.length ) {
-                       self.headers.eq( 0 ).attr( "tabIndex", 0 );
+               if ( !this.active.length ) {
+                       this.headers.eq( 0 ).attr( "tabIndex", 0 );
                } else {
-                       self.active
+                       this.active.attr({
+                               "aria-selected": "true",
+                               tabIndex: 0
+                       })
+                       .next()
                                .attr({
                                        "aria-expanded": "true",
-                                       "aria-selected": "true",
-                                       tabIndex: 0
+                                       "aria-hidden": "false"
                                });
                }
 
-               // only need links in tab order for Safari
-               if ( !$.browser.safari ) {
-                       self.headers.find( "a" ).attr( "tabIndex", -1 );
-               }
+               this._on( this.headers, { keydown: "_keydown" });
+               this._on( this.headers.next(), { keydown: "_panelKeyDown" });
+               this._setupEvents( options.event );
+       },
 
-               if ( options.event ) {
-                       self.headers.bind( options.event.split(" ").join(".accordion ") + ".accordion", function(event) {
-                               self._clickHandler.call( self, event, this );
-                               event.preventDefault();
-                       });
-               }
+       _getCreateEventData: function() {
+               return {
+                       header: this.active,
+                       content: !this.active.length ? $() : this.active.next()
+               };
        },
 
        _createIcons: function() {
-               var options = this.options;
-               if ( options.icons ) {
-                       $( "<span></span>" )
-                               .addClass( "ui-icon " + options.icons.header )
+               var icons = this.options.icons;
+               if ( icons ) {
+                       $( "<span>" )
+                               .addClass( "ui-accordion-header-icon ui-icon " + icons.header )
                                .prependTo( this.headers );
-                       this.active.children( ".ui-icon" )
-                               .toggleClass(options.icons.header)
-                               .toggleClass(options.icons.headerSelected);
-                       this.element.addClass( "ui-accordion-icons" );
+                       this.active.children( ".ui-accordion-header-icon" )
+                               .removeClass( icons.header )
+                               .addClass( icons.activeHeader );
+                       this.headers.addClass( "ui-accordion-icons" );
                }
        },
 
        _destroyIcons: function() {
-               this.headers.children( ".ui-icon" ).remove();
-               this.element.removeClass( "ui-accordion-icons" );
+               this.headers
+                       .removeClass( "ui-accordion-icons" )
+                       .children( ".ui-accordion-header-icon" )
+                               .remove();
        },
 
-       destroy: function() {
-               var options = this.options;
+       _destroy: function() {
+               var contents;
 
+               // clean up main element
                this.element
                        .removeClass( "ui-accordion ui-widget ui-helper-reset" )
                        .removeAttr( "role" );
 
+               // clean up headers
                this.headers
-                       .unbind( ".accordion" )
-                       .removeClass( "ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top" )
+                       .removeClass( "ui-accordion-header ui-accordion-header-active ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top" )
                        .removeAttr( "role" )
-                       .removeAttr( "aria-expanded" )
                        .removeAttr( "aria-selected" )
-                       .removeAttr( "tabIndex" );
-
-               this.headers.find( "a" ).removeAttr( "tabIndex" );
+                       .removeAttr( "aria-controls" )
+                       .removeAttr( "tabIndex" )
+                       .each(function() {
+                               if ( /^ui-accordion/.test( this.id ) ) {
+                                       this.removeAttribute( "id" );
+                               }
+                       });
                this._destroyIcons();
-               var contents = this.headers.next()
+
+               // clean up content panels
+               contents = this.headers.next()
                        .css( "display", "" )
                        .removeAttr( "role" )
-                       .removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled" );
-               if ( options.autoHeight || options.fillHeight ) {
+                       .removeAttr( "aria-expanded" )
+                       .removeAttr( "aria-hidden" )
+                       .removeAttr( "aria-labelledby" )
+                       .removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled" )
+                       .each(function() {
+                               if ( /^ui-accordion/.test( this.id ) ) {
+                                       this.removeAttribute( "id" );
+                               }
+                       });
+               if ( this.options.heightStyle !== "content" ) {
                        contents.css( "height", "" );
                }
-
-               return $.Widget.prototype.destroy.call( this );
        },
 
        _setOption: function( key, value ) {
-               $.Widget.prototype._setOption.apply( this, arguments );
-                       
-               if ( key == "active" ) {
-                       this.activate( value );
+               if ( key === "active" ) {
+                       // _activate() will handle invalid values and update this.options
+                       this._activate( value );
+                       return;
+               }
+
+               if ( key === "event" ) {
+                       if ( this.options.event ) {
+                               this._off( this.headers, this.options.event );
+                       }
+                       this._setupEvents( value );
+               }
+
+               this._super( key, value );
+
+               // setting collapsible: false while collapsed; open first panel
+               if ( key === "collapsible" && !value && this.options.active === false ) {
+                       this._activate( 0 );
                }
-               if ( key == "icons" ) {
+
+               if ( key === "icons" ) {
                        this._destroyIcons();
                        if ( value ) {
                                this._createIcons();
                        }
                }
+
                // #5332 - opacity doesn't cascade to positioned elements in IE
                // so we need to add the disabled class to the headers and panels
-               if ( key == "disabled" ) {
-                       this.headers.add(this.headers.next())
-                               [ value ? "addClass" : "removeClass" ](
-                                       "ui-accordion-disabled ui-state-disabled" );
+               if ( key === "disabled" ) {
+                       this.headers.add( this.headers.next() )
+                               .toggleClass( "ui-state-disabled", !!value );
                }
        },
 
        _keydown: function( event ) {
-               if ( this.options.disabled || event.altKey || event.ctrlKey ) {
+               if ( event.altKey || event.ctrlKey ) {
                        return;
                }
 
@@ -233,32 +258,57 @@ $.widget( "ui.accordion", {
                                break;
                        case keyCode.SPACE:
                        case keyCode.ENTER:
-                               this._clickHandler( { target: event.target }, event.target );
-                               event.preventDefault();
+                               this._eventHandler( event );
+                               break;
+                       case keyCode.HOME:
+                               toFocus = this.headers[ 0 ];
+                               break;
+                       case keyCode.END:
+                               toFocus = this.headers[ length - 1 ];
+                               break;
                }
 
                if ( toFocus ) {
                        $( event.target ).attr( "tabIndex", -1 );
                        $( toFocus ).attr( "tabIndex", 0 );
                        toFocus.focus();
-                       return false;
+                       event.preventDefault();
                }
+       },
 
-               return true;
+       _panelKeyDown : function( event ) {
+               if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) {
+                       $( event.currentTarget ).prev().focus();
+               }
        },
 
-       resize: function() {
-               var options = this.options,
-                       maxHeight;
+       refresh: function() {
+               var maxHeight, overflow,
+                       heightStyle = this.options.heightStyle,
+                       parent = this.element.parent();
+
 
-               if ( options.fillSpace ) {
-                       if ( $.browser.msie ) {
-                               var defOverflow = this.element.parent().css( "overflow" );
-                               this.element.parent().css( "overflow", "hidden");
+               if ( heightStyle === "fill" ) {
+                       // IE 6 treats height like minHeight, so we need to turn off overflow
+                       // in order to get a reliable height
+                       // we use the minHeight support test because we assume that only
+                       // browsers that don't support minHeight will treat height as minHeight
+                       if ( !$.support.minHeight ) {
+                               overflow = parent.css( "overflow" );
+                               parent.css( "overflow", "hidden");
                        }
-                       maxHeight = this.element.parent().height();
-                       if ($.browser.msie) {
-                               this.element.parent().css( "overflow", defOverflow );
+                       maxHeight = parent.height();
+                       this.element.siblings( ":visible" ).each(function() {
+                               var elem = $( this ),
+                                       position = elem.css( "position" );
+
+                               if ( position === "absolute" || position === "fixed" ) {
+                                       return;
+                               }
+                               maxHeight -= elem.outerHeight( true );
+                       });
+                       if ( overflow ) {
+                               parent.css( "overflow", overflow );
                        }
 
                        this.headers.each(function() {
@@ -271,341 +321,411 @@ $.widget( "ui.accordion", {
                                                $( this ).innerHeight() + $( this ).height() ) );
                                })
                                .css( "overflow", "auto" );
-               } else if ( options.autoHeight ) {
+               } else if ( heightStyle === "auto" ) {
                        maxHeight = 0;
                        this.headers.next()
                                .each(function() {
-                                       maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
+                                       maxHeight = Math.max( maxHeight, $( this ).css( "height", "" ).height() );
                                })
                                .height( maxHeight );
                }
-
-               return this;
        },
 
-       activate: function( index ) {
-               // TODO this gets called on init, changing the option without an explicit call for that
-               this.options.active = index;
-               // call clickHandler with custom event
+       _activate: function( index ) {
                var active = this._findActive( index )[ 0 ];
-               this._clickHandler( { target: active }, active );
 
-               return this;
+               // trying to activate the already active panel
+               if ( active === this.active[ 0 ] ) {
+                       return;
+               }
+
+               // trying to collapse, simulate a click on the currently active header
+               active = active || this.active[ 0 ];
+
+               this._eventHandler({
+                       target: active,
+                       currentTarget: active,
+                       preventDefault: $.noop
+               });
        },
 
        _findActive: function( selector ) {
-               return selector
-                       ? typeof selector === "number"
-                               ? this.headers.filter( ":eq(" + selector + ")" )
-                               : this.headers.not( this.headers.not( selector ) )
-                       : selector === false
-                               ? $( [] )
-                               : this.headers.filter( ":eq(0)" );
+               return typeof selector === "number" ? this.headers.eq( selector ) : $();
        },
 
-       // TODO isn't event.target enough? why the separate target argument?
-       _clickHandler: function( event, target ) {
-               var options = this.options;
-               if ( options.disabled ) {
-                       return;
-               }
-
-               // called only when using activate(false) to close all parts programmatically
-               if ( !event.target ) {
-                       if ( !options.collapsible ) {
-                               return;
-                       }
-                       this.active
-                               .removeClass( "ui-state-active ui-corner-top" )
-                               .addClass( "ui-state-default ui-corner-all" )
-                               .children( ".ui-icon" )
-                                       .removeClass( options.icons.headerSelected )
-                                       .addClass( options.icons.header );
-                       this.active.next().addClass( "ui-accordion-content-active" );
-                       var toHide = this.active.next(),
-                               data = {
-                                       options: options,
-                                       newHeader: $( [] ),
-                                       oldHeader: options.active,
-                                       newContent: $( [] ),
-                                       oldContent: toHide
-                               },
-                               toShow = ( this.active = $( [] ) );
-                       this._toggle( toShow, toHide, data );
+       _setupEvents: function( event ) {
+               var events = {};
+               if ( !event ) {
                        return;
                }
+               $.each( event.split(" "), function( index, eventName ) {
+                       events[ eventName ] = "_eventHandler";
+               });
+               this._on( this.headers, events );
+       },
 
-               // get the click target
-               var clicked = $( event.currentTarget || target ),
-                       clickedIsActive = clicked[0] === this.active[0];
-
-               // TODO the option is changed, is that correct?
-               // TODO if it is correct, shouldn't that happen after determining that the click is valid?
-               options.active = options.collapsible && clickedIsActive ?
-                       false :
-                       this.headers.index( clicked );
-
-               // if animations are still active, or the active header is the target, ignore click
-               if ( this.running || ( !options.collapsible && clickedIsActive ) ) {
+       _eventHandler: function( event ) {
+               var options = this.options,
+                       active = this.active,
+                       clicked = $( event.currentTarget ),
+                       clickedIsActive = clicked[ 0 ] === active[ 0 ],
+                       collapsing = clickedIsActive && options.collapsible,
+                       toShow = collapsing ? $() : clicked.next(),
+                       toHide = active.next(),
+                       eventData = {
+                               oldHeader: active,
+                               oldPanel: toHide,
+                               newHeader: collapsing ? $() : clicked,
+                               newPanel: toShow
+                       };
+
+               event.preventDefault();
+
+               if (
+                               // click on active header, but not collapsible
+                               ( clickedIsActive && !options.collapsible ) ||
+                               // allow canceling activation
+                               ( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
                        return;
                }
 
-               // find elements to show and hide
-               var active = this.active,
-                       toShow = clicked.next(),
-                       toHide = this.active.next(),
-                       data = {
-                               options: options,
-                               newHeader: clickedIsActive && options.collapsible ? $([]) : clicked,
-                               oldHeader: this.active,
-                               newContent: clickedIsActive && options.collapsible ? $([]) : toShow,
-                               oldContent: toHide
-                       },
-                       down = this.headers.index( this.active[0] ) > this.headers.index( clicked[0] );
+               options.active = collapsing ? false : this.headers.index( clicked );
 
                // when the call to ._toggle() comes after the class changes
                // it causes a very odd bug in IE 8 (see #6720)
-               this.active = clickedIsActive ? $([]) : clicked;
-               this._toggle( toShow, toHide, data, clickedIsActive, down );
+               this.active = clickedIsActive ? $() : clicked;
+               this._toggle( eventData );
 
                // switch classes
-               active
-                       .removeClass( "ui-state-active ui-corner-top" )
-                       .addClass( "ui-state-default ui-corner-all" )
-                       .children( ".ui-icon" )
-                               .removeClass( options.icons.headerSelected )
+               // corner classes on the previously active header stay after the animation
+               active.removeClass( "ui-accordion-header-active ui-state-active" );
+               if ( options.icons ) {
+                       active.children( ".ui-accordion-header-icon" )
+                               .removeClass( options.icons.activeHeader )
                                .addClass( options.icons.header );
+               }
+
                if ( !clickedIsActive ) {
                        clicked
-                               .removeClass( "ui-state-default ui-corner-all" )
-                               .addClass( "ui-state-active ui-corner-top" )
-                               .children( ".ui-icon" )
+                               .removeClass( "ui-corner-all" )
+                               .addClass( "ui-accordion-header-active ui-state-active ui-corner-top" );
+                       if ( options.icons ) {
+                               clicked.children( ".ui-accordion-header-icon" )
                                        .removeClass( options.icons.header )
-                                       .addClass( options.icons.headerSelected );
+                                       .addClass( options.icons.activeHeader );
+                       }
+
                        clicked
                                .next()
                                .addClass( "ui-accordion-content-active" );
                }
+       },
+
+       _toggle: function( data ) {
+               var toShow = data.newPanel,
+                       toHide = this.prevShow.length ? this.prevShow : data.oldPanel;
 
-               return;
+               // handle activating a panel during the animation for another activation
+               this.prevShow.add( this.prevHide ).stop( true, true );
+               this.prevShow = toShow;
+               this.prevHide = toHide;
+
+               if ( this.options.animate ) {
+                       this._animate( toShow, toHide, data );
+               } else {
+                       toHide.hide();
+                       toShow.show();
+                       this._toggleComplete( data );
+               }
+
+               toHide.attr({
+                       "aria-expanded": "false",
+                       "aria-hidden": "true"
+               });
+               toHide.prev().attr( "aria-selected", "false" );
+               // if we're switching panels, remove the old header from the tab order
+               // if we're opening from collapsed state, remove the previous header from the tab order
+               // if we're collapsing, then keep the collapsing header in the tab order
+               if ( toShow.length && toHide.length ) {
+                       toHide.prev().attr( "tabIndex", -1 );
+               } else if ( toShow.length ) {
+                       this.headers.filter(function() {
+                               return $( this ).attr( "tabIndex" ) === 0;
+                       })
+                       .attr( "tabIndex", -1 );
+               }
+
+               toShow
+                       .attr({
+                               "aria-expanded": "true",
+                               "aria-hidden": "false"
+                       })
+                       .prev()
+                               .attr({
+                                       "aria-selected": "true",
+                                       tabIndex: 0
+                               });
        },
 
-       _toggle: function( toShow, toHide, data, clickedIsActive, down ) {
-               var self = this,
-                       options = self.options;
+       _animate: function( toShow, toHide, data ) {
+               var total, easing, duration,
+                       that = this,
+                       adjust = 0,
+                       down = toShow.length &&
+                               ( !toHide.length || ( toShow.index() < toHide.index() ) ),
+                       animate = this.options.animate || {},
+                       options = down && animate.down || animate,
+                       complete = function() {
+                               that._toggleComplete( data );
+                       };
+
+               if ( typeof options === "number" ) {
+                       duration = options;
+               }
+               if ( typeof options === "string" ) {
+                       easing = options;
+               }
+               // fall back from options to animation in case of partial down settings
+               easing = easing || options.easing || animate.easing;
+               duration = duration || options.duration || animate.duration;
 
-               self.toShow = toShow;
-               self.toHide = toHide;
-               self.data = data;
+               if ( !toHide.length ) {
+                       return toShow.animate( showProps, duration, easing, complete );
+               }
+               if ( !toShow.length ) {
+                       return toHide.animate( hideProps, duration, easing, complete );
+               }
 
-               var complete = function() {
-                       if ( !self ) {
-                               return;
+               total = toShow.show().outerHeight();
+               toHide.animate( hideProps, {
+                       duration: duration,
+                       easing: easing,
+                       step: function( now, fx ) {
+                               fx.now = Math.round( now );
                        }
-                       return self._completed.apply( self, arguments );
-               };
+               });
+               toShow
+                       .hide()
+                       .animate( showProps, {
+                               duration: duration,
+                               easing: easing,
+                               complete: complete,
+                               step: function( now, fx ) {
+                                       fx.now = Math.round( now );
+                                       if ( fx.prop !== "height" ) {
+                                               adjust += fx.now;
+                                       } else if ( that.options.heightStyle !== "content" ) {
+                                               fx.now = Math.round( total - toHide.outerHeight() - adjust );
+                                               adjust = 0;
+                                       }
+                               }
+                       });
+       },
 
-               // trigger changestart event
-               self._trigger( "changestart", null, self.data );
-
-               // count elements to animate
-               self.running = toHide.size() === 0 ? toShow.size() : toHide.size();
-
-               if ( options.animated ) {
-                       var animOptions = {};
-
-                       if ( options.collapsible && clickedIsActive ) {
-                               animOptions = {
-                                       toShow: $( [] ),
-                                       toHide: toHide,
-                                       complete: complete,
-                                       down: down,
-                                       autoHeight: options.autoHeight || options.fillSpace
-                               };
-                       } else {
-                               animOptions = {
-                                       toShow: toShow,
-                                       toHide: toHide,
-                                       complete: complete,
-                                       down: down,
-                                       autoHeight: options.autoHeight || options.fillSpace
-                               };
-                       }
+       _toggleComplete: function( data ) {
+               var toHide = data.oldPanel;
 
-                       if ( !options.proxied ) {
-                               options.proxied = options.animated;
-                       }
+               toHide
+                       .removeClass( "ui-accordion-content-active" )
+                       .prev()
+                               .removeClass( "ui-corner-top" )
+                               .addClass( "ui-corner-all" );
 
-                       if ( !options.proxiedDuration ) {
-                               options.proxiedDuration = options.duration;
-                       }
+               // Work around for rendering bug in IE (#5421)
+               if ( toHide.length ) {
+                       toHide.parent()[0].className = toHide.parent()[0].className;
+               }
 
-                       options.animated = $.isFunction( options.proxied ) ?
-                               options.proxied( animOptions ) :
-                               options.proxied;
+               this._trigger( "activate", null, data );
+       }
+});
 
-                       options.duration = $.isFunction( options.proxiedDuration ) ?
-                               options.proxiedDuration( animOptions ) :
-                               options.proxiedDuration;
 
-                       var animations = $.ui.accordion.animations,
-                               duration = options.duration,
-                               easing = options.animated;
 
-                       if ( easing && !animations[ easing ] && !$.easing[ easing ] ) {
-                               easing = "slide";
+// DEPRECATED
+if ( $.uiBackCompat !== false ) {
+       // navigation options
+       (function( $, prototype ) {
+               $.extend( prototype.options, {
+                       navigation: false,
+                       navigationFilter: function() {
+                               return this.href.toLowerCase() === location.href.toLowerCase();
                        }
-                       if ( !animations[ easing ] ) {
-                               animations[ easing ] = function( options ) {
-                                       this.slide( options, {
-                                               easing: easing,
-                                               duration: duration || 700
+               });
+
+               var _create = prototype._create;
+               prototype._create = function() {
+                       if ( this.options.navigation ) {
+                               var that = this,
+                                       headers = this.element.find( this.options.header ),
+                                       content = headers.next(),
+                                       current = headers.add( content )
+                                               .find( "a" )
+                                               .filter( this.options.navigationFilter )
+                                               [ 0 ];
+                               if ( current ) {
+                                       headers.add( content ).each( function( index ) {
+                                               if ( $.contains( this, current ) ) {
+                                                       that.options.active = Math.floor( index / 2 );
+                                                       return false;
+                                               }
                                        });
-                               };
+                               }
                        }
+                       _create.call( this );
+               };
+       }( jQuery, jQuery.ui.accordion.prototype ) );
+
+       // height options
+       (function( $, prototype ) {
+               $.extend( prototype.options, {
+                       heightStyle: null, // remove default so we fall back to old values
+                       autoHeight: true, // use heightStyle: "auto"
+                       clearStyle: false, // use heightStyle: "content"
+                       fillSpace: false // use heightStyle: "fill"
+               });
+
+               var _create = prototype._create,
+                       _setOption = prototype._setOption;
+
+               $.extend( prototype, {
+                       _create: function() {
+                               this.options.heightStyle = this.options.heightStyle ||
+                                       this._mergeHeightStyle();
+
+                               _create.call( this );
+                       },
 
-                       animations[ easing ]( animOptions );
-               } else {
-                       if ( options.collapsible && clickedIsActive ) {
-                               toShow.toggle();
-                       } else {
-                               toHide.hide();
-                               toShow.show();
-                       }
+                       _setOption: function( key ) {
+                               if ( key === "autoHeight" || key === "clearStyle" || key === "fillSpace" ) {
+                                       this.options.heightStyle = this._mergeHeightStyle();
+                               }
+                               _setOption.apply( this, arguments );
+                       },
 
-                       complete( true );
-               }
+                       _mergeHeightStyle: function() {
+                               var options = this.options;
 
-               // TODO assert that the blur and focus triggers are really necessary, remove otherwise
-               toHide.prev()
-                       .attr({
-                               "aria-expanded": "false",
-                               "aria-selected": "false",
-                               tabIndex: -1
-                       })
-                       .blur();
-               toShow.prev()
-                       .attr({
-                               "aria-expanded": "true",
-                               "aria-selected": "true",
-                               tabIndex: 0
-                       })
-                       .focus();
-       },
+                               if ( options.fillSpace ) {
+                                       return "fill";
+                               }
 
-       _completed: function( cancel ) {
-               this.running = cancel ? 0 : --this.running;
-               if ( this.running ) {
-                       return;
-               }
+                               if ( options.clearStyle ) {
+                                       return "content";
+                               }
 
-               if ( this.options.clearStyle ) {
-                       this.toShow.add( this.toHide ).css({
-                               height: "",
-                               overflow: ""
-                       });
-               }
+                               if ( options.autoHeight ) {
+                                       return "auto";
+                               }
+                       }
+               });
+       }( jQuery, jQuery.ui.accordion.prototype ) );
 
-               // other classes are removed before the animation; this one needs to stay until completed
-               this.toHide.removeClass( "ui-accordion-content-active" );
-               // Work around for rendering bug in IE (#5421)
-               if ( this.toHide.length ) {
-                       this.toHide.parent()[0].className = this.toHide.parent()[0].className;
-               }
+       // icon options
+       (function( $, prototype ) {
+               $.extend( prototype.options.icons, {
+                       activeHeader: null, // remove default so we fall back to old values
+                       headerSelected: "ui-icon-triangle-1-s"
+               });
 
-               this._trigger( "change", null, this.data );
-       }
-});
+               var _createIcons = prototype._createIcons;
+               prototype._createIcons = function() {
+                       if ( this.options.icons ) {
+                               this.options.icons.activeHeader = this.options.icons.activeHeader ||
+                                       this.options.icons.headerSelected;
+                       }
+                       _createIcons.call( this );
+               };
+       }( jQuery, jQuery.ui.accordion.prototype ) );
 
-$.extend( $.ui.accordion, {
-       version: "1.8.24",
-       animations: {
-               slide: function( options, additions ) {
-                       options = $.extend({
-                               easing: "swing",
-                               duration: 300
-                       }, options, additions );
-                       if ( !options.toHide.size() ) {
-                               options.toShow.animate({
-                                       height: "show",
-                                       paddingTop: "show",
-                                       paddingBottom: "show"
-                               }, options );
-                               return;
+       // expanded active option, activate method
+       (function( $, prototype ) {
+               prototype.activate = prototype._activate;
+
+               var _findActive = prototype._findActive;
+               prototype._findActive = function( index ) {
+                       if ( index === -1 ) {
+                               index = false;
                        }
-                       if ( !options.toShow.size() ) {
-                               options.toHide.animate({
-                                       height: "hide",
-                                       paddingTop: "hide",
-                                       paddingBottom: "hide"
-                               }, options );
-                               return;
+                       if ( index && typeof index !== "number" ) {
+                               index = this.headers.index( this.headers.filter( index ) );
+                               if ( index === -1 ) {
+                                       index = false;
+                               }
+                       }
+                       return _findActive.call( this, index );
+               };
+       }( jQuery, jQuery.ui.accordion.prototype ) );
+
+       // resize method
+       jQuery.ui.accordion.prototype.resize = jQuery.ui.accordion.prototype.refresh;
+
+       // change events
+       (function( $, prototype ) {
+               $.extend( prototype.options, {
+                       change: null,
+                       changestart: null
+               });
+
+               var _trigger = prototype._trigger;
+               prototype._trigger = function( type, event, data ) {
+                       var ret = _trigger.apply( this, arguments );
+                       if ( !ret ) {
+                               return false;
                        }
-                       var overflow = options.toShow.css( "overflow" ),
-                               percentDone = 0,
-                               showProps = {},
-                               hideProps = {},
-                               fxAttrs = [ "height", "paddingTop", "paddingBottom" ],
-                               originalWidth;
-                       // fix width before calculating height of hidden element
-                       var s = options.toShow;
-                       originalWidth = s[0].style.width;
-                       s.width( s.parent().width()
-                               - parseFloat( s.css( "paddingLeft" ) )
-                               - parseFloat( s.css( "paddingRight" ) )
-                               - ( parseFloat( s.css( "borderLeftWidth" ) ) || 0 )
-                               - ( parseFloat( s.css( "borderRightWidth" ) ) || 0 ) );
-
-                       $.each( fxAttrs, function( i, prop ) {
-                               hideProps[ prop ] = "hide";
-
-                               var parts = ( "" + $.css( options.toShow[0], prop ) ).match( /^([\d+-.]+)(.*)$/ );
-                               showProps[ prop ] = {
-                                       value: parts[ 1 ],
-                                       unit: parts[ 2 ] || "px"
-                               };
-                       });
-                       options.toShow.css({ height: 0, overflow: "hidden" }).show();
-                       options.toHide
-                               .filter( ":hidden" )
-                                       .each( options.complete )
-                               .end()
-                               .filter( ":visible" )
-                               .animate( hideProps, {
-                               step: function( now, settings ) {
-                                       // only calculate the percent when animating height
-                                       // IE gets very inconsistent results when animating elements
-                                       // with small values, which is common for padding
-                                       if ( settings.prop == "height" ) {
-                                               percentDone = ( settings.end - settings.start === 0 ) ? 0 :
-                                                       ( settings.now - settings.start ) / ( settings.end - settings.start );
-                                       }
 
-                                       options.toShow[ 0 ].style[ settings.prop ] =
-                                               ( percentDone * showProps[ settings.prop ].value )
-                                               + showProps[ settings.prop ].unit;
-                               },
-                               duration: options.duration,
-                               easing: options.easing,
-                               complete: function() {
-                                       if ( !options.autoHeight ) {
-                                               options.toShow.css( "height", "" );
-                                       }
-                                       options.toShow.css({
-                                               width: originalWidth,
-                                               overflow: overflow
-                                       });
-                                       options.complete();
+                       if ( type === "beforeActivate" ) {
+                               ret = _trigger.call( this, "changestart", event, {
+                                       oldHeader: data.oldHeader,
+                                       oldContent: data.oldPanel,
+                                       newHeader: data.newHeader,
+                                       newContent: data.newPanel
+                               });
+                       } else if ( type === "activate" ) {
+                               ret = _trigger.call( this, "change", event, {
+                                       oldHeader: data.oldHeader,
+                                       oldContent: data.oldPanel,
+                                       newHeader: data.newHeader,
+                                       newContent: data.newPanel
+                               });
+                       }
+                       return ret;
+               };
+       }( jQuery, jQuery.ui.accordion.prototype ) );
+
+       // animated option
+       // NOTE: this only provides support for "slide", "bounceslide", and easings
+       // not the full $.ui.accordion.animations API
+       (function( $, prototype ) {
+               $.extend( prototype.options, {
+                       animate: null,
+                       animated: "slide"
+               });
+
+               var _create = prototype._create;
+               prototype._create = function() {
+                       var options = this.options;
+                       if ( options.animate === null ) {
+                               if ( !options.animated ) {
+                                       options.animate = false;
+                               } else if ( options.animated === "slide" ) {
+                                       options.animate = 300;
+                               } else if ( options.animated === "bounceslide" ) {
+                                       options.animate = {
+                                               duration: 200,
+                                               down: {
+                                                       easing: "easeOutBounce",
+                                                       duration: 1000
+                                               }
+                                       };
+                               } else {
+                                       options.animate = options.animated;
                                }
-                       });
-               },
-               bounceslide: function( options ) {
-                       this.slide( options, {
-                               easing: options.down ? "easeOutBounce" : "swing",
-                               duration: options.down ? 1000 : 200
-                       });
-               }
-       }
-});
+                       }
+
+                       _create.call( this );
+               };
+       }( jQuery, jQuery.ui.accordion.prototype ) );
+}
 
 })( jQuery );
index 8d69be2..3baed1d 100644 (file)
@@ -1,16 +1,18 @@
 /*!
- * jQuery UI Autocomplete 1.8.24
+ * jQuery UI Autocomplete 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Autocomplete
+ * http://api.jqueryui.com/autocomplete/
  *
  * Depends:
  *     jquery.ui.core.js
  *     jquery.ui.widget.js
  *     jquery.ui.position.js
+ *     jquery.ui.menu.js
  */
 (function( $, undefined ) {
 
@@ -18,6 +20,8 @@
 var requestIndex = 0;
 
 $.widget( "ui.autocomplete", {
+       version: "1.9.2",
+       defaultElement: "<input>",
        options: {
                appendTo: "body",
                autoFocus: false,
@@ -28,241 +32,335 @@ $.widget( "ui.autocomplete", {
                        at: "left bottom",
                        collision: "none"
                },
-               source: null
+               source: null,
+
+               // callbacks
+               change: null,
+               close: null,
+               focus: null,
+               open: null,
+               response: null,
+               search: null,
+               select: null
        },
 
        pending: 0,
 
        _create: function() {
-               var self = this,
-                       doc = this.element[ 0 ].ownerDocument,
-                       suppressKeyPress;
-               this.isMultiLine = this.element.is( "textarea" );
+               // Some browsers only repeat keydown events, not keypress events,
+               // so we use the suppressKeyPress flag to determine if we've already
+               // handled the keydown event. #7269
+               // Unfortunately the code for & in keypress is the same as the up arrow,
+               // so we use the suppressKeyPressRepeat flag to avoid handling keypress
+               // events when we know the keydown event was used to modify the
+               // search term. #7799
+               var suppressKeyPress, suppressKeyPressRepeat, suppressInput;
+
+               this.isMultiLine = this._isMultiLine();
+               this.valueMethod = this.element[ this.element.is( "input,textarea" ) ? "val" : "text" ];
+               this.isNewMenu = true;
 
                this.element
                        .addClass( "ui-autocomplete-input" )
-                       .attr( "autocomplete", "off" )
-                       // TODO verify these actually work as intended
-                       .attr({
-                               role: "textbox",
-                               "aria-autocomplete": "list",
-                               "aria-haspopup": "true"
-                       })
-                       .bind( "keydown.autocomplete", function( event ) {
-                               if ( self.options.disabled || self.element.propAttr( "readOnly" ) ) {
+                       .attr( "autocomplete", "off" );
+
+               this._on( this.element, {
+                       keydown: function( event ) {
+                               if ( this.element.prop( "readOnly" ) ) {
+                                       suppressKeyPress = true;
+                                       suppressInput = true;
+                                       suppressKeyPressRepeat = true;
                                        return;
                                }
 
                                suppressKeyPress = false;
+                               suppressInput = false;
+                               suppressKeyPressRepeat = false;
                                var keyCode = $.ui.keyCode;
                                switch( event.keyCode ) {
                                case keyCode.PAGE_UP:
-                                       self._move( "previousPage", event );
+                                       suppressKeyPress = true;
+                                       this._move( "previousPage", event );
                                        break;
                                case keyCode.PAGE_DOWN:
-                                       self._move( "nextPage", event );
+                                       suppressKeyPress = true;
+                                       this._move( "nextPage", event );
                                        break;
                                case keyCode.UP:
-                                       self._keyEvent( "previous", event );
+                                       suppressKeyPress = true;
+                                       this._keyEvent( "previous", event );
                                        break;
                                case keyCode.DOWN:
-                                       self._keyEvent( "next", event );
+                                       suppressKeyPress = true;
+                                       this._keyEvent( "next", event );
                                        break;
                                case keyCode.ENTER:
                                case keyCode.NUMPAD_ENTER:
                                        // when menu is open and has focus
-                                       if ( self.menu.active ) {
+                                       if ( this.menu.active ) {
                                                // #6055 - Opera still allows the keypress to occur
                                                // which causes forms to submit
                                                suppressKeyPress = true;
                                                event.preventDefault();
+                                               this.menu.select( event );
                                        }
-                                       //passthrough - ENTER and TAB both select the current element
+                                       break;
                                case keyCode.TAB:
-                                       if ( !self.menu.active ) {
-                                               return;
+                                       if ( this.menu.active ) {
+                                               this.menu.select( event );
                                        }
-                                       self.menu.select( event );
                                        break;
                                case keyCode.ESCAPE:
-                                       self.element.val( self.term );
-                                       self.close( event );
+                                       if ( this.menu.element.is( ":visible" ) ) {
+                                               this._value( this.term );
+                                               this.close( event );
+                                               // Different browsers have different default behavior for escape
+                                               // Single press can mean undo or clear
+                                               // Double press in IE means clear the whole form
+                                               event.preventDefault();
+                                       }
                                        break;
                                default:
-                                       // keypress is triggered before the input value is changed
-                                       clearTimeout( self.searching );
-                                       self.searching = setTimeout(function() {
-                                               // only search if the value has changed
-                                               if ( self.term != self.element.val() ) {
-                                                       self.selectedItem = null;
-                                                       self.search( null, event );
-                                               }
-                                       }, self.options.delay );
+                                       suppressKeyPressRepeat = true;
+                                       // search timeout should be triggered before the input value is changed
+                                       this._searchTimeout( event );
                                        break;
                                }
-                       })
-                       .bind( "keypress.autocomplete", function( event ) {
+                       },
+                       keypress: function( event ) {
                                if ( suppressKeyPress ) {
                                        suppressKeyPress = false;
                                        event.preventDefault();
+                                       return;
                                }
-                       })
-                       .bind( "focus.autocomplete", function() {
-                               if ( self.options.disabled ) {
+                               if ( suppressKeyPressRepeat ) {
                                        return;
                                }
 
-                               self.selectedItem = null;
-                               self.previous = self.element.val();
-                       })
-                       .bind( "blur.autocomplete", function( event ) {
-                               if ( self.options.disabled ) {
+                               // replicate some key handlers to allow them to repeat in Firefox and Opera
+                               var keyCode = $.ui.keyCode;
+                               switch( event.keyCode ) {
+                               case keyCode.PAGE_UP:
+                                       this._move( "previousPage", event );
+                                       break;
+                               case keyCode.PAGE_DOWN:
+                                       this._move( "nextPage", event );
+                                       break;
+                               case keyCode.UP:
+                                       this._keyEvent( "previous", event );
+                                       break;
+                               case keyCode.DOWN:
+                                       this._keyEvent( "next", event );
+                                       break;
+                               }
+                       },
+                       input: function( event ) {
+                               if ( suppressInput ) {
+                                       suppressInput = false;
+                                       event.preventDefault();
                                        return;
                                }
+                               this._searchTimeout( event );
+                       },
+                       focus: function() {
+                               this.selectedItem = null;
+                               this.previous = this._value();
+                       },
+                       blur: function( event ) {
+                               if ( this.cancelBlur ) {
+                                       delete this.cancelBlur;
+                                       return;
+                               }
+
+                               clearTimeout( this.searching );
+                               this.close( event );
+                               this._change( event );
+                       }
+               });
 
-                               clearTimeout( self.searching );
-                               // clicks on the menu (or a button to trigger a search) will cause a blur event
-                               self.closing = setTimeout(function() {
-                                       self.close( event );
-                                       self._change( event );
-                               }, 150 );
-                       });
                this._initSource();
-               this.menu = $( "<ul></ul>" )
+               this.menu = $( "<ul>" )
                        .addClass( "ui-autocomplete" )
-                       .appendTo( $( this.options.appendTo || "body", doc )[0] )
-                       // prevent the close-on-blur in case of a "slow" click on the menu (long mousedown)
-                       .mousedown(function( event ) {
+                       .appendTo( this.document.find( this.options.appendTo || "body" )[ 0 ] )
+                       .menu({
+                               // custom key handling for now
+                               input: $(),
+                               // disable ARIA support, the live region takes care of that
+                               role: null
+                       })
+                       .zIndex( this.element.zIndex() + 1 )
+                       .hide()
+                       .data( "menu" );
+
+               this._on( this.menu.element, {
+                       mousedown: function( event ) {
+                               // prevent moving focus out of the text field
+                               event.preventDefault();
+
+                               // IE doesn't prevent moving focus even with event.preventDefault()
+                               // so we set a flag to know when we should ignore the blur event
+                               this.cancelBlur = true;
+                               this._delay(function() {
+                                       delete this.cancelBlur;
+                               });
+
                                // clicking on the scrollbar causes focus to shift to the body
                                // but we can't detect a mouseup or a click immediately afterward
                                // so we have to track the next mousedown and close the menu if
                                // the user clicks somewhere outside of the autocomplete
-                               var menuElement = self.menu.element[ 0 ];
+                               var menuElement = this.menu.element[ 0 ];
                                if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {
-                                       setTimeout(function() {
-                                               $( document ).one( 'mousedown', function( event ) {
-                                                       if ( event.target !== self.element[ 0 ] &&
-                                                               event.target !== menuElement &&
-                                                               !$.ui.contains( menuElement, event.target ) ) {
-                                                               self.close();
+                                       this._delay(function() {
+                                               var that = this;
+                                               this.document.one( "mousedown", function( event ) {
+                                                       if ( event.target !== that.element[ 0 ] &&
+                                                                       event.target !== menuElement &&
+                                                                       !$.contains( menuElement, event.target ) ) {
+                                                               that.close();
                                                        }
                                                });
-                                       }, 1 );
+                                       });
                                }
+                       },
+                       menufocus: function( event, ui ) {
+                               // #7024 - Prevent accidental activation of menu items in Firefox
+                               if ( this.isNewMenu ) {
+                                       this.isNewMenu = false;
+                                       if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {
+                                               this.menu.blur();
+
+                                               this.document.one( "mousemove", function() {
+                                                       $( event.target ).trigger( event.originalEvent );
+                                               });
 
-                               // use another timeout to make sure the blur-event-handler on the input was already triggered
-                               setTimeout(function() {
-                                       clearTimeout( self.closing );
-                               }, 13);
-                       })
-                       .menu({
-                               focus: function( event, ui ) {
-                                       var item = ui.item.data( "item.autocomplete" );
-                                       if ( false !== self._trigger( "focus", event, { item: item } ) ) {
-                                               // use value to match what will end up in the input, if it was a key event
-                                               if ( /^key/.test(event.originalEvent.type) ) {
-                                                       self.element.val( item.value );
-                                               }
-                                       }
-                               },
-                               selected: function( event, ui ) {
-                                       var item = ui.item.data( "item.autocomplete" ),
-                                               previous = self.previous;
-
-                                       // only trigger when focus was lost (click on menu)
-                                       if ( self.element[0] !== doc.activeElement ) {
-                                               self.element.focus();
-                                               self.previous = previous;
-                                               // #6109 - IE triggers two focus events and the second
-                                               // is asynchronous, so we need to reset the previous
-                                               // term synchronously and asynchronously :-(
-                                               setTimeout(function() {
-                                                       self.previous = previous;
-                                                       self.selectedItem = item;
-                                               }, 1);
+                                               return;
                                        }
+                               }
 
-                                       if ( false !== self._trigger( "select", event, { item: item } ) ) {
-                                               self.element.val( item.value );
-                                       }
-                                       // reset the term after the select event
-                                       // this allows custom select handling to work properly
-                                       self.term = self.element.val();
-
-                                       self.close( event );
-                                       self.selectedItem = item;
-                               },
-                               blur: function( event, ui ) {
-                                       // don't set the value of the text field if it's already correct
-                                       // this prevents moving the cursor unnecessarily
-                                       if ( self.menu.element.is(":visible") &&
-                                               ( self.element.val() !== self.term ) ) {
-                                               self.element.val( self.term );
+                               // back compat for _renderItem using item.autocomplete, via #7810
+                               // TODO remove the fallback, see #8156
+                               var item = ui.item.data( "ui-autocomplete-item" ) || ui.item.data( "item.autocomplete" );
+                               if ( false !== this._trigger( "focus", event, { item: item } ) ) {
+                                       // use value to match what will end up in the input, if it was a key event
+                                       if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {
+                                               this._value( item.value );
                                        }
+                               } else {
+                                       // Normally the input is populated with the item's value as the
+                                       // menu is navigated, causing screen readers to notice a change and
+                                       // announce the item. Since the focus event was canceled, this doesn't
+                                       // happen, so we update the live region so that screen readers can
+                                       // still notice the change and announce it.
+                                       this.liveRegion.text( item.value );
+                               }
+                       },
+                       menuselect: function( event, ui ) {
+                               // back compat for _renderItem using item.autocomplete, via #7810
+                               // TODO remove the fallback, see #8156
+                               var item = ui.item.data( "ui-autocomplete-item" ) || ui.item.data( "item.autocomplete" ),
+                                       previous = this.previous;
+
+                               // only trigger when focus was lost (click on menu)
+                               if ( this.element[0] !== this.document[0].activeElement ) {
+                                       this.element.focus();
+                                       this.previous = previous;
+                                       // #6109 - IE triggers two focus events and the second
+                                       // is asynchronous, so we need to reset the previous
+                                       // term synchronously and asynchronously :-(
+                                       this._delay(function() {
+                                               this.previous = previous;
+                                               this.selectedItem = item;
+                                       });
+                               }
+
+                               if ( false !== this._trigger( "select", event, { item: item } ) ) {
+                                       this._value( item.value );
                                }
+                               // reset the term after the select event
+                               // this allows custom select handling to work properly
+                               this.term = this._value();
+
+                               this.close( event );
+                               this.selectedItem = item;
+                       }
+               });
+
+               this.liveRegion = $( "<span>", {
+                               role: "status",
+                               "aria-live": "polite"
                        })
-                       .zIndex( this.element.zIndex() + 1 )
-                       // workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781
-                       .css({ top: 0, left: 0 })
-                       .hide()
-                       .data( "menu" );
+                       .addClass( "ui-helper-hidden-accessible" )
+                       .insertAfter( this.element );
+
                if ( $.fn.bgiframe ) {
-                        this.menu.element.bgiframe();
+                       this.menu.element.bgiframe();
                }
+
                // turning off autocomplete prevents the browser from remembering the
                // value when navigating through history, so we re-enable autocomplete
                // if the page is unloaded before the widget is destroyed. #7790
-               self.beforeunloadHandler = function() {
-                       self.element.removeAttr( "autocomplete" );
-               };
-               $( window ).bind( "beforeunload", self.beforeunloadHandler );
+               this._on( this.window, {
+                       beforeunload: function() {
+                               this.element.removeAttr( "autocomplete" );
+                       }
+               });
        },
 
-       destroy: function() {
+       _destroy: function() {
+               clearTimeout( this.searching );
                this.element
                        .removeClass( "ui-autocomplete-input" )
-                       .removeAttr( "autocomplete" )
-                       .removeAttr( "role" )
-                       .removeAttr( "aria-autocomplete" )
-                       .removeAttr( "aria-haspopup" );
+                       .removeAttr( "autocomplete" );
                this.menu.element.remove();
-               $( window ).unbind( "beforeunload", this.beforeunloadHandler );
-               $.Widget.prototype.destroy.call( this );
+               this.liveRegion.remove();
        },
 
        _setOption: function( key, value ) {
-               $.Widget.prototype._setOption.apply( this, arguments );
+               this._super( key, value );
                if ( key === "source" ) {
                        this._initSource();
                }
                if ( key === "appendTo" ) {
-                       this.menu.element.appendTo( $( value || "body", this.element[0].ownerDocument )[0] )
+                       this.menu.element.appendTo( this.document.find( value || "body" )[0] );
                }
                if ( key === "disabled" && value && this.xhr ) {
                        this.xhr.abort();
                }
        },
 
+       _isMultiLine: function() {
+               // Textareas are always multi-line
+               if ( this.element.is( "textarea" ) ) {
+                       return true;
+               }
+               // Inputs are always single-line, even if inside a contentEditable element
+               // IE also treats inputs as contentEditable
+               if ( this.element.is( "input" ) ) {
+                       return false;
+               }
+               // All other element types are determined by whether or not they're contentEditable
+               return this.element.prop( "isContentEditable" );
+       },
+
        _initSource: function() {
-               var self = this,
-                       array,
-                       url;
+               var array, url,
+                       that = this;
                if ( $.isArray(this.options.source) ) {
                        array = this.options.source;
                        this.source = function( request, response ) {
-                               response( $.ui.autocomplete.filter(array, request.term) );
+                               response( $.ui.autocomplete.filter( array, request.term ) );
                        };
                } else if ( typeof this.options.source === "string" ) {
                        url = this.options.source;
                        this.source = function( request, response ) {
-                               if ( self.xhr ) {
-                                       self.xhr.abort();
+                               if ( that.xhr ) {
+                                       that.xhr.abort();
                                }
-                               self.xhr = $.ajax({
+                               that.xhr = $.ajax({
                                        url: url,
                                        data: request,
                                        dataType: "json",
-                                       success: function( data, status ) {
+                                       success: function( data ) {
                                                response( data );
                                        },
                                        error: function() {
@@ -275,17 +373,27 @@ $.widget( "ui.autocomplete", {
                }
        },
 
+       _searchTimeout: function( event ) {
+               clearTimeout( this.searching );
+               this.searching = this._delay(function() {
+                       // only search if the value has changed
+                       if ( this.term !== this._value() ) {
+                               this.selectedItem = null;
+                               this.search( null, event );
+                       }
+               }, this.options.delay );
+       },
+
        search: function( value, event ) {
-               value = value != null ? value : this.element.val();
+               value = value != null ? value : this._value();
 
                // always save the actual value, not the one passed as an argument
-               this.term = this.element.val();
+               this.term = this._value();
 
                if ( value.length < this.options.minLength ) {
                        return this.close( event );
                }
 
-               clearTimeout( this.closing );
                if ( this._trigger( "search", event ) === false ) {
                        return;
                }
@@ -296,6 +404,7 @@ $.widget( "ui.autocomplete", {
        _search: function( value ) {
                this.pending++;
                this.element.addClass( "ui-autocomplete-loading" );
+               this.cancelSearch = false;
 
                this.source( { term: value }, this._response() );
        },
@@ -317,26 +426,35 @@ $.widget( "ui.autocomplete", {
        },
 
        __response: function( content ) {
-               if ( !this.options.disabled && content && content.length ) {
+               if ( content ) {
                        content = this._normalize( content );
+               }
+               this._trigger( "response", null, { content: content } );
+               if ( !this.options.disabled && content && content.length && !this.cancelSearch ) {
                        this._suggest( content );
                        this._trigger( "open" );
                } else {
-                       this.close();
+                       // use ._close() instead of .close() so we don't cancel future searches
+                       this._close();
                }
        },
 
        close: function( event ) {
-               clearTimeout( this.closing );
-               if ( this.menu.element.is(":visible") ) {
+               this.cancelSearch = true;
+               this._close( event );
+       },
+
+       _close: function( event ) {
+               if ( this.menu.element.is( ":visible" ) ) {
                        this.menu.element.hide();
-                       this.menu.deactivate();
+                       this.menu.blur();
+                       this.isNewMenu = true;
                        this._trigger( "close", event );
                }
        },
-       
+
        _change: function( event ) {
-               if ( this.previous !== this.element.val() ) {
+               if ( this.previous !== this._value() ) {
                        this._trigger( "change", event, { item: this.selectedItem } );
                }
        },
@@ -346,7 +464,7 @@ $.widget( "ui.autocomplete", {
                if ( items.length && items[0].label && items[0].value ) {
                        return items;
                }
-               return $.map( items, function(item) {
+               return $.map( items, function( item ) {
                        if ( typeof item === "string" ) {
                                return {
                                        label: item,
@@ -365,8 +483,6 @@ $.widget( "ui.autocomplete", {
                        .empty()
                        .zIndex( this.element.zIndex() + 1 );
                this._renderMenu( ul, items );
-               // TODO refresh should check if the active item is still in the dom, removing the need for a manual deactivate
-               this.menu.deactivate();
                this.menu.refresh();
 
                // size and position menu
@@ -377,7 +493,7 @@ $.widget( "ui.autocomplete", {
                }, this.options.position ));
 
                if ( this.options.autoFocus ) {
-                       this.menu.next( new $.Event("mouseover") );
+                       this.menu.next();
                }
        },
 
@@ -392,28 +508,31 @@ $.widget( "ui.autocomplete", {
        },
 
        _renderMenu: function( ul, items ) {
-               var self = this;
+               var that = this;
                $.each( items, function( index, item ) {
-                       self._renderItem( ul, item );
+                       that._renderItemData( ul, item );
                });
        },
 
-       _renderItem: function( ul, item) {
-               return $( "<li></li>" )
-                       .data( "item.autocomplete", item )
-                       .append( $( "<a></a>" ).text( item.label ) )
+       _renderItemData: function( ul, item ) {
+               return this._renderItem( ul, item ).data( "ui-autocomplete-item", item );
+       },
+
+       _renderItem: function( ul, item ) {
+               return $( "<li>" )
+                       .append( $( "<a>" ).text( item.label ) )
                        .appendTo( ul );
        },
 
        _move: function( direction, event ) {
-               if ( !this.menu.element.is(":visible") ) {
+               if ( !this.menu.element.is( ":visible" ) ) {
                        this.search( null, event );
                        return;
                }
-               if ( this.menu.first() && /^previous/.test(direction) ||
-                               this.menu.last() && /^next/.test(direction) ) {
-                       this.element.val( this.term );
-                       this.menu.deactivate();
+               if ( this.menu.isFirstItem() && /^previous/.test( direction ) ||
+                               this.menu.isLastItem() && /^next/.test( direction ) ) {
+                       this._value( this.term );
+                       this.menu.blur();
                        return;
                }
                this.menu[ direction ]( event );
@@ -422,6 +541,11 @@ $.widget( "ui.autocomplete", {
        widget: function() {
                return this.menu.element;
        },
+
+       _value: function() {
+               return this.valueMethod.apply( this.element, arguments );
+       },
+
        _keyEvent: function( keyEvent, event ) {
                if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
                        this._move( keyEvent, event );
@@ -434,7 +558,7 @@ $.widget( "ui.autocomplete", {
 
 $.extend( $.ui.autocomplete, {
        escapeRegex: function( value ) {
-               return value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
+               return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
        },
        filter: function(array, term) {
                var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
@@ -444,188 +568,35 @@ $.extend( $.ui.autocomplete, {
        }
 });
 
-}( jQuery ));
-
-/*
- * jQuery UI Menu (not officially released)
- * 
- * This widget isn't yet finished and the API is subject to change. We plan to finish
- * it for the next release. You're welcome to give it a try anyway and give us feedback,
- * as long as you're okay with migrating your code later on. We can help with that, too.
- *
- * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Menu
- *
- * Depends:
- *     jquery.ui.core.js
- *  jquery.ui.widget.js
- */
-(function($) {
-
-$.widget("ui.menu", {
-       _create: function() {
-               var self = this;
-               this.element
-                       .addClass("ui-menu ui-widget ui-widget-content ui-corner-all")
-                       .attr({
-                               role: "listbox",
-                               "aria-activedescendant": "ui-active-menuitem"
-                       })
-                       .click(function( event ) {
-                               if ( !$( event.target ).closest( ".ui-menu-item a" ).length ) {
-                                       return;
-                               }
-                               // temporary
-                               event.preventDefault();
-                               self.select( event );
-                       });
-               this.refresh();
-       },
-       
-       refresh: function() {
-               var self = this;
-
-               // don't refresh list items that are already adapted
-               var items = this.element.children("li:not(.ui-menu-item):has(a)")
-                       .addClass("ui-menu-item")
-                       .attr("role", "menuitem");
-               
-               items.children("a")
-                       .addClass("ui-corner-all")
-                       .attr("tabindex", -1)
-                       // mouseenter doesn't work with event delegation
-                       .mouseenter(function( event ) {
-                               self.activate( event, $(this).parent() );
-                       })
-                       .mouseleave(function() {
-                               self.deactivate();
-                       });
-       },
 
-       activate: function( event, item ) {
-               this.deactivate();
-               if (this.hasScroll()) {
-                       var offset = item.offset().top - this.element.offset().top,
-                               scroll = this.element.scrollTop(),
-                               elementHeight = this.element.height();
-                       if (offset < 0) {
-                               this.element.scrollTop( scroll + offset);
-                       } else if (offset >= elementHeight) {
-                               this.element.scrollTop( scroll + offset - elementHeight + item.height());
+// live region extension, adding a `messages` option
+// NOTE: This is an experimental API. We are still investigating
+// a full solution for string manipulation and internationalization.
+$.widget( "ui.autocomplete", $.ui.autocomplete, {
+       options: {
+               messages: {
+                       noResults: "No search results.",
+                       results: function( amount ) {
+                               return amount + ( amount > 1 ? " results are" : " result is" ) +
+                                       " available, use up and down arrow keys to navigate.";
                        }
                }
-               this.active = item.eq(0)
-                       .children("a")
-                               .addClass("ui-state-hover")
-                               .attr("id", "ui-active-menuitem")
-                       .end();
-               this._trigger("focus", event, { item: item });
-       },
-
-       deactivate: function() {
-               if (!this.active) { return; }
-
-               this.active.children("a")
-                       .removeClass("ui-state-hover")
-                       .removeAttr("id");
-               this._trigger("blur");
-               this.active = null;
        },
 
-       next: function(event) {
-               this.move("next", ".ui-menu-item:first", event);
-       },
-
-       previous: function(event) {
-               this.move("prev", ".ui-menu-item:last", event);
-       },
-
-       first: function() {
-               return this.active && !this.active.prevAll(".ui-menu-item").length;
-       },
-
-       last: function() {
-               return this.active && !this.active.nextAll(".ui-menu-item").length;
-       },
-
-       move: function(direction, edge, event) {
-               if (!this.active) {
-                       this.activate(event, this.element.children(edge));
+       __response: function( content ) {
+               var message;
+               this._superApply( arguments );
+               if ( this.options.disabled || this.cancelSearch ) {
                        return;
                }
-               var next = this.active[direction + "All"](".ui-menu-item").eq(0);
-               if (next.length) {
-                       this.activate(event, next);
-               } else {
-                       this.activate(event, this.element.children(edge));
-               }
-       },
-
-       // TODO merge with previousPage
-       nextPage: function(event) {
-               if (this.hasScroll()) {
-                       // TODO merge with no-scroll-else
-                       if (!this.active || this.last()) {
-                               this.activate(event, this.element.children(".ui-menu-item:first"));
-                               return;
-                       }
-                       var base = this.active.offset().top,
-                               height = this.element.height(),
-                               result = this.element.children(".ui-menu-item").filter(function() {
-                                       var close = $(this).offset().top - base - height + $(this).height();
-                                       // TODO improve approximation
-                                       return close < 10 && close > -10;
-                               });
-
-                       // TODO try to catch this earlier when scrollTop indicates the last page anyway
-                       if (!result.length) {
-                               result = this.element.children(".ui-menu-item:last");
-                       }
-                       this.activate(event, result);
-               } else {
-                       this.activate(event, this.element.children(".ui-menu-item")
-                               .filter(!this.active || this.last() ? ":first" : ":last"));
-               }
-       },
-
-       // TODO merge with nextPage
-       previousPage: function(event) {
-               if (this.hasScroll()) {
-                       // TODO merge with no-scroll-else
-                       if (!this.active || this.first()) {
-                               this.activate(event, this.element.children(".ui-menu-item:last"));
-                               return;
-                       }
-
-                       var base = this.active.offset().top,
-                               height = this.element.height(),
-                               result = this.element.children(".ui-menu-item").filter(function() {
-                                       var close = $(this).offset().top - base + height - $(this).height();
-                                       // TODO improve approximation
-                                       return close < 10 && close > -10;
-                               });
-
-                       // TODO try to catch this earlier when scrollTop indicates the last page anyway
-                       if (!result.length) {
-                               result = this.element.children(".ui-menu-item:first");
-                       }
-                       this.activate(event, result);
+               if ( content && content.length ) {
+                       message = this.options.messages.results( content.length );
                } else {
-                       this.activate(event, this.element.children(".ui-menu-item")
-                               .filter(!this.active || this.first() ? ":last" : ":first"));
+                       message = this.options.messages.noResults;
                }
-       },
-
-       hasScroll: function() {
-               return this.element.height() < this.element[ $.fn.prop ? "prop" : "attr" ]("scrollHeight");
-       },
-
-       select: function( event ) {
-               this._trigger("selected", event, { item: this.active });
+               this.liveRegion.text( message );
        }
 });
 
-}(jQuery));
+
+}( jQuery ));
index 8326262..53cf699 100644 (file)
@@ -1,11 +1,12 @@
 /*!
- * jQuery UI Button 1.8.24
+ * jQuery UI Button 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Button
+ * http://api.jqueryui.com/button/
  *
  * Depends:
  *     jquery.ui.core.js
@@ -41,6 +42,8 @@ var lastActive, startXPos, startYPos, clickDragged,
        };
 
 $.widget( "ui.button", {
+       version: "1.9.2",
+       defaultElement: "<button>",
        options: {
                disabled: null,
                text: true,
@@ -52,47 +55,48 @@ $.widget( "ui.button", {
        },
        _create: function() {
                this.element.closest( "form" )
-                       .unbind( "reset.button" )
-                       .bind( "reset.button", formResetHandler );
+                       .unbind( "reset" + this.eventNamespace )
+                       .bind( "reset" + this.eventNamespace, formResetHandler );
 
                if ( typeof this.options.disabled !== "boolean" ) {
-                       this.options.disabled = !!this.element.propAttr( "disabled" );
+                       this.options.disabled = !!this.element.prop( "disabled" );
                } else {
-                       this.element.propAttr( "disabled", this.options.disabled );
+                       this.element.prop( "disabled", this.options.disabled );
                }
 
                this._determineButtonType();
                this.hasTitle = !!this.buttonElement.attr( "title" );
 
-               var self = this,
+               var that = this,
                        options = this.options,
                        toggleButton = this.type === "checkbox" || this.type === "radio",
-                       hoverClass = "ui-state-hover" + ( !toggleButton ? " ui-state-active" : "" ),
+                       activeClass = !toggleButton ? "ui-state-active" : "",
                        focusClass = "ui-state-focus";
 
                if ( options.label === null ) {
-                       options.label = this.buttonElement.html();
+                       options.label = (this.type === "input" ? this.buttonElement.val() : this.buttonElement.html());
                }
 
+               this._hoverable( this.buttonElement );
+
                this.buttonElement
                        .addClass( baseClasses )
                        .attr( "role", "button" )
-                       .bind( "mouseenter.button", function() {
+                       .bind( "mouseenter" + this.eventNamespace, function() {
                                if ( options.disabled ) {
                                        return;
                                }
-                               $( this ).addClass( "ui-state-hover" );
                                if ( this === lastActive ) {
                                        $( this ).addClass( "ui-state-active" );
                                }
                        })
-                       .bind( "mouseleave.button", function() {
+                       .bind( "mouseleave" + this.eventNamespace, function() {
                                if ( options.disabled ) {
                                        return;
                                }
-                               $( this ).removeClass( hoverClass );
+                               $( this ).removeClass( activeClass );
                        })
-                       .bind( "click.button", function( event ) {
+                       .bind( "click" + this.eventNamespace, function( event ) {
                                if ( options.disabled ) {
                                        event.preventDefault();
                                        event.stopImmediatePropagation();
@@ -100,26 +104,26 @@ $.widget( "ui.button", {
                        });
 
                this.element
-                       .bind( "focus.button", function() {
+                       .bind( "focus" + this.eventNamespace, function() {
                                // no need to check disabled, focus won't be triggered anyway
-                               self.buttonElement.addClass( focusClass );
+                               that.buttonElement.addClass( focusClass );
                        })
-                       .bind( "blur.button", function() {
-                               self.buttonElement.removeClass( focusClass );
+                       .bind( "blur" + this.eventNamespace, function() {
+                               that.buttonElement.removeClass( focusClass );
                        });
 
                if ( toggleButton ) {
-                       this.element.bind( "change.button", function() {
+                       this.element.bind( "change" + this.eventNamespace, function() {
                                if ( clickDragged ) {
                                        return;
                                }
-                               self.refresh();
+                               that.refresh();
                        });
                        // if mouse moves between mousedown and mouseup (drag) set clickDragged flag
                        // prevents issue where button state changes but checkbox/radio checked state
                        // does not in Firefox (see ticket #6970)
                        this.buttonElement
-                               .bind( "mousedown.button", function( event ) {
+                               .bind( "mousedown" + this.eventNamespace, function( event ) {
                                        if ( options.disabled ) {
                                                return;
                                        }
@@ -127,7 +131,7 @@ $.widget( "ui.button", {
                                        startXPos = event.pageX;
                                        startYPos = event.pageY;
                                })
-                               .bind( "mouseup.button", function( event ) {
+                               .bind( "mouseup" + this.eventNamespace, function( event ) {
                                        if ( options.disabled ) {
                                                return;
                                        }
@@ -138,22 +142,22 @@ $.widget( "ui.button", {
                }
 
                if ( this.type === "checkbox" ) {
-                       this.buttonElement.bind( "click.button", function() {
+                       this.buttonElement.bind( "click" + this.eventNamespace, function() {
                                if ( options.disabled || clickDragged ) {
                                        return false;
                                }
                                $( this ).toggleClass( "ui-state-active" );
-                               self.buttonElement.attr( "aria-pressed", self.element[0].checked );
+                               that.buttonElement.attr( "aria-pressed", that.element[0].checked );
                        });
                } else if ( this.type === "radio" ) {
-                       this.buttonElement.bind( "click.button", function() {
+                       this.buttonElement.bind( "click" + this.eventNamespace, function() {
                                if ( options.disabled || clickDragged ) {
                                        return false;
                                }
                                $( this ).addClass( "ui-state-active" );
-                               self.buttonElement.attr( "aria-pressed", "true" );
+                               that.buttonElement.attr( "aria-pressed", "true" );
 
-                               var radio = self.element[ 0 ];
+                               var radio = that.element[ 0 ];
                                radioGroup( radio )
                                        .not( radio )
                                        .map(function() {
@@ -164,31 +168,31 @@ $.widget( "ui.button", {
                        });
                } else {
                        this.buttonElement
-                               .bind( "mousedown.button", function() {
+                               .bind( "mousedown" + this.eventNamespace, function() {
                                        if ( options.disabled ) {
                                                return false;
                                        }
                                        $( this ).addClass( "ui-state-active" );
                                        lastActive = this;
-                                       $( document ).one( "mouseup", function() {
+                                       that.document.one( "mouseup", function() {
                                                lastActive = null;
                                        });
                                })
-                               .bind( "mouseup.button", function() {
+                               .bind( "mouseup" + this.eventNamespace, function() {
                                        if ( options.disabled ) {
                                                return false;
                                        }
                                        $( this ).removeClass( "ui-state-active" );
                                })
-                               .bind( "keydown.button", function(event) {
+                               .bind( "keydown" + this.eventNamespace, function(event) {
                                        if ( options.disabled ) {
                                                return false;
                                        }
-                                       if ( event.keyCode == $.ui.keyCode.SPACE || event.keyCode == $.ui.keyCode.ENTER ) {
+                                       if ( event.keyCode === $.ui.keyCode.SPACE || event.keyCode === $.ui.keyCode.ENTER ) {
                                                $( this ).addClass( "ui-state-active" );
                                        }
                                })
-                               .bind( "keyup.button", function() {
+                               .bind( "keyup" + this.eventNamespace, function() {
                                        $( this ).removeClass( "ui-state-active" );
                                });
 
@@ -210,10 +214,11 @@ $.widget( "ui.button", {
        },
 
        _determineButtonType: function() {
+               var ancestor, labelSelector, checked;
 
-               if ( this.element.is(":checkbox") ) {
+               if ( this.element.is("[type=checkbox]") ) {
                        this.type = "checkbox";
-               } else if ( this.element.is(":radio") ) {
+               } else if ( this.element.is("[type=radio]") ) {
                        this.type = "radio";
                } else if ( this.element.is("input") ) {
                        this.type = "input";
@@ -224,8 +229,8 @@ $.widget( "ui.button", {
                if ( this.type === "checkbox" || this.type === "radio" ) {
                        // we don't search against the document in case the element
                        // is disconnected from the DOM
-                       var ancestor = this.element.parents().filter(":last"),
-                               labelSelector = "label[for='" + this.element.attr("id") + "']";
+                       ancestor = this.element.parents().last();
+                       labelSelector = "label[for='" + this.element.attr("id") + "']";
                        this.buttonElement = ancestor.find( labelSelector );
                        if ( !this.buttonElement.length ) {
                                ancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();
@@ -236,11 +241,11 @@ $.widget( "ui.button", {
                        }
                        this.element.addClass( "ui-helper-hidden-accessible" );
 
-                       var checked = this.element.is( ":checked" );
+                       checked = this.element.is( ":checked" );
                        if ( checked ) {
                                this.buttonElement.addClass( "ui-state-active" );
                        }
-                       this.buttonElement.attr( "aria-pressed", checked );
+                       this.buttonElement.prop( "aria-pressed", checked );
                } else {
                        this.buttonElement = this.element;
                }
@@ -250,7 +255,7 @@ $.widget( "ui.button", {
                return this.buttonElement;
        },
 
-       destroy: function() {
+       _destroy: function() {
                this.element
                        .removeClass( "ui-helper-hidden-accessible" );
                this.buttonElement
@@ -262,17 +267,15 @@ $.widget( "ui.button", {
                if ( !this.hasTitle ) {
                        this.buttonElement.removeAttr( "title" );
                }
-
-               $.Widget.prototype.destroy.call( this );
        },
 
        _setOption: function( key, value ) {
-               $.Widget.prototype._setOption.apply( this, arguments );
+               this._super( key, value );
                if ( key === "disabled" ) {
                        if ( value ) {
-                               this.element.propAttr( "disabled", true );
+                               this.element.prop( "disabled", true );
                        } else {
-                               this.element.propAttr( "disabled", false );
+                               this.element.prop( "disabled", false );
                        }
                        return;
                }
@@ -280,7 +283,9 @@ $.widget( "ui.button", {
        },
 
        refresh: function() {
-               var isDisabled = this.element.is( ":disabled" );
+               //See #8237 & #8828
+               var isDisabled = this.element.is( "input, button" ) ? this.element.is( ":disabled" ) : this.element.hasClass( "ui-button-disabled" );
+
                if ( isDisabled !== this.options.disabled ) {
                        this._setOption( "disabled", isDisabled );
                }
@@ -317,14 +322,14 @@ $.widget( "ui.button", {
                        return;
                }
                var buttonElement = this.buttonElement.removeClass( typeClasses ),
-                       buttonText = $( "<span></span>", this.element[0].ownerDocument )
+                       buttonText = $( "<span></span>", this.document[0] )
                                .addClass( "ui-button-text" )
                                .html( this.options.label )
                                .appendTo( buttonElement.empty() )
                                .text(),
                        icons = this.options.icons,
                        multipleIcons = icons.primary && icons.secondary,
-                       buttonClasses = [];  
+                       buttonClasses = [];
 
                if ( icons.primary || icons.secondary ) {
                        if ( this.options.text ) {
@@ -343,7 +348,7 @@ $.widget( "ui.button", {
                                buttonClasses.push( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" );
 
                                if ( !this.hasTitle ) {
-                                       buttonElement.attr( "title", buttonText );
+                                       buttonElement.attr( "title", $.trim( buttonText ) );
                                }
                        }
                } else {
@@ -354,14 +359,15 @@ $.widget( "ui.button", {
 });
 
 $.widget( "ui.buttonset", {
+       version: "1.9.2",
        options: {
-               items: ":button, :submit, :reset, :checkbox, :radio, a, :data(button)"
+               items: "button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(button)"
        },
 
        _create: function() {
                this.element.addClass( "ui-buttonset" );
        },
-       
+
        _init: function() {
                this.refresh();
        },
@@ -371,12 +377,12 @@ $.widget( "ui.buttonset", {
                        this.buttons.button( "option", key, value );
                }
 
-               $.Widget.prototype._setOption.apply( this, arguments );
+               this._super( key, value );
        },
-       
+
        refresh: function() {
                var rtl = this.element.css( "direction" ) === "rtl";
-               
+
                this.buttons = this.element.find( this.options.items )
                        .filter( ":ui-button" )
                                .button( "refresh" )
@@ -397,7 +403,7 @@ $.widget( "ui.buttonset", {
                        .end();
        },
 
-       destroy: function() {
+       _destroy: function() {
                this.element.removeClass( "ui-buttonset" );
                this.buttons
                        .map(function() {
@@ -406,8 +412,6 @@ $.widget( "ui.buttonset", {
                                .removeClass( "ui-corner-left ui-corner-right" )
                        .end()
                        .button( "destroy" );
-
-               $.Widget.prototype.destroy.call( this );
        }
 });
 
index b36c1ac..4ef4b76 100644 (file)
@@ -1,14 +1,18 @@
 /*!
- * jQuery UI 1.8.24
+ * jQuery UI Core 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI
+ * http://api.jqueryui.com/category/ui-core/
  */
 (function( $, undefined ) {
 
+var uuid = 0,
+       runiqueId = /^ui-id-\d+$/;
+
 // prevent duplicate loading
 // this is only a problem because we proxy existing functions
 // and we don't want to double proxy them
@@ -18,26 +22,18 @@ if ( $.ui.version ) {
 }
 
 $.extend( $.ui, {
-       version: "1.8.24",
+       version: "1.9.2",
 
        keyCode: {
-               ALT: 18,
                BACKSPACE: 8,
-               CAPS_LOCK: 20,
                COMMA: 188,
-               COMMAND: 91,
-               COMMAND_LEFT: 91, // COMMAND
-               COMMAND_RIGHT: 93,
-               CONTROL: 17,
                DELETE: 46,
                DOWN: 40,
                END: 35,
                ENTER: 13,
                ESCAPE: 27,
                HOME: 36,
-               INSERT: 45,
                LEFT: 37,
-               MENU: 93, // COMMAND_RIGHT
                NUMPAD_ADD: 107,
                NUMPAD_DECIMAL: 110,
                NUMPAD_DIVIDE: 111,
@@ -48,18 +44,14 @@ $.extend( $.ui, {
                PAGE_UP: 33,
                PERIOD: 190,
                RIGHT: 39,
-               SHIFT: 16,
                SPACE: 32,
                TAB: 9,
-               UP: 38,
-               WINDOWS: 91 // COMMAND
+               UP: 38
        }
 });
 
 // plugins
 $.fn.extend({
-       propAttr: $.fn.prop || $.fn.attr,
-
        _focus: $.fn.focus,
        focus: function( delay, fn ) {
                return typeof delay === "number" ?
@@ -77,13 +69,13 @@ $.fn.extend({
 
        scrollParent: function() {
                var scrollParent;
-               if (($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
+               if (($.ui.ie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
                        scrollParent = this.parents().filter(function() {
-                               return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
+                               return (/(relative|absolute|fixed)/).test($.css(this,'position')) && (/(auto|scroll)/).test($.css(this,'overflow')+$.css(this,'overflow-y')+$.css(this,'overflow-x'));
                        }).eq(0);
                } else {
                        scrollParent = this.parents().filter(function() {
-                               return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
+                               return (/(auto|scroll)/).test($.css(this,'overflow')+$.css(this,'overflow-y')+$.css(this,'overflow-x'));
                        }).eq(0);
                }
 
@@ -119,92 +111,50 @@ $.fn.extend({
                return 0;
        },
 
-       disableSelection: function() {
-               return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
-                       ".ui-disableSelection", function( event ) {
-                               event.preventDefault();
-                       });
+       uniqueId: function() {
+               return this.each(function() {
+                       if ( !this.id ) {
+                               this.id = "ui-id-" + (++uuid);
+                       }
+               });
        },
 
-       enableSelection: function() {
-               return this.unbind( ".ui-disableSelection" );
+       removeUniqueId: function() {
+               return this.each(function() {
+                       if ( runiqueId.test( this.id ) ) {
+                               $( this ).removeAttr( "id" );
+                       }
+               });
        }
 });
 
-// support: jQuery <1.8
-if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
-       $.each( [ "Width", "Height" ], function( i, name ) {
-               var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
-                       type = name.toLowerCase(),
-                       orig = {
-                               innerWidth: $.fn.innerWidth,
-                               innerHeight: $.fn.innerHeight,
-                               outerWidth: $.fn.outerWidth,
-                               outerHeight: $.fn.outerHeight
-                       };
-
-               function reduce( elem, size, border, margin ) {
-                       $.each( side, function() {
-                               size -= parseFloat( $.curCSS( elem, "padding" + this, true) ) || 0;
-                               if ( border ) {
-                                       size -= parseFloat( $.curCSS( elem, "border" + this + "Width", true) ) || 0;
-                               }
-                               if ( margin ) {
-                                       size -= parseFloat( $.curCSS( elem, "margin" + this, true) ) || 0;
-                               }
-                       });
-                       return size;
-               }
-
-               $.fn[ "inner" + name ] = function( size ) {
-                       if ( size === undefined ) {
-                               return orig[ "inner" + name ].call( this );
-                       }
-
-                       return this.each(function() {
-                               $( this ).css( type, reduce( this, size ) + "px" );
-                       });
-               };
-
-               $.fn[ "outer" + name] = function( size, margin ) {
-                       if ( typeof size !== "number" ) {
-                               return orig[ "outer" + name ].call( this, size );
-                       }
-
-                       return this.each(function() {
-                               $( this).css( type, reduce( this, size, true, margin ) + "px" );
-                       });
-               };
-       });
-}
-
 // selectors
 function focusable( element, isTabIndexNotNaN ) {
-       var nodeName = element.nodeName.toLowerCase();
+       var map, mapName, img,
+               nodeName = element.nodeName.toLowerCase();
        if ( "area" === nodeName ) {
-               var map = element.parentNode,
-                       mapName = map.name,
-                       img;
+               map = element.parentNode;
+               mapName = map.name;
                if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
                        return false;
                }
                img = $( "img[usemap=#" + mapName + "]" )[0];
                return !!img && visible( img );
        }
-       return ( /input|select|textarea|button|object/.test( nodeName )
-               ? !element.disabled
-               : "a" == nodeName
-                       ? element.href || isTabIndexNotNaN
-                       : isTabIndexNotNaN)
+       return ( /input|select|textarea|button|object/.test( nodeName ) ?
+               !element.disabled :
+               "a" === nodeName ?
+                       element.href || isTabIndexNotNaN :
+                       isTabIndexNotNaN) &&
                // the element and all of its ancestors must be visible
-               && visible( element );
+               visible( element );
 }
 
 function visible( element ) {
-       return !$( element ).parents().andSelf().filter(function() {
-               return $.curCSS( this, "visibility" ) === "hidden" ||
-                       $.expr.filters.hidden( this );
-       }).length;
+       return $.expr.filters.visible( element ) &&
+               !$( element ).parents().andSelf().filter(function() {
+                       return $.css( this, "visibility" ) === "hidden";
+               }).length;
 }
 
 $.extend( $.expr[ ":" ], {
@@ -236,7 +186,7 @@ $(function() {
                div = body.appendChild( div = document.createElement( "div" ) );
 
        // access offsetHeight before setting the style to prevent a layout bug
-       // in IE 9 which causes the elemnt to continue to take up space even
+       // in IE 9 which causes the element to continue to take up space even
        // after it is removed from the DOM (#8026)
        div.offsetHeight;
 
@@ -255,9 +205,64 @@ $(function() {
        body.removeChild( div ).style.display = "none";
 });
 
-// jQuery <1.4.3 uses curCSS, in 1.4.3 - 1.7.2 curCSS = css, 1.8+ only has css
-if ( !$.curCSS ) {
-       $.curCSS = $.css;
+// support: jQuery <1.8
+if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
+       $.each( [ "Width", "Height" ], function( i, name ) {
+               var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
+                       type = name.toLowerCase(),
+                       orig = {
+                               innerWidth: $.fn.innerWidth,
+                               innerHeight: $.fn.innerHeight,
+                               outerWidth: $.fn.outerWidth,
+                               outerHeight: $.fn.outerHeight
+                       };
+
+               function reduce( elem, size, border, margin ) {
+                       $.each( side, function() {
+                               size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;
+                               if ( border ) {
+                                       size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0;
+                               }
+                               if ( margin ) {
+                                       size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;
+                               }
+                       });
+                       return size;
+               }
+
+               $.fn[ "inner" + name ] = function( size ) {
+                       if ( size === undefined ) {
+                               return orig[ "inner" + name ].call( this );
+                       }
+
+                       return this.each(function() {
+                               $( this ).css( type, reduce( this, size ) + "px" );
+                       });
+               };
+
+               $.fn[ "outer" + name] = function( size, margin ) {
+                       if ( typeof size !== "number" ) {
+                               return orig[ "outer" + name ].call( this, size );
+                       }
+
+                       return this.each(function() {
+                               $( this).css( type, reduce( this, size, true, margin ) + "px" );
+                       });
+               };
+       });
+}
+
+// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)
+if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {
+       $.fn.removeData = (function( removeData ) {
+               return function( key ) {
+                       if ( arguments.length ) {
+                               return removeData.call( this, $.camelCase( key ) );
+                       } else {
+                               return removeData.call( this );
+                       }
+               };
+       })( $.fn.removeData );
 }
 
 
@@ -265,52 +270,69 @@ if ( !$.curCSS ) {
 
 
 // deprecated
+
+(function() {
+       var uaMatch = /msie ([\w.]+)/.exec( navigator.userAgent.toLowerCase() ) || [];
+       $.ui.ie = uaMatch.length ? true : false;
+       $.ui.ie6 = parseFloat( uaMatch[ 1 ], 10 ) === 6;
+})();
+
+$.fn.extend({
+       disableSelection: function() {
+               return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
+                       ".ui-disableSelection", function( event ) {
+                               event.preventDefault();
+                       });
+       },
+
+       enableSelection: function() {
+               return this.unbind( ".ui-disableSelection" );
+       }
+});
+
 $.extend( $.ui, {
        // $.ui.plugin is deprecated.  Use the proxy pattern instead.
        plugin: {
                add: function( module, option, set ) {
-                       var proto = $.ui[ module ].prototype;
-                       for ( var i in set ) {
+                       var i,
+                               proto = $.ui[ module ].prototype;
+                       for ( i in set ) {
                                proto.plugins[ i ] = proto.plugins[ i ] || [];
                                proto.plugins[ i ].push( [ option, set[ i ] ] );
                        }
                },
                call: function( instance, name, args ) {
-                       var set = instance.plugins[ name ];
-                       if ( !set || !instance.element[ 0 ].parentNode ) {
+                       var i,
+                               set = instance.plugins[ name ];
+                       if ( !set || !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) {
                                return;
                        }
-       
-                       for ( var i = 0; i < set.length; i++ ) {
+
+                       for ( i = 0; i < set.length; i++ ) {
                                if ( instance.options[ set[ i ][ 0 ] ] ) {
                                        set[ i ][ 1 ].apply( instance.element, args );
                                }
                        }
                }
        },
-       
-       // will be deprecated when we switch to jQuery 1.4 - use jQuery.contains()
-       contains: function( a, b ) {
-               return document.compareDocumentPosition ?
-                       a.compareDocumentPosition( b ) & 16 :
-                       a !== b && a.contains( b );
-       },
-       
+
+       contains: $.contains,
+
        // only used by resizable
        hasScroll: function( el, a ) {
-       
+
                //If overflow is hidden, the element might have extra content, but the user wants to hide it
                if ( $( el ).css( "overflow" ) === "hidden") {
                        return false;
                }
-       
+
                var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
                        has = false;
-       
+
                if ( el[ scroll ] > 0 ) {
                        return true;
                }
-       
+
                // TODO: determine which cases actually cause this to happen
                // if the element doesn't have the scroll set, see if it's possible to
                // set the scroll
@@ -319,7 +341,7 @@ $.extend( $.ui, {
                el[ scroll ] = 0;
                return has;
        },
-       
+
        // these are odd functions, fix the API or move into individual plugins
        isOverAxis: function( x, reference, size ) {
                //Determines when x coordinate is over "b" element axis
index 1fcea12..cd5d490 100644 (file)
@@ -1,18 +1,19 @@
 /*!
- * jQuery UI Datepicker 1.8.24
+ * jQuery UI Datepicker 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Datepicker
+ * http://api.jqueryui.com/datepicker/
  *
  * Depends:
  *     jquery.ui.core.js
  */
 (function( $, undefined ) {
 
-$.extend($.ui, { datepicker: { version: "1.8.24" } });
+$.extend($.ui, { datepicker: { version: "1.9.2" } });
 
 var PROP_NAME = 'datepicker';
 var dpuuid = new Date().getTime();
@@ -115,7 +116,7 @@ function Datepicker() {
 $.extend(Datepicker.prototype, {
        /* Class name added to elements to indicate already configured with a date picker. */
        markerClassName: 'hasDatepicker',
-       
+
        //Keep track of the maximum number of rows displayed (see #7043)
        maxRows: 4,
 
@@ -124,7 +125,7 @@ $.extend(Datepicker.prototype, {
                if (this.debug)
                        console.log.apply('', arguments);
        },
-       
+
        // TODO rename to "widget" when switching to widget factory
        _widgetDatepicker: function() {
                return this.dpDiv;
@@ -234,7 +235,7 @@ $.extend(Datepicker.prototype, {
                                if ($.datepicker._datepickerShowing && $.datepicker._lastInput == input[0])
                                        $.datepicker._hideDatepicker();
                                else if ($.datepicker._datepickerShowing && $.datepicker._lastInput != input[0]) {
-                                       $.datepicker._hideDatepicker(); 
+                                       $.datepicker._hideDatepicker();
                                        $.datepicker._showDatepicker(input[0]);
                                } else
                                        $.datepicker._showDatepicker(input[0]);
@@ -382,7 +383,7 @@ $.extend(Datepicker.prototype, {
                        var inline = $target.children('.' + this._inlineClass);
                        inline.children().removeClass('ui-state-disabled');
                        inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
-                               removeAttr("disabled");
+                               prop("disabled", false);
                }
                this._disabledInputs = $.map(this._disabledInputs,
                        function(value) { return (value == target ? null : value); }); // delete entry
@@ -407,7 +408,7 @@ $.extend(Datepicker.prototype, {
                        var inline = $target.children('.' + this._inlineClass);
                        inline.children().addClass('ui-state-disabled');
                        inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
-                               attr("disabled", "disabled");
+                               prop("disabled", true);
                }
                this._disabledInputs = $.map(this._disabledInputs,
                        function(value) { return (value == target ? null : value); }); // delete entry
@@ -530,7 +531,7 @@ $.extend(Datepicker.prototype, {
                                case 9: $.datepicker._hideDatepicker();
                                                handled = false;
                                                break; // hide on tab out
-                               case 13: var sel = $('td.' + $.datepicker._dayOverClass + ':not(.' + 
+                               case 13: var sel = $('td.' + $.datepicker._dayOverClass + ':not(.' +
                                                                        $.datepicker._currentClass + ')', inst.dpDiv);
                                                if (sel[0])
                                                        $.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);
@@ -628,7 +629,7 @@ $.extend(Datepicker.prototype, {
        },
 
        /* Pop-up the date picker for a given input field.
-       If false returned from beforeShow event handler do not show. 
+          If false returned from beforeShow event handler do not show.
           @param  input  element - the input field attached to the date picker or
                          event - if triggered by focus */
        _showDatepicker: function(input) {
@@ -647,7 +648,7 @@ $.extend(Datepicker.prototype, {
                var beforeShow = $.datepicker._get(inst, 'beforeShow');
                var beforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {};
                if(beforeShowSettings === false){
-            //false
+                       //false
                        return;
                }
                extendRemove(inst.settings, beforeShowSettings);
@@ -665,10 +666,6 @@ $.extend(Datepicker.prototype, {
                        isFixed |= $(this).css('position') == 'fixed';
                        return !isFixed;
                });
-               if (isFixed && $.browser.opera) { // correction for Opera when fixed and scrolled
-                       $.datepicker._pos[0] -= document.documentElement.scrollLeft;
-                       $.datepicker._pos[1] -= document.documentElement.scrollTop;
-               }
                var offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};
                $.datepicker._pos = null;
                //to avoid flashes on Firefox
@@ -695,7 +692,9 @@ $.extend(Datepicker.prototype, {
                        };
                        inst.dpDiv.zIndex($(input).zIndex()+1);
                        $.datepicker._datepickerShowing = true;
-                       if ($.effects && $.effects[showAnim])
+
+                       // DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
+                       if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) )
                                inst.dpDiv.show(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
                        else
                                inst.dpDiv[showAnim || 'show']((showAnim ? duration : null), postProcess);
@@ -709,8 +708,7 @@ $.extend(Datepicker.prototype, {
 
        /* Generate the date picker content. */
        _updateDatepicker: function(inst) {
-               var self = this;
-               self.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
+               this.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
                var borders = $.datepicker._getBorders(inst.dpDiv);
                instActive = inst; // for delegate hover events
                inst.dpDiv.empty().append(this._generateHTML(inst));
@@ -735,7 +733,7 @@ $.extend(Datepicker.prototype, {
                                // this breaks the change event in IE
                                inst.input.is(':visible') && !inst.input.is(':disabled') && inst.input[0] != document.activeElement)
                        inst.input.focus();
-               // deffered render of the years select (to avoid flashes on Firefox) 
+               // deffered render of the years select (to avoid flashes on Firefox)
                if( inst.yearshtml ){
                        var origyearshtml = inst.yearshtml;
                        setTimeout(function(){
@@ -785,11 +783,11 @@ $.extend(Datepicker.prototype, {
        _findPos: function(obj) {
                var inst = this._getInst(obj);
                var isRTL = this._get(inst, 'isRTL');
-        while (obj && (obj.type == 'hidden' || obj.nodeType != 1 || $.expr.filters.hidden(obj))) {
-            obj = obj[isRTL ? 'previousSibling' : 'nextSibling'];
-        }
-        var position = $(obj).offset();
-           return [position.left, position.top];
+               while (obj && (obj.type == 'hidden' || obj.nodeType != 1 || $.expr.filters.hidden(obj))) {
+                       obj = obj[isRTL ? 'previousSibling' : 'nextSibling'];
+               }
+               var position = $(obj).offset();
+               return [position.left, position.top];
        },
 
        /* Hide the date picker from view.
@@ -804,7 +802,9 @@ $.extend(Datepicker.prototype, {
                        var postProcess = function() {
                                $.datepicker._tidyDialog(inst);
                        };
-                       if ($.effects && $.effects[showAnim])
+
+                       // DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
+                       if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) )
                                inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
                        else
                                inst.dpDiv[(showAnim == 'slideDown' ? 'slideUp' :
@@ -1096,7 +1096,10 @@ $.extend(Datepicker.prototype, {
                                }
                }
                if (iValue < value.length){
-                       throw "Extra/unparsed characters found in date: " + value.substring(iValue);
+                       var extra = value.substr(iValue);
+                       if (!/^\s+/.test(extra)) {
+                               throw "Extra/unparsed characters found in date: " + extra;
+                       }
                }
                if (year == -1)
                        year = new Date().getFullYear();
@@ -1439,7 +1442,7 @@ $.extend(Datepicker.prototype, {
                        $(this).bind(this.getAttribute('data-event'), handler[this.getAttribute('data-handler')]);
                });
        },
-       
+
        /* Generate the HTML for the current state of the date picker. */
        _generateHTML: function(inst) {
                var today = new Date();
@@ -1596,13 +1599,13 @@ $.extend(Datepicker.prototype, {
                                        drawMonth = 0;
                                        drawYear++;
                                }
-                               calender += '</tbody></table>' + (isMultiMonth ? '</div>' + 
+                               calender += '</tbody></table>' + (isMultiMonth ? '</div>' +
                                                        ((numMonths[0] > 0 && col == numMonths[1]-1) ? '<div class="ui-datepicker-row-break"></div>' : '') : '');
                                group += calender;
                        }
                        html += group;
                }
-               html += buttonPanel + ($.browser.msie && parseInt($.browser.version,10) < 7 && !inst.inline ?
+               html += buttonPanel + ($.ui.ie6 && !inst.inline ?
                        '<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>' : '');
                inst._keyEvent = false;
                return html;
@@ -1660,7 +1663,7 @@ $.extend(Datepicker.prototype, {
                                                '>' + year + '</option>';
                                }
                                inst.yearshtml += '</select>';
-                               
+
                                html += inst.yearshtml;
                                inst.yearshtml = null;
                        }
@@ -1771,26 +1774,21 @@ $.extend(Datepicker.prototype, {
  * Bind hover events for datepicker elements.
  * Done via delegate so the binding only occurs once in the lifetime of the parent div.
  * Global instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
- */ 
+ */
 function bindHover(dpDiv) {
        var selector = 'button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a';
-       return dpDiv.bind('mouseout', function(event) {
-                       var elem = $( event.target ).closest( selector );
-                       if ( !elem.length ) {
-                               return;
-                       }
-                       elem.removeClass( "ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover" );
+       return dpDiv.delegate(selector, 'mouseout', function() {
+                       $(this).removeClass('ui-state-hover');
+                       if (this.className.indexOf('ui-datepicker-prev') != -1) $(this).removeClass('ui-datepicker-prev-hover');
+                       if (this.className.indexOf('ui-datepicker-next') != -1) $(this).removeClass('ui-datepicker-next-hover');
                })
-               .bind('mouseover', function(event) {
-                       var elem = $( event.target ).closest( selector );
-                       if ($.datepicker._isDisabledDatepicker( instActive.inline ? dpDiv.parent()[0] : instActive.input[0]) ||
-                                       !elem.length ) {
-                               return;
+               .delegate(selector, 'mouseover', function(){
+                       if (!$.datepicker._isDisabledDatepicker( instActive.inline ? dpDiv.parent()[0] : instActive.input[0])) {
+                               $(this).parents('.ui-datepicker-calendar').find('a').removeClass('ui-state-hover');
+                               $(this).addClass('ui-state-hover');
+                               if (this.className.indexOf('ui-datepicker-prev') != -1) $(this).addClass('ui-datepicker-prev-hover');
+                               if (this.className.indexOf('ui-datepicker-next') != -1) $(this).addClass('ui-datepicker-next-hover');
                        }
-                       elem.parents('.ui-datepicker-calendar').find('a').removeClass('ui-state-hover');
-                       elem.addClass('ui-state-hover');
-                       if (elem.hasClass('ui-datepicker-prev')) elem.addClass('ui-datepicker-prev-hover');
-                       if (elem.hasClass('ui-datepicker-next')) elem.addClass('ui-datepicker-next-hover');
                });
 }
 
@@ -1803,27 +1801,21 @@ function extendRemove(target, props) {
        return target;
 };
 
-/* Determine whether an object is an array. */
-function isArray(a) {
-       return (a && (($.browser.safari && typeof a == 'object' && a.length) ||
-               (a.constructor && a.constructor.toString().match(/\Array\(\)/))));
-};
-
 /* Invoke the datepicker functionality.
    @param  options  string - a command, optionally followed by additional parameters or
-                    Object - settings for attaching new datepicker functionality
+                       Object - settings for attaching new datepicker functionality
    @return  jQuery object */
 $.fn.datepicker = function(options){
-       
+
        /* Verify an empty collection wasn't passed - Fixes #6976 */
        if ( !this.length ) {
                return this;
        }
-       
+
        /* Initialise the date picker. */
        if (!$.datepicker.initialized) {
                $(document).mousedown($.datepicker._checkExternalClick).
-                       find('body').append($.datepicker.dpDiv);
+                       find(document.body).append($.datepicker.dpDiv);
                $.datepicker.initialized = true;
        }
 
@@ -1845,7 +1837,7 @@ $.fn.datepicker = function(options){
 $.datepicker = new Datepicker(); // singleton instance
 $.datepicker.initialized = false;
 $.datepicker.uuid = new Date().getTime();
-$.datepicker.version = "1.8.24";
+$.datepicker.version = "1.9.2";
 
 // Workaround for #4055
 // Add another global to avoid noConflict issues with inline event handlers
index 06b85f2..75a9e8f 100644 (file)
@@ -1,11 +1,12 @@
 /*!
- * jQuery UI Dialog 1.8.24
+ * jQuery UI Dialog 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Dialog
+ * http://api.jqueryui.com/dialog/
  *
  * Depends:
  *     jquery.ui.core.js
  */
 (function( $, undefined ) {
 
-var uiDialogClasses =
-               'ui-dialog ' +
-               'ui-widget ' +
-               'ui-widget-content ' +
-               'ui-corner-all ',
+var uiDialogClasses = "ui-dialog ui-widget ui-widget-content ui-corner-all ",
        sizeRelatedOptions = {
                buttons: true,
                height: true,
@@ -40,158 +37,167 @@ var uiDialogClasses =
        };
 
 $.widget("ui.dialog", {
+       version: "1.9.2",
        options: {
                autoOpen: true,
                buttons: {},
                closeOnEscape: true,
-               closeText: 'close',
-               dialogClass: '',
+               closeText: "close",
+               dialogClass: "",
                draggable: true,
                hide: null,
-               height: 'auto',
+               height: "auto",
                maxHeight: false,
                maxWidth: false,
                minHeight: 150,
                minWidth: 150,
                modal: false,
                position: {
-                       my: 'center',
-                       at: 'center',
-                       collision: 'fit',
+                       my: "center",
+                       at: "center",
+                       of: window,
+                       collision: "fit",
                        // ensure that the titlebar is never outside the document
-                       using: function(pos) {
-                               var topOffset = $(this).css(pos).offset().top;
-                               if (topOffset < 0) {
-                                       $(this).css('top', pos.top - topOffset);
+                       using: function( pos ) {
+                               var topOffset = $( this ).css( pos ).offset().top;
+                               if ( topOffset < 0 ) {
+                                       $( this ).css( "top", pos.top - topOffset );
                                }
                        }
                },
                resizable: true,
                show: null,
                stack: true,
-               title: '',
+               title: "",
                width: 300,
                zIndex: 1000
        },
 
        _create: function() {
-               this.originalTitle = this.element.attr('title');
+               this.originalTitle = this.element.attr( "title" );
                // #5742 - .attr() might return a DOMElement
                if ( typeof this.originalTitle !== "string" ) {
                        this.originalTitle = "";
                }
-
+               this.oldPosition = {
+                       parent: this.element.parent(),
+                       index: this.element.parent().children().index( this.element )
+               };
                this.options.title = this.options.title || this.originalTitle;
-               var self = this,
-                       options = self.options,
-
-                       title = options.title || '&#160;',
-                       titleId = $.ui.dialog.getTitleId(self.element),
-
-                       uiDialog = (self.uiDialog = $('<div></div>'))
-                               .appendTo(document.body)
-                               .hide()
-                               .addClass(uiDialogClasses + options.dialogClass)
+               var that = this,
+                       options = this.options,
+
+                       title = options.title || "&#160;",
+                       uiDialog,
+                       uiDialogTitlebar,
+                       uiDialogTitlebarClose,
+                       uiDialogTitle,
+                       uiDialogButtonPane;
+
+                       uiDialog = ( this.uiDialog = $( "<div>" ) )
+                               .addClass( uiDialogClasses + options.dialogClass )
                                .css({
+                                       display: "none",
+                                       outline: 0, // TODO: move to stylesheet
                                        zIndex: options.zIndex
                                })
                                // setting tabIndex makes the div focusable
-                               // setting outline to 0 prevents a border on focus in Mozilla
-                               .attr('tabIndex', -1).css('outline', 0).keydown(function(event) {
-                                       if (options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
-                                               event.keyCode === $.ui.keyCode.ESCAPE) {
-                                               
-                                               self.close(event);
+                               .attr( "tabIndex", -1)
+                               .keydown(function( event ) {
+                                       if ( options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
+                                                       event.keyCode === $.ui.keyCode.ESCAPE ) {
+                                               that.close( event );
                                                event.preventDefault();
                                        }
                                })
-                               .attr({
-                                       role: 'dialog',
-                                       'aria-labelledby': titleId
+                               .mousedown(function( event ) {
+                                       that.moveToTop( false, event );
                                })
-                               .mousedown(function(event) {
-                                       self.moveToTop(false, event);
-                               }),
+                               .appendTo( "body" );
 
-                       uiDialogContent = self.element
+                       this.element
                                .show()
-                               .removeAttr('title')
-                               .addClass(
-                                       'ui-dialog-content ' +
-                                       'ui-widget-content')
-                               .appendTo(uiDialog),
-
-                       uiDialogTitlebar = (self.uiDialogTitlebar = $('<div></div>'))
-                               .addClass(
-                                       'ui-dialog-titlebar ' +
-                                       'ui-widget-header ' +
-                                       'ui-corner-all ' +
-                                       'ui-helper-clearfix'
-                               )
-                               .prependTo(uiDialog),
-
-                       uiDialogTitlebarClose = $('<a href="#"></a>')
-                               .addClass(
-                                       'ui-dialog-titlebar-close ' +
-                                       'ui-corner-all'
-                               )
-                               .attr('role', 'button')
-                               .hover(
-                                       function() {
-                                               uiDialogTitlebarClose.addClass('ui-state-hover');
-                                       },
-                                       function() {
-                                               uiDialogTitlebarClose.removeClass('ui-state-hover');
-                                       }
-                               )
-                               .focus(function() {
-                                       uiDialogTitlebarClose.addClass('ui-state-focus');
-                               })
-                               .blur(function() {
-                                       uiDialogTitlebarClose.removeClass('ui-state-focus');
+                               .removeAttr( "title" )
+                               .addClass( "ui-dialog-content ui-widget-content" )
+                               .appendTo( uiDialog );
+
+                       uiDialogTitlebar = ( this.uiDialogTitlebar = $( "<div>" ) )
+                               .addClass( "ui-dialog-titlebar  ui-widget-header  " +
+                                       "ui-corner-all  ui-helper-clearfix" )
+                               .bind( "mousedown", function() {
+                                       // Dialog isn't getting focus when dragging (#8063)
+                                       uiDialog.focus();
                                })
-                               .click(function(event) {
-                                       self.close(event);
-                                       return false;
+                               .prependTo( uiDialog );
+
+                       uiDialogTitlebarClose = $( "<a href='#'></a>" )
+                               .addClass( "ui-dialog-titlebar-close  ui-corner-all" )
+                               .attr( "role", "button" )
+                               .click(function( event ) {
+                                       event.preventDefault();
+                                       that.close( event );
                                })
-                               .appendTo(uiDialogTitlebar),
+                               .appendTo( uiDialogTitlebar );
 
-                       uiDialogTitlebarCloseText = (self.uiDialogTitlebarCloseText = $('<span></span>'))
-                               .addClass(
-                                       'ui-icon ' +
-                                       'ui-icon-closethick'
-                               )
-                               .text(options.closeText)
-                               .appendTo(uiDialogTitlebarClose),
+                       ( this.uiDialogTitlebarCloseText = $( "<span>" ) )
+                               .addClass( "ui-icon ui-icon-closethick" )
+                               .text( options.closeText )
+                               .appendTo( uiDialogTitlebarClose );
 
-                       uiDialogTitle = $('<span></span>')
-                               .addClass('ui-dialog-title')
-                               .attr('id', titleId)
-                               .html(title)
-                               .prependTo(uiDialogTitlebar);
+                       uiDialogTitle = $( "<span>" )
+                               .uniqueId()
+                               .addClass( "ui-dialog-title" )
+                               .html( title )
+                               .prependTo( uiDialogTitlebar );
 
-               //handling of deprecated beforeclose (vs beforeClose) option
-               //Ticket #4669 http://dev.jqueryui.com/ticket/4669
-               //TODO: remove in 1.9pre
-               if ($.isFunction(options.beforeclose) && !$.isFunction(options.beforeClose)) {
-                       options.beforeClose = options.beforeclose;
-               }
+                       uiDialogButtonPane = ( this.uiDialogButtonPane = $( "<div>" ) )
+                               .addClass( "ui-dialog-buttonpane ui-widget-content ui-helper-clearfix" );
+
+                       ( this.uiButtonSet = $( "<div>" ) )
+                               .addClass( "ui-dialog-buttonset" )
+                               .appendTo( uiDialogButtonPane );
 
-               uiDialogTitlebar.find("*").add(uiDialogTitlebar).disableSelection();
+               uiDialog.attr({
+                       role: "dialog",
+                       "aria-labelledby": uiDialogTitle.attr( "id" )
+               });
 
-               if (options.draggable && $.fn.draggable) {
-                       self._makeDraggable();
+               uiDialogTitlebar.find( "*" ).add( uiDialogTitlebar ).disableSelection();
+               this._hoverable( uiDialogTitlebarClose );
+               this._focusable( uiDialogTitlebarClose );
+
+               if ( options.draggable && $.fn.draggable ) {
+                       this._makeDraggable();
                }
-               if (options.resizable && $.fn.resizable) {
-                       self._makeResizable();
+               if ( options.resizable && $.fn.resizable ) {
+                       this._makeResizable();
                }
 
-               self._createButtons(options.buttons);
-               self._isOpen = false;
+               this._createButtons( options.buttons );
+               this._isOpen = false;
 
-               if ($.fn.bgiframe) {
+               if ( $.fn.bgiframe ) {
                        uiDialog.bgiframe();
                }
+
+               // prevent tabbing out of modal dialogs
+               this._on( uiDialog, { keydown: function( event ) {
+                       if ( !options.modal || event.keyCode !== $.ui.keyCode.TAB ) {
+                               return;
+                       }
+
+                       var tabbables = $( ":tabbable", uiDialog ),
+                               first = tabbables.filter( ":first" ),
+                               last  = tabbables.filter( ":last" );
+
+                       if ( event.target === last[0] && !event.shiftKey ) {
+                               first.focus( 1 );
+                               return false;
+                       } else if ( event.target === first[0] && event.shiftKey ) {
+                               last.focus( 1 );
+                               return false;
+                       }
+               }});
        },
 
        _init: function() {
@@ -200,72 +206,81 @@ $.widget("ui.dialog", {
                }
        },
 
-       destroy: function() {
-               var self = this;
-               
-               if (self.overlay) {
-                       self.overlay.destroy();
+       _destroy: function() {
+               var next,
+                       oldPosition = this.oldPosition;
+
+               if ( this.overlay ) {
+                       this.overlay.destroy();
                }
-               self.uiDialog.hide();
-               self.element
-                       .unbind('.dialog')
-                       .removeData('dialog')
-                       .removeClass('ui-dialog-content ui-widget-content')
-                       .hide().appendTo('body');
-               self.uiDialog.remove();
+               this.uiDialog.hide();
+               this.element
+                       .removeClass( "ui-dialog-content ui-widget-content" )
+                       .hide()
+                       .appendTo( "body" );
+               this.uiDialog.remove();
 
-               if (self.originalTitle) {
-                       self.element.attr('title', self.originalTitle);
+               if ( this.originalTitle ) {
+                       this.element.attr( "title", this.originalTitle );
                }
 
-               return self;
+               next = oldPosition.parent.children().eq( oldPosition.index );
+               // Don't try to place the dialog next to itself (#8613)
+               if ( next.length && next[ 0 ] !== this.element[ 0 ] ) {
+                       next.before( this.element );
+               } else {
+                       oldPosition.parent.append( this.element );
+               }
        },
 
        widget: function() {
                return this.uiDialog;
        },
 
-       close: function(event) {
-               var self = this,
+       close: function( event ) {
+               var that = this,
                        maxZ, thisZ;
-               
-               if (false === self._trigger('beforeClose', event)) {
+
+               if ( !this._isOpen ) {
                        return;
                }
 
-               if (self.overlay) {
-                       self.overlay.destroy();
+               if ( false === this._trigger( "beforeClose", event ) ) {
+                       return;
                }
-               self.uiDialog.unbind('keypress.ui-dialog');
 
-               self._isOpen = false;
+               this._isOpen = false;
+
+               if ( this.overlay ) {
+                       this.overlay.destroy();
+               }
 
-               if (self.options.hide) {
-                       self.uiDialog.hide(self.options.hide, function() {
-                               self._trigger('close', event);
+               if ( this.options.hide ) {
+                       this._hide( this.uiDialog, this.options.hide, function() {
+                               that._trigger( "close", event );
                        });
                } else {
-                       self.uiDialog.hide();
-                       self._trigger('close', event);
+                       this.uiDialog.hide();
+                       this._trigger( "close", event );
                }
 
                $.ui.dialog.overlay.resize();
 
                // adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
-               if (self.options.modal) {
+               if ( this.options.modal ) {
                        maxZ = 0;
-                       $('.ui-dialog').each(function() {
-                               if (this !== self.uiDialog[0]) {
-                                       thisZ = $(this).css('z-index');
-                                       if(!isNaN(thisZ)) {
-                                               maxZ = Math.max(maxZ, thisZ);
+                       $( ".ui-dialog" ).each(function() {
+                               if ( this !== that.uiDialog[0] ) {
+                                       thisZ = $( this ).css( "z-index" );
+                                       if ( !isNaN( thisZ ) ) {
+                                               maxZ = Math.max( maxZ, thisZ );
                                        }
                                }
                        });
                        $.ui.dialog.maxZ = maxZ;
                }
 
-               return self;
+               return this;
        },
 
        isOpen: function() {
@@ -274,179 +289,158 @@ $.widget("ui.dialog", {
 
        // the force parameter allows us to move modal dialogs to their correct
        // position on open
-       moveToTop: function(force, event) {
-               var self = this,
-                       options = self.options,
+       moveToTop: function( force, event ) {
+               var options = this.options,
                        saveScroll;
 
-               if ((options.modal && !force) ||
-                       (!options.stack && !options.modal)) {
-                       return self._trigger('focus', event);
+               if ( ( options.modal && !force ) ||
+                               ( !options.stack && !options.modal ) ) {
+                       return this._trigger( "focus", event );
                }
 
-               if (options.zIndex > $.ui.dialog.maxZ) {
+               if ( options.zIndex > $.ui.dialog.maxZ ) {
                        $.ui.dialog.maxZ = options.zIndex;
                }
-               if (self.overlay) {
+               if ( this.overlay ) {
                        $.ui.dialog.maxZ += 1;
-                       self.overlay.$el.css('z-index', $.ui.dialog.overlay.maxZ = $.ui.dialog.maxZ);
+                       $.ui.dialog.overlay.maxZ = $.ui.dialog.maxZ;
+                       this.overlay.$el.css( "z-index", $.ui.dialog.overlay.maxZ );
                }
 
-               //Save and then restore scroll since Opera 9.5+ resets when parent z-Index is changed.
-               //  http://ui.jquery.com/bugs/ticket/3193
-               saveScroll = { scrollTop: self.element.scrollTop(), scrollLeft: self.element.scrollLeft() };
+               // Save and then restore scroll
+               // Opera 9.5+ resets when parent z-index is changed.
+               // http://bugs.jqueryui.com/ticket/3193
+               saveScroll = {
+                       scrollTop: this.element.scrollTop(),
+                       scrollLeft: this.element.scrollLeft()
+               };
                $.ui.dialog.maxZ += 1;
-               self.uiDialog.css('z-index', $.ui.dialog.maxZ);
-               self.element.attr(saveScroll);
-               self._trigger('focus', event);
+               this.uiDialog.css( "z-index", $.ui.dialog.maxZ );
+               this.element.attr( saveScroll );
+               this._trigger( "focus", event );
 
-               return self;
+               return this;
        },
 
        open: function() {
-               if (this._isOpen) { return; }
-
-               var self = this,
-                       options = self.options,
-                       uiDialog = self.uiDialog;
-
-               self.overlay = options.modal ? new $.ui.dialog.overlay(self) : null;
-               self._size();
-               self._position(options.position);
-               uiDialog.show(options.show);
-               self.moveToTop(true);
+               if ( this._isOpen ) {
+                       return;
+               }
 
-               // prevent tabbing out of modal dialogs
-               if ( options.modal ) {
-                       uiDialog.bind( "keydown.ui-dialog", function( event ) {
-                               if ( event.keyCode !== $.ui.keyCode.TAB ) {
-                                       return;
-                               }
+               var hasFocus,
+                       options = this.options,
+                       uiDialog = this.uiDialog;
 
-                               var tabbables = $(':tabbable', this),
-                                       first = tabbables.filter(':first'),
-                                       last  = tabbables.filter(':last');
-
-                               if (event.target === last[0] && !event.shiftKey) {
-                                       first.focus(1);
-                                       return false;
-                               } else if (event.target === first[0] && event.shiftKey) {
-                                       last.focus(1);
-                                       return false;
-                               }
-                       });
-               }
+               this._size();
+               this._position( options.position );
+               uiDialog.show( options.show );
+               this.overlay = options.modal ? new $.ui.dialog.overlay( this ) : null;
+               this.moveToTop( true );
 
                // set focus to the first tabbable element in the content area or the first button
                // if there are no tabbable elements, set focus on the dialog itself
-               $(self.element.find(':tabbable').get().concat(
-                       uiDialog.find('.ui-dialog-buttonpane :tabbable').get().concat(
-                               uiDialog.get()))).eq(0).focus();
+               hasFocus = this.element.find( ":tabbable" );
+               if ( !hasFocus.length ) {
+                       hasFocus = this.uiDialogButtonPane.find( ":tabbable" );
+                       if ( !hasFocus.length ) {
+                               hasFocus = uiDialog;
+                       }
+               }
+               hasFocus.eq( 0 ).focus();
 
-               self._isOpen = true;
-               self._trigger('open');
+               this._isOpen = true;
+               this._trigger( "open" );
 
-               return self;
+               return this;
        },
 
-       _createButtons: function(buttons) {
-               var self = this,
-                       hasButtons = false,
-                       uiDialogButtonPane = $('<div></div>')
-                               .addClass(
-                                       'ui-dialog-buttonpane ' +
-                                       'ui-widget-content ' +
-                                       'ui-helper-clearfix'
-                               ),
-                       uiButtonSet = $( "<div></div>" )
-                               .addClass( "ui-dialog-buttonset" )
-                               .appendTo( uiDialogButtonPane );
+       _createButtons: function( buttons ) {
+               var that = this,
+                       hasButtons = false;
 
                // if we already have a button pane, remove it
-               self.uiDialog.find('.ui-dialog-buttonpane').remove();
+               this.uiDialogButtonPane.remove();
+               this.uiButtonSet.empty();
 
-               if (typeof buttons === 'object' && buttons !== null) {
-                       $.each(buttons, function() {
+               if ( typeof buttons === "object" && buttons !== null ) {
+                       $.each( buttons, function() {
                                return !(hasButtons = true);
                        });
                }
-               if (hasButtons) {
-                       $.each(buttons, function(name, props) {
+               if ( hasButtons ) {
+                       $.each( buttons, function( name, props ) {
+                               var button, click;
                                props = $.isFunction( props ) ?
                                        { click: props, text: name } :
                                        props;
-                               var button = $('<button type="button"></button>')
-                                       .click(function() {
-                                               props.click.apply(self.element[0], arguments);
-                                       })
-                                       .appendTo(uiButtonSet);
-                               // can't use .attr( props, true ) with jQuery 1.3.2.
-                               $.each( props, function( key, value ) {
-                                       if ( key === "click" ) {
-                                               return;
-                                       }
-                                       if ( key in button ) {
-                                               button[ key ]( value );
-                                       } else {
-                                               button.attr( key, value );
-                                       }
-                               });
-                               if ($.fn.button) {
+                               // Default to a non-submitting button
+                               props = $.extend( { type: "button" }, props );
+                               // Change the context for the click callback to be the main element
+                               click = props.click;
+                               props.click = function() {
+                                       click.apply( that.element[0], arguments );
+                               };
+                               button = $( "<button></button>", props )
+                                       .appendTo( that.uiButtonSet );
+                               if ( $.fn.button ) {
                                        button.button();
                                }
                        });
-                       uiDialogButtonPane.appendTo(self.uiDialog);
+                       this.uiDialog.addClass( "ui-dialog-buttons" );
+                       this.uiDialogButtonPane.appendTo( this.uiDialog );
+               } else {
+                       this.uiDialog.removeClass( "ui-dialog-buttons" );
                }
        },
 
        _makeDraggable: function() {
-               var self = this,
-                       options = self.options,
-                       doc = $(document),
-                       heightBeforeDrag;
+               var that = this,
+                       options = this.options;
 
-               function filteredUi(ui) {
+               function filteredUi( ui ) {
                        return {
                                position: ui.position,
                                offset: ui.offset
                        };
                }
 
-               self.uiDialog.draggable({
-                       cancel: '.ui-dialog-content, .ui-dialog-titlebar-close',
-                       handle: '.ui-dialog-titlebar',
-                       containment: 'document',
-                       start: function(event, ui) {
-                               heightBeforeDrag = options.height === "auto" ? "auto" : $(this).height();
-                               $(this).height($(this).height()).addClass("ui-dialog-dragging");
-                               self._trigger('dragStart', event, filteredUi(ui));
+               this.uiDialog.draggable({
+                       cancel: ".ui-dialog-content, .ui-dialog-titlebar-close",
+                       handle: ".ui-dialog-titlebar",
+                       containment: "document",
+                       start: function( event, ui ) {
+                               $( this )
+                                       .addClass( "ui-dialog-dragging" );
+                               that._trigger( "dragStart", event, filteredUi( ui ) );
                        },
-                       drag: function(event, ui) {
-                               self._trigger('drag', event, filteredUi(ui));
+                       drag: function( event, ui ) {
+                               that._trigger( "drag", event, filteredUi( ui ) );
                        },
-                       stop: function(event, ui) {
-                               options.position = [ui.position.left - doc.scrollLeft(),
-                                       ui.position.top - doc.scrollTop()];
-                               $(this).removeClass("ui-dialog-dragging").height(heightBeforeDrag);
-                               self._trigger('dragStop', event, filteredUi(ui));
+                       stop: function( event, ui ) {
+                               options.position = [
+                                       ui.position.left - that.document.scrollLeft(),
+                                       ui.position.top - that.document.scrollTop()
+                               ];
+                               $( this )
+                                       .removeClass( "ui-dialog-dragging" );
+                               that._trigger( "dragStop", event, filteredUi( ui ) );
                                $.ui.dialog.overlay.resize();
                        }
                });
        },
 
-       _makeResizable: function(handles) {
+       _makeResizable: function( handles ) {
                handles = (handles === undefined ? this.options.resizable : handles);
-               var self = this,
-                       options = self.options,
+               var that = this,
+                       options = this.options,
                        // .ui-resizable has position: relative defined in the stylesheet
                        // but dialogs have to use absolute or fixed positioning
-                       position = self.uiDialog.css('position'),
-                       resizeHandles = (typeof handles === 'string' ?
+                       position = this.uiDialog.css( "position" ),
+                       resizeHandles = typeof handles === 'string' ?
                                handles :
-                               'n,e,s,w,se,sw,ne,nw'
-                       );
+                               "n,e,s,w,se,sw,ne,nw";
 
-               function filteredUi(ui) {
+               function filteredUi( ui ) {
                        return {
                                originalPosition: ui.originalPosition,
                                originalSize: ui.originalSize,
@@ -455,101 +449,99 @@ $.widget("ui.dialog", {
                        };
                }
 
-               self.uiDialog.resizable({
-                       cancel: '.ui-dialog-content',
-                       containment: 'document',
-                       alsoResize: self.element,
+               this.uiDialog.resizable({
+                       cancel: ".ui-dialog-content",
+                       containment: "document",
+                       alsoResize: this.element,
                        maxWidth: options.maxWidth,
                        maxHeight: options.maxHeight,
                        minWidth: options.minWidth,
-                       minHeight: self._minHeight(),
+                       minHeight: this._minHeight(),
                        handles: resizeHandles,
-                       start: function(event, ui) {
-                               $(this).addClass("ui-dialog-resizing");
-                               self._trigger('resizeStart', event, filteredUi(ui));
+                       start: function( event, ui ) {
+                               $( this ).addClass( "ui-dialog-resizing" );
+                               that._trigger( "resizeStart", event, filteredUi( ui ) );
                        },
-                       resize: function(event, ui) {
-                               self._trigger('resize', event, filteredUi(ui));
+                       resize: function( event, ui ) {
+                               that._trigger( "resize", event, filteredUi( ui ) );
                        },
-                       stop: function(event, ui) {
-                               $(this).removeClass("ui-dialog-resizing");
-                               options.height = $(this).height();
-                               options.width = $(this).width();
-                               self._trigger('resizeStop', event, filteredUi(ui));
+                       stop: function( event, ui ) {
+                               $( this ).removeClass( "ui-dialog-resizing" );
+                               options.height = $( this ).height();
+                               options.width = $( this ).width();
+                               that._trigger( "resizeStop", event, filteredUi( ui ) );
                                $.ui.dialog.overlay.resize();
                        }
                })
-               .css('position', position)
-               .find('.ui-resizable-se').addClass('ui-icon ui-icon-grip-diagonal-se');
+               .css( "position", position )
+               .find( ".ui-resizable-se" )
+                       .addClass( "ui-icon ui-icon-grip-diagonal-se" );
        },
 
        _minHeight: function() {
                var options = this.options;
 
-               if (options.height === 'auto') {
+               if ( options.height === "auto" ) {
                        return options.minHeight;
                } else {
-                       return Math.min(options.minHeight, options.height);
+                       return Math.min( options.minHeight, options.height );
                }
        },
 
-       _position: function(position) {
+       _position: function( position ) {
                var myAt = [],
-                       offset = [0, 0],
+                       offset = [ 0, 0 ],
                        isVisible;
 
-               if (position) {
+               if ( position ) {
                        // deep extending converts arrays to objects in jQuery <= 1.3.2 :-(
        //              if (typeof position == 'string' || $.isArray(position)) {
        //                      myAt = $.isArray(position) ? position : position.split(' ');
 
-                       if (typeof position === 'string' || (typeof position === 'object' && '0' in position)) {
-                               myAt = position.split ? position.split(' ') : [position[0], position[1]];
-                               if (myAt.length === 1) {
-                                       myAt[1] = myAt[0];
+                       if ( typeof position === "string" || (typeof position === "object" && "0" in position ) ) {
+                               myAt = position.split ? position.split( " " ) : [ position[ 0 ], position[ 1 ] ];
+                               if ( myAt.length === 1 ) {
+                                       myAt[ 1 ] = myAt[ 0 ];
                                }
 
-                               $.each(['left', 'top'], function(i, offsetPosition) {
-                                       if (+myAt[i] === myAt[i]) {
-                                               offset[i] = myAt[i];
-                                               myAt[i] = offsetPosition;
+                               $.each( [ "left", "top" ], function( i, offsetPosition ) {
+                                       if ( +myAt[ i ] === myAt[ i ] ) {
+                                               offset[ i ] = myAt[ i ];
+                                               myAt[ i ] = offsetPosition;
                                        }
                                });
 
                                position = {
-                                       my: myAt.join(" "),
-                                       at: myAt.join(" "),
-                                       offset: offset.join(" ")
+                                       my: myAt[0] + (offset[0] < 0 ? offset[0] : "+" + offset[0]) + " " +
+                                               myAt[1] + (offset[1] < 0 ? offset[1] : "+" + offset[1]),
+                                       at: myAt.join( " " )
                                };
-                       } 
+                       }
 
-                       position = $.extend({}, $.ui.dialog.prototype.options.position, position);
+                       position = $.extend( {}, $.ui.dialog.prototype.options.position, position );
                } else {
                        position = $.ui.dialog.prototype.options.position;
                }
 
                // need to show the dialog to get the actual offset in the position plugin
-               isVisible = this.uiDialog.is(':visible');
-               if (!isVisible) {
+               isVisible = this.uiDialog.is( ":visible" );
+               if ( !isVisible ) {
                        this.uiDialog.show();
                }
-               this.uiDialog
-                       // workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781
-                       .css({ top: 0, left: 0 })
-                       .position($.extend({ of: window }, position));
-               if (!isVisible) {
+               this.uiDialog.position( position );
+               if ( !isVisible ) {
                        this.uiDialog.hide();
                }
        },
 
        _setOptions: function( options ) {
-               var self = this,
+               var that = this,
                        resizableOptions = {},
                        resize = false;
 
                $.each( options, function( key, value ) {
-                       self._setOption( key, value );
-                       
+                       that._setOption( key, value );
+
                        if ( key in sizeRelatedOptions ) {
                                resize = true;
                        }
@@ -566,104 +558,98 @@ $.widget("ui.dialog", {
                }
        },
 
-       _setOption: function(key, value){
-               var self = this,
-                       uiDialog = self.uiDialog;
+       _setOption: function( key, value ) {
+               var isDraggable, isResizable,
+                       uiDialog = this.uiDialog;
 
-               switch (key) {
-                       //handling of deprecated beforeclose (vs beforeClose) option
-                       //Ticket #4669 http://dev.jqueryui.com/ticket/4669
-                       //TODO: remove in 1.9pre
-                       case "beforeclose":
-                               key = "beforeClose";
-                               break;
+               switch ( key ) {
                        case "buttons":
-                               self._createButtons(value);
+                               this._createButtons( value );
                                break;
                        case "closeText":
                                // ensure that we always pass a string
-                               self.uiDialogTitlebarCloseText.text("" + value);
+                               this.uiDialogTitlebarCloseText.text( "" + value );
                                break;
                        case "dialogClass":
                                uiDialog
-                                       .removeClass(self.options.dialogClass)
-                                       .addClass(uiDialogClasses + value);
+                                       .removeClass( this.options.dialogClass )
+                                       .addClass( uiDialogClasses + value );
                                break;
                        case "disabled":
-                               if (value) {
-                                       uiDialog.addClass('ui-dialog-disabled');
+                               if ( value ) {
+                                       uiDialog.addClass( "ui-dialog-disabled" );
                                } else {
-                                       uiDialog.removeClass('ui-dialog-disabled');
+                                       uiDialog.removeClass( "ui-dialog-disabled" );
                                }
                                break;
                        case "draggable":
-                               var isDraggable = uiDialog.is( ":data(draggable)" );
+                               isDraggable = uiDialog.is( ":data(draggable)" );
                                if ( isDraggable && !value ) {
                                        uiDialog.draggable( "destroy" );
                                }
-                               
+
                                if ( !isDraggable && value ) {
-                                       self._makeDraggable();
+                                       this._makeDraggable();
                                }
                                break;
                        case "position":
-                               self._position(value);
+                               this._position( value );
                                break;
                        case "resizable":
                                // currently resizable, becoming non-resizable
-                               var isResizable = uiDialog.is( ":data(resizable)" );
-                               if (isResizable && !value) {
-                                       uiDialog.resizable('destroy');
+                               isResizable = uiDialog.is( ":data(resizable)" );
+                               if ( isResizable && !value ) {
+                                       uiDialog.resizable( "destroy" );
                                }
 
                                // currently resizable, changing handles
-                               if (isResizable && typeof value === 'string') {
-                                       uiDialog.resizable('option', 'handles', value);
+                               if ( isResizable && typeof value === "string" ) {
+                                       uiDialog.resizable( "option", "handles", value );
                                }
 
                                // currently non-resizable, becoming resizable
-                               if (!isResizable && value !== false) {
-                                       self._makeResizable(value);
+                               if ( !isResizable && value !== false ) {
+                                       this._makeResizable( value );
                                }
                                break;
                        case "title":
                                // convert whatever was passed in o a string, for html() to not throw up
-                               $(".ui-dialog-title", self.uiDialogTitlebar).html("" + (value || '&#160;'));
+                               $( ".ui-dialog-title", this.uiDialogTitlebar )
+                                       .html( "" + ( value || "&#160;" ) );
                                break;
                }
 
-               $.Widget.prototype._setOption.apply(self, arguments);
+               this._super( key, value );
        },
 
        _size: function() {
                /* If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
                 * divs will both have width and height set, so we need to reset them
                 */
-               var options = this.options,
-                       nonContentHeight,
-                       minContentHeight,
+               var nonContentHeight, minContentHeight, autoHeight,
+                       options = this.options,
                        isVisible = this.uiDialog.is( ":visible" );
 
                // reset content sizing
                this.element.show().css({
-                       width: 'auto',
+                       width: "auto",
                        minHeight: 0,
                        height: 0
                });
 
-               if (options.minWidth > options.width) {
+               if ( options.minWidth > options.width ) {
                        options.width = options.minWidth;
                }
 
                // reset wrapper sizing
                // determine the height of all the non-content elements
                nonContentHeight = this.uiDialog.css({
-                               height: 'auto',
+                               height: "auto",
                                width: options.width
                        })
-                       .height();
+                       .outerHeight();
                minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
-               
+
                if ( options.height === "auto" ) {
                        // only needed for IE6 support
                        if ( $.support.minHeight ) {
@@ -673,7 +659,7 @@ $.widget("ui.dialog", {
                                });
                        } else {
                                this.uiDialog.show();
-                               var autoHeight = this.element.css( "height", "auto" ).height();
+                               autoHeight = this.element.css( "height", "auto" ).height();
                                if ( !isVisible ) {
                                        this.uiDialog.hide();
                                }
@@ -683,102 +669,108 @@ $.widget("ui.dialog", {
                        this.element.height( Math.max( options.height - nonContentHeight, 0 ) );
                }
 
-               if (this.uiDialog.is(':data(resizable)')) {
-                       this.uiDialog.resizable('option', 'minHeight', this._minHeight());
+               if (this.uiDialog.is( ":data(resizable)" ) ) {
+                       this.uiDialog.resizable( "option", "minHeight", this._minHeight() );
                }
        }
 });
 
 $.extend($.ui.dialog, {
-       version: "1.8.24",
-
        uuid: 0,
        maxZ: 0,
 
        getTitleId: function($el) {
-               var id = $el.attr('id');
-               if (!id) {
+               var id = $el.attr( "id" );
+               if ( !id ) {
                        this.uuid += 1;
                        id = this.uuid;
                }
-               return 'ui-dialog-title-' + id;
+               return "ui-dialog-title-" + id;
        },
 
-       overlay: function(dialog) {
-               this.$el = $.ui.dialog.overlay.create(dialog);
+       overlay: function( dialog ) {
+               this.$el = $.ui.dialog.overlay.create( dialog );
        }
 });
 
-$.extend($.ui.dialog.overlay, {
+$.extend( $.ui.dialog.overlay, {
        instances: [],
        // reuse old instances due to IE memory leak with alpha transparency (see #5185)
        oldInstances: [],
        maxZ: 0,
-       events: $.map('focus,mousedown,mouseup,keydown,keypress,click'.split(','),
-               function(event) { return event + '.dialog-overlay'; }).join(' '),
-       create: function(dialog) {
-               if (this.instances.length === 0) {
+       events: $.map(
+               "focus,mousedown,mouseup,keydown,keypress,click".split( "," ),
+               function( event ) {
+                       return event + ".dialog-overlay";
+               }
+       ).join( " " ),
+       create: function( dialog ) {
+               if ( this.instances.length === 0 ) {
                        // prevent use of anchors and inputs
                        // we use a setTimeout in case the overlay is created from an
                        // event that we're going to be cancelling (see #2804)
                        setTimeout(function() {
                                // handle $(el).dialog().dialog('close') (see #4065)
-                               if ($.ui.dialog.overlay.instances.length) {
-                                       $(document).bind($.ui.dialog.overlay.events, function(event) {
+                               if ( $.ui.dialog.overlay.instances.length ) {
+                                       $( document ).bind( $.ui.dialog.overlay.events, function( event ) {
                                                // stop events if the z-index of the target is < the z-index of the overlay
                                                // we cannot return true when we don't want to cancel the event (#3523)
-                                               if ($(event.target).zIndex() < $.ui.dialog.overlay.maxZ) {
+                                               if ( $( event.target ).zIndex() < $.ui.dialog.overlay.maxZ ) {
                                                        return false;
                                                }
                                        });
                                }
-                       }, 1);
-
-                       // allow closing by pressing the escape key
-                       $(document).bind('keydown.dialog-overlay', function(event) {
-                               if (dialog.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
-                                       event.keyCode === $.ui.keyCode.ESCAPE) {
-                                       
-                                       dialog.close(event);
-                                       event.preventDefault();
-                               }
-                       });
+                       }, 1 );
 
                        // handle window resize
-                       $(window).bind('resize.dialog-overlay', $.ui.dialog.overlay.resize);
+                       $( window ).bind( "resize.dialog-overlay", $.ui.dialog.overlay.resize );
                }
 
-               var $el = (this.oldInstances.pop() || $('<div></div>').addClass('ui-widget-overlay'))
-                       .appendTo(document.body)
-                       .css({
-                               width: this.width(),
-                               height: this.height()
-                       });
+               var $el = ( this.oldInstances.pop() || $( "<div>" ).addClass( "ui-widget-overlay" ) );
 
-               if ($.fn.bgiframe) {
+               // allow closing by pressing the escape key
+               $( document ).bind( "keydown.dialog-overlay", function( event ) {
+                       var instances = $.ui.dialog.overlay.instances;
+                       // only react to the event if we're the top overlay
+                       if ( instances.length !== 0 && instances[ instances.length - 1 ] === $el &&
+                               dialog.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
+                               event.keyCode === $.ui.keyCode.ESCAPE ) {
+
+                               dialog.close( event );
+                               event.preventDefault();
+                       }
+               });
+
+               $el.appendTo( document.body ).css({
+                       width: this.width(),
+                       height: this.height()
+               });
+
+               if ( $.fn.bgiframe ) {
                        $el.bgiframe();
                }
 
-               this.instances.push($el);
+               this.instances.push( $el );
                return $el;
        },
 
-       destroy: function($el) {
-               var indexOf = $.inArray($el, this.instances);
-               if (indexOf != -1){
-                       this.oldInstances.push(this.instances.splice(indexOf, 1)[0]);
+       destroy: function( $el ) {
+               var indexOf = $.inArray( $el, this.instances ),
+                       maxZ = 0;
+
+               if ( indexOf !== -1 ) {
+                       this.oldInstances.push( this.instances.splice( indexOf, 1 )[ 0 ] );
                }
 
-               if (this.instances.length === 0) {
-                       $([document, window]).unbind('.dialog-overlay');
+               if ( this.instances.length === 0 ) {
+                       $( [ document, window ] ).unbind( ".dialog-overlay" );
                }
 
-               $el.remove();
-               
+               $el.height( 0 ).width( 0 ).remove();
+
                // adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
-               var maxZ = 0;
-               $.each(this.instances, function() {
-                       maxZ = Math.max(maxZ, this.css('z-index'));
+               $.each( this.instances, function() {
+                       maxZ = Math.max( maxZ, this.css( "z-index" ) );
                });
                this.maxZ = maxZ;
        },
@@ -786,8 +778,8 @@ $.extend($.ui.dialog.overlay, {
        height: function() {
                var scrollHeight,
                        offsetHeight;
-               // handle IE 6
-               if ($.browser.msie && $.browser.version < 7) {
+               // handle IE
+               if ( $.ui.ie ) {
                        scrollHeight = Math.max(
                                document.documentElement.scrollHeight,
                                document.body.scrollHeight
@@ -797,14 +789,14 @@ $.extend($.ui.dialog.overlay, {
                                document.body.offsetHeight
                        );
 
-                       if (scrollHeight < offsetHeight) {
-                               return $(window).height() + 'px';
+                       if ( scrollHeight < offsetHeight ) {
+                               return $( window ).height() + "px";
                        } else {
-                               return scrollHeight + 'px';
+                               return scrollHeight + "px";
                        }
                // handle "good" browsers
                } else {
-                       return $(document).height() + 'px';
+                       return $( document ).height() + "px";
                }
        },
 
@@ -812,7 +804,7 @@ $.extend($.ui.dialog.overlay, {
                var scrollWidth,
                        offsetWidth;
                // handle IE
-               if ( $.browser.msie ) {
+               if ( $.ui.ie ) {
                        scrollWidth = Math.max(
                                document.documentElement.scrollWidth,
                                document.body.scrollWidth
@@ -822,14 +814,14 @@ $.extend($.ui.dialog.overlay, {
                                document.body.offsetWidth
                        );
 
-                       if (scrollWidth < offsetWidth) {
-                               return $(window).width() + 'px';
+                       if ( scrollWidth < offsetWidth ) {
+                               return $( window ).width() + "px";
                        } else {
-                               return scrollWidth + 'px';
+                               return scrollWidth + "px";
                        }
                // handle "good" browsers
                } else {
-                       return $(document).width() + 'px';
+                       return $( document ).width() + "px";
                }
        },
 
@@ -842,9 +834,9 @@ $.extend($.ui.dialog.overlay, {
                 * This is handled by shrinking the overlay before setting it
                 * to the full document size.
                 */
-               var $overlays = $([]);
-               $.each($.ui.dialog.overlay.instances, function() {
-                       $overlays = $overlays.add(this);
+               var $overlays = $( [] );
+               $.each( $.ui.dialog.overlay.instances, function() {
+                       $overlays = $overlays.add( this );
                });
 
                $overlays.css({
@@ -857,10 +849,10 @@ $.extend($.ui.dialog.overlay, {
        }
 });
 
-$.extend($.ui.dialog.overlay.prototype, {
+$.extend( $.ui.dialog.overlay.prototype, {
        destroy: function() {
-               $.ui.dialog.overlay.destroy(this.$el);
+               $.ui.dialog.overlay.destroy( this.$el );
        }
 });
 
-}(jQuery));
+}( jQuery ) );
index 149035c..3768022 100644 (file)
@@ -1,11 +1,12 @@
 /*!
- * jQuery UI Draggable 1.8.24
+ * jQuery UI Draggable 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Draggables
+ * http://api.jqueryui.com/draggable/
  *
  * Depends:
  *     jquery.ui.core.js
@@ -15,6 +16,7 @@
 (function( $, undefined ) {
 
 $.widget("ui.draggable", $.ui.mouse, {
+       version: "1.9.2",
        widgetEventPrefix: "drag",
        options: {
                addClasses: true,
@@ -54,17 +56,9 @@ $.widget("ui.draggable", $.ui.mouse, {
 
        },
 
-       destroy: function() {
-               if(!this.element.data('draggable')) return;
-               this.element
-                       .removeData("draggable")
-                       .unbind(".draggable")
-                       .removeClass("ui-draggable"
-                               + " ui-draggable-dragging"
-                               + " ui-draggable-disabled");
+       _destroy: function() {
+               this.element.removeClass( "ui-draggable ui-draggable-dragging ui-draggable-disabled" );
                this._mouseDestroy();
-
-               return this;
        },
 
        _mouseCapture: function(event) {
@@ -79,18 +73,16 @@ $.widget("ui.draggable", $.ui.mouse, {
                this.handle = this._getHandle(event);
                if (!this.handle)
                        return false;
-               
-               if ( o.iframeFix ) {
-                       $(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {
-                               $('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>')
-                               .css({
-                                       width: this.offsetWidth+"px", height: this.offsetHeight+"px",
-                                       position: "absolute", opacity: "0.001", zIndex: 1000
-                               })
-                               .css($(this).offset())
-                               .appendTo("body");
-                       });
-               }
+
+               $(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {
+                       $('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>')
+                       .css({
+                               width: this.offsetWidth+"px", height: this.offsetHeight+"px",
+                               position: "absolute", opacity: "0.001", zIndex: 1000
+                       })
+                       .css($(this).offset())
+                       .appendTo("body");
+               });
 
                return true;
 
@@ -165,12 +157,12 @@ $.widget("ui.draggable", $.ui.mouse, {
                if ($.ui.ddmanager && !o.dropBehaviour)
                        $.ui.ddmanager.prepareOffsets(this, event);
 
-               
+
                this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
-               
+
                //If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)
                if ( $.ui.ddmanager ) $.ui.ddmanager.dragStart(this, event);
-               
+
                return true;
        },
 
@@ -209,7 +201,7 @@ $.widget("ui.draggable", $.ui.mouse, {
                        dropped = this.dropped;
                        this.dropped = false;
                }
-               
+
                //if the original element is no longer in the DOM don't bother to continue (see #8269)
                var element = this.element[0], elementInDom = false;
                while ( element && (element = element.parentNode) ) {
@@ -221,10 +213,10 @@ $.widget("ui.draggable", $.ui.mouse, {
                        return false;
 
                if((this.options.revert == "invalid" && !dropped) || (this.options.revert == "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
-                       var self = this;
+                       var that = this;
                        $(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
-                               if(self._trigger("stop", event) !== false) {
-                                       self._clear();
+                               if(that._trigger("stop", event) !== false) {
+                                       that._clear();
                                }
                        });
                } else {
@@ -235,29 +227,29 @@ $.widget("ui.draggable", $.ui.mouse, {
 
                return false;
        },
-       
+
        _mouseUp: function(event) {
                //Remove frame helpers
-               $("div.ui-draggable-iframeFix").each(function() { 
-                       this.parentNode.removeChild(this); 
+               $("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);
-               
+
                return $.ui.mouse.prototype._mouseUp.call(this, event);
        },
-       
+
        cancel: function() {
-               
+
                if(this.helper.is(".ui-draggable-dragging")) {
                        this._mouseUp({});
                } else {
                        this._clear();
                }
-               
+
                return this;
-               
+
        },
 
        _getHandle: function(event) {
@@ -320,13 +312,13 @@ $.widget("ui.draggable", $.ui.mouse, {
                // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
                // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
                //    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
-               if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
+               if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
                        po.left += this.scrollParent.scrollLeft();
                        po.top += this.scrollParent.scrollTop();
                }
 
                if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
-               || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
+               || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.ui.ie)) //Ugly IE fix
                        po = { top: 0, left: 0 };
 
                return {
@@ -378,7 +370,7 @@ $.widget("ui.draggable", $.ui.mouse, {
                ];
 
                if(!(/^(document|window|parent)$/).test(o.containment) && o.containment.constructor != Array) {
-                       var c = $(o.containment);
+                       var c = $(o.containment);
                        var ce = c[0]; if(!ce) return;
                        var co = c.offset();
                        var over = ($(ce).css("overflow") != 'hidden');
@@ -401,20 +393,20 @@ $.widget("ui.draggable", $.ui.mouse, {
 
                if(!pos) pos = this.position;
                var mod = d == "absolute" ? 1 : -1;
-               var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+               var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
 
                return {
                        top: (
                                pos.top                                                                                                                                 // The absolute mouse position
                                + this.offset.relative.top * mod                                                                                // Only for relative positioned nodes: Relative offset from element to offset parent
                                + this.offset.parent.top * mod                                                                                  // The offsetParent's offset without borders (offset + border)
-                               - ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
+                               - ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
                        ),
                        left: (
                                pos.left                                                                                                                                // The absolute mouse position
                                + this.offset.relative.left * mod                                                                               // Only for relative positioned nodes: Relative offset from element to offset parent
                                + this.offset.parent.left * mod                                                                                 // The offsetParent's offset without borders (offset + border)
-                               - ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
+                               - ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
                        )
                };
 
@@ -422,7 +414,7 @@ $.widget("ui.draggable", $.ui.mouse, {
 
        _generatePosition: function(event) {
 
-               var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+               var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
                var pageX = event.pageX;
                var pageY = event.pageY;
 
@@ -432,18 +424,18 @@ $.widget("ui.draggable", $.ui.mouse, {
                 */
 
                if(this.originalPosition) { //If we are not dragging yet, we won't check for options
-                        var containment;
-                        if(this.containment) {
-                                if (this.relative_container){
-                                    var co = this.relative_container.offset();
-                                    containment = [ this.containment[0] + co.left,
-                                                    this.containment[1] + co.top,
-                                                    this.containment[2] + co.left,
-                                                    this.containment[3] + co.top ];
-                                }
-                                else {
-                                    containment = this.containment;
-                                }
+                       var containment;
+                       if(this.containment) {
+                       if (this.relative_container){
+                               var co = this.relative_container.offset();
+                               containment = [ this.containment[0] + co.left,
+                                       this.containment[1] + co.top,
+                                       this.containment[2] + co.left,
+                                       this.containment[3] + co.top ];
+                       }
+                       else {
+                               containment = this.containment;
+                       }
 
                                if(event.pageX - this.offset.click.left < containment[0]) pageX = containment[0] + this.offset.click.left;
                                if(event.pageY - this.offset.click.top < containment[1]) pageY = containment[1] + this.offset.click.top;
@@ -468,14 +460,14 @@ $.widget("ui.draggable", $.ui.mouse, {
                                - this.offset.click.top                                                                                                 // Click offset (relative to the element)
                                - this.offset.relative.top                                                                                              // Only for relative positioned nodes: Relative offset from element to offset parent
                                - this.offset.parent.top                                                                                                // The offsetParent's offset without borders (offset + border)
-                               + ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
+                               + ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
                        ),
                        left: (
                                pageX                                                                                                                           // The absolute mouse position
                                - this.offset.click.left                                                                                                // Click offset (relative to the element)
                                - this.offset.relative.left                                                                                             // Only for relative positioned nodes: Relative offset from element to offset parent
                                - this.offset.parent.left                                                                                               // The offsetParent's offset without borders (offset + border)
-                               + ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
+                               + ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
                        )
                };
 
@@ -511,10 +503,6 @@ $.widget("ui.draggable", $.ui.mouse, {
 
 });
 
-$.extend($.ui.draggable, {
-       version: "1.8.24"
-});
-
 $.ui.plugin.add("draggable", "connectToSortable", {
        start: function(event, ui) {
 
@@ -570,7 +558,7 @@ $.ui.plugin.add("draggable", "connectToSortable", {
        },
        drag: function(event, ui) {
 
-               var inst = $(this).data("draggable"), self = this;
+               var inst = $(this).data("draggable"), that = this;
 
                var checkPos = function(o) {
                        var dyClick = this.offset.click.top, dxClick = this.offset.click.left;
@@ -582,14 +570,30 @@ $.ui.plugin.add("draggable", "connectToSortable", {
                };
 
                $.each(inst.sortables, function(i) {
-                       
+
+                       var innermostIntersecting = false;
+                       var thisSortable = this;
                        //Copy over some variables to allow calling the sortable's native _intersectsWith
                        this.instance.positionAbs = inst.positionAbs;
                        this.instance.helperProportions = inst.helperProportions;
                        this.instance.offset.click = inst.offset.click;
-                       
+
                        if(this.instance._intersectsWith(this.instance.containerCache)) {
+                               innermostIntersecting = true;
+                               $.each(inst.sortables, function () {
+                                       this.instance.positionAbs = inst.positionAbs;
+                                       this.instance.helperProportions = inst.helperProportions;
+                                       this.instance.offset.click = inst.offset.click;
+                                       if  (this != thisSortable
+                                               && this.instance._intersectsWith(this.instance.containerCache)
+                                               && $.ui.contains(thisSortable.instance.element[0], this.instance.element[0]))
+                                               innermostIntersecting = false;
+                                               return innermostIntersecting;
+                               });
+                       }
 
+
+                       if(innermostIntersecting) {
                                //If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once
                                if(!this.instance.isOver) {
 
@@ -597,7 +601,7 @@ $.ui.plugin.add("draggable", "connectToSortable", {
                                        //Now we fake the start of dragging for the sortable instance,
                                        //by cloning the list group item, appending it to the sortable and using it as inst.currentItem
                                        //We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one)
-                                       this.instance.currentItem = $(self).clone().removeAttr('id').appendTo(this.instance.element).data("sortable-item", true);
+                                       this.instance.currentItem = $(that).clone().removeAttr('id').appendTo(this.instance.element).data("sortable-item", true);
                                        this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it
                                        this.instance.options.helper = function() { return ui.helper[0]; };
 
@@ -630,13 +634,13 @@ $.ui.plugin.add("draggable", "connectToSortable", {
 
                                        this.instance.isOver = 0;
                                        this.instance.cancelHelperRemoval = true;
-                                       
+
                                        //Prevent reverting on this forced stop
                                        this.instance.options.revert = false;
-                                       
+
                                        // The out event needs to be triggered independently
                                        this.instance._trigger('out', event, this.instance._uiHash(this.instance));
-                                       
+
                                        this.instance._mouseStop(event, true);
                                        this.instance.options.helper = this.instance.options._helper;
 
@@ -806,7 +810,7 @@ $.ui.plugin.add("draggable", "stack", {
                        return (parseInt($(a).css("zIndex"),10) || 0) - (parseInt($(b).css("zIndex"),10) || 0);
                });
                if (!group.length) { return; }
-               
+
                var min = parseInt(group[0].style.zIndex) || 0;
                $(group).each(function(i) {
                        this.style.zIndex = min + i;
index f17c222..1e9ea51 100644 (file)
@@ -1,11 +1,12 @@
 /*!
- * jQuery UI Droppable 1.8.24
+ * jQuery UI Droppable 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Droppables
+ * http://api.jqueryui.com/droppable/
  *
  * Depends:
  *     jquery.ui.core.js
@@ -16,6 +17,7 @@
 (function( $, undefined ) {
 
 $.widget("ui.droppable", {
+       version: "1.9.2",
        widgetEventPrefix: "drop",
        options: {
                accept: '*',
@@ -46,18 +48,13 @@ $.widget("ui.droppable", {
 
        },
 
-       destroy: function() {
+       _destroy: function() {
                var drop = $.ui.ddmanager.droppables[this.options.scope];
                for ( var i = 0; i < drop.length; i++ )
                        if ( drop[i] == this )
                                drop.splice(i, 1);
 
-               this.element
-                       .removeClass("ui-droppable ui-droppable-disabled")
-                       .removeData("droppable")
-                       .unbind(".droppable");
-
-               return this;
+               this.element.removeClass("ui-droppable ui-droppable-disabled");
        },
 
        _setOption: function(key, value) {
@@ -146,10 +143,6 @@ $.widget("ui.droppable", {
 
 });
 
-$.extend($.ui.droppable, {
-       version: "1.8.24"
-});
-
 $.ui.intersect = function(draggable, droppable, toleranceMode) {
 
        if (!droppable.offset) return false;
@@ -240,7 +233,7 @@ $.ui.ddmanager = {
        },
        dragStart: function( draggable, event ) {
                //Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003)
-               draggable.element.parents( ":not(body,html)" ).bind( "scroll.droppable", function() {
+               draggable.element.parentsUntil( "body" ).bind( "scroll.droppable", function() {
                        if( !draggable.options.refreshPositions ) $.ui.ddmanager.prepareOffsets( draggable, event );
                });
        },
@@ -292,7 +285,7 @@ $.ui.ddmanager = {
 
        },
        dragStop: function( draggable, event ) {
-               draggable.element.parents( ":not(body,html)" ).unbind( "scroll.droppable" );
+               draggable.element.parentsUntil( "body" ).unbind( "scroll.droppable" );
                //Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003)
                if( !draggable.options.refreshPositions ) $.ui.ddmanager.prepareOffsets( draggable, event );
        }
diff --git a/resources/lib/jquery.ui/jquery.ui.effect-blind.js b/resources/lib/jquery.ui/jquery.ui.effect-blind.js
new file mode 100644 (file)
index 0000000..e5c7331
--- /dev/null
@@ -0,0 +1,82 @@
+/*!
+ * jQuery UI Effects Blind 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/blind-effect/
+ *
+ * Depends:
+ *     jquery.ui.effect.js
+ */
+(function( $, undefined ) {
+
+var rvertical = /up|down|vertical/,
+       rpositivemotion = /up|left|vertical|horizontal/;
+
+$.effects.effect.blind = function( o, done ) {
+       // Create element
+       var el = $( this ),
+               props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
+               mode = $.effects.setMode( el, o.mode || "hide" ),
+               direction = o.direction || "up",
+               vertical = rvertical.test( direction ),
+               ref = vertical ? "height" : "width",
+               ref2 = vertical ? "top" : "left",
+               motion = rpositivemotion.test( direction ),
+               animation = {},
+               show = mode === "show",
+               wrapper, distance, margin;
+
+       // if already wrapped, the wrapper's properties are my property. #6245
+       if ( el.parent().is( ".ui-effects-wrapper" ) ) {
+               $.effects.save( el.parent(), props );
+       } else {
+               $.effects.save( el, props );
+       }
+       el.show();
+       wrapper = $.effects.createWrapper( el ).css({
+               overflow: "hidden"
+       });
+
+       distance = wrapper[ ref ]();
+       margin = parseFloat( wrapper.css( ref2 ) ) || 0;
+
+       animation[ ref ] = show ? distance : 0;
+       if ( !motion ) {
+               el
+                       .css( vertical ? "bottom" : "right", 0 )
+                       .css( vertical ? "top" : "left", "auto" )
+                       .css({ position: "absolute" });
+
+               animation[ ref2 ] = show ? margin : distance + margin;
+       }
+
+       // start at 0 if we are showing
+       if ( show ) {
+               wrapper.css( ref, 0 );
+               if ( ! motion ) {
+                       wrapper.css( ref2, margin + distance );
+               }
+       }
+
+       // Animate
+       wrapper.animate( animation, {
+               duration: o.duration,
+               easing: o.easing,
+               queue: false,
+               complete: function() {
+                       if ( mode === "hide" ) {
+                               el.hide();
+                       }
+                       $.effects.restore( el, props );
+                       $.effects.removeWrapper( el );
+                       done();
+               }
+       });
+
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.effect-bounce.js b/resources/lib/jquery.ui/jquery.ui.effect-bounce.js
new file mode 100644 (file)
index 0000000..ab1977e
--- /dev/null
@@ -0,0 +1,113 @@
+/*!
+ * jQuery UI Effects Bounce 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/bounce-effect/
+ *
+ * Depends:
+ *     jquery.ui.effect.js
+ */
+(function( $, undefined ) {
+
+$.effects.effect.bounce = function( o, done ) {
+       var el = $( this ),
+               props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
+
+               // defaults:
+               mode = $.effects.setMode( el, o.mode || "effect" ),
+               hide = mode === "hide",
+               show = mode === "show",
+               direction = o.direction || "up",
+               distance = o.distance,
+               times = o.times || 5,
+
+               // number of internal animations
+               anims = times * 2 + ( show || hide ? 1 : 0 ),
+               speed = o.duration / anims,
+               easing = o.easing,
+
+               // utility:
+               ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
+               motion = ( direction === "up" || direction === "left" ),
+               i,
+               upAnim,
+               downAnim,
+
+               // we will need to re-assemble the queue to stack our animations in place
+               queue = el.queue(),
+               queuelen = queue.length;
+
+       // Avoid touching opacity to prevent clearType and PNG issues in IE
+       if ( show || hide ) {
+               props.push( "opacity" );
+       }
+
+       $.effects.save( el, props );
+       el.show();
+       $.effects.createWrapper( el ); // Create Wrapper
+
+       // default distance for the BIGGEST bounce is the outer Distance / 3
+       if ( !distance ) {
+               distance = el[ ref === "top" ? "outerHeight" : "outerWidth" ]() / 3;
+       }
+
+       if ( show ) {
+               downAnim = { opacity: 1 };
+               downAnim[ ref ] = 0;
+
+               // if we are showing, force opacity 0 and set the initial position
+               // then do the "first" animation
+               el.css( "opacity", 0 )
+                       .css( ref, motion ? -distance * 2 : distance * 2 )
+                       .animate( downAnim, speed, easing );
+       }
+
+       // start at the smallest distance if we are hiding
+       if ( hide ) {
+               distance = distance / Math.pow( 2, times - 1 );
+       }
+
+       downAnim = {};
+       downAnim[ ref ] = 0;
+       // Bounces up/down/left/right then back to 0 -- times * 2 animations happen here
+       for ( i = 0; i < times; i++ ) {
+               upAnim = {};
+               upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
+
+               el.animate( upAnim, speed, easing )
+                       .animate( downAnim, speed, easing );
+
+               distance = hide ? distance * 2 : distance / 2;
+       }
+
+       // Last Bounce when Hiding
+       if ( hide ) {
+               upAnim = { opacity: 0 };
+               upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
+
+               el.animate( upAnim, speed, easing );
+       }
+
+       el.queue(function() {
+               if ( hide ) {
+                       el.hide();
+               }
+               $.effects.restore( el, props );
+               $.effects.removeWrapper( el );
+               done();
+       });
+
+       // inject all the animations we just queued to be first in line (after "inprogress")
+       if ( queuelen > 1) {
+               queue.splice.apply( queue,
+                       [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
+       }
+       el.dequeue();
+
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.effect-clip.js b/resources/lib/jquery.ui/jquery.ui.effect-clip.js
new file mode 100644 (file)
index 0000000..cce037a
--- /dev/null
@@ -0,0 +1,67 @@
+/*!
+ * jQuery UI Effects Clip 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/clip-effect/
+ *
+ * Depends:
+ *     jquery.ui.effect.js
+ */
+(function( $, undefined ) {
+
+$.effects.effect.clip = function( o, done ) {
+       // Create element
+       var el = $( this ),
+               props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
+               mode = $.effects.setMode( el, o.mode || "hide" ),
+               show = mode === "show",
+               direction = o.direction || "vertical",
+               vert = direction === "vertical",
+               size = vert ? "height" : "width",
+               position = vert ? "top" : "left",
+               animation = {},
+               wrapper, animate, distance;
+
+       // Save & Show
+       $.effects.save( el, props );
+       el.show();
+
+       // Create Wrapper
+       wrapper = $.effects.createWrapper( el ).css({
+               overflow: "hidden"
+       });
+       animate = ( el[0].tagName === "IMG" ) ? wrapper : el;
+       distance = animate[ size ]();
+
+       // Shift
+       if ( show ) {
+               animate.css( size, 0 );
+               animate.css( position, distance / 2 );
+       }
+
+       // Create Animation Object:
+       animation[ size ] = show ? distance : 0;
+       animation[ position ] = show ? 0 : distance / 2;
+
+       // Animate
+       animate.animate( animation, {
+               queue: false,
+               duration: o.duration,
+               easing: o.easing,
+               complete: function() {
+                       if ( !show ) {
+                               el.hide();
+                       }
+                       $.effects.restore( el, props );
+                       $.effects.removeWrapper( el );
+                       done();
+               }
+       });
+
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.effect-drop.js b/resources/lib/jquery.ui/jquery.ui.effect-drop.js
new file mode 100644 (file)
index 0000000..83c8ef4
--- /dev/null
@@ -0,0 +1,65 @@
+/*!
+ * jQuery UI Effects Drop 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/drop-effect/
+ *
+ * Depends:
+ *     jquery.ui.effect.js
+ */
+(function( $, undefined ) {
+
+$.effects.effect.drop = function( o, done ) {
+
+       var el = $( this ),
+               props = [ "position", "top", "bottom", "left", "right", "opacity", "height", "width" ],
+               mode = $.effects.setMode( el, o.mode || "hide" ),
+               show = mode === "show",
+               direction = o.direction || "left",
+               ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
+               motion = ( direction === "up" || direction === "left" ) ? "pos" : "neg",
+               animation = {
+                       opacity: show ? 1 : 0
+               },
+               distance;
+
+       // Adjust
+       $.effects.save( el, props );
+       el.show();
+       $.effects.createWrapper( el );
+
+       distance = o.distance || el[ ref === "top" ? "outerHeight": "outerWidth" ]( true ) / 2;
+
+       if ( show ) {
+               el
+                       .css( "opacity", 0 )
+                       .css( ref, motion === "pos" ? -distance : distance );
+       }
+
+       // Animation
+       animation[ ref ] = ( show ?
+               ( motion === "pos" ? "+=" : "-=" ) :
+               ( motion === "pos" ? "-=" : "+=" ) ) +
+               distance;
+
+       // Animate
+       el.animate( animation, {
+               queue: false,
+               duration: o.duration,
+               easing: o.easing,
+               complete: function() {
+                       if ( mode === "hide" ) {
+                               el.hide();
+                       }
+                       $.effects.restore( el, props );
+                       $.effects.removeWrapper( el );
+                       done();
+               }
+       });
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.effect-explode.js b/resources/lib/jquery.ui/jquery.ui.effect-explode.js
new file mode 100644 (file)
index 0000000..98d5be5
--- /dev/null
@@ -0,0 +1,97 @@
+/*!
+ * jQuery UI Effects Explode 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/explode-effect/
+ *
+ * Depends:
+ *     jquery.ui.effect.js
+ */
+(function( $, undefined ) {
+
+$.effects.effect.explode = function( o, done ) {
+
+       var rows = o.pieces ? Math.round( Math.sqrt( o.pieces ) ) : 3,
+               cells = rows,
+               el = $( this ),
+               mode = $.effects.setMode( el, o.mode || "hide" ),
+               show = mode === "show",
+
+               // show and then visibility:hidden the element before calculating offset
+               offset = el.show().css( "visibility", "hidden" ).offset(),
+
+               // width and height of a piece
+               width = Math.ceil( el.outerWidth() / cells ),
+               height = Math.ceil( el.outerHeight() / rows ),
+               pieces = [],
+
+               // loop
+               i, j, left, top, mx, my;
+
+       // children animate complete:
+       function childComplete() {
+               pieces.push( this );
+               if ( pieces.length === rows * cells ) {
+                       animComplete();
+               }
+       }
+
+       // clone the element for each row and cell.
+       for( i = 0; i < rows ; i++ ) { // ===>
+               top = offset.top + i * height;
+               my = i - ( rows - 1 ) / 2 ;
+
+               for( j = 0; j < cells ; j++ ) { // |||
+                       left = offset.left + j * width;
+                       mx = j - ( cells - 1 ) / 2 ;
+
+                       // Create a clone of the now hidden main element that will be absolute positioned
+                       // within a wrapper div off the -left and -top equal to size of our pieces
+                       el
+                               .clone()
+                               .appendTo( "body" )
+                               .wrap( "<div></div>" )
+                               .css({
+                                       position: "absolute",
+                                       visibility: "visible",
+                                       left: -j * width,
+                                       top: -i * height
+                               })
+
+                       // select the wrapper - make it overflow: hidden and absolute positioned based on
+                       // where the original was located +left and +top equal to the size of pieces
+                               .parent()
+                               .addClass( "ui-effects-explode" )
+                               .css({
+                                       position: "absolute",
+                                       overflow: "hidden",
+                                       width: width,
+                                       height: height,
+                                       left: left + ( show ? mx * width : 0 ),
+                                       top: top + ( show ? my * height : 0 ),
+                                       opacity: show ? 0 : 1
+                               }).animate({
+                                       left: left + ( show ? 0 : mx * width ),
+                                       top: top + ( show ? 0 : my * height ),
+                                       opacity: show ? 1 : 0
+                               }, o.duration || 500, o.easing, childComplete );
+               }
+       }
+
+       function animComplete() {
+               el.css({
+                       visibility: "visible"
+               });
+               $( pieces ).remove();
+               if ( !show ) {
+                       el.hide();
+               }
+               done();
+       }
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.effect-fade.js b/resources/lib/jquery.ui/jquery.ui.effect-fade.js
new file mode 100644 (file)
index 0000000..c79c6f4
--- /dev/null
@@ -0,0 +1,30 @@
+/*!
+ * jQuery UI Effects Fade 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/fade-effect/
+ *
+ * Depends:
+ *     jquery.ui.effect.js
+ */
+(function( $, undefined ) {
+
+$.effects.effect.fade = function( o, done ) {
+       var el = $( this ),
+               mode = $.effects.setMode( el, o.mode || "toggle" );
+
+       el.animate({
+               opacity: mode
+       }, {
+               queue: false,
+               duration: o.duration,
+               easing: o.easing,
+               complete: done
+       });
+};
+
+})( jQuery );
diff --git a/resources/lib/jquery.ui/jquery.ui.effect-fold.js b/resources/lib/jquery.ui/jquery.ui.effect-fold.js
new file mode 100644 (file)
index 0000000..9452c5d
--- /dev/null
@@ -0,0 +1,76 @@
+/*!
+ * jQuery UI Effects Fold 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/fold-effect/
+ *
+ * Depends:
+ *     jquery.ui.effect.js
+ */
+(function( $, undefined ) {
+
+$.effects.effect.fold = function( o, done ) {
+
+       // Create element
+       var el = $( this ),
+               props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
+               mode = $.effects.setMode( el, o.mode || "hide" ),
+               show = mode === "show",
+               hide = mode === "hide",
+               size = o.size || 15,
+               percent = /([0-9]+)%/.exec( size ),
+               horizFirst = !!o.horizFirst,
+               widthFirst = show !== horizFirst,
+               ref = widthFirst ? [ "width", "height" ] : [ "height", "width" ],
+               duration = o.duration / 2,
+               wrapper, distance,
+               animation1 = {},
+               animation2 = {};
+
+       $.effects.save( el, props );
+       el.show();
+
+       // Create Wrapper
+       wrapper = $.effects.createWrapper( el ).css({
+               overflow: "hidden"
+       });
+       distance = widthFirst ?
+               [ wrapper.width(), wrapper.height() ] :
+               [ wrapper.height(), wrapper.width() ];
+
+       if ( percent ) {
+               size = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ];
+       }
+       if ( show ) {
+               wrapper.css( horizFirst ? {
+                       height: 0,
+                       width: size
+               } : {
+                       height: size,
+                       width: 0
+               });
+       }
+
+       // Animation
+       animation1[ ref[ 0 ] ] = show ? distance[ 0 ] : size;
+       animation2[ ref[ 1 ] ] = show ? distance[ 1 ] : 0;
+
+       // Animate
+       wrapper
+               .animate( animation1, duration, o.easing )
+               .animate( animation2, duration, o.easing, function() {
+                       if ( hide ) {
+                               el.hide();
+                       }
+                       $.effects.restore( el, props );
+                       $.effects.removeWrapper( el );
+                       done();
+               });
+
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.effect-highlight.js b/resources/lib/jquery.ui/jquery.ui.effect-highlight.js
new file mode 100644 (file)
index 0000000..d901f80
--- /dev/null
@@ -0,0 +1,50 @@
+/*!
+ * jQuery UI Effects Highlight 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/highlight-effect/
+ *
+ * Depends:
+ *     jquery.ui.effect.js
+ */
+(function( $, undefined ) {
+
+$.effects.effect.highlight = function( o, done ) {
+       var elem = $( this ),
+               props = [ "backgroundImage", "backgroundColor", "opacity" ],
+               mode = $.effects.setMode( elem, o.mode || "show" ),
+               animation = {
+                       backgroundColor: elem.css( "backgroundColor" )
+               };
+
+       if (mode === "hide") {
+               animation.opacity = 0;
+       }
+
+       $.effects.save( elem, props );
+
+       elem
+               .show()
+               .css({
+                       backgroundImage: "none",
+                       backgroundColor: o.color || "#ffff99"
+               })
+               .animate( animation, {
+                       queue: false,
+                       duration: o.duration,
+                       easing: o.easing,
+                       complete: function() {
+                               if ( mode === "hide" ) {
+                                       elem.hide();
+                               }
+                               $.effects.restore( elem, props );
+                               done();
+                       }
+               });
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.effect-pulsate.js b/resources/lib/jquery.ui/jquery.ui.effect-pulsate.js
new file mode 100644 (file)
index 0000000..20f84dd
--- /dev/null
@@ -0,0 +1,63 @@
+/*!
+ * jQuery UI Effects Pulsate 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/pulsate-effect/
+ *
+ * Depends:
+ *     jquery.ui.effect.js
+ */
+(function( $, undefined ) {
+
+$.effects.effect.pulsate = function( o, done ) {
+       var elem = $( this ),
+               mode = $.effects.setMode( elem, o.mode || "show" ),
+               show = mode === "show",
+               hide = mode === "hide",
+               showhide = ( show || mode === "hide" ),
+
+               // showing or hiding leaves of the "last" animation
+               anims = ( ( o.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ),
+               duration = o.duration / anims,
+               animateTo = 0,
+               queue = elem.queue(),
+               queuelen = queue.length,
+               i;
+
+       if ( show || !elem.is(":visible")) {
+               elem.css( "opacity", 0 ).show();
+               animateTo = 1;
+       }
+
+       // anims - 1 opacity "toggles"
+       for ( i = 1; i < anims; i++ ) {
+               elem.animate({
+                       opacity: animateTo
+               }, duration, o.easing );
+               animateTo = 1 - animateTo;
+       }
+
+       elem.animate({
+               opacity: animateTo
+       }, duration, o.easing);
+
+       elem.queue(function() {
+               if ( hide ) {
+                       elem.hide();
+               }
+               done();
+       });
+
+       // We just queued up "anims" animations, we need to put them next in the queue
+       if ( queuelen > 1 ) {
+               queue.splice.apply( queue,
+                       [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
+       }
+       elem.dequeue();
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.effect-scale.js b/resources/lib/jquery.ui/jquery.ui.effect-scale.js
new file mode 100644 (file)
index 0000000..9beac69
--- /dev/null
@@ -0,0 +1,318 @@
+/*!
+ * jQuery UI Effects Scale 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/scale-effect/
+ *
+ * Depends:
+ *     jquery.ui.effect.js
+ */
+(function( $, undefined ) {
+
+$.effects.effect.puff = function( o, done ) {
+       var elem = $( this ),
+               mode = $.effects.setMode( elem, o.mode || "hide" ),
+               hide = mode === "hide",
+               percent = parseInt( o.percent, 10 ) || 150,
+               factor = percent / 100,
+               original = {
+                       height: elem.height(),
+                       width: elem.width(),
+                       outerHeight: elem.outerHeight(),
+                       outerWidth: elem.outerWidth()
+               };
+
+       $.extend( o, {
+               effect: "scale",
+               queue: false,
+               fade: true,
+               mode: mode,
+               complete: done,
+               percent: hide ? percent : 100,
+               from: hide ?
+                       original :
+                       {
+                               height: original.height * factor,
+                               width: original.width * factor,
+                               outerHeight: original.outerHeight * factor,
+                               outerWidth: original.outerWidth * factor
+                       }
+       });
+
+       elem.effect( o );
+};
+
+$.effects.effect.scale = function( o, done ) {
+
+       // Create element
+       var el = $( this ),
+               options = $.extend( true, {}, o ),
+               mode = $.effects.setMode( el, o.mode || "effect" ),
+               percent = parseInt( o.percent, 10 ) ||
+                       ( parseInt( o.percent, 10 ) === 0 ? 0 : ( mode === "hide" ? 0 : 100 ) ),
+               direction = o.direction || "both",
+               origin = o.origin,
+               original = {
+                       height: el.height(),
+                       width: el.width(),
+                       outerHeight: el.outerHeight(),
+                       outerWidth: el.outerWidth()
+               },
+               factor = {
+                       y: direction !== "horizontal" ? (percent / 100) : 1,
+                       x: direction !== "vertical" ? (percent / 100) : 1
+               };
+
+       // We are going to pass this effect to the size effect:
+       options.effect = "size";
+       options.queue = false;
+       options.complete = done;
+
+       // Set default origin and restore for show/hide
+       if ( mode !== "effect" ) {
+               options.origin = origin || ["middle","center"];
+               options.restore = true;
+       }
+
+       options.from = o.from || ( mode === "show" ? {
+               height: 0,
+               width: 0,
+               outerHeight: 0,
+               outerWidth: 0
+       } : original );
+       options.to = {
+               height: original.height * factor.y,
+               width: original.width * factor.x,
+               outerHeight: original.outerHeight * factor.y,
+               outerWidth: original.outerWidth * factor.x
+       };
+
+       // Fade option to support puff
+       if ( options.fade ) {
+               if ( mode === "show" ) {
+                       options.from.opacity = 0;
+                       options.to.opacity = 1;
+               }
+               if ( mode === "hide" ) {
+                       options.from.opacity = 1;
+                       options.to.opacity = 0;
+               }
+       }
+
+       // Animate
+       el.effect( options );
+
+};
+
+$.effects.effect.size = function( o, done ) {
+
+       // Create element
+       var original, baseline, factor,
+               el = $( this ),
+               props0 = [ "position", "top", "bottom", "left", "right", "width", "height", "overflow", "opacity" ],
+
+               // Always restore
+               props1 = [ "position", "top", "bottom", "left", "right", "overflow", "opacity" ],
+
+               // Copy for children
+               props2 = [ "width", "height", "overflow" ],
+               cProps = [ "fontSize" ],
+               vProps = [ "borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom" ],
+               hProps = [ "borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight" ],
+
+               // Set options
+               mode = $.effects.setMode( el, o.mode || "effect" ),
+               restore = o.restore || mode !== "effect",
+               scale = o.scale || "both",
+               origin = o.origin || [ "middle", "center" ],
+               position = el.css( "position" ),
+               props = restore ? props0 : props1,
+               zero = {
+                       height: 0,
+                       width: 0,
+                       outerHeight: 0,
+                       outerWidth: 0
+               };
+
+       if ( mode === "show" ) {
+               el.show();
+       }
+       original = {
+               height: el.height(),
+               width: el.width(),
+               outerHeight: el.outerHeight(),
+               outerWidth: el.outerWidth()
+       };
+
+       if ( o.mode === "toggle" && mode === "show" ) {
+               el.from = o.to || zero;
+               el.to = o.from || original;
+       } else {
+               el.from = o.from || ( mode === "show" ? zero : original );
+               el.to = o.to || ( mode === "hide" ? zero : original );
+       }
+
+       // Set scaling factor
+       factor = {
+               from: {
+                       y: el.from.height / original.height,
+                       x: el.from.width / original.width
+               },
+               to: {
+                       y: el.to.height / original.height,
+                       x: el.to.width / original.width
+               }
+       };
+
+       // Scale the css box
+       if ( scale === "box" || scale === "both" ) {
+
+               // Vertical props scaling
+               if ( factor.from.y !== factor.to.y ) {
+                       props = props.concat( vProps );
+                       el.from = $.effects.setTransition( el, vProps, factor.from.y, el.from );
+                       el.to = $.effects.setTransition( el, vProps, factor.to.y, el.to );
+               }
+
+               // Horizontal props scaling
+               if ( factor.from.x !== factor.to.x ) {
+                       props = props.concat( hProps );
+                       el.from = $.effects.setTransition( el, hProps, factor.from.x, el.from );
+                       el.to = $.effects.setTransition( el, hProps, factor.to.x, el.to );
+               }
+       }
+
+       // Scale the content
+       if ( scale === "content" || scale === "both" ) {
+
+               // Vertical props scaling
+               if ( factor.from.y !== factor.to.y ) {
+                       props = props.concat( cProps ).concat( props2 );
+                       el.from = $.effects.setTransition( el, cProps, factor.from.y, el.from );
+                       el.to = $.effects.setTransition( el, cProps, factor.to.y, el.to );
+               }
+       }
+
+       $.effects.save( el, props );
+       el.show();
+       $.effects.createWrapper( el );
+       el.css( "overflow", "hidden" ).css( el.from );
+
+       // Adjust
+       if (origin) { // Calculate baseline shifts
+               baseline = $.effects.getBaseline( origin, original );
+               el.from.top = ( original.outerHeight - el.outerHeight() ) * baseline.y;
+               el.from.left = ( original.outerWidth - el.outerWidth() ) * baseline.x;
+               el.to.top = ( original.outerHeight - el.to.outerHeight ) * baseline.y;
+               el.to.left = ( original.outerWidth - el.to.outerWidth ) * baseline.x;
+       }
+       el.css( el.from ); // set top & left
+
+       // Animate
+       if ( scale === "content" || scale === "both" ) { // Scale the children
+
+               // Add margins/font-size
+               vProps = vProps.concat([ "marginTop", "marginBottom" ]).concat(cProps);
+               hProps = hProps.concat([ "marginLeft", "marginRight" ]);
+               props2 = props0.concat(vProps).concat(hProps);
+
+               el.find( "*[width]" ).each( function(){
+                       var child = $( this ),
+                               c_original = {
+                                       height: child.height(),
+                                       width: child.width(),
+                                       outerHeight: child.outerHeight(),
+                                       outerWidth: child.outerWidth()
+                               };
+                       if (restore) {
+                               $.effects.save(child, props2);
+                       }
+
+                       child.from = {
+                               height: c_original.height * factor.from.y,
+                               width: c_original.width * factor.from.x,
+                               outerHeight: c_original.outerHeight * factor.from.y,
+                               outerWidth: c_original.outerWidth * factor.from.x
+                       };
+                       child.to = {
+                               height: c_original.height * factor.to.y,
+                               width: c_original.width * factor.to.x,
+                               outerHeight: c_original.height * factor.to.y,
+                               outerWidth: c_original.width * factor.to.x
+                       };
+
+                       // Vertical props scaling
+                       if ( factor.from.y !== factor.to.y ) {
+                               child.from = $.effects.setTransition( child, vProps, factor.from.y, child.from );
+                               child.to = $.effects.setTransition( child, vProps, factor.to.y, child.to );
+                       }
+
+                       // Horizontal props scaling
+                       if ( factor.from.x !== factor.to.x ) {
+                               child.from = $.effects.setTransition( child, hProps, factor.from.x, child.from );
+                               child.to = $.effects.setTransition( child, hProps, factor.to.x, child.to );
+                       }
+
+                       // Animate children
+                       child.css( child.from );
+                       child.animate( child.to, o.duration, o.easing, function() {
+
+                               // Restore children
+                               if ( restore ) {
+                                       $.effects.restore( child, props2 );
+                               }
+                       });
+               });
+       }
+
+       // Animate
+       el.animate( el.to, {
+               queue: false,
+               duration: o.duration,
+               easing: o.easing,
+               complete: function() {
+                       if ( el.to.opacity === 0 ) {
+                               el.css( "opacity", el.from.opacity );
+                       }
+                       if( mode === "hide" ) {
+                               el.hide();
+                       }
+                       $.effects.restore( el, props );
+                       if ( !restore ) {
+
+                               // we need to calculate our new positioning based on the scaling
+                               if ( position === "static" ) {
+                                       el.css({
+                                               position: "relative",
+                                               top: el.to.top,
+                                               left: el.to.left
+                                       });
+                               } else {
+                                       $.each([ "top", "left" ], function( idx, pos ) {
+                                               el.css( pos, function( _, str ) {
+                                                       var val = parseInt( str, 10 ),
+                                                               toRef = idx ? el.to.left : el.to.top;
+
+                                                       // if original was "auto", recalculate the new value from wrapper
+                                                       if ( str === "auto" ) {
+                                                               return toRef + "px";
+                                                       }
+
+                                                       return val + toRef + "px";
+                                               });
+                                       });
+                               }
+                       }
+
+                       $.effects.removeWrapper( el );
+                       done();
+               }
+       });
+
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.effect-shake.js b/resources/lib/jquery.ui/jquery.ui.effect-shake.js
new file mode 100644 (file)
index 0000000..216c08b
--- /dev/null
@@ -0,0 +1,74 @@
+/*!
+ * jQuery UI Effects Shake 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/shake-effect/
+ *
+ * Depends:
+ *     jquery.ui.effect.js
+ */
+(function( $, undefined ) {
+
+$.effects.effect.shake = function( o, done ) {
+
+       var el = $( this ),
+               props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
+               mode = $.effects.setMode( el, o.mode || "effect" ),
+               direction = o.direction || "left",
+               distance = o.distance || 20,
+               times = o.times || 3,
+               anims = times * 2 + 1,
+               speed = Math.round(o.duration/anims),
+               ref = (direction === "up" || direction === "down") ? "top" : "left",
+               positiveMotion = (direction === "up" || direction === "left"),
+               animation = {},
+               animation1 = {},
+               animation2 = {},
+               i,
+
+               // we will need to re-assemble the queue to stack our animations in place
+               queue = el.queue(),
+               queuelen = queue.length;
+
+       $.effects.save( el, props );
+       el.show();
+       $.effects.createWrapper( el );
+
+       // Animation
+       animation[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance;
+       animation1[ ref ] = ( positiveMotion ? "+=" : "-=" ) + distance * 2;
+       animation2[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance * 2;
+
+       // Animate
+       el.animate( animation, speed, o.easing );
+
+       // Shakes
+       for ( i = 1; i < times; i++ ) {
+               el.animate( animation1, speed, o.easing ).animate( animation2, speed, o.easing );
+       }
+       el
+               .animate( animation1, speed, o.easing )
+               .animate( animation, speed / 2, o.easing )
+               .queue(function() {
+                       if ( mode === "hide" ) {
+                               el.hide();
+                       }
+                       $.effects.restore( el, props );
+                       $.effects.removeWrapper( el );
+                       done();
+               });
+
+       // inject all the animations we just queued to be first in line (after "inprogress")
+       if ( queuelen > 1) {
+               queue.splice.apply( queue,
+                       [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
+       }
+       el.dequeue();
+
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.effect-slide.js b/resources/lib/jquery.ui/jquery.ui.effect-slide.js
new file mode 100644 (file)
index 0000000..445ec48
--- /dev/null
@@ -0,0 +1,64 @@
+/*!
+ * jQuery UI Effects Slide 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/slide-effect/
+ *
+ * Depends:
+ *     jquery.ui.effect.js
+ */
+(function( $, undefined ) {
+
+$.effects.effect.slide = function( o, done ) {
+
+       // Create element
+       var el = $( this ),
+               props = [ "position", "top", "bottom", "left", "right", "width", "height" ],
+               mode = $.effects.setMode( el, o.mode || "show" ),
+               show = mode === "show",
+               direction = o.direction || "left",
+               ref = (direction === "up" || direction === "down") ? "top" : "left",
+               positiveMotion = (direction === "up" || direction === "left"),
+               distance,
+               animation = {};
+
+       // Adjust
+       $.effects.save( el, props );
+       el.show();
+       distance = o.distance || el[ ref === "top" ? "outerHeight" : "outerWidth" ]( true );
+
+       $.effects.createWrapper( el ).css({
+               overflow: "hidden"
+       });
+
+       if ( show ) {
+               el.css( ref, positiveMotion ? (isNaN(distance) ? "-" + distance : -distance) : distance );
+       }
+
+       // Animation
+       animation[ ref ] = ( show ?
+               ( positiveMotion ? "+=" : "-=") :
+               ( positiveMotion ? "-=" : "+=")) +
+               distance;
+
+       // Animate
+       el.animate( animation, {
+               queue: false,
+               duration: o.duration,
+               easing: o.easing,
+               complete: function() {
+                       if ( mode === "hide" ) {
+                               el.hide();
+                       }
+                       $.effects.restore( el, props );
+                       $.effects.removeWrapper( el );
+                       done();
+               }
+       });
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.effect-transfer.js b/resources/lib/jquery.ui/jquery.ui.effect-transfer.js
new file mode 100644 (file)
index 0000000..f133c04
--- /dev/null
@@ -0,0 +1,47 @@
+/*!
+ * jQuery UI Effects Transfer 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/transfer-effect/
+ *
+ * Depends:
+ *     jquery.ui.effect.js
+ */
+(function( $, undefined ) {
+
+$.effects.effect.transfer = function( o, done ) {
+       var elem = $( this ),
+               target = $( o.to ),
+               targetFixed = target.css( "position" ) === "fixed",
+               body = $("body"),
+               fixTop = targetFixed ? body.scrollTop() : 0,
+               fixLeft = targetFixed ? body.scrollLeft() : 0,
+               endPosition = target.offset(),
+               animation = {
+                       top: endPosition.top - fixTop ,
+                       left: endPosition.left - fixLeft ,
+                       height: target.innerHeight(),
+                       width: target.innerWidth()
+               },
+               startPosition = elem.offset(),
+               transfer = $( '<div class="ui-effects-transfer"></div>' )
+                       .appendTo( document.body )
+                       .addClass( o.className )
+                       .css({
+                               top: startPosition.top - fixTop ,
+                               left: startPosition.left - fixLeft ,
+                               height: elem.innerHeight(),
+                               width: elem.innerWidth(),
+                               position: targetFixed ? "fixed" : "absolute"
+                       })
+                       .animate( animation, o.duration, o.easing, function() {
+                               transfer.remove();
+                               done();
+                       });
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.effect.js b/resources/lib/jquery.ui/jquery.ui.effect.js
new file mode 100644 (file)
index 0000000..c8e5818
--- /dev/null
@@ -0,0 +1,1276 @@
+/*!
+ * jQuery UI Effects 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/category/effects-core/
+ */
+;(jQuery.effects || (function($, undefined) {
+
+var backCompat = $.uiBackCompat !== false,
+       // prefix used for storing data on .data()
+       dataSpace = "ui-effects-";
+
+$.effects = {
+       effect: {}
+};
+
+/*!
+ * jQuery Color Animations v2.0.0
+ * http://jquery.com/
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * Date: Mon Aug 13 13:41:02 2012 -0500
+ */
+(function( jQuery, undefined ) {
+
+       var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor".split(" "),
+
+       // plusequals test for += 100 -= 100
+       rplusequals = /^([\-+])=\s*(\d+\.?\d*)/,
+       // a set of RE's that can match strings and generate color tuples.
+       stringParsers = [{
+                       re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
+                       parse: function( execResult ) {
+                               return [
+                                       execResult[ 1 ],
+                                       execResult[ 2 ],
+                                       execResult[ 3 ],
+                                       execResult[ 4 ]
+                               ];
+                       }
+               }, {
+                       re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
+                       parse: function( execResult ) {
+                               return [
+                                       execResult[ 1 ] * 2.55,
+                                       execResult[ 2 ] * 2.55,
+                                       execResult[ 3 ] * 2.55,
+                                       execResult[ 4 ]
+                               ];
+                       }
+               }, {
+                       // this regex ignores A-F because it's compared against an already lowercased string
+                       re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,
+                       parse: function( execResult ) {
+                               return [
+                                       parseInt( execResult[ 1 ], 16 ),
+                                       parseInt( execResult[ 2 ], 16 ),
+                                       parseInt( execResult[ 3 ], 16 )
+                               ];
+                       }
+               }, {
+                       // this regex ignores A-F because it's compared against an already lowercased string
+                       re: /#([a-f0-9])([a-f0-9])([a-f0-9])/,
+                       parse: function( execResult ) {
+                               return [
+                                       parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),
+                                       parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),
+                                       parseInt( execResult[ 3 ] + execResult[ 3 ], 16 )
+                               ];
+                       }
+               }, {
+                       re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
+                       space: "hsla",
+                       parse: function( execResult ) {
+                               return [
+                                       execResult[ 1 ],
+                                       execResult[ 2 ] / 100,
+                                       execResult[ 3 ] / 100,
+                                       execResult[ 4 ]
+                               ];
+                       }
+               }],
+
+       // jQuery.Color( )
+       color = jQuery.Color = function( color, green, blue, alpha ) {
+               return new jQuery.Color.fn.parse( color, green, blue, alpha );
+       },
+       spaces = {
+               rgba: {
+                       props: {
+                               red: {
+                                       idx: 0,
+                                       type: "byte"
+                               },
+                               green: {
+                                       idx: 1,
+                                       type: "byte"
+                               },
+                               blue: {
+                                       idx: 2,
+                                       type: "byte"
+                               }
+                       }
+               },
+
+               hsla: {
+                       props: {
+                               hue: {
+                                       idx: 0,
+                                       type: "degrees"
+                               },
+                               saturation: {
+                                       idx: 1,
+                                       type: "percent"
+                               },
+                               lightness: {
+                                       idx: 2,
+                                       type: "percent"
+                               }
+                       }
+               }
+       },
+       propTypes = {
+               "byte": {
+                       floor: true,
+                       max: 255
+               },
+               "percent": {
+                       max: 1
+               },
+               "degrees": {
+                       mod: 360,
+                       floor: true
+               }
+       },
+       support = color.support = {},
+
+       // element for support tests
+       supportElem = jQuery( "<p>" )[ 0 ],
+
+       // colors = jQuery.Color.names
+       colors,
+
+       // local aliases of functions called often
+       each = jQuery.each;
+
+// determine rgba support immediately
+supportElem.style.cssText = "background-color:rgba(1,1,1,.5)";
+support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1;
+
+// define cache name and alpha properties
+// for rgba and hsla spaces
+each( spaces, function( spaceName, space ) {
+       space.cache = "_" + spaceName;
+       space.props.alpha = {
+               idx: 3,
+               type: "percent",
+               def: 1
+       };
+});
+
+function clamp( value, prop, allowEmpty ) {
+       var type = propTypes[ prop.type ] || {};
+
+       if ( value == null ) {
+               return (allowEmpty || !prop.def) ? null : prop.def;
+       }
+
+       // ~~ is an short way of doing floor for positive numbers
+       value = type.floor ? ~~value : parseFloat( value );
+
+       // IE will pass in empty strings as value for alpha,
+       // which will hit this case
+       if ( isNaN( value ) ) {
+               return prop.def;
+       }
+
+       if ( type.mod ) {
+               // we add mod before modding to make sure that negatives values
+               // get converted properly: -10 -> 350
+               return (value + type.mod) % type.mod;
+       }
+
+       // for now all property types without mod have min and max
+       return 0 > value ? 0 : type.max < value ? type.max : value;
+}
+
+function stringParse( string ) {
+       var inst = color(),
+               rgba = inst._rgba = [];
+
+       string = string.toLowerCase();
+
+       each( stringParsers, function( i, parser ) {
+               var parsed,
+                       match = parser.re.exec( string ),
+                       values = match && parser.parse( match ),
+                       spaceName = parser.space || "rgba";
+
+               if ( values ) {
+                       parsed = inst[ spaceName ]( values );
+
+                       // if this was an rgba parse the assignment might happen twice
+                       // oh well....
+                       inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];
+                       rgba = inst._rgba = parsed._rgba;
+
+                       // exit each( stringParsers ) here because we matched
+                       return false;
+               }
+       });
+
+       // Found a stringParser that handled it
+       if ( rgba.length ) {
+
+               // if this came from a parsed string, force "transparent" when alpha is 0
+               // chrome, (and maybe others) return "transparent" as rgba(0,0,0,0)
+               if ( rgba.join() === "0,0,0,0" ) {
+                       jQuery.extend( rgba, colors.transparent );
+               }
+               return inst;
+       }
+
+       // named colors
+       return colors[ string ];
+}
+
+color.fn = jQuery.extend( color.prototype, {
+       parse: function( red, green, blue, alpha ) {
+               if ( red === undefined ) {
+                       this._rgba = [ null, null, null, null ];
+                       return this;
+               }
+               if ( red.jquery || red.nodeType ) {
+                       red = jQuery( red ).css( green );
+                       green = undefined;
+               }
+
+               var inst = this,
+                       type = jQuery.type( red ),
+                       rgba = this._rgba = [];
+
+               // more than 1 argument specified - assume ( red, green, blue, alpha )
+               if ( green !== undefined ) {
+                       red = [ red, green, blue, alpha ];
+                       type = "array";
+               }
+
+               if ( type === "string" ) {
+                       return this.parse( stringParse( red ) || colors._default );
+               }
+
+               if ( type === "array" ) {
+                       each( spaces.rgba.props, function( key, prop ) {
+                               rgba[ prop.idx ] = clamp( red[ prop.idx ], prop );
+                       });
+                       return this;
+               }
+
+               if ( type === "object" ) {
+                       if ( red instanceof color ) {
+                               each( spaces, function( spaceName, space ) {
+                                       if ( red[ space.cache ] ) {
+                                               inst[ space.cache ] = red[ space.cache ].slice();
+                                       }
+                               });
+                       } else {
+                               each( spaces, function( spaceName, space ) {
+                                       var cache = space.cache;
+                                       each( space.props, function( key, prop ) {
+
+                                               // if the cache doesn't exist, and we know how to convert
+                                               if ( !inst[ cache ] && space.to ) {
+
+                                                       // if the value was null, we don't need to copy it
+                                                       // if the key was alpha, we don't need to copy it either
+                                                       if ( key === "alpha" || red[ key ] == null ) {
+                                                               return;
+                                                       }
+                                                       inst[ cache ] = space.to( inst._rgba );
+                                               }
+
+                                               // this is the only case where we allow nulls for ALL properties.
+                                               // call clamp with alwaysAllowEmpty
+                                               inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );
+                                       });
+
+                                       // everything defined but alpha?
+                                       if ( inst[ cache ] && $.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {
+                                               // use the default of 1
+                                               inst[ cache ][ 3 ] = 1;
+                                               if ( space.from ) {
+                                                       inst._rgba = space.from( inst[ cache ] );
+                                               }
+                                       }
+                               });
+                       }
+                       return this;
+               }
+       },
+       is: function( compare ) {
+               var is = color( compare ),
+                       same = true,
+                       inst = this;
+
+               each( spaces, function( _, space ) {
+                       var localCache,
+                               isCache = is[ space.cache ];
+                       if (isCache) {
+                               localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];
+                               each( space.props, function( _, prop ) {
+                                       if ( isCache[ prop.idx ] != null ) {
+                                               same = ( isCache[ prop.idx ] === localCache[ prop.idx ] );
+                                               return same;
+                                       }
+                               });
+                       }
+                       return same;
+               });
+               return same;
+       },
+       _space: function() {
+               var used = [],
+                       inst = this;
+               each( spaces, function( spaceName, space ) {
+                       if ( inst[ space.cache ] ) {
+                               used.push( spaceName );
+                       }
+               });
+               return used.pop();
+       },
+       transition: function( other, distance ) {
+               var end = color( other ),
+                       spaceName = end._space(),
+                       space = spaces[ spaceName ],
+                       startColor = this.alpha() === 0 ? color( "transparent" ) : this,
+                       start = startColor[ space.cache ] || space.to( startColor._rgba ),
+                       result = start.slice();
+
+               end = end[ space.cache ];
+               each( space.props, function( key, prop ) {
+                       var index = prop.idx,
+                               startValue = start[ index ],
+                               endValue = end[ index ],
+                               type = propTypes[ prop.type ] || {};
+
+                       // if null, don't override start value
+                       if ( endValue === null ) {
+                               return;
+                       }
+                       // if null - use end
+                       if ( startValue === null ) {
+                               result[ index ] = endValue;
+                       } else {
+                               if ( type.mod ) {
+                                       if ( endValue - startValue > type.mod / 2 ) {
+                                               startValue += type.mod;
+                                       } else if ( startValue - endValue > type.mod / 2 ) {
+                                               startValue -= type.mod;
+                                       }
+                               }
+                               result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );
+                       }
+               });
+               return this[ spaceName ]( result );
+       },
+       blend: function( opaque ) {
+               // if we are already opaque - return ourself
+               if ( this._rgba[ 3 ] === 1 ) {
+                       return this;
+               }
+
+               var rgb = this._rgba.slice(),
+                       a = rgb.pop(),
+                       blend = color( opaque )._rgba;
+
+               return color( jQuery.map( rgb, function( v, i ) {
+                       return ( 1 - a ) * blend[ i ] + a * v;
+               }));
+       },
+       toRgbaString: function() {
+               var prefix = "rgba(",
+                       rgba = jQuery.map( this._rgba, function( v, i ) {
+                               return v == null ? ( i > 2 ? 1 : 0 ) : v;
+                       });
+
+               if ( rgba[ 3 ] === 1 ) {
+                       rgba.pop();
+                       prefix = "rgb(";
+               }
+
+               return prefix + rgba.join() + ")";
+       },
+       toHslaString: function() {
+               var prefix = "hsla(",
+                       hsla = jQuery.map( this.hsla(), function( v, i ) {
+                               if ( v == null ) {
+                                       v = i > 2 ? 1 : 0;
+                               }
+
+                               // catch 1 and 2
+                               if ( i && i < 3 ) {
+                                       v = Math.round( v * 100 ) + "%";
+                               }
+                               return v;
+                       });
+
+               if ( hsla[ 3 ] === 1 ) {
+                       hsla.pop();
+                       prefix = "hsl(";
+               }
+               return prefix + hsla.join() + ")";
+       },
+       toHexString: function( includeAlpha ) {
+               var rgba = this._rgba.slice(),
+                       alpha = rgba.pop();
+
+               if ( includeAlpha ) {
+                       rgba.push( ~~( alpha * 255 ) );
+               }
+
+               return "#" + jQuery.map( rgba, function( v ) {
+
+                       // default to 0 when nulls exist
+                       v = ( v || 0 ).toString( 16 );
+                       return v.length === 1 ? "0" + v : v;
+               }).join("");
+       },
+       toString: function() {
+               return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString();
+       }
+});
+color.fn.parse.prototype = color.fn;
+
+// hsla conversions adapted from:
+// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021
+
+function hue2rgb( p, q, h ) {
+       h = ( h + 1 ) % 1;
+       if ( h * 6 < 1 ) {
+               return p + (q - p) * h * 6;
+       }
+       if ( h * 2 < 1) {
+               return q;
+       }
+       if ( h * 3 < 2 ) {
+               return p + (q - p) * ((2/3) - h) * 6;
+       }
+       return p;
+}
+
+spaces.hsla.to = function ( rgba ) {
+       if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {
+               return [ null, null, null, rgba[ 3 ] ];
+       }
+       var r = rgba[ 0 ] / 255,
+               g = rgba[ 1 ] / 255,
+               b = rgba[ 2 ] / 255,
+               a = rgba[ 3 ],
+               max = Math.max( r, g, b ),
+               min = Math.min( r, g, b ),
+               diff = max - min,
+               add = max + min,
+               l = add * 0.5,
+               h, s;
+
+       if ( min === max ) {
+               h = 0;
+       } else if ( r === max ) {
+               h = ( 60 * ( g - b ) / diff ) + 360;
+       } else if ( g === max ) {
+               h = ( 60 * ( b - r ) / diff ) + 120;
+       } else {
+               h = ( 60 * ( r - g ) / diff ) + 240;
+       }
+
+       if ( l === 0 || l === 1 ) {
+               s = l;
+       } else if ( l <= 0.5 ) {
+               s = diff / add;
+       } else {
+               s = diff / ( 2 - add );
+       }
+       return [ Math.round(h) % 360, s, l, a == null ? 1 : a ];
+};
+
+spaces.hsla.from = function ( hsla ) {
+       if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {
+               return [ null, null, null, hsla[ 3 ] ];
+       }
+       var h = hsla[ 0 ] / 360,
+               s = hsla[ 1 ],
+               l = hsla[ 2 ],
+               a = hsla[ 3 ],
+               q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,
+               p = 2 * l - q;
+
+       return [
+               Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),
+               Math.round( hue2rgb( p, q, h ) * 255 ),
+               Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),
+               a
+       ];
+};
+
+
+each( spaces, function( spaceName, space ) {
+       var props = space.props,
+               cache = space.cache,
+               to = space.to,
+               from = space.from;
+
+       // makes rgba() and hsla()
+       color.fn[ spaceName ] = function( value ) {
+
+               // generate a cache for this space if it doesn't exist
+               if ( to && !this[ cache ] ) {
+                       this[ cache ] = to( this._rgba );
+               }
+               if ( value === undefined ) {
+                       return this[ cache ].slice();
+               }
+
+               var ret,
+                       type = jQuery.type( value ),
+                       arr = ( type === "array" || type === "object" ) ? value : arguments,
+                       local = this[ cache ].slice();
+
+               each( props, function( key, prop ) {
+                       var val = arr[ type === "object" ? key : prop.idx ];
+                       if ( val == null ) {
+                               val = local[ prop.idx ];
+                       }
+                       local[ prop.idx ] = clamp( val, prop );
+               });
+
+               if ( from ) {
+                       ret = color( from( local ) );
+                       ret[ cache ] = local;
+                       return ret;
+               } else {
+                       return color( local );
+               }
+       };
+
+       // makes red() green() blue() alpha() hue() saturation() lightness()
+       each( props, function( key, prop ) {
+               // alpha is included in more than one space
+               if ( color.fn[ key ] ) {
+                       return;
+               }
+               color.fn[ key ] = function( value ) {
+                       var vtype = jQuery.type( value ),
+                               fn = ( key === "alpha" ? ( this._hsla ? "hsla" : "rgba" ) : spaceName ),
+                               local = this[ fn ](),
+                               cur = local[ prop.idx ],
+                               match;
+
+                       if ( vtype === "undefined" ) {
+                               return cur;
+                       }
+
+                       if ( vtype === "function" ) {
+                               value = value.call( this, cur );
+                               vtype = jQuery.type( value );
+                       }
+                       if ( value == null && prop.empty ) {
+                               return this;
+                       }
+                       if ( vtype === "string" ) {
+                               match = rplusequals.exec( value );
+                               if ( match ) {
+                                       value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 );
+                               }
+                       }
+                       local[ prop.idx ] = value;
+                       return this[ fn ]( local );
+               };
+       });
+});
+
+// add .fx.step functions
+each( stepHooks, function( i, hook ) {
+       jQuery.cssHooks[ hook ] = {
+               set: function( elem, value ) {
+                       var parsed, curElem,
+                               backgroundColor = "";
+
+                       if ( jQuery.type( value ) !== "string" || ( parsed = stringParse( value ) ) ) {
+                               value = color( parsed || value );
+                               if ( !support.rgba && value._rgba[ 3 ] !== 1 ) {
+                                       curElem = hook === "backgroundColor" ? elem.parentNode : elem;
+                                       while (
+                                               (backgroundColor === "" || backgroundColor === "transparent") &&
+                                               curElem && curElem.style
+                                       ) {
+                                               try {
+                                                       backgroundColor = jQuery.css( curElem, "backgroundColor" );
+                                                       curElem = curElem.parentNode;
+                                               } catch ( e ) {
+                                               }
+                                       }
+
+                                       value = value.blend( backgroundColor && backgroundColor !== "transparent" ?
+                                               backgroundColor :
+                                               "_default" );
+                               }
+
+                               value = value.toRgbaString();
+                       }
+                       try {
+                               elem.style[ hook ] = value;
+                       } catch( error ) {
+                               // wrapped to prevent IE from throwing errors on "invalid" values like 'auto' or 'inherit'
+                       }
+               }
+       };
+       jQuery.fx.step[ hook ] = function( fx ) {
+               if ( !fx.colorInit ) {
+                       fx.start = color( fx.elem, hook );
+                       fx.end = color( fx.end );
+                       fx.colorInit = true;
+               }
+               jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );
+       };
+});
+
+jQuery.cssHooks.borderColor = {
+       expand: function( value ) {
+               var expanded = {};
+
+               each( [ "Top", "Right", "Bottom", "Left" ], function( i, part ) {
+                       expanded[ "border" + part + "Color" ] = value;
+               });
+               return expanded;
+       }
+};
+
+// Basic color names only.
+// Usage of any of the other color names requires adding yourself or including
+// jquery.color.svg-names.js.
+colors = jQuery.Color.names = {
+       // 4.1. Basic color keywords
+       aqua: "#00ffff",
+       black: "#000000",
+       blue: "#0000ff",
+       fuchsia: "#ff00ff",
+       gray: "#808080",
+       green: "#008000",
+       lime: "#00ff00",
+       maroon: "#800000",
+       navy: "#000080",
+       olive: "#808000",
+       purple: "#800080",
+       red: "#ff0000",
+       silver: "#c0c0c0",
+       teal: "#008080",
+       white: "#ffffff",
+       yellow: "#ffff00",
+
+       // 4.2.3. "transparent" color keyword
+       transparent: [ null, null, null, 0 ],
+
+       _default: "#ffffff"
+};
+
+})( jQuery );
+
+
+
+/******************************************************************************/
+/****************************** CLASS ANIMATIONS ******************************/
+/******************************************************************************/
+(function() {
+
+var classAnimationActions = [ "add", "remove", "toggle" ],
+       shorthandStyles = {
+               border: 1,
+               borderBottom: 1,
+               borderColor: 1,
+               borderLeft: 1,
+               borderRight: 1,
+               borderTop: 1,
+               borderWidth: 1,
+               margin: 1,
+               padding: 1
+       };
+
+$.each([ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ], function( _, prop ) {
+       $.fx.step[ prop ] = function( fx ) {
+               if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {
+                       jQuery.style( fx.elem, prop, fx.end );
+                       fx.setAttr = true;
+               }
+       };
+});
+
+function getElementStyles() {
+       var style = this.ownerDocument.defaultView ?
+                       this.ownerDocument.defaultView.getComputedStyle( this, null ) :
+                       this.currentStyle,
+               newStyle = {},
+               key,
+               len;
+
+       // webkit enumerates style porperties
+       if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {
+               len = style.length;
+               while ( len-- ) {
+                       key = style[ len ];
+                       if ( typeof style[ key ] === "string" ) {
+                               newStyle[ $.camelCase( key ) ] = style[ key ];
+                       }
+               }
+       } else {
+               for ( key in style ) {
+                       if ( typeof style[ key ] === "string" ) {
+                               newStyle[ key ] = style[ key ];
+                       }
+               }
+       }
+
+       return newStyle;
+}
+
+
+function styleDifference( oldStyle, newStyle ) {
+       var diff = {},
+               name, value;
+
+       for ( name in newStyle ) {
+               value = newStyle[ name ];
+               if ( oldStyle[ name ] !== value ) {
+                       if ( !shorthandStyles[ name ] ) {
+                               if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {
+                                       diff[ name ] = value;
+                               }
+                       }
+               }
+       }
+
+       return diff;
+}
+
+$.effects.animateClass = function( value, duration, easing, callback ) {
+       var o = $.speed( duration, easing, callback );
+
+       return this.queue( function() {
+               var animated = $( this ),
+                       baseClass = animated.attr( "class" ) || "",
+                       applyClassChange,
+                       allAnimations = o.children ? animated.find( "*" ).andSelf() : animated;
+
+               // map the animated objects to store the original styles.
+               allAnimations = allAnimations.map(function() {
+                       var el = $( this );
+                       return {
+                               el: el,
+                               start: getElementStyles.call( this )
+                       };
+               });
+
+               // apply class change
+               applyClassChange = function() {
+                       $.each( classAnimationActions, function(i, action) {
+                               if ( value[ action ] ) {
+                                       animated[ action + "Class" ]( value[ action ] );
+                               }
+                       });
+               };
+               applyClassChange();
+
+               // map all animated objects again - calculate new styles and diff
+               allAnimations = allAnimations.map(function() {
+                       this.end = getElementStyles.call( this.el[ 0 ] );
+                       this.diff = styleDifference( this.start, this.end );
+                       return this;
+               });
+
+               // apply original class
+               animated.attr( "class", baseClass );
+
+               // map all animated objects again - this time collecting a promise
+               allAnimations = allAnimations.map(function() {
+                       var styleInfo = this,
+                               dfd = $.Deferred(),
+                               opts = jQuery.extend({}, o, {
+                                       queue: false,
+                                       complete: function() {
+                                               dfd.resolve( styleInfo );
+                                       }
+                               });
+
+                       this.el.animate( this.diff, opts );
+                       return dfd.promise();
+               });
+
+               // once all animations have completed:
+               $.when.apply( $, allAnimations.get() ).done(function() {
+
+                       // set the final class
+                       applyClassChange();
+
+                       // for each animated element,
+                       // clear all css properties that were animated
+                       $.each( arguments, function() {
+                               var el = this.el;
+                               $.each( this.diff, function(key) {
+                                       el.css( key, '' );
+                               });
+                       });
+
+                       // this is guarnteed to be there if you use jQuery.speed()
+                       // it also handles dequeuing the next anim...
+                       o.complete.call( animated[ 0 ] );
+               });
+       });
+};
+
+$.fn.extend({
+       _addClass: $.fn.addClass,
+       addClass: function( classNames, speed, easing, callback ) {
+               return speed ?
+                       $.effects.animateClass.call( this,
+                               { add: classNames }, speed, easing, callback ) :
+                       this._addClass( classNames );
+       },
+
+       _removeClass: $.fn.removeClass,
+       removeClass: function( classNames, speed, easing, callback ) {
+               return speed ?
+                       $.effects.animateClass.call( this,
+                               { remove: classNames }, speed, easing, callback ) :
+                       this._removeClass( classNames );
+       },
+
+       _toggleClass: $.fn.toggleClass,
+       toggleClass: function( classNames, force, speed, easing, callback ) {
+               if ( typeof force === "boolean" || force === undefined ) {
+                       if ( !speed ) {
+                               // without speed parameter
+                               return this._toggleClass( classNames, force );
+                       } else {
+                               return $.effects.animateClass.call( this,
+                                       (force ? { add: classNames } : { remove: classNames }),
+                                       speed, easing, callback );
+                       }
+               } else {
+                       // without force parameter
+                       return $.effects.animateClass.call( this,
+                               { toggle: classNames }, force, speed, easing );
+               }
+       },
+
+       switchClass: function( remove, add, speed, easing, callback) {
+               return $.effects.animateClass.call( this, {
+                       add: add,
+                       remove: remove
+               }, speed, easing, callback );
+       }
+});
+
+})();
+
+/******************************************************************************/
+/*********************************** EFFECTS **********************************/
+/******************************************************************************/
+
+(function() {
+
+$.extend( $.effects, {
+       version: "1.9.2",
+
+       // Saves a set of properties in a data storage
+       save: function( element, set ) {
+               for( var i=0; i < set.length; i++ ) {
+                       if ( set[ i ] !== null ) {
+                               element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );
+                       }
+               }
+       },
+
+       // Restores a set of previously saved properties from a data storage
+       restore: function( element, set ) {
+               var val, i;
+               for( i=0; i < set.length; i++ ) {
+                       if ( set[ i ] !== null ) {
+                               val = element.data( dataSpace + set[ i ] );
+                               // support: jQuery 1.6.2
+                               // http://bugs.jquery.com/ticket/9917
+                               // jQuery 1.6.2 incorrectly returns undefined for any falsy value.
+                               // We can't differentiate between "" and 0 here, so we just assume
+                               // empty string since it's likely to be a more common value...
+                               if ( val === undefined ) {
+                                       val = "";
+                               }
+                               element.css( set[ i ], val );
+                       }
+               }
+       },
+
+       setMode: function( el, mode ) {
+               if (mode === "toggle") {
+                       mode = el.is( ":hidden" ) ? "show" : "hide";
+               }
+               return mode;
+       },
+
+       // Translates a [top,left] array into a baseline value
+       // this should be a little more flexible in the future to handle a string & hash
+       getBaseline: function( origin, original ) {
+               var y, x;
+               switch ( origin[ 0 ] ) {
+                       case "top": y = 0; break;
+                       case "middle": y = 0.5; break;
+                       case "bottom": y = 1; break;
+                       default: y = origin[ 0 ] / original.height;
+               }
+               switch ( origin[ 1 ] ) {
+                       case "left": x = 0; break;
+                       case "center": x = 0.5; break;
+                       case "right": x = 1; break;
+                       default: x = origin[ 1 ] / original.width;
+               }
+               return {
+                       x: x,
+                       y: y
+               };
+       },
+
+       // Wraps the element around a wrapper that copies position properties
+       createWrapper: function( element ) {
+
+               // if the element is already wrapped, return it
+               if ( element.parent().is( ".ui-effects-wrapper" )) {
+                       return element.parent();
+               }
+
+               // wrap the element
+               var props = {
+                               width: element.outerWidth(true),
+                               height: element.outerHeight(true),
+                               "float": element.css( "float" )
+                       },
+                       wrapper = $( "<div></div>" )
+                               .addClass( "ui-effects-wrapper" )
+                               .css({
+                                       fontSize: "100%",
+                                       background: "transparent",
+                                       border: "none",
+                                       margin: 0,
+                                       padding: 0
+                               }),
+                       // Store the size in case width/height are defined in % - Fixes #5245
+                       size = {
+                               width: element.width(),
+                               height: element.height()
+                       },
+                       active = document.activeElement;
+
+               // support: Firefox
+               // Firefox incorrectly exposes anonymous content
+               // https://bugzilla.mozilla.org/show_bug.cgi?id=561664
+               try {
+                       active.id;
+               } catch( e ) {
+                       active = document.body;
+               }
+
+               element.wrap( wrapper );
+
+               // Fixes #7595 - Elements lose focus when wrapped.
+               if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
+                       $( active ).focus();
+               }
+
+               wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually lose the reference to the wrapped element
+
+               // transfer positioning properties to the wrapper
+               if ( element.css( "position" ) === "static" ) {
+                       wrapper.css({ position: "relative" });
+                       element.css({ position: "relative" });
+               } else {
+                       $.extend( props, {
+                               position: element.css( "position" ),
+                               zIndex: element.css( "z-index" )
+                       });
+                       $.each([ "top", "left", "bottom", "right" ], function(i, pos) {
+                               props[ pos ] = element.css( pos );
+                               if ( isNaN( parseInt( props[ pos ], 10 ) ) ) {
+                                       props[ pos ] = "auto";
+                               }
+                       });
+                       element.css({
+                               position: "relative",
+                               top: 0,
+                               left: 0,
+                               right: "auto",
+                               bottom: "auto"
+                       });
+               }
+               element.css(size);
+
+               return wrapper.css( props ).show();
+       },
+
+       removeWrapper: function( element ) {
+               var active = document.activeElement;
+
+               if ( element.parent().is( ".ui-effects-wrapper" ) ) {
+                       element.parent().replaceWith( element );
+
+                       // Fixes #7595 - Elements lose focus when wrapped.
+                       if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
+                               $( active ).focus();
+                       }
+               }
+
+
+               return element;
+       },
+
+       setTransition: function( element, list, factor, value ) {
+               value = value || {};
+               $.each( list, function( i, x ) {
+                       var unit = element.cssUnit( x );
+                       if ( unit[ 0 ] > 0 ) {
+                               value[ x ] = unit[ 0 ] * factor + unit[ 1 ];
+                       }
+               });
+               return value;
+       }
+});
+
+// return an effect options object for the given parameters:
+function _normalizeArguments( effect, options, speed, callback ) {
+
+       // allow passing all options as the first parameter
+       if ( $.isPlainObject( effect ) ) {
+               options = effect;
+               effect = effect.effect;
+       }
+
+       // convert to an object
+       effect = { effect: effect };
+
+       // catch (effect, null, ...)
+       if ( options == null ) {
+               options = {};
+       }
+
+       // catch (effect, callback)
+       if ( $.isFunction( options ) ) {
+               callback = options;
+               speed = null;
+               options = {};
+       }
+
+       // catch (effect, speed, ?)
+       if ( typeof options === "number" || $.fx.speeds[ options ] ) {
+               callback = speed;
+               speed = options;
+               options = {};
+       }
+
+       // catch (effect, options, callback)
+       if ( $.isFunction( speed ) ) {
+               callback = speed;
+               speed = null;
+       }
+
+       // add options to effect
+       if ( options ) {
+               $.extend( effect, options );
+       }
+
+       speed = speed || options.duration;
+       effect.duration = $.fx.off ? 0 :
+               typeof speed === "number" ? speed :
+               speed in $.fx.speeds ? $.fx.speeds[ speed ] :
+               $.fx.speeds._default;
+
+       effect.complete = callback || options.complete;
+
+       return effect;
+}
+
+function standardSpeed( speed ) {
+       // valid standard speeds
+       if ( !speed || typeof speed === "number" || $.fx.speeds[ speed ] ) {
+               return true;
+       }
+
+       // invalid strings - treat as "normal" speed
+       if ( typeof speed === "string" && !$.effects.effect[ speed ] ) {
+               // TODO: remove in 2.0 (#7115)
+               if ( backCompat && $.effects[ speed ] ) {
+                       return false;
+               }
+               return true;
+       }
+
+       return false;
+}
+
+$.fn.extend({
+       effect: function( /* effect, options, speed, callback */ ) {
+               var args = _normalizeArguments.apply( this, arguments ),
+                       mode = args.mode,
+                       queue = args.queue,
+                       effectMethod = $.effects.effect[ args.effect ],
+
+                       // DEPRECATED: remove in 2.0 (#7115)
+                       oldEffectMethod = !effectMethod && backCompat && $.effects[ args.effect ];
+
+               if ( $.fx.off || !( effectMethod || oldEffectMethod ) ) {
+                       // delegate to the original method (e.g., .show()) if possible
+                       if ( mode ) {
+                               return this[ mode ]( args.duration, args.complete );
+                       } else {
+                               return this.each( function() {
+                                       if ( args.complete ) {
+                                               args.complete.call( this );
+                                       }
+                               });
+                       }
+               }
+
+               function run( next ) {
+                       var elem = $( this ),
+                               complete = args.complete,
+                               mode = args.mode;
+
+                       function done() {
+                               if ( $.isFunction( complete ) ) {
+                                       complete.call( elem[0] );
+                               }
+                               if ( $.isFunction( next ) ) {
+                                       next();
+                               }
+                       }
+
+                       // if the element is hiddden and mode is hide,
+                       // or element is visible and mode is show
+                       if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) {
+                               done();
+                       } else {
+                               effectMethod.call( elem[0], args, done );
+                       }
+               }
+
+               // TODO: remove this check in 2.0, effectMethod will always be true
+               if ( effectMethod ) {
+                       return queue === false ? this.each( run ) : this.queue( queue || "fx", run );
+               } else {
+                       // DEPRECATED: remove in 2.0 (#7115)
+                       return oldEffectMethod.call(this, {
+                               options: args,
+                               duration: args.duration,
+                               callback: args.complete,
+                               mode: args.mode
+                       });
+               }
+       },
+
+       _show: $.fn.show,
+       show: function( speed ) {
+               if ( standardSpeed( speed ) ) {
+                       return this._show.apply( this, arguments );
+               } else {
+                       var args = _normalizeArguments.apply( this, arguments );
+                       args.mode = "show";
+                       return this.effect.call( this, args );
+               }
+       },
+
+       _hide: $.fn.hide,
+       hide: function( speed ) {
+               if ( standardSpeed( speed ) ) {
+                       return this._hide.apply( this, arguments );
+               } else {
+                       var args = _normalizeArguments.apply( this, arguments );
+                       args.mode = "hide";
+                       return this.effect.call( this, args );
+               }
+       },
+
+       // jQuery core overloads toggle and creates _toggle
+       __toggle: $.fn.toggle,
+       toggle: function( speed ) {
+               if ( standardSpeed( speed ) || typeof speed === "boolean" || $.isFunction( speed ) ) {
+                       return this.__toggle.apply( this, arguments );
+               } else {
+                       var args = _normalizeArguments.apply( this, arguments );
+                       args.mode = "toggle";
+                       return this.effect.call( this, args );
+               }
+       },
+
+       // helper functions
+       cssUnit: function(key) {
+               var style = this.css( key ),
+                       val = [];
+
+               $.each( [ "em", "px", "%", "pt" ], function( i, unit ) {
+                       if ( style.indexOf( unit ) > 0 ) {
+                               val = [ parseFloat( style ), unit ];
+                       }
+               });
+               return val;
+       }
+});
+
+})();
+
+/******************************************************************************/
+/*********************************** EASING ***********************************/
+/******************************************************************************/
+
+(function() {
+
+// based on easing equations from Robert Penner (http://www.robertpenner.com/easing)
+
+var baseEasings = {};
+
+$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {
+       baseEasings[ name ] = function( p ) {
+               return Math.pow( p, i + 2 );
+       };
+});
+
+$.extend( baseEasings, {
+       Sine: function ( p ) {
+               return 1 - Math.cos( p * Math.PI / 2 );
+       },
+       Circ: function ( p ) {
+               return 1 - Math.sqrt( 1 - p * p );
+       },
+       Elastic: function( p ) {
+               return p === 0 || p === 1 ? p :
+                       -Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 );
+       },
+       Back: function( p ) {
+               return p * p * ( 3 * p - 2 );
+       },
+       Bounce: function ( p ) {
+               var pow2,
+                       bounce = 4;
+
+               while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
+               return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );
+       }
+});
+
+$.each( baseEasings, function( name, easeIn ) {
+       $.easing[ "easeIn" + name ] = easeIn;
+       $.easing[ "easeOut" + name ] = function( p ) {
+               return 1 - easeIn( 1 - p );
+       };
+       $.easing[ "easeInOut" + name ] = function( p ) {
+               return p < 0.5 ?
+                       easeIn( p * 2 ) / 2 :
+                       1 - easeIn( p * -2 + 2 ) / 2;
+       };
+});
+
+})();
+
+})(jQuery));
diff --git a/resources/lib/jquery.ui/jquery.ui.menu.js b/resources/lib/jquery.ui/jquery.ui.menu.js
new file mode 100644 (file)
index 0000000..6342f2d
--- /dev/null
@@ -0,0 +1,610 @@
+/*!
+ * jQuery UI Menu 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/menu/
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.widget.js
+ *     jquery.ui.position.js
+ */
+(function( $, undefined ) {
+
+var mouseHandled = false;
+
+$.widget( "ui.menu", {
+       version: "1.9.2",
+       defaultElement: "<ul>",
+       delay: 300,
+       options: {
+               icons: {
+                       submenu: "ui-icon-carat-1-e"
+               },
+               menus: "ul",
+               position: {
+                       my: "left top",
+                       at: "right top"
+               },
+               role: "menu",
+
+               // callbacks
+               blur: null,
+               focus: null,
+               select: null
+       },
+
+       _create: function() {
+               this.activeMenu = this.element;
+               this.element
+                       .uniqueId()
+                       .addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" )
+                       .toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length )
+                       .attr({
+                               role: this.options.role,
+                               tabIndex: 0
+                       })
+                       // need to catch all clicks on disabled menu
+                       // not possible through _on
+                       .bind( "click" + this.eventNamespace, $.proxy(function( event ) {
+                               if ( this.options.disabled ) {
+                                       event.preventDefault();
+                               }
+                       }, this ));
+
+               if ( this.options.disabled ) {
+                       this.element
+                               .addClass( "ui-state-disabled" )
+                               .attr( "aria-disabled", "true" );
+               }
+
+               this._on({
+                       // Prevent focus from sticking to links inside menu after clicking
+                       // them (focus should always stay on UL during navigation).
+                       "mousedown .ui-menu-item > a": function( event ) {
+                               event.preventDefault();
+                       },
+                       "click .ui-state-disabled > a": function( event ) {
+                               event.preventDefault();
+                       },
+                       "click .ui-menu-item:has(a)": function( event ) {
+                               var target = $( event.target ).closest( ".ui-menu-item" );
+                               if ( !mouseHandled && target.not( ".ui-state-disabled" ).length ) {
+                                       mouseHandled = true;
+
+                                       this.select( event );
+                                       // Open submenu on click
+                                       if ( target.has( ".ui-menu" ).length ) {
+                                               this.expand( event );
+                                       } else if ( !this.element.is( ":focus" ) ) {
+                                               // Redirect focus to the menu
+                                               this.element.trigger( "focus", [ true ] );
+
+                                               // If the active item is on the top level, let it stay active.
+                                               // Otherwise, blur the active item since it is no longer visible.
+                                               if ( this.active && this.active.parents( ".ui-menu" ).length === 1 ) {
+                                                       clearTimeout( this.timer );
+                                               }
+                                       }
+                               }
+                       },
+                       "mouseenter .ui-menu-item": function( event ) {
+                               var target = $( event.currentTarget );
+                               // Remove ui-state-active class from siblings of the newly focused menu item
+                               // to avoid a jump caused by adjacent elements both having a class with a border
+                               target.siblings().children( ".ui-state-active" ).removeClass( "ui-state-active" );
+                               this.focus( event, target );
+                       },
+                       mouseleave: "collapseAll",
+                       "mouseleave .ui-menu": "collapseAll",
+                       focus: function( event, keepActiveItem ) {
+                               // If there's already an active item, keep it active
+                               // If not, activate the first item
+                               var item = this.active || this.element.children( ".ui-menu-item" ).eq( 0 );
+
+                               if ( !keepActiveItem ) {
+                                       this.focus( event, item );
+                               }
+                       },
+                       blur: function( event ) {
+                               this._delay(function() {
+                                       if ( !$.contains( this.element[0], this.document[0].activeElement ) ) {
+                                               this.collapseAll( event );
+                                       }
+                               });
+                       },
+                       keydown: "_keydown"
+               });
+
+               this.refresh();
+
+               // Clicks outside of a menu collapse any open menus
+               this._on( this.document, {
+                       click: function( event ) {
+                               if ( !$( event.target ).closest( ".ui-menu" ).length ) {
+                                       this.collapseAll( event );
+                               }
+
+                               // Reset the mouseHandled flag
+                               mouseHandled = false;
+                       }
+               });
+       },
+
+       _destroy: function() {
+               // Destroy (sub)menus
+               this.element
+                       .removeAttr( "aria-activedescendant" )
+                       .find( ".ui-menu" ).andSelf()
+                               .removeClass( "ui-menu ui-widget ui-widget-content ui-corner-all ui-menu-icons" )
+                               .removeAttr( "role" )
+                               .removeAttr( "tabIndex" )
+                               .removeAttr( "aria-labelledby" )
+                               .removeAttr( "aria-expanded" )
+                               .removeAttr( "aria-hidden" )
+                               .removeAttr( "aria-disabled" )
+                               .removeUniqueId()
+                               .show();
+
+               // Destroy menu items
+               this.element.find( ".ui-menu-item" )
+                       .removeClass( "ui-menu-item" )
+                       .removeAttr( "role" )
+                       .removeAttr( "aria-disabled" )
+                       .children( "a" )
+                               .removeUniqueId()
+                               .removeClass( "ui-corner-all ui-state-hover" )
+                               .removeAttr( "tabIndex" )
+                               .removeAttr( "role" )
+                               .removeAttr( "aria-haspopup" )
+                               .children().each( function() {
+                                       var elem = $( this );
+                                       if ( elem.data( "ui-menu-submenu-carat" ) ) {
+                                               elem.remove();
+                                       }
+                               });
+
+               // Destroy menu dividers
+               this.element.find( ".ui-menu-divider" ).removeClass( "ui-menu-divider ui-widget-content" );
+       },
+
+       _keydown: function( event ) {
+               var match, prev, character, skip, regex,
+                       preventDefault = true;
+
+               function escape( value ) {
+                       return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
+               }
+
+               switch ( event.keyCode ) {
+               case $.ui.keyCode.PAGE_UP:
+                       this.previousPage( event );
+                       break;
+               case $.ui.keyCode.PAGE_DOWN:
+                       this.nextPage( event );
+                       break;
+               case $.ui.keyCode.HOME:
+                       this._move( "first", "first", event );
+                       break;
+               case $.ui.keyCode.END:
+                       this._move( "last", "last", event );
+                       break;
+               case $.ui.keyCode.UP:
+                       this.previous( event );
+                       break;
+               case $.ui.keyCode.DOWN:
+                       this.next( event );
+                       break;
+               case $.ui.keyCode.LEFT:
+                       this.collapse( event );
+                       break;
+               case $.ui.keyCode.RIGHT:
+                       if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
+                               this.expand( event );
+                       }
+                       break;
+               case $.ui.keyCode.ENTER:
+               case $.ui.keyCode.SPACE:
+                       this._activate( event );
+                       break;
+               case $.ui.keyCode.ESCAPE:
+                       this.collapse( event );
+                       break;
+               default:
+                       preventDefault = false;
+                       prev = this.previousFilter || "";
+                       character = String.fromCharCode( event.keyCode );
+                       skip = false;
+
+                       clearTimeout( this.filterTimer );
+
+                       if ( character === prev ) {
+                               skip = true;
+                       } else {
+                               character = prev + character;
+                       }
+
+                       regex = new RegExp( "^" + escape( character ), "i" );
+                       match = this.activeMenu.children( ".ui-menu-item" ).filter(function() {
+                               return regex.test( $( this ).children( "a" ).text() );
+                       });
+                       match = skip && match.index( this.active.next() ) !== -1 ?
+                               this.active.nextAll( ".ui-menu-item" ) :
+                               match;
+
+                       // If no matches on the current filter, reset to the last character pressed
+                       // to move down the menu to the first item that starts with that character
+                       if ( !match.length ) {
+                               character = String.fromCharCode( event.keyCode );
+                               regex = new RegExp( "^" + escape( character ), "i" );
+                               match = this.activeMenu.children( ".ui-menu-item" ).filter(function() {
+                                       return regex.test( $( this ).children( "a" ).text() );
+                               });
+                       }
+
+                       if ( match.length ) {
+                               this.focus( event, match );
+                               if ( match.length > 1 ) {
+                                       this.previousFilter = character;
+                                       this.filterTimer = this._delay(function() {
+                                               delete this.previousFilter;
+                                       }, 1000 );
+                               } else {
+                                       delete this.previousFilter;
+                               }
+                       } else {
+                               delete this.previousFilter;
+                       }
+               }
+
+               if ( preventDefault ) {
+                       event.preventDefault();
+               }
+       },
+
+       _activate: function( event ) {
+               if ( !this.active.is( ".ui-state-disabled" ) ) {
+                       if ( this.active.children( "a[aria-haspopup='true']" ).length ) {
+                               this.expand( event );
+                       } else {
+                               this.select( event );
+                       }
+               }
+       },
+
+       refresh: function() {
+               var menus,
+                       icon = this.options.icons.submenu,
+                       submenus = this.element.find( this.options.menus );
+
+               // Initialize nested menus
+               submenus.filter( ":not(.ui-menu)" )
+                       .addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" )
+                       .hide()
+                       .attr({
+                               role: this.options.role,
+                               "aria-hidden": "true",
+                               "aria-expanded": "false"
+                       })
+                       .each(function() {
+                               var menu = $( this ),
+                                       item = menu.prev( "a" ),
+                                       submenuCarat = $( "<span>" )
+                                               .addClass( "ui-menu-icon ui-icon " + icon )
+                                               .data( "ui-menu-submenu-carat", true );
+
+                               item
+                                       .attr( "aria-haspopup", "true" )
+                                       .prepend( submenuCarat );
+                               menu.attr( "aria-labelledby", item.attr( "id" ) );
+                       });
+
+               menus = submenus.add( this.element );
+
+               // Don't refresh list items that are already adapted
+               menus.children( ":not(.ui-menu-item):has(a)" )
+                       .addClass( "ui-menu-item" )
+                       .attr( "role", "presentation" )
+                       .children( "a" )
+                               .uniqueId()
+                               .addClass( "ui-corner-all" )
+                               .attr({
+                                       tabIndex: -1,
+                                       role: this._itemRole()
+                               });
+
+               // Initialize unlinked menu-items containing spaces and/or dashes only as dividers
+               menus.children( ":not(.ui-menu-item)" ).each(function() {
+                       var item = $( this );
+                       // hyphen, em dash, en dash
+                       if ( !/[^\-—–\s]/.test( item.text() ) ) {
+                               item.addClass( "ui-widget-content ui-menu-divider" );
+                       }
+               });
+
+               // Add aria-disabled attribute to any disabled menu item
+               menus.children( ".ui-state-disabled" ).attr( "aria-disabled", "true" );
+
+               // If the active item has been removed, blur the menu
+               if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
+                       this.blur();
+               }
+       },
+
+       _itemRole: function() {
+               return {
+                       menu: "menuitem",
+                       listbox: "option"
+               }[ this.options.role ];
+       },
+
+       focus: function( event, item ) {
+               var nested, focused;
+               this.blur( event, event && event.type === "focus" );
+
+               this._scrollIntoView( item );
+
+               this.active = item.first();
+               focused = this.active.children( "a" ).addClass( "ui-state-focus" );
+               // Only update aria-activedescendant if there's a role
+               // otherwise we assume focus is managed elsewhere
+               if ( this.options.role ) {
+                       this.element.attr( "aria-activedescendant", focused.attr( "id" ) );
+               }
+
+               // Highlight active parent menu item, if any
+               this.active
+                       .parent()
+                       .closest( ".ui-menu-item" )
+                       .children( "a:first" )
+                       .addClass( "ui-state-active" );
+
+               if ( event && event.type === "keydown" ) {
+                       this._close();
+               } else {
+                       this.timer = this._delay(function() {
+                               this._close();
+                       }, this.delay );
+               }
+
+               nested = item.children( ".ui-menu" );
+               if ( nested.length && ( /^mouse/.test( event.type ) ) ) {
+                       this._startOpening(nested);
+               }
+               this.activeMenu = item.parent();
+
+               this._trigger( "focus", event, { item: item } );
+       },
+
+       _scrollIntoView: function( item ) {
+               var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
+               if ( this._hasScroll() ) {
+                       borderTop = parseFloat( $.css( this.activeMenu[0], "borderTopWidth" ) ) || 0;
+                       paddingTop = parseFloat( $.css( this.activeMenu[0], "paddingTop" ) ) || 0;
+                       offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;
+                       scroll = this.activeMenu.scrollTop();
+                       elementHeight = this.activeMenu.height();
+                       itemHeight = item.height();
+
+                       if ( offset < 0 ) {
+                               this.activeMenu.scrollTop( scroll + offset );
+                       } else if ( offset + itemHeight > elementHeight ) {
+                               this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );
+                       }
+               }
+       },
+
+       blur: function( event, fromFocus ) {
+               if ( !fromFocus ) {
+                       clearTimeout( this.timer );
+               }
+
+               if ( !this.active ) {
+                       return;
+               }
+
+               this.active.children( "a" ).removeClass( "ui-state-focus" );
+               this.active = null;
+
+               this._trigger( "blur", event, { item: this.active } );
+       },
+
+       _startOpening: function( submenu ) {
+               clearTimeout( this.timer );
+
+               // Don't open if already open fixes a Firefox bug that caused a .5 pixel
+               // shift in the submenu position when mousing over the carat icon
+               if ( submenu.attr( "aria-hidden" ) !== "true" ) {
+                       return;
+               }
+
+               this.timer = this._delay(function() {
+                       this._close();
+                       this._open( submenu );
+               }, this.delay );
+       },
+
+       _open: function( submenu ) {
+               var position = $.extend({
+                       of: this.active
+               }, this.options.position );
+
+               clearTimeout( this.timer );
+               this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" ) )
+                       .hide()
+                       .attr( "aria-hidden", "true" );
+
+               submenu
+                       .show()
+                       .removeAttr( "aria-hidden" )
+                       .attr( "aria-expanded", "true" )
+                       .position( position );
+       },
+
+       collapseAll: function( event, all ) {
+               clearTimeout( this.timer );
+               this.timer = this._delay(function() {
+                       // If we were passed an event, look for the submenu that contains the event
+                       var currentMenu = all ? this.element :
+                               $( event && event.target ).closest( this.element.find( ".ui-menu" ) );
+
+                       // If we found no valid submenu ancestor, use the main menu to close all sub menus anyway
+                       if ( !currentMenu.length ) {
+                               currentMenu = this.element;
+                       }
+
+                       this._close( currentMenu );
+
+                       this.blur( event );
+                       this.activeMenu = currentMenu;
+               }, this.delay );
+       },
+
+       // With no arguments, closes the currently active menu - if nothing is active
+       // it closes all menus.  If passed an argument, it will search for menus BELOW
+       _close: function( startMenu ) {
+               if ( !startMenu ) {
+                       startMenu = this.active ? this.active.parent() : this.element;
+               }
+
+               startMenu
+                       .find( ".ui-menu" )
+                               .hide()
+                               .attr( "aria-hidden", "true" )
+                               .attr( "aria-expanded", "false" )
+                       .end()
+                       .find( "a.ui-state-active" )
+                               .removeClass( "ui-state-active" );
+       },
+
+       collapse: function( event ) {
+               var newItem = this.active &&
+                       this.active.parent().closest( ".ui-menu-item", this.element );
+               if ( newItem && newItem.length ) {
+                       this._close();
+                       this.focus( event, newItem );
+               }
+       },
+
+       expand: function( event ) {
+               var newItem = this.active &&
+                       this.active
+                               .children( ".ui-menu " )
+                               .children( ".ui-menu-item" )
+                               .first();
+
+               if ( newItem && newItem.length ) {
+                       this._open( newItem.parent() );
+
+                       // Delay so Firefox will not hide activedescendant change in expanding submenu from AT
+                       this._delay(function() {
+                               this.focus( event, newItem );
+                       });
+               }
+       },
+
+       next: function( event ) {
+               this._move( "next", "first", event );
+       },
+
+       previous: function( event ) {
+               this._move( "prev", "last", event );
+       },
+
+       isFirstItem: function() {
+               return this.active && !this.active.prevAll( ".ui-menu-item" ).length;
+       },
+
+       isLastItem: function() {
+               return this.active && !this.active.nextAll( ".ui-menu-item" ).length;
+       },
+
+       _move: function( direction, filter, event ) {
+               var next;
+               if ( this.active ) {
+                       if ( direction === "first" || direction === "last" ) {
+                               next = this.active
+                                       [ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" )
+                                       .eq( -1 );
+                       } else {
+                               next = this.active
+                                       [ direction + "All" ]( ".ui-menu-item" )
+                                       .eq( 0 );
+                       }
+               }
+               if ( !next || !next.length || !this.active ) {
+                       next = this.activeMenu.children( ".ui-menu-item" )[ filter ]();
+               }
+
+               this.focus( event, next );
+       },
+
+       nextPage: function( event ) {
+               var item, base, height;
+
+               if ( !this.active ) {
+                       this.next( event );
+                       return;
+               }
+               if ( this.isLastItem() ) {
+                       return;
+               }
+               if ( this._hasScroll() ) {
+                       base = this.active.offset().top;
+                       height = this.element.height();
+                       this.active.nextAll( ".ui-menu-item" ).each(function() {
+                               item = $( this );
+                               return item.offset().top - base - height < 0;
+                       });
+
+                       this.focus( event, item );
+               } else {
+                       this.focus( event, this.activeMenu.children( ".ui-menu-item" )
+                               [ !this.active ? "first" : "last" ]() );
+               }
+       },
+
+       previousPage: function( event ) {
+               var item, base, height;
+               if ( !this.active ) {
+                       this.next( event );
+                       return;
+               }
+               if ( this.isFirstItem() ) {
+                       return;
+               }
+               if ( this._hasScroll() ) {
+                       base = this.active.offset().top;
+                       height = this.element.height();
+                       this.active.prevAll( ".ui-menu-item" ).each(function() {
+                               item = $( this );
+                               return item.offset().top - base + height > 0;
+                       });
+
+                       this.focus( event, item );
+               } else {
+                       this.focus( event, this.activeMenu.children( ".ui-menu-item" ).first() );
+               }
+       },
+
+       _hasScroll: function() {
+               return this.element.outerHeight() < this.element.prop( "scrollHeight" );
+       },
+
+       select: function( event ) {
+               // TODO: It should never be possible to not have an active item at this
+               // point, but the tests don't trigger mouseenter before click.
+               this.active = this.active || $( event.target ).closest( ".ui-menu-item" );
+               var ui = { item: this.active };
+               if ( !this.active.has( ".ui-menu" ).length ) {
+                       this.collapseAll( event, true );
+               }
+               this._trigger( "select", event, ui );
+       }
+});
+
+}( jQuery ));
index 52a1786..250365f 100644 (file)
@@ -1,11 +1,12 @@
 /*!
- * jQuery UI Mouse 1.8.24
+ * jQuery UI Mouse 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Mouse
+ * http://api.jqueryui.com/mouse/
  *
  * Depends:
  *     jquery.ui.widget.js
@@ -18,21 +19,22 @@ $( document ).mouseup( function( e ) {
 });
 
 $.widget("ui.mouse", {
+       version: "1.9.2",
        options: {
-               cancel: ':input,option',
+               cancel: 'input,textarea,button,select,option',
                distance: 1,
                delay: 0
        },
        _mouseInit: function() {
-               var self = this;
+               var that = this;
 
                this.element
                        .bind('mousedown.'+this.widgetName, function(event) {
-                               return self._mouseDown(event);
+                               return that._mouseDown(event);
                        })
                        .bind('click.'+this.widgetName, function(event) {
-                               if (true === $.data(event.target, self.widgetName + '.preventClickEvent')) {
-                                   $.removeData(event.target, self.widgetName + '.preventClickEvent');
+                               if (true === $.data(event.target, that.widgetName + '.preventClickEvent')) {
+                                       $.removeData(event.target, that.widgetName + '.preventClickEvent');
                                        event.stopImmediatePropagation();
                                        return false;
                                }
@@ -54,18 +56,18 @@ $.widget("ui.mouse", {
 
        _mouseDown: function(event) {
                // don't let more than one widget handle mouseStart
-               if( mouseHandled ) { return };
+               if( mouseHandled ) { return; }
 
                // we may have missed mouseup (out of window)
                (this._mouseStarted && this._mouseUp(event));
 
                this._mouseDownEvent = event;
 
-               var self = this,
-                       btnIsLeft = (event.which == 1),
+               var that = this,
+                       btnIsLeft = (event.which === 1),
                        // event.target.nodeName works around a bug in IE 8 with
                        // disabled inputs (#7620)
-                       elIsCancel = (typeof this.options.cancel == "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
+                       elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
                if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
                        return true;
                }
@@ -73,7 +75,7 @@ $.widget("ui.mouse", {
                this.mouseDelayMet = !this.options.delay;
                if (!this.mouseDelayMet) {
                        this._mouseDelayTimer = setTimeout(function() {
-                               self.mouseDelayMet = true;
+                               that.mouseDelayMet = true;
                        }, this.options.delay);
                }
 
@@ -92,24 +94,24 @@ $.widget("ui.mouse", {
 
                // these delegates are required to keep context
                this._mouseMoveDelegate = function(event) {
-                       return self._mouseMove(event);
+                       return that._mouseMove(event);
                };
                this._mouseUpDelegate = function(event) {
-                       return self._mouseUp(event);
+                       return that._mouseUp(event);
                };
                $(document)
                        .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
                        .bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
 
                event.preventDefault();
-               
+
                mouseHandled = true;
                return true;
        },
 
        _mouseMove: function(event) {
                // IE mouseup check - mouseup happened when mouse was out of window
-               if ($.browser.msie && !(document.documentMode >= 9) && !event.button) {
+               if ($.ui.ie && !(document.documentMode >= 9) && !event.button) {
                        return this._mouseUp(event);
                }
 
@@ -135,8 +137,8 @@ $.widget("ui.mouse", {
                if (this._mouseStarted) {
                        this._mouseStarted = false;
 
-                       if (event.target == this._mouseDownEvent.target) {
-                           $.data(event.target, this.widgetName + '.preventClickEvent', true);
+                       if (event.target === this._mouseDownEvent.target) {
+                               $.data(event.target, this.widgetName + '.preventClickEvent', true);
                        }
 
                        this._mouseStop(event);
index 8b20179..be99013 100644 (file)
@@ -1,22 +1,87 @@
 /*!
- * jQuery UI Position 1.8.24
+ * jQuery UI Position 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Position
+ * http://api.jqueryui.com/position/
  */
 (function( $, undefined ) {
 
 $.ui = $.ui || {};
 
-var horizontalPositions = /left|center|right/,
-       verticalPositions = /top|center|bottom/,
-       center = "center",
-       support = {},
-       _position = $.fn.position,
-       _offset = $.fn.offset;
+var cachedScrollbarWidth,
+       max = Math.max,
+       abs = Math.abs,
+       round = Math.round,
+       rhorizontal = /left|center|right/,
+       rvertical = /top|center|bottom/,
+       roffset = /[\+\-]\d+%?/,
+       rposition = /^\w+/,
+       rpercent = /%$/,
+       _position = $.fn.position;
+
+function getOffsets( offsets, width, height ) {
+       return [
+               parseInt( offsets[ 0 ], 10 ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
+               parseInt( offsets[ 1 ], 10 ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
+       ];
+}
+function parseCss( element, property ) {
+       return parseInt( $.css( element, property ), 10 ) || 0;
+}
+
+$.position = {
+       scrollbarWidth: function() {
+               if ( cachedScrollbarWidth !== undefined ) {
+                       return cachedScrollbarWidth;
+               }
+               var w1, w2,
+                       div = $( "<div style='display:block;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>" ),
+                       innerDiv = div.children()[0];
+
+               $( "body" ).append( div );
+               w1 = innerDiv.offsetWidth;
+               div.css( "overflow", "scroll" );
+
+               w2 = innerDiv.offsetWidth;
+
+               if ( w1 === w2 ) {
+                       w2 = div[0].clientWidth;
+               }
+
+               div.remove();
+
+               return (cachedScrollbarWidth = w1 - w2);
+       },
+       getScrollInfo: function( within ) {
+               var overflowX = within.isWindow ? "" : within.element.css( "overflow-x" ),
+                       overflowY = within.isWindow ? "" : within.element.css( "overflow-y" ),
+                       hasOverflowX = overflowX === "scroll" ||
+                               ( overflowX === "auto" && within.width < within.element[0].scrollWidth ),
+                       hasOverflowY = overflowY === "scroll" ||
+                               ( overflowY === "auto" && within.height < within.element[0].scrollHeight );
+               return {
+                       width: hasOverflowX ? $.position.scrollbarWidth() : 0,
+                       height: hasOverflowY ? $.position.scrollbarWidth() : 0
+               };
+       },
+       getWithinInfo: function( element ) {
+               var withinElement = $( element || window ),
+                       isWindow = $.isWindow( withinElement[0] );
+               return {
+                       element: withinElement,
+                       isWindow: isWindow,
+                       offset: withinElement.offset() || { left: 0, top: 0 },
+                       scrollLeft: withinElement.scrollLeft(),
+                       scrollTop: withinElement.scrollTop(),
+                       width: isWindow ? withinElement.width() : withinElement.outerWidth(),
+                       height: isWindow ? withinElement.height() : withinElement.outerHeight()
+               };
+       }
+};
 
 $.fn.position = function( options ) {
        if ( !options || !options.of ) {
@@ -26,48 +91,65 @@ $.fn.position = function( options ) {
        // make a copy, we don't want to modify arguments
        options = $.extend( {}, options );
 
-       var target = $( options.of ),
+       var atOffset, targetWidth, targetHeight, targetOffset, basePosition,
+               target = $( options.of ),
+               within = $.position.getWithinInfo( options.within ),
+               scrollInfo = $.position.getScrollInfo( within ),
                targetElem = target[0],
                collision = ( options.collision || "flip" ).split( " " ),
-               offset = options.offset ? options.offset.split( " " ) : [ 0, 0 ],
-               targetWidth,
-               targetHeight,
-               basePosition;
+               offsets = {};
 
        if ( targetElem.nodeType === 9 ) {
                targetWidth = target.width();
                targetHeight = target.height();
-               basePosition = { top: 0, left: 0 };
-       // TODO: use $.isWindow() in 1.9
-       } else if ( targetElem.setTimeout ) {
+               targetOffset = { top: 0, left: 0 };
+       } else if ( $.isWindow( targetElem ) ) {
                targetWidth = target.width();
                targetHeight = target.height();
-               basePosition = { top: target.scrollTop(), left: target.scrollLeft() };
+               targetOffset = { top: target.scrollTop(), left: target.scrollLeft() };
        } else if ( targetElem.preventDefault ) {
                // force left top to allow flipping
                options.at = "left top";
                targetWidth = targetHeight = 0;
-               basePosition = { top: options.of.pageY, left: options.of.pageX };
+               targetOffset = { top: targetElem.pageY, left: targetElem.pageX };
        } else {
                targetWidth = target.outerWidth();
                targetHeight = target.outerHeight();
-               basePosition = target.offset();
+               targetOffset = target.offset();
        }
+       // clone to reuse original targetOffset later
+       basePosition = $.extend( {}, targetOffset );
 
-       // force my and at to have valid horizontal and veritcal positions
-       // if a value is missing or invalid, it will be converted to center 
+       // force my and at to have valid horizontal and vertical positions
+       // if a value is missing or invalid, it will be converted to center
        $.each( [ "my", "at" ], function() {
-               var pos = ( options[this] || "" ).split( " " );
+               var pos = ( options[ this ] || "" ).split( " " ),
+                       horizontalOffset,
+                       verticalOffset;
+
                if ( pos.length === 1) {
-                       pos = horizontalPositions.test( pos[0] ) ?
-                               pos.concat( [center] ) :
-                               verticalPositions.test( pos[0] ) ?
-                                       [ center ].concat( pos ) :
-                                       [ center, center ];
+                       pos = rhorizontal.test( pos[ 0 ] ) ?
+                               pos.concat( [ "center" ] ) :
+                               rvertical.test( pos[ 0 ] ) ?
+                                       [ "center" ].concat( pos ) :
+                                       [ "center", "center" ];
                }
-               pos[ 0 ] = horizontalPositions.test( pos[0] ) ? pos[ 0 ] : center;
-               pos[ 1 ] = verticalPositions.test( pos[1] ) ? pos[ 1 ] : center;
-               options[ this ] = pos;
+               pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
+               pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
+
+               // calculate offsets
+               horizontalOffset = roffset.exec( pos[ 0 ] );
+               verticalOffset = roffset.exec( pos[ 1 ] );
+               offsets[ this ] = [
+                       horizontalOffset ? horizontalOffset[ 0 ] : 0,
+                       verticalOffset ? verticalOffset[ 0 ] : 0
+               ];
+
+               // reduce to just the positions without the offsets
+               options[ this ] = [
+                       rposition.exec( pos[ 0 ] )[ 0 ],
+                       rposition.exec( pos[ 1 ] )[ 0 ]
+               ];
        });
 
        // normalize collision option
@@ -75,67 +157,63 @@ $.fn.position = function( options ) {
                collision[ 1 ] = collision[ 0 ];
        }
 
-       // normalize offset option
-       offset[ 0 ] = parseInt( offset[0], 10 ) || 0;
-       if ( offset.length === 1 ) {
-               offset[ 1 ] = offset[ 0 ];
-       }
-       offset[ 1 ] = parseInt( offset[1], 10 ) || 0;
-
-       if ( options.at[0] === "right" ) {
+       if ( options.at[ 0 ] === "right" ) {
                basePosition.left += targetWidth;
-       } else if ( options.at[0] === center ) {
+       } else if ( options.at[ 0 ] === "center" ) {
                basePosition.left += targetWidth / 2;
        }
 
-       if ( options.at[1] === "bottom" ) {
+       if ( options.at[ 1 ] === "bottom" ) {
                basePosition.top += targetHeight;
-       } else if ( options.at[1] === center ) {
+       } else if ( options.at[ 1 ] === "center" ) {
                basePosition.top += targetHeight / 2;
        }
 
-       basePosition.left += offset[ 0 ];
-       basePosition.top += offset[ 1 ];
+       atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
+       basePosition.left += atOffset[ 0 ];
+       basePosition.top += atOffset[ 1 ];
 
        return this.each(function() {
-               var elem = $( this ),
+               var collisionPosition, using,
+                       elem = $( this ),
                        elemWidth = elem.outerWidth(),
                        elemHeight = elem.outerHeight(),
-                       marginLeft = parseInt( $.curCSS( this, "marginLeft", true ) ) || 0,
-                       marginTop = parseInt( $.curCSS( this, "marginTop", true ) ) || 0,
-                       collisionWidth = elemWidth + marginLeft +
-                               ( parseInt( $.curCSS( this, "marginRight", true ) ) || 0 ),
-                       collisionHeight = elemHeight + marginTop +
-                               ( parseInt( $.curCSS( this, "marginBottom", true ) ) || 0 ),
+                       marginLeft = parseCss( this, "marginLeft" ),
+                       marginTop = parseCss( this, "marginTop" ),
+                       collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width,
+                       collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height,
                        position = $.extend( {}, basePosition ),
-                       collisionPosition;
+                       myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
 
-               if ( options.my[0] === "right" ) {
+               if ( options.my[ 0 ] === "right" ) {
                        position.left -= elemWidth;
-               } else if ( options.my[0] === center ) {
+               } else if ( options.my[ 0 ] === "center" ) {
                        position.left -= elemWidth / 2;
                }
 
-               if ( options.my[1] === "bottom" ) {
+               if ( options.my[ 1 ] === "bottom" ) {
                        position.top -= elemHeight;
-               } else if ( options.my[1] === center ) {
+               } else if ( options.my[ 1 ] === "center" ) {
                        position.top -= elemHeight / 2;
                }
 
-               // prevent fractions if jQuery version doesn't support them (see #5280)
-               if ( !support.fractions ) {
-                       position.left = Math.round( position.left );
-                       position.top = Math.round( position.top );
+               position.left += myOffset[ 0 ];
+               position.top += myOffset[ 1 ];
+
+               // if the browser doesn't support fractions, then round for consistent results
+               if ( !$.support.offsetFractions ) {
+                       position.left = round( position.left );
+                       position.top = round( position.top );
                }
 
                collisionPosition = {
-                       left: position.left - marginLeft,
-                       top: position.top - marginTop
+                       marginLeft: marginLeft,
+                       marginTop: marginTop
                };
 
                $.each( [ "left", "top" ], function( i, dir ) {
-                       if ( $.ui.position[ collision[i] ] ) {
-                               $.ui.position[ collision[i] ][ dir ]( position, {
+                       if ( $.ui.position[ collision[ i ] ] ) {
+                               $.ui.position[ collision[ i ] ][ dir ]( position, {
                                        targetWidth: targetWidth,
                                        targetHeight: targetHeight,
                                        elemWidth: elemWidth,
@@ -143,9 +221,11 @@ $.fn.position = function( options ) {
                                        collisionPosition: collisionPosition,
                                        collisionWidth: collisionWidth,
                                        collisionHeight: collisionHeight,
-                                       offset: offset,
+                                       offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
                                        my: options.my,
-                                       at: options.at
+                                       at: options.at,
+                                       within: within,
+                                       elem : elem
                                });
                        }
                });
@@ -153,31 +233,137 @@ $.fn.position = function( options ) {
                if ( $.fn.bgiframe ) {
                        elem.bgiframe();
                }
-               elem.offset( $.extend( position, { using: options.using } ) );
+
+               if ( options.using ) {
+                       // adds feedback as second argument to using callback, if present
+                       using = function( props ) {
+                               var left = targetOffset.left - position.left,
+                                       right = left + targetWidth - elemWidth,
+                                       top = targetOffset.top - position.top,
+                                       bottom = top + targetHeight - elemHeight,
+                                       feedback = {
+                                               target: {
+                                                       element: target,
+                                                       left: targetOffset.left,
+                                                       top: targetOffset.top,
+                                                       width: targetWidth,
+                                                       height: targetHeight
+                                               },
+                                               element: {
+                                                       element: elem,
+                                                       left: position.left,
+                                                       top: position.top,
+                                                       width: elemWidth,
+                                                       height: elemHeight
+                                               },
+                                               horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
+                                               vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
+                                       };
+                               if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
+                                       feedback.horizontal = "center";
+                               }
+                               if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {
+                                       feedback.vertical = "middle";
+                               }
+                               if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
+                                       feedback.important = "horizontal";
+                               } else {
+                                       feedback.important = "vertical";
+                               }
+                               options.using.call( this, props, feedback );
+                       };
+               }
+
+               elem.offset( $.extend( position, { using: using } ) );
        });
 };
 
 $.ui.position = {
        fit: {
                left: function( position, data ) {
-                       var win = $( window ),
-                               over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft();
-                       position.left = over > 0 ? position.left - over : Math.max( position.left - data.collisionPosition.left, position.left );
+                       var within = data.within,
+                               withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
+                               outerWidth = within.width,
+                               collisionPosLeft = position.left - data.collisionPosition.marginLeft,
+                               overLeft = withinOffset - collisionPosLeft,
+                               overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
+                               newOverRight;
+
+                       // element is wider than within
+                       if ( data.collisionWidth > outerWidth ) {
+                               // element is initially over the left side of within
+                               if ( overLeft > 0 && overRight <= 0 ) {
+                                       newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset;
+                                       position.left += overLeft - newOverRight;
+                               // element is initially over right side of within
+                               } else if ( overRight > 0 && overLeft <= 0 ) {
+                                       position.left = withinOffset;
+                               // element is initially over both left and right sides of within
+                               } else {
+                                       if ( overLeft > overRight ) {
+                                               position.left = withinOffset + outerWidth - data.collisionWidth;
+                                       } else {
+                                               position.left = withinOffset;
+                                       }
+                               }
+                       // too far left -> align with left edge
+                       } else if ( overLeft > 0 ) {
+                               position.left += overLeft;
+                       // too far right -> align with right edge
+                       } else if ( overRight > 0 ) {
+                               position.left -= overRight;
+                       // adjust based on position and margin
+                       } else {
+                               position.left = max( position.left - collisionPosLeft, position.left );
+                       }
                },
                top: function( position, data ) {
-                       var win = $( window ),
-                               over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop();
-                       position.top = over > 0 ? position.top - over : Math.max( position.top - data.collisionPosition.top, position.top );
+                       var within = data.within,
+                               withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
+                               outerHeight = data.within.height,
+                               collisionPosTop = position.top - data.collisionPosition.marginTop,
+                               overTop = withinOffset - collisionPosTop,
+                               overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
+                               newOverBottom;
+
+                       // element is taller than within
+                       if ( data.collisionHeight > outerHeight ) {
+                               // element is initially over the top of within
+                               if ( overTop > 0 && overBottom <= 0 ) {
+                                       newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset;
+                                       position.top += overTop - newOverBottom;
+                               // element is initially over bottom of within
+                               } else if ( overBottom > 0 && overTop <= 0 ) {
+                                       position.top = withinOffset;
+                               // element is initially over both top and bottom of within
+                               } else {
+                                       if ( overTop > overBottom ) {
+                                               position.top = withinOffset + outerHeight - data.collisionHeight;
+                                       } else {
+                                               position.top = withinOffset;
+                                       }
+                               }
+                       // too far up -> align with top
+                       } else if ( overTop > 0 ) {
+                               position.top += overTop;
+                       // too far down -> align with bottom edge
+                       } else if ( overBottom > 0 ) {
+                               position.top -= overBottom;
+                       // adjust based on position and margin
+                       } else {
+                               position.top = max( position.top - collisionPosTop, position.top );
+                       }
                }
        },
-
        flip: {
                left: function( position, data ) {
-                       if ( data.at[0] === center ) {
-                               return;
-                       }
-                       var win = $( window ),
-                               over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft(),
+                       var within = data.within,
+                               withinOffset = within.offset.left + within.scrollLeft,
+                               outerWidth = within.width,
+                               offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
+                               collisionPosLeft = position.left - data.collisionPosition.marginLeft,
+                               overLeft = collisionPosLeft - offsetLeft,
+                               overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
                                myOffset = data.my[ 0 ] === "left" ?
                                        -data.elemWidth :
                                        data.my[ 0 ] === "right" ?
@@ -185,88 +371,79 @@ $.ui.position = {
                                                0,
                                atOffset = data.at[ 0 ] === "left" ?
                                        data.targetWidth :
-                                       -data.targetWidth,
-                               offset = -2 * data.offset[ 0 ];
-                       position.left += data.collisionPosition.left < 0 ?
-                               myOffset + atOffset + offset :
-                               over > 0 ?
-                                       myOffset + atOffset + offset :
-                                       0;
+                                       data.at[ 0 ] === "right" ?
+                                               -data.targetWidth :
+                                               0,
+                               offset = -2 * data.offset[ 0 ],
+                               newOverRight,
+                               newOverLeft;
+
+                       if ( overLeft < 0 ) {
+                               newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset;
+                               if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
+                                       position.left += myOffset + atOffset + offset;
+                               }
+                       }
+                       else if ( overRight > 0 ) {
+                               newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft;
+                               if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
+                                       position.left += myOffset + atOffset + offset;
+                               }
+                       }
                },
                top: function( position, data ) {
-                       if ( data.at[1] === center ) {
-                               return;
-                       }
-                       var win = $( window ),
-                               over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop(),
-                               myOffset = data.my[ 1 ] === "top" ?
+                       var within = data.within,
+                               withinOffset = within.offset.top + within.scrollTop,
+                               outerHeight = within.height,
+                               offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
+                               collisionPosTop = position.top - data.collisionPosition.marginTop,
+                               overTop = collisionPosTop - offsetTop,
+                               overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
+                               top = data.my[ 1 ] === "top",
+                               myOffset = top ?
                                        -data.elemHeight :
                                        data.my[ 1 ] === "bottom" ?
                                                data.elemHeight :
                                                0,
                                atOffset = data.at[ 1 ] === "top" ?
                                        data.targetHeight :
-                                       -data.targetHeight,
-                               offset = -2 * data.offset[ 1 ];
-                       position.top += data.collisionPosition.top < 0 ?
-                               myOffset + atOffset + offset :
-                               over > 0 ?
-                                       myOffset + atOffset + offset :
-                                       0;
+                                       data.at[ 1 ] === "bottom" ?
+                                               -data.targetHeight :
+                                               0,
+                               offset = -2 * data.offset[ 1 ],
+                               newOverTop,
+                               newOverBottom;
+                       if ( overTop < 0 ) {
+                               newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset;
+                               if ( ( position.top + myOffset + atOffset + offset) > overTop && ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) ) {
+                                       position.top += myOffset + atOffset + offset;
+                               }
+                       }
+                       else if ( overBottom > 0 ) {
+                               newOverTop = position.top -  data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop;
+                               if ( ( position.top + myOffset + atOffset + offset) > overBottom && ( newOverTop > 0 || abs( newOverTop ) < overBottom ) ) {
+                                       position.top += myOffset + atOffset + offset;
+                               }
+                       }
+               }
+       },
+       flipfit: {
+               left: function() {
+                       $.ui.position.flip.left.apply( this, arguments );
+                       $.ui.position.fit.left.apply( this, arguments );
+               },
+               top: function() {
+                       $.ui.position.flip.top.apply( this, arguments );
+                       $.ui.position.fit.top.apply( this, arguments );
                }
        }
 };
 
-// offset setter from jQuery 1.4
-if ( !$.offset.setOffset ) {
-       $.offset.setOffset = function( elem, options ) {
-               // set position first, in-case top/left are set even on static elem
-               if ( /static/.test( $.curCSS( elem, "position" ) ) ) {
-                       elem.style.position = "relative";
-               }
-               var curElem   = $( elem ),
-                       curOffset = curElem.offset(),
-                       curTop    = parseInt( $.curCSS( elem, "top",  true ), 10 ) || 0,
-                       curLeft   = parseInt( $.curCSS( elem, "left", true ), 10)  || 0,
-                       props     = {
-                               top:  (options.top  - curOffset.top)  + curTop,
-                               left: (options.left - curOffset.left) + curLeft
-                       };
-               
-               if ( 'using' in options ) {
-                       options.using.call( elem, props );
-               } else {
-                       curElem.css( props );
-               }
-       };
-
-       $.fn.offset = function( options ) {
-               var elem = this[ 0 ];
-               if ( !elem || !elem.ownerDocument ) { return null; }
-               if ( options ) {
-                       if ( $.isFunction( options ) ) {
-                               return this.each(function( i ) {
-                                       $( this ).offset( options.call( this, i, $( this ).offset() ) );
-                               });
-                       }
-                       return this.each(function() {
-                               $.offset.setOffset( this, options );
-                       });
-               }
-               return _offset.call( this );
-       };
-}
-
-// jQuery <1.4.3 uses curCSS, in 1.4.3 - 1.7.2 curCSS = css, 1.8+ only has css
-if ( !$.curCSS ) {
-       $.curCSS = $.css;
-}
-
-// fraction support test (older versions of jQuery don't support fractions)
+// fraction support test
 (function () {
-       var body = document.getElementsByTagName( "body" )[ 0 ], 
-               div = document.createElement( "div" ),
-               testElement, testElementParent, testElementStyle, offset, offsetTotal;
+       var testElement, testElementParent, testElementStyle, offsetLeft, i,
+               body = document.getElementsByTagName( "body" )[ 0 ],
+               div = document.createElement( "div" );
 
        //Create a "fake body" for testing based on method used in jQuery.support
        testElement = document.createElement( body ? "div" : "body" );
@@ -285,24 +462,56 @@ if ( !$.curCSS ) {
                        top: "-1000px"
                });
        }
-       for ( var i in testElementStyle ) {
+       for ( i in testElementStyle ) {
                testElement.style[ i ] = testElementStyle[ i ];
        }
        testElement.appendChild( div );
        testElementParent = body || document.documentElement;
        testElementParent.insertBefore( testElement, testElementParent.firstChild );
 
-       div.style.cssText = "position: absolute; left: 10.7432222px; top: 10.432325px; height: 30px; width: 201px;";
+       div.style.cssText = "position: absolute; left: 10.7432222px;";
 
-       offset = $( div ).offset( function( _, offset ) {
-               return offset;
-       }).offset();
+       offsetLeft = $( div ).offset().left;
+       $.support.offsetFractions = offsetLeft > 10 && offsetLeft < 11;
 
        testElement.innerHTML = "";
        testElementParent.removeChild( testElement );
-
-       offsetTotal = offset.top + offset.left + ( body ? 2000 : 0 );
-       support.fractions = offsetTotal > 21 && offsetTotal < 22;
 })();
 
-}( jQuery ));
+// DEPRECATED
+if ( $.uiBackCompat !== false ) {
+       // offset option
+       (function( $ ) {
+               var _position = $.fn.position;
+               $.fn.position = function( options ) {
+                       if ( !options || !options.offset ) {
+                               return _position.call( this, options );
+                       }
+                       var offset = options.offset.split( " " ),
+                               at = options.at.split( " " );
+                       if ( offset.length === 1 ) {
+                               offset[ 1 ] = offset[ 0 ];
+                       }
+                       if ( /^\d/.test( offset[ 0 ] ) ) {
+                               offset[ 0 ] = "+" + offset[ 0 ];
+                       }
+                       if ( /^\d/.test( offset[ 1 ] ) ) {
+                               offset[ 1 ] = "+" + offset[ 1 ];
+                       }
+                       if ( at.length === 1 ) {
+                               if ( /left|center|right/.test( at[ 0 ] ) ) {
+                                       at[ 1 ] = "center";
+                               } else {
+                                       at[ 1 ] = at[ 0 ];
+                                       at[ 0 ] = "center";
+                               }
+                       }
+                       return _position.call( this, $.extend( options, {
+                               at: at[ 0 ] + offset[ 0 ] + " " + at[ 1 ] + offset[ 1 ],
+                               offset: undefined
+                       } ) );
+               };
+       }( jQuery ) );
+}
+
+}( jQuery ) );
index 7cea1ba..4aa19d8 100644 (file)
@@ -1,11 +1,12 @@
 /*!
- * jQuery UI Progressbar 1.8.24
+ * jQuery UI Progressbar 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Progressbar
+ * http://api.jqueryui.com/progressbar/
  *
  * Depends:
  *   jquery.ui.core.js
@@ -14,6 +15,7 @@
 (function( $, undefined ) {
 
 $.widget( "ui.progressbar", {
+       version: "1.9.2",
        options: {
                value: 0,
                max: 100
@@ -38,7 +40,7 @@ $.widget( "ui.progressbar", {
                this._refreshValue();
        },
 
-       destroy: function() {
+       _destroy: function() {
                this.element
                        .removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
                        .removeAttr( "role" )
@@ -47,8 +49,6 @@ $.widget( "ui.progressbar", {
                        .removeAttr( "aria-valuenow" );
 
                this.valueDiv.remove();
-
-               $.Widget.prototype.destroy.apply( this, arguments );
        },
 
        value: function( newValue ) {
@@ -69,7 +69,7 @@ $.widget( "ui.progressbar", {
                        }
                }
 
-               $.Widget.prototype._setOption.apply( this, arguments );
+               this._super( key, value );
        },
 
        _value: function() {
@@ -86,8 +86,8 @@ $.widget( "ui.progressbar", {
        },
 
        _refreshValue: function() {
-               var value = this.value();
-               var percentage = this._percentage();
+               var value = this.value(),
+                       percentage = this._percentage();
 
                if ( this.oldValue !== value ) {
                        this.oldValue = value;
@@ -102,8 +102,4 @@ $.widget( "ui.progressbar", {
        }
 });
 
-$.extend( $.ui.progressbar, {
-       version: "1.8.24"
-});
-
 })( jQuery );
index 6cc6f41..bb277e2 100644 (file)
@@ -1,11 +1,12 @@
 /*!
- * jQuery UI Resizable 1.8.24
+ * jQuery UI Resizable 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Resizables
+ * http://api.jqueryui.com/resizable/
  *
  * Depends:
  *     jquery.ui.core.js
@@ -15,6 +16,7 @@
 (function( $, undefined ) {
 
 $.widget("ui.resizable", $.ui.mouse, {
+       version: "1.9.2",
        widgetEventPrefix: "resize",
        options: {
                alsoResize: false,
@@ -36,7 +38,7 @@ $.widget("ui.resizable", $.ui.mouse, {
        },
        _create: function() {
 
-               var self = this, o = this.options;
+               var that = this, o = this.options;
                this.element.addClass("ui-resizable");
 
                $.extend(this, {
@@ -157,11 +159,11 @@ $.widget("ui.resizable", $.ui.mouse, {
 
                //Matching axis name
                this._handles.mouseover(function() {
-                       if (!self.resizing) {
+                       if (!that.resizing) {
                                if (this.className)
                                        var axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
                                //Axis, default = se
-                               self.axis = axis && axis[1] ? axis[1] : 'se';
+                               that.axis = axis && axis[1] ? axis[1] : 'se';
                        }
                });
 
@@ -170,16 +172,16 @@ $.widget("ui.resizable", $.ui.mouse, {
                        this._handles.hide();
                        $(this.element)
                                .addClass("ui-resizable-autohide")
-                               .hover(function() {
+                               .mouseenter(function() {
                                        if (o.disabled) return;
                                        $(this).removeClass("ui-resizable-autohide");
-                                       self._handles.show();
-                               },
-                               function(){
+                                       that._handles.show();
+                               })
+                               .mouseleave(function(){
                                        if (o.disabled) return;
-                                       if (!self.resizing) {
+                                       if (!that.resizing) {
                                                $(this).addClass("ui-resizable-autohide");
-                                               self._handles.hide();
+                                               that._handles.hide();
                                        }
                                });
                }
@@ -189,28 +191,27 @@ $.widget("ui.resizable", $.ui.mouse, {
 
        },
 
-       destroy: function() {
+       _destroy: function() {
 
                this._mouseDestroy();
 
                var _destroy = function(exp) {
                        $(exp).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
-                               .removeData("resizable").unbind(".resizable").find('.ui-resizable-handle').remove();
+                               .removeData("resizable").removeData("ui-resizable").unbind(".resizable").find('.ui-resizable-handle').remove();
                };
 
                //TODO: Unwrap at same DOM position
                if (this.elementIsWrapper) {
                        _destroy(this.element);
                        var wrapper = this.element;
-                       wrapper.after(
-                               this.originalElement.css({
-                                       position: wrapper.css('position'),
-                                       width: wrapper.outerWidth(),
-                                       height: wrapper.outerHeight(),
-                                       top: wrapper.css('top'),
-                                       left: wrapper.css('left')
-                               })
-                       ).remove();
+                       this.originalElement.css({
+                               position: wrapper.css('position'),
+                               width: wrapper.outerWidth(),
+                               height: wrapper.outerHeight(),
+                               top: wrapper.css('top'),
+                               left: wrapper.css('left')
+                       }).insertAfter( wrapper );
+                       wrapper.remove();
                }
 
                this.originalElement.css('resize', this.originalResizeStyle);
@@ -263,8 +264,8 @@ $.widget("ui.resizable", $.ui.mouse, {
                //Aspect Ratio
                this.aspectRatio = (typeof o.aspectRatio == 'number') ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height) || 1);
 
-           var cursor = $('.ui-resizable-' + this.axis).css('cursor');
-           $('body').css('cursor', cursor == 'auto' ? this.axis + '-resize' : cursor);
+               var cursor = $('.ui-resizable-' + this.axis).css('cursor');
+               $('body').css('cursor', cursor == 'auto' ? this.axis + '-resize' : cursor);
 
                el.addClass("ui-resizable-resizing");
                this._propagate("start", event);
@@ -275,14 +276,14 @@ $.widget("ui.resizable", $.ui.mouse, {
 
                //Increase performance, avoid regex
                var el = this.helper, o = this.options, props = {},
-                       self = this, smp = this.originalMousePosition, a = this.axis;
+                       that = this, smp = this.originalMousePosition, a = this.axis;
 
                var dx = (event.pageX-smp.left)||0, dy = (event.pageY-smp.top)||0;
                var trigger = this._change[a];
                if (!trigger) return false;
 
                // Calculate the attrs that will be change
-               var data = trigger.apply(this, [event, dx, dy]), ie6 = $.browser.msie && $.browser.version < 7, csdif = this.sizeDiff;
+               var data = trigger.apply(this, [event, dx, dy]);
 
                // Put this in the mouseDrag handler since the user can start pressing shift while resizing
                this._updateVirtualBoundaries(event.shiftKey);
@@ -313,22 +314,22 @@ $.widget("ui.resizable", $.ui.mouse, {
        _mouseStop: function(event) {
 
                this.resizing = false;
-               var o = this.options, self = this;
+               var o = this.options, that = this;
 
                if(this._helper) {
                        var pr = this._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
-                               soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
-                               soffsetw = ista ? 0 : self.sizeDiff.width;
+                               soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : that.sizeDiff.height,
+                               soffsetw = ista ? 0 : that.sizeDiff.width;
 
-                       var s = { width: (self.helper.width()  - soffsetw), height: (self.helper.height() - soffseth) },
-                               left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
-                               top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;
+                       var s = { width: (that.helper.width()  - soffsetw), height: (that.helper.height() - soffseth) },
+                               left = (parseInt(that.element.css('left'), 10) + (that.position.left - that.originalPosition.left)) || null,
+                               top = (parseInt(that.element.css('top'), 10) + (that.position.top - that.originalPosition.top)) || null;
 
                        if (!o.animate)
                                this.element.css($.extend(s, { top: top, left: left }));
 
-                       self.helper.height(self.size.height);
-                       self.helper.width(self.size.width);
+                       that.helper.height(that.size.height);
+                       that.helper.width(that.size.width);
 
                        if (this._helper && !o.animate) this._proportionallyResize();
                }
@@ -344,31 +345,31 @@ $.widget("ui.resizable", $.ui.mouse, {
 
        },
 
-    _updateVirtualBoundaries: function(forceAspectRatio) {
-        var o = this.options, pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b;
-
-        b = {
-            minWidth: isNumber(o.minWidth) ? o.minWidth : 0,
-            maxWidth: isNumber(o.maxWidth) ? o.maxWidth : Infinity,
-            minHeight: isNumber(o.minHeight) ? o.minHeight : 0,
-            maxHeight: isNumber(o.maxHeight) ? o.maxHeight : Infinity
-        };
-
-        if(this._aspectRatio || forceAspectRatio) {
-            // We want to create an enclosing box whose aspect ration is the requested one
-            // First, compute the "projected" size for each dimension based on the aspect ratio and other dimension
-            pMinWidth = b.minHeight * this.aspectRatio;
-            pMinHeight = b.minWidth / this.aspectRatio;
-            pMaxWidth = b.maxHeight * this.aspectRatio;
-            pMaxHeight = b.maxWidth / this.aspectRatio;
-
-            if(pMinWidth > b.minWidth) b.minWidth = pMinWidth;
-            if(pMinHeight > b.minHeight) b.minHeight = pMinHeight;
-            if(pMaxWidth < b.maxWidth) b.maxWidth = pMaxWidth;
-            if(pMaxHeight < b.maxHeight) b.maxHeight = pMaxHeight;
-        }
-        this._vBoundaries = b;
-    },
+       _updateVirtualBoundaries: function(forceAspectRatio) {
+               var o = this.options, pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b;
+
+               b = {
+                       minWidth: isNumber(o.minWidth) ? o.minWidth : 0,
+                       maxWidth: isNumber(o.maxWidth) ? o.maxWidth : Infinity,
+                       minHeight: isNumber(o.minHeight) ? o.minHeight : 0,
+                       maxHeight: isNumber(o.maxHeight) ? o.maxHeight : Infinity
+               };
+
+               if(this._aspectRatio || forceAspectRatio) {
+                       // We want to create an enclosing box whose aspect ration is the requested one
+                       // First, compute the "projected" size for each dimension based on the aspect ratio and other dimension
+                       pMinWidth = b.minHeight * this.aspectRatio;
+                       pMinHeight = b.minWidth / this.aspectRatio;
+                       pMaxWidth = b.maxHeight * this.aspectRatio;
+                       pMaxHeight = b.maxWidth / this.aspectRatio;
+
+                       if(pMinWidth > b.minWidth) b.minWidth = pMinWidth;
+                       if(pMinHeight > b.minHeight) b.minHeight = pMinHeight;
+                       if(pMaxWidth < b.maxWidth) b.maxWidth = pMaxWidth;
+                       if(pMaxHeight < b.maxHeight) b.maxHeight = pMaxHeight;
+               }
+               this._vBoundaries = b;
+       },
 
        _updateCache: function(data) {
                var o = this.options;
@@ -445,9 +446,6 @@ $.widget("ui.resizable", $.ui.mouse, {
                                });
                        }
 
-                       if ($.browser.msie && !(!($(element).is(':hidden') || $(element).parents(':hidden').length)))
-                               continue;
-
                        prel.css({
                                height: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0,
                                width: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0
@@ -467,8 +465,8 @@ $.widget("ui.resizable", $.ui.mouse, {
                        this.helper = this.helper || $('<div style="overflow:hidden;"></div>');
 
                        // fix ie6 offset TODO: This seems broken
-                       var ie6 = $.browser.msie && $.browser.version < 7, ie6offset = (ie6 ? 1 : 0),
-                       pxyoffset = ( ie6 ? 2 : -1 );
+                       var ie6offset = ($.ui.ie6 ? 1 : 0),
+                       pxyoffset = ( $.ui.ie6 ? 2 : -1 );
 
                        this.helper.addClass(this._helper).css({
                                width: this.element.outerWidth() + pxyoffset,
@@ -539,10 +537,6 @@ $.widget("ui.resizable", $.ui.mouse, {
 
 });
 
-$.extend($.ui.resizable, {
-       version: "1.8.24"
-});
-
 /*
  * Resizable Extensions
  */
@@ -550,7 +544,7 @@ $.extend($.ui.resizable, {
 $.ui.plugin.add("resizable", "alsoResize", {
 
        start: function (event, ui) {
-               var self = $(this).data("resizable"), o = self.options;
+               var that = $(this).data("resizable"), o = that.options;
 
                var _store = function (exp) {
                        $(exp).each(function() {
@@ -571,16 +565,16 @@ $.ui.plugin.add("resizable", "alsoResize", {
        },
 
        resize: function (event, ui) {
-               var self = $(this).data("resizable"), o = self.options, os = self.originalSize, op = self.originalPosition;
+               var that = $(this).data("resizable"), o = that.options, os = that.originalSize, op = that.originalPosition;
 
                var delta = {
-                       height: (self.size.height - os.height) || 0, width: (self.size.width - os.width) || 0,
-                       top: (self.position.top - op.top) || 0, left: (self.position.left - op.left) || 0
+                       height: (that.size.height - os.height) || 0, width: (that.size.width - os.width) || 0,
+                       top: (that.position.top - op.top) || 0, left: (that.position.left - op.left) || 0
                },
 
                _alsoResize = function (exp, c) {
                        $(exp).each(function() {
-                               var el = $(this), start = $(this).data("resizable-alsoresize"), style = {}, 
+                               var el = $(this), start = $(this).data("resizable-alsoresize"), style = {},
                                        css = c && c.length ? c : el.parents(ui.originalElement[0]).length ? ['width', 'height'] : ['width', 'height', 'top', 'left'];
 
                                $.each(css, function (i, prop) {
@@ -608,34 +602,34 @@ $.ui.plugin.add("resizable", "alsoResize", {
 $.ui.plugin.add("resizable", "animate", {
 
        stop: function(event, ui) {
-               var self = $(this).data("resizable"), o = self.options;
+               var that = $(this).data("resizable"), o = that.options;
 
-               var pr = self._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
-                                       soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
-                                               soffsetw = ista ? 0 : self.sizeDiff.width;
+               var pr = that._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
+                                       soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : that.sizeDiff.height,
+                                               soffsetw = ista ? 0 : that.sizeDiff.width;
 
-               var style = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) },
-                                       left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
-                                               top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;
+               var style = { width: (that.size.width - soffsetw), height: (that.size.height - soffseth) },
+                                       left = (parseInt(that.element.css('left'), 10) + (that.position.left - that.originalPosition.left)) || null,
+                                               top = (parseInt(that.element.css('top'), 10) + (that.position.top - that.originalPosition.top)) || null;
 
-               self.element.animate(
+               that.element.animate(
                        $.extend(style, top && left ? { top: top, left: left } : {}), {
                                duration: o.animateDuration,
                                easing: o.animateEasing,
                                step: function() {
 
                                        var data = {
-                                               width: parseInt(self.element.css('width'), 10),
-                                               height: parseInt(self.element.css('height'), 10),
-                                               top: parseInt(self.element.css('top'), 10),
-                                               left: parseInt(self.element.css('left'), 10)
+                                               width: parseInt(that.element.css('width'), 10),
+                                               height: parseInt(that.element.css('height'), 10),
+                                               top: parseInt(that.element.css('top'), 10),
+                                               left: parseInt(that.element.css('left'), 10)
                                        };
 
                                        if (pr && pr.length) $(pr[0]).css({ width: data.width, height: data.height });
 
                                        // propagating resize, and updating values for each animation step
-                                       self._updateCache(data);
-                                       self._propagate("resize", event);
+                                       that._updateCache(data);
+                                       that._propagate("resize", event);
 
                                }
                        }
@@ -647,17 +641,17 @@ $.ui.plugin.add("resizable", "animate", {
 $.ui.plugin.add("resizable", "containment", {
 
        start: function(event, ui) {
-               var self = $(this).data("resizable"), o = self.options, el = self.element;
+               var that = $(this).data("resizable"), o = that.options, el = that.element;
                var oc = o.containment, ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc;
                if (!ce) return;
 
-               self.containerElement = $(ce);
+               that.containerElement = $(ce);
 
                if (/document/.test(oc) || oc == document) {
-                       self.containerOffset = { left: 0, top: 0 };
-                       self.containerPosition = { left: 0, top: 0 };
+                       that.containerOffset = { left: 0, top: 0 };
+                       that.containerPosition = { left: 0, top: 0 };
 
-                       self.parentData = {
+                       that.parentData = {
                                element: $(document), left: 0, top: 0,
                                width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight
                        };
@@ -668,70 +662,70 @@ $.ui.plugin.add("resizable", "containment", {
                        var element = $(ce), p = [];
                        $([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); });
 
-                       self.containerOffset = element.offset();
-                       self.containerPosition = element.position();
-                       self.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) };
+                       that.containerOffset = element.offset();
+                       that.containerPosition = element.position();
+                       that.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) };
 
-                       var co = self.containerOffset, ch = self.containerSize.height,  cw = self.containerSize.width,
+                       var co = that.containerOffset, ch = that.containerSize.height,  cw = that.containerSize.width,
                                                width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ), height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch);
 
-                       self.parentData = {
+                       that.parentData = {
                                element: ce, left: co.left, top: co.top, width: width, height: height
                        };
                }
        },
 
        resize: function(event, ui) {
-               var self = $(this).data("resizable"), o = self.options,
-                               ps = self.containerSize, co = self.containerOffset, cs = self.size, cp = self.position,
-                               pRatio = self._aspectRatio || event.shiftKey, cop = { top:0, left:0 }, ce = self.containerElement;
+               var that = $(this).data("resizable"), o = that.options,
+                               ps = that.containerSize, co = that.containerOffset, cs = that.size, cp = that.position,
+                               pRatio = that._aspectRatio || event.shiftKey, cop = { top:0, left:0 }, ce = that.containerElement;
 
                if (ce[0] != document && (/static/).test(ce.css('position'))) cop = co;
 
-               if (cp.left < (self._helper ? co.left : 0)) {
-                       self.size.width = self.size.width + (self._helper ? (self.position.left - co.left) : (self.position.left - cop.left));
-                       if (pRatio) self.size.height = self.size.width / self.aspectRatio;
-                       self.position.left = o.helper ? co.left : 0;
+               if (cp.left < (that._helper ? co.left : 0)) {
+                       that.size.width = that.size.width + (that._helper ? (that.position.left - co.left) : (that.position.left - cop.left));
+                       if (pRatio) that.size.height = that.size.width / that.aspectRatio;
+                       that.position.left = o.helper ? co.left : 0;
                }
 
-               if (cp.top < (self._helper ? co.top : 0)) {
-                       self.size.height = self.size.height + (self._helper ? (self.position.top - co.top) : self.position.top);
-                       if (pRatio) self.size.width = self.size.height * self.aspectRatio;
-                       self.position.top = self._helper ? co.top : 0;
+               if (cp.top < (that._helper ? co.top : 0)) {
+                       that.size.height = that.size.height + (that._helper ? (that.position.top - co.top) : that.position.top);
+                       if (pRatio) that.size.width = that.size.height * that.aspectRatio;
+                       that.position.top = that._helper ? co.top : 0;
                }
 
-               self.offset.left = self.parentData.left+self.position.left;
-               self.offset.top = self.parentData.top+self.position.top;
+               that.offset.left = that.parentData.left+that.position.left;
+               that.offset.top = that.parentData.top+that.position.top;
 
-               var woset = Math.abs( (self._helper ? self.offset.left - cop.left : (self.offset.left - cop.left)) + self.sizeDiff.width ),
-                                       hoset = Math.abs( (self._helper ? self.offset.top - cop.top : (self.offset.top - co.top)) + self.sizeDiff.height );
+               var woset = Math.abs( (that._helper ? that.offset.left - cop.left : (that.offset.left - cop.left)) + that.sizeDiff.width ),
+                                       hoset = Math.abs( (that._helper ? that.offset.top - cop.top : (that.offset.top - co.top)) + that.sizeDiff.height );
 
-               var isParent = self.containerElement.get(0) == self.element.parent().get(0),
-                   isOffsetRelative = /relative|absolute/.test(self.containerElement.css('position'));
+               var isParent = that.containerElement.get(0) == that.element.parent().get(0),
+                       isOffsetRelative = /relative|absolute/.test(that.containerElement.css('position'));
 
-               if(isParent && isOffsetRelative) woset -= self.parentData.left;
+               if(isParent && isOffsetRelative) woset -= that.parentData.left;
 
-               if (woset + self.size.width >= self.parentData.width) {
-                       self.size.width = self.parentData.width - woset;
-                       if (pRatio) self.size.height = self.size.width / self.aspectRatio;
+               if (woset + that.size.width >= that.parentData.width) {
+                       that.size.width = that.parentData.width - woset;
+                       if (pRatio) that.size.height = that.size.width / that.aspectRatio;
                }
 
-               if (hoset + self.size.height >= self.parentData.height) {
-                       self.size.height = self.parentData.height - hoset;
-                       if (pRatio) self.size.width = self.size.height * self.aspectRatio;
+               if (hoset + that.size.height >= that.parentData.height) {
+                       that.size.height = that.parentData.height - hoset;
+                       if (pRatio) that.size.width = that.size.height * that.aspectRatio;
                }
        },
 
        stop: function(event, ui){
-               var self = $(this).data("resizable"), o = self.options, cp = self.position,
-                               co = self.containerOffset, cop = self.containerPosition, ce = self.containerElement;
+               var that = $(this).data("resizable"), o = that.options, cp = that.position,
+                               co = that.containerOffset, cop = that.containerPosition, ce = that.containerElement;
 
-               var helper = $(self.helper), ho = helper.offset(), w = helper.outerWidth() - self.sizeDiff.width, h = helper.outerHeight() - self.sizeDiff.height;
+               var helper = $(that.helper), ho = helper.offset(), w = helper.outerWidth() - that.sizeDiff.width, h = helper.outerHeight() - that.sizeDiff.height;
 
-               if (self._helper && !o.animate && (/relative/).test(ce.css('position')))
+               if (that._helper && !o.animate && (/relative/).test(ce.css('position')))
                        $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
 
-               if (self._helper && !o.animate && (/static/).test(ce.css('position')))
+               if (that._helper && !o.animate && (/static/).test(ce.css('position')))
                        $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
 
        }
@@ -741,26 +735,26 @@ $.ui.plugin.add("resizable", "ghost", {
 
        start: function(event, ui) {
 
-               var self = $(this).data("resizable"), o = self.options, cs = self.size;
+               var that = $(this).data("resizable"), o = that.options, cs = that.size;
 
-               self.ghost = self.originalElement.clone();
-               self.ghost
+               that.ghost = that.originalElement.clone();
+               that.ghost
                        .css({ opacity: .25, display: 'block', position: 'relative', height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 })
                        .addClass('ui-resizable-ghost')
                        .addClass(typeof o.ghost == 'string' ? o.ghost : '');
 
-               self.ghost.appendTo(self.helper);
+               that.ghost.appendTo(that.helper);
 
        },
 
        resize: function(event, ui){
-               var self = $(this).data("resizable"), o = self.options;
-               if (self.ghost) self.ghost.css({ position: 'relative', height: self.size.height, width: self.size.width });
+               var that = $(this).data("resizable"), o = that.options;
+               if (that.ghost) that.ghost.css({ position: 'relative', height: that.size.height, width: that.size.width });
        },
 
        stop: function(event, ui){
-               var self = $(this).data("resizable"), o = self.options;
-               if (self.ghost && self.helper) self.helper.get(0).removeChild(self.ghost.get(0));
+               var that = $(this).data("resizable"), o = that.options;
+               if (that.ghost && that.helper) that.helper.get(0).removeChild(that.ghost.get(0));
        }
 
 });
@@ -768,29 +762,29 @@ $.ui.plugin.add("resizable", "ghost", {
 $.ui.plugin.add("resizable", "grid", {
 
        resize: function(event, ui) {
-               var self = $(this).data("resizable"), o = self.options, cs = self.size, os = self.originalSize, op = self.originalPosition, a = self.axis, ratio = o._aspectRatio || event.shiftKey;
+               var that = $(this).data("resizable"), o = that.options, cs = that.size, os = that.originalSize, op = that.originalPosition, a = that.axis, ratio = o._aspectRatio || event.shiftKey;
                o.grid = typeof o.grid == "number" ? [o.grid, o.grid] : o.grid;
                var ox = Math.round((cs.width - os.width) / (o.grid[0]||1)) * (o.grid[0]||1), oy = Math.round((cs.height - os.height) / (o.grid[1]||1)) * (o.grid[1]||1);
 
                if (/^(se|s|e)$/.test(a)) {
-                       self.size.width = os.width + ox;
-                       self.size.height = os.height + oy;
+                       that.size.width = os.width + ox;
+                       that.size.height = os.height + oy;
                }
                else if (/^(ne)$/.test(a)) {
-                       self.size.width = os.width + ox;
-                       self.size.height = os.height + oy;
-                       self.position.top = op.top - oy;
+                       that.size.width = os.width + ox;
+                       that.size.height = os.height + oy;
+                       that.position.top = op.top - oy;
                }
                else if (/^(sw)$/.test(a)) {
-                       self.size.width = os.width + ox;
-                       self.size.height = os.height + oy;
-                       self.position.left = op.left - ox;
+                       that.size.width = os.width + ox;
+                       that.size.height = os.height + oy;
+                       that.position.left = op.left - ox;
                }
                else {
-                       self.size.width = os.width + ox;
-                       self.size.height = os.height + oy;
-                       self.position.top = op.top - oy;
-                       self.position.left = op.left - ox;
+                       that.size.width = os.width + ox;
+                       that.size.height = os.height + oy;
+                       that.position.top = op.top - oy;
+                       that.position.left = op.left - ox;
                }
        }
 
index 44c6e8c..3f27b73 100644 (file)
@@ -1,11 +1,12 @@
 /*!
- * jQuery UI Selectable 1.8.24
+ * jQuery UI Selectable 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Selectables
+ * http://api.jqueryui.com/selectable/
  *
  * Depends:
  *     jquery.ui.core.js
@@ -15,6 +16,7 @@
 (function( $, undefined ) {
 
 $.widget("ui.selectable", $.ui.mouse, {
+       version: "1.9.2",
        options: {
                appendTo: 'body',
                autoRefresh: true,
@@ -23,7 +25,7 @@ $.widget("ui.selectable", $.ui.mouse, {
                tolerance: 'touch'
        },
        _create: function() {
-               var self = this;
+               var that = this;
 
                this.element.addClass("ui-selectable");
 
@@ -32,7 +34,7 @@ $.widget("ui.selectable", $.ui.mouse, {
                // cache selectee children based on filter
                var selectees;
                this.refresh = function() {
-                       selectees = $(self.options.filter, self.element[0]);
+                       selectees = $(that.options.filter, that.element[0]);
                        selectees.addClass("ui-selectee");
                        selectees.each(function() {
                                var $this = $(this);
@@ -60,21 +62,17 @@ $.widget("ui.selectable", $.ui.mouse, {
                this.helper = $("<div class='ui-selectable-helper'></div>");
        },
 
-       destroy: function() {
+       _destroy: function() {
                this.selectees
                        .removeClass("ui-selectee")
                        .removeData("selectable-item");
                this.element
-                       .removeClass("ui-selectable ui-selectable-disabled")
-                       .removeData("selectable")
-                       .unbind(".selectable");
+                       .removeClass("ui-selectable ui-selectable-disabled");
                this._mouseDestroy();
-
-               return this;
        },
 
        _mouseStart: function(event) {
-               var self = this;
+               var that = this;
 
                this.opos = [event.pageX, event.pageY];
 
@@ -109,7 +107,7 @@ $.widget("ui.selectable", $.ui.mouse, {
                                selectee.$element.addClass('ui-unselecting');
                                selectee.unselecting = true;
                                // selectable UNSELECTING callback
-                               self._trigger("unselecting", event, {
+                               that._trigger("unselecting", event, {
                                        unselecting: selectee.element
                                });
                        }
@@ -127,11 +125,11 @@ $.widget("ui.selectable", $.ui.mouse, {
                                selectee.selected = doSelect;
                                // selectable (UN)SELECTING callback
                                if (doSelect) {
-                                       self._trigger("selecting", event, {
+                                       that._trigger("selecting", event, {
                                                selecting: selectee.element
                                        });
                                } else {
-                                       self._trigger("unselecting", event, {
+                                       that._trigger("unselecting", event, {
                                                unselecting: selectee.element
                                        });
                                }
@@ -142,7 +140,7 @@ $.widget("ui.selectable", $.ui.mouse, {
        },
 
        _mouseDrag: function(event) {
-               var self = this;
+               var that = this;
                this.dragged = true;
 
                if (this.options.disabled)
@@ -158,7 +156,7 @@ $.widget("ui.selectable", $.ui.mouse, {
                this.selectees.each(function() {
                        var selectee = $.data(this, "selectable-item");
                        //prevent helper from being selected if appendTo: selectable
-                       if (!selectee || selectee.element == self.element[0])
+                       if (!selectee || selectee.element == that.element[0])
                                return;
                        var hit = false;
                        if (options.tolerance == 'touch') {
@@ -181,7 +179,7 @@ $.widget("ui.selectable", $.ui.mouse, {
                                        selectee.$element.addClass('ui-selecting');
                                        selectee.selecting = true;
                                        // selectable SELECTING callback
-                                       self._trigger("selecting", event, {
+                                       that._trigger("selecting", event, {
                                                selecting: selectee.element
                                        });
                                }
@@ -201,7 +199,7 @@ $.widget("ui.selectable", $.ui.mouse, {
                                                        selectee.unselecting = true;
                                                }
                                                // selectable UNSELECTING callback
-                                               self._trigger("unselecting", event, {
+                                               that._trigger("unselecting", event, {
                                                        unselecting: selectee.element
                                                });
                                        }
@@ -214,7 +212,7 @@ $.widget("ui.selectable", $.ui.mouse, {
                                                selectee.$element.addClass('ui-unselecting');
                                                selectee.unselecting = true;
                                                // selectable UNSELECTING callback
-                                               self._trigger("unselecting", event, {
+                                               that._trigger("unselecting", event, {
                                                        unselecting: selectee.element
                                                });
                                        }
@@ -226,7 +224,7 @@ $.widget("ui.selectable", $.ui.mouse, {
        },
 
        _mouseStop: function(event) {
-               var self = this;
+               var that = this;
 
                this.dragged = false;
 
@@ -237,7 +235,7 @@ $.widget("ui.selectable", $.ui.mouse, {
                        selectee.$element.removeClass('ui-unselecting');
                        selectee.unselecting = false;
                        selectee.startselected = false;
-                       self._trigger("unselected", event, {
+                       that._trigger("unselected", event, {
                                unselected: selectee.element
                        });
                });
@@ -247,7 +245,7 @@ $.widget("ui.selectable", $.ui.mouse, {
                        selectee.selecting = false;
                        selectee.selected = true;
                        selectee.startselected = true;
-                       self._trigger("selected", event, {
+                       that._trigger("selected", event, {
                                selected: selectee.element
                        });
                });
@@ -260,8 +258,4 @@ $.widget("ui.selectable", $.ui.mouse, {
 
 });
 
-$.extend($.ui.selectable, {
-       version: "1.8.24"
-});
-
 })(jQuery);
index c554e78..c3daa7a 100644 (file)
@@ -1,11 +1,12 @@
 /*!
- * jQuery UI Slider 1.8.24
+ * jQuery UI Slider 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Slider
+ * http://api.jqueryui.com/slider/
  *
  * Depends:
  *     jquery.ui.core.js
@@ -19,7 +20,7 @@
 var numPages = 5;
 
 $.widget( "ui.slider", $.ui.mouse, {
-
+       version: "1.9.2",
        widgetEventPrefix: "slide",
 
        options: {
@@ -35,11 +36,10 @@ $.widget( "ui.slider", $.ui.mouse, {
        },
 
        _create: function() {
-               var self = this,
+               var i, handleCount,
                        o = this.options,
                        existingHandles = this.element.find( ".ui-slider-handle" ).addClass( "ui-state-default ui-corner-all" ),
                        handle = "<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>",
-                       handleCount = ( o.values && o.values.length ) || 1,
                        handles = [];
 
                this._keySliding = false;
@@ -74,15 +74,17 @@ $.widget( "ui.slider", $.ui.mouse, {
                                .addClass( "ui-slider-range" +
                                // note: this isn't the most fittingly semantic framework class for this element,
                                // but worked best visually with a variety of themes
-                               " ui-widget-header" + 
+                               " ui-widget-header" +
                                ( ( o.range === "min" || o.range === "max" ) ? " ui-slider-range-" + o.range : "" ) );
                }
 
-               for ( var i = existingHandles.length; i < handleCount; i += 1 ) {
+               handleCount = ( o.values && o.values.length ) || 1;
+
+               for ( i = existingHandles.length; i < handleCount; i++ ) {
                        handles.push( handle );
                }
 
-               this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( self.element ) );
+               this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( this.element ) );
 
                this.handle = this.handles.eq( 0 );
 
@@ -90,11 +92,12 @@ $.widget( "ui.slider", $.ui.mouse, {
                        .click(function( event ) {
                                event.preventDefault();
                        })
-                       .hover(function() {
+                       .mouseenter(function() {
                                if ( !o.disabled ) {
                                        $( this ).addClass( "ui-state-hover" );
                                }
-                       }, function() {
+                       })
+                       .mouseleave(function() {
                                $( this ).removeClass( "ui-state-hover" );
                        })
                        .focus(function() {
@@ -110,21 +113,14 @@ $.widget( "ui.slider", $.ui.mouse, {
                        });
 
                this.handles.each(function( i ) {
-                       $( this ).data( "index.ui-slider-handle", i );
+                       $( this ).data( "ui-slider-handle-index", i );
                });
 
-               this.handles
-                       .keydown(function( event ) {
-                               var index = $( this ).data( "index.ui-slider-handle" ),
-                                       allowed,
-                                       curVal,
-                                       newVal,
-                                       step;
-       
-                               if ( self.options.disabled ) {
-                                       return;
-                               }
-       
+               this._on( this.handles, {
+                       keydown: function( event ) {
+                               var allowed, curVal, newVal, step,
+                                       index = $( event.target ).data( "ui-slider-handle-index" );
+
                                switch ( event.keyCode ) {
                                        case $.ui.keyCode.HOME:
                                        case $.ui.keyCode.END:
@@ -135,73 +131,73 @@ $.widget( "ui.slider", $.ui.mouse, {
                                        case $.ui.keyCode.DOWN:
                                        case $.ui.keyCode.LEFT:
                                                event.preventDefault();
-                                               if ( !self._keySliding ) {
-                                                       self._keySliding = true;
-                                                       $( this ).addClass( "ui-state-active" );
-                                                       allowed = self._start( event, index );
+                                               if ( !this._keySliding ) {
+                                                       this._keySliding = true;
+                                                       $( event.target ).addClass( "ui-state-active" );
+                                                       allowed = this._start( event, index );
                                                        if ( allowed === false ) {
                                                                return;
                                                        }
                                                }
                                                break;
                                }
-       
-                               step = self.options.step;
-                               if ( self.options.values && self.options.values.length ) {
-                                       curVal = newVal = self.values( index );
+
+                               step = this.options.step;
+                               if ( this.options.values && this.options.values.length ) {
+                                       curVal = newVal = this.values( index );
                                } else {
-                                       curVal = newVal = self.value();
+                                       curVal = newVal = this.value();
                                }
-       
+
                                switch ( event.keyCode ) {
                                        case $.ui.keyCode.HOME:
-                                               newVal = self._valueMin();
+                                               newVal = this._valueMin();
                                                break;
                                        case $.ui.keyCode.END:
-                                               newVal = self._valueMax();
+                                               newVal = this._valueMax();
                                                break;
                                        case $.ui.keyCode.PAGE_UP:
-                                               newVal = self._trimAlignValue( curVal + ( (self._valueMax() - self._valueMin()) / numPages ) );
+                                               newVal = this._trimAlignValue( curVal + ( (this._valueMax() - this._valueMin()) / numPages ) );
                                                break;
                                        case $.ui.keyCode.PAGE_DOWN:
-                                               newVal = self._trimAlignValue( curVal - ( (self._valueMax() - self._valueMin()) / numPages ) );
+                                               newVal = this._trimAlignValue( curVal - ( (this._valueMax() - this._valueMin()) / numPages ) );
                                                break;
                                        case $.ui.keyCode.UP:
                                        case $.ui.keyCode.RIGHT:
-                                               if ( curVal === self._valueMax() ) {
+                                               if ( curVal === this._valueMax() ) {
                                                        return;
                                                }
-                                               newVal = self._trimAlignValue( curVal + step );
+                                               newVal = this._trimAlignValue( curVal + step );
                                                break;
                                        case $.ui.keyCode.DOWN:
                                        case $.ui.keyCode.LEFT:
-                                               if ( curVal === self._valueMin() ) {
+                                               if ( curVal === this._valueMin() ) {
                                                        return;
                                                }
-                                               newVal = self._trimAlignValue( curVal - step );
+                                               newVal = this._trimAlignValue( curVal - step );
                                                break;
                                }
-       
-                               self._slide( event, index, newVal );
-                       })
-                       .keyup(function( event ) {
-                               var index = $( this ).data( "index.ui-slider-handle" );
-       
-                               if ( self._keySliding ) {
-                                       self._keySliding = false;
-                                       self._stop( event, index );
-                                       self._change( event, index );
-                                       $( this ).removeClass( "ui-state-active" );
+
+                               this._slide( event, index, newVal );
+                       },
+                       keyup: function( event ) {
+                               var index = $( event.target ).data( "ui-slider-handle-index" );
+
+                               if ( this._keySliding ) {
+                                       this._keySliding = false;
+                                       this._stop( event, index );
+                                       this._change( event, index );
+                                       $( event.target ).removeClass( "ui-state-active" );
                                }
-       
-                       });
+                       }
+               });
 
                this._refreshValue();
 
                this._animateOff = false;
        },
 
-       destroy: function() {
+       _destroy: function() {
                this.handles.remove();
                this.range.remove();
 
@@ -212,26 +208,15 @@ $.widget( "ui.slider", $.ui.mouse, {
                                " ui-slider-disabled" +
                                " ui-widget" +
                                " ui-widget-content" +
-                               " ui-corner-all" )
-                       .removeData( "slider" )
-                       .unbind( ".slider" );
+                               " ui-corner-all" );
 
                this._mouseDestroy();
-
-               return this;
        },
 
        _mouseCapture: function( event ) {
-               var o = this.options,
-                       position,
-                       normValue,
-                       distance,
-                       closestHandle,
-                       self,
-                       index,
-                       allowed,
-                       offset,
-                       mouseOverHandle;
+               var position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle,
+                       that = this,
+                       o = this.options;
 
                if ( o.disabled ) {
                        return false;
@@ -246,9 +231,8 @@ $.widget( "ui.slider", $.ui.mouse, {
                position = { x: event.pageX, y: event.pageY };
                normValue = this._normValueFromMouse( position );
                distance = this._valueMax() - this._valueMin() + 1;
-               self = this;
                this.handles.each(function( i ) {
-                       var thisDistance = Math.abs( normValue - self.values(i) );
+                       var thisDistance = Math.abs( normValue - that.values(i) );
                        if ( distance > thisDistance ) {
                                distance = thisDistance;
                                closestHandle = $( this );
@@ -270,12 +254,12 @@ $.widget( "ui.slider", $.ui.mouse, {
                }
                this._mouseSliding = true;
 
-               self._handleIndex = index;
+               this._handleIndex = index;
 
                closestHandle
                        .addClass( "ui-state-active" )
                        .focus();
-               
+
                offset = closestHandle.offset();
                mouseOverHandle = !$( event.target ).parents().andSelf().is( ".ui-slider-handle" );
                this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
@@ -294,14 +278,14 @@ $.widget( "ui.slider", $.ui.mouse, {
                return true;
        },
 
-       _mouseStart: function( event ) {
+       _mouseStart: function() {
                return true;
        },
 
        _mouseDrag: function( event ) {
                var position = { x: event.pageX, y: event.pageY },
                        normValue = this._normValueFromMouse( position );
-               
+
                this._slide( event, this._handleIndex, normValue );
 
                return false;
@@ -320,7 +304,7 @@ $.widget( "ui.slider", $.ui.mouse, {
 
                return false;
        },
-       
+
        _detectOrientation: function() {
                this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
        },
@@ -377,7 +361,7 @@ $.widget( "ui.slider", $.ui.mouse, {
                if ( this.options.values && this.options.values.length ) {
                        otherVal = this.values( index ? 0 : 1 );
 
-                       if ( ( this.options.values.length === 2 && this.options.range === true ) && 
+                       if ( ( this.options.values.length === 2 && this.options.range === true ) &&
                                        ( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )
                                ) {
                                newVal = otherVal;
@@ -498,10 +482,10 @@ $.widget( "ui.slider", $.ui.mouse, {
                                if ( value ) {
                                        this.handles.filter( ".ui-state-focus" ).blur();
                                        this.handles.removeClass( "ui-state-hover" );
-                                       this.handles.propAttr( "disabled", true );
+                                       this.handles.prop( "disabled", true );
                                        this.element.addClass( "ui-disabled" );
                                } else {
-                                       this.handles.propAttr( "disabled", false );
+                                       this.handles.prop( "disabled", false );
                                        this.element.removeClass( "ui-disabled" );
                                }
                                break;
@@ -526,6 +510,12 @@ $.widget( "ui.slider", $.ui.mouse, {
                                }
                                this._animateOff = false;
                                break;
+                       case "min":
+                       case "max":
+                               this._animateOff = true;
+                               this._refreshValue();
+                               this._animateOff = false;
+                               break;
                }
        },
 
@@ -562,7 +552,7 @@ $.widget( "ui.slider", $.ui.mouse, {
                        return vals;
                }
        },
-       
+
        // returns the step-aligned value that val is closest to, between (inclusive) min and max
        _trimAlignValue: function( val ) {
                if ( val <= this._valueMin() ) {
@@ -591,38 +581,34 @@ $.widget( "ui.slider", $.ui.mouse, {
        _valueMax: function() {
                return this.options.max;
        },
-       
+
        _refreshValue: function() {
-               var oRange = this.options.range,
+               var lastValPercent, valPercent, value, valueMin, valueMax,
+                       oRange = this.options.range,
                        o = this.options,
-                       self = this,
+                       that = this,
                        animate = ( !this._animateOff ) ? o.animate : false,
-                       valPercent,
-                       _set = {},
-                       lastValPercent,
-                       value,
-                       valueMin,
-                       valueMax;
+                       _set = {};
 
                if ( this.options.values && this.options.values.length ) {
-                       this.handles.each(function( i, j ) {
-                               valPercent = ( self.values(i) - self._valueMin() ) / ( self._valueMax() - self._valueMin() ) * 100;
-                               _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
+                       this.handles.each(function( i ) {
+                               valPercent = ( that.values(i) - that._valueMin() ) / ( that._valueMax() - that._valueMin() ) * 100;
+                               _set[ that.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
                                $( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
-                               if ( self.options.range === true ) {
-                                       if ( self.orientation === "horizontal" ) {
+                               if ( that.options.range === true ) {
+                                       if ( that.orientation === "horizontal" ) {
                                                if ( i === 0 ) {
-                                                       self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate );
+                                                       that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate );
                                                }
                                                if ( i === 1 ) {
-                                                       self.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
+                                                       that.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
                                                }
                                        } else {
                                                if ( i === 0 ) {
-                                                       self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate );
+                                                       that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate );
                                                }
                                                if ( i === 1 ) {
-                                                       self.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
+                                                       that.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
                                                }
                                        }
                                }
@@ -635,7 +621,7 @@ $.widget( "ui.slider", $.ui.mouse, {
                        valPercent = ( valueMax !== valueMin ) ?
                                        ( value - valueMin ) / ( valueMax - valueMin ) * 100 :
                                        0;
-                       _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
+                       _set[ this.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
                        this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
 
                        if ( oRange === "min" && this.orientation === "horizontal" ) {
@@ -655,8 +641,4 @@ $.widget( "ui.slider", $.ui.mouse, {
 
 });
 
-$.extend( $.ui.slider, {
-       version: "1.8.24"
-});
-
 }(jQuery));
index 9e0cac6..bd960df 100644 (file)
@@ -1,11 +1,12 @@
 /*!
- * jQuery UI Sortable 1.8.24
+ * jQuery UI Sortable 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Sortables
+ * http://api.jqueryui.com/sortable/
  *
  * Depends:
  *     jquery.ui.core.js
@@ -15,6 +16,7 @@
 (function( $, undefined ) {
 
 $.widget("ui.sortable", $.ui.mouse, {
+       version: "1.9.2",
        widgetEventPrefix: "sort",
        ready: false,
        options: {
@@ -58,14 +60,13 @@ $.widget("ui.sortable", $.ui.mouse, {
 
                //Initialize mouse events for interaction
                this._mouseInit();
-               
+
                //We're ready to go
                this.ready = true
 
        },
 
-       destroy: function() {
-               $.Widget.prototype.destroy.call( this );
+       _destroy: function() {
                this.element
                        .removeClass("ui-sortable ui-sortable-disabled");
                this._mouseDestroy();
@@ -79,9 +80,8 @@ $.widget("ui.sortable", $.ui.mouse, {
        _setOption: function(key, value){
                if ( key === "disabled" ) {
                        this.options[ key ] = value;
-       
-                       this.widget()
-                               [ value ? "addClass" : "removeClass"]( "ui-sortable-disabled" );
+
+                       this.widget().toggleClass( "ui-sortable-disabled", !!value );
                } else {
                        // Don't call widget base _setOption for disable as it adds ui-state-disabled class
                        $.Widget.prototype._setOption.apply(this, arguments);
@@ -101,13 +101,13 @@ $.widget("ui.sortable", $.ui.mouse, {
                this._refreshItems(event);
 
                //Find out if the clicked node (or one of its parents) is a actual item in this.items
-               var currentItem = null, self = this, nodes = $(event.target).parents().each(function() {
-                       if($.data(this, that.widgetName + '-item') == self) {
+               var currentItem = null, nodes = $(event.target).parents().each(function() {
+                       if($.data(this, that.widgetName + '-item') == that) {
                                currentItem = $(this);
                                return false;
                        }
                });
-               if($.data(event.target, that.widgetName + '-item') == self) currentItem = $(event.target);
+               if($.data(event.target, that.widgetName + '-item') == that) currentItem = $(event.target);
 
                if(!currentItem) return false;
                if(this.options.handle && !overrideHandle) {
@@ -125,7 +125,7 @@ $.widget("ui.sortable", $.ui.mouse, {
 
        _mouseStart: function(event, overrideHandle, noActivation) {
 
-               var o = this.options, self = this;
+               var o = this.options;
                this.currentContainer = this;
 
                //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
@@ -168,7 +168,7 @@ $.widget("ui.sortable", $.ui.mouse, {
                // TODO: Still need to figure out a way to make relative sorting possible
                this.helper.css("position", "absolute");
                this.cssPosition = this.helper.css("position");
-               
+
                //Generate the original position
                this.originalPosition = this._generatePosition(event);
                this.originalPageX = event.pageX;
@@ -221,7 +221,7 @@ $.widget("ui.sortable", $.ui.mouse, {
 
                //Post 'activate' events to possible containers
                if(!noActivation) {
-                        for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._trigger("activate", event, self._uiHash(this)); }
+                        for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._trigger("activate", event, this._uiHash(this)); }
                }
 
                //Prepare possible droppables
@@ -307,8 +307,8 @@ $.widget("ui.sortable", $.ui.mouse, {
 
                        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)
+                               &&      !$.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked
+                               && (this.options.type == 'semi-dynamic' ? !$.contains(this.element[0], itemElement) : true)
                                //&& itemElement.parentNode == this.placeholder[0].parentNode // only rearrange items within the same container
                        ) {
 
@@ -348,16 +348,16 @@ $.widget("ui.sortable", $.ui.mouse, {
                        $.ui.ddmanager.drop(this, event);
 
                if(this.options.revert) {
-                       var self = this;
-                       var cur = self.placeholder.offset();
+                       var that = this;
+                       var cur = this.placeholder.offset();
 
-                       self.reverting = true;
+                       this.reverting = true;
 
                        $(this.helper).animate({
-                               left: cur.left - this.offset.parent.left - self.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft),
-                               top: cur.top - this.offset.parent.top - self.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop)
+                               left: cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft),
+                               top: cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop)
                        }, parseInt(this.options.revert, 10) || 500, function() {
-                               self._clear(event);
+                               that._clear(event);
                        });
                } else {
                        this._clear(event, noPropagation);
@@ -369,8 +369,6 @@ $.widget("ui.sortable", $.ui.mouse, {
 
        cancel: function() {
 
-               var self = this;
-
                if(this.dragging) {
 
                        this._mouseUp({ target: null });
@@ -382,9 +380,9 @@ $.widget("ui.sortable", $.ui.mouse, {
 
                        //Post deactivating events to containers
                        for (var i = this.containers.length - 1; i >= 0; i--){
-                               this.containers[i]._trigger("deactivate", null, self._uiHash(this));
+                               this.containers[i]._trigger("deactivate", null, this._uiHash(this));
                                if(this.containers[i].containerCache.over) {
-                                       this.containers[i]._trigger("out", null, self._uiHash(this));
+                                       this.containers[i]._trigger("out", null, this._uiHash(this));
                                        this.containers[i].containerCache.over = 0;
                                }
                        }
@@ -529,10 +527,9 @@ $.widget("ui.sortable", $.ui.mouse, {
                        ? [options.connectWith]
                        : options.connectWith;
        },
-       
+
        _getItemsAsjQuery: function(connected) {
 
-               var self = this;
                var items = [];
                var queries = [];
                var connectWith = this._connectWith();
@@ -565,14 +562,13 @@ $.widget("ui.sortable", $.ui.mouse, {
 
                var list = this.currentItem.find(":data(" + this.widgetName + "-item)");
 
-               for (var i=0; i < this.items.length; i++) {
-
+               this.items = $.grep(this.items, function (item) {
                        for (var j=0; j < list.length; j++) {
-                               if(list[j] == this.items[i].item[0])
-                                       this.items.splice(i,1);
+                               if(list[j] == item.item[0])
+                                       return false;
                        };
-
-               };
+                       return true;
+               });
 
        },
 
@@ -581,7 +577,6 @@ $.widget("ui.sortable", $.ui.mouse, {
                this.items = [];
                this.containers = [this];
                var items = this.items;
-               var self = this;
                var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]];
                var connectWith = this._connectWith();
 
@@ -660,16 +655,16 @@ $.widget("ui.sortable", $.ui.mouse, {
        },
 
        _createPlaceholder: function(that) {
-
-               var self = that || this, o = self.options;
+               that = that || this;
+               var o = that.options;
 
                if(!o.placeholder || o.placeholder.constructor == String) {
                        var className = o.placeholder;
                        o.placeholder = {
                                element: function() {
 
-                                       var el = $(document.createElement(self.currentItem[0].nodeName))
-                                               .addClass(className || self.currentItem[0].className+" ui-sortable-placeholder")
+                                       var el = $(document.createElement(that.currentItem[0].nodeName))
+                                               .addClass(className || that.currentItem[0].className+" ui-sortable-placeholder")
                                                .removeClass("ui-sortable-helper")[0];
 
                                        if(!className)
@@ -684,46 +679,46 @@ $.widget("ui.sortable", $.ui.mouse, {
                                        if(className && !o.forcePlaceholderSize) return;
 
                                        //If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
-                                       if(!p.height()) { p.height(self.currentItem.innerHeight() - parseInt(self.currentItem.css('paddingTop')||0, 10) - parseInt(self.currentItem.css('paddingBottom')||0, 10)); };
-                                       if(!p.width()) { p.width(self.currentItem.innerWidth() - parseInt(self.currentItem.css('paddingLeft')||0, 10) - parseInt(self.currentItem.css('paddingRight')||0, 10)); };
+                                       if(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css('paddingTop')||0, 10) - parseInt(that.currentItem.css('paddingBottom')||0, 10)); };
+                                       if(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css('paddingLeft')||0, 10) - parseInt(that.currentItem.css('paddingRight')||0, 10)); };
                                }
                        };
                }
 
                //Create the placeholder
-               self.placeholder = $(o.placeholder.element.call(self.element, self.currentItem));
+               that.placeholder = $(o.placeholder.element.call(that.element, that.currentItem));
 
                //Append it after the actual current item
-               self.currentItem.after(self.placeholder);
+               that.currentItem.after(that.placeholder);
 
                //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
-               o.placeholder.update(self, self.placeholder);
+               o.placeholder.update(that, that.placeholder);
 
        },
 
        _contactContainers: function(event) {
-               
-               // get innermost container that intersects with item 
-               var innermostContainer = null, innermostIndex = null;           
-               
-               
+
+               // get innermost container that intersects with item
+               var innermostContainer = null, innermostIndex = null;
+
+
                for (var i = this.containers.length - 1; i >= 0; i--){
 
-                       // never consider a container that's located within the item itself 
-                       if($.ui.contains(this.currentItem[0], this.containers[i].element[0]))
+                       // never consider a container that's located within the item itself
+                       if($.contains(this.currentItem[0], this.containers[i].element[0]))
                                continue;
 
                        if(this._intersectsWith(this.containers[i].containerCache)) {
 
-                               // if we've already found a container and it's more "inner" than this, then continue 
-                               if(innermostContainer && $.ui.contains(this.containers[i].element[0], innermostContainer.element[0]))
+                               // if we've already found a container and it's more "inner" than this, then continue
+                               if(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0]))
                                        continue;
 
-                               innermostContainer = this.containers[i]; 
+                               innermostContainer = this.containers[i];
                                innermostIndex = i;
-                                       
+
                        } else {
-                               // container doesn't intersect. trigger "out" event if necessary 
+                               // container doesn't intersect. trigger "out" event if necessary
                                if(this.containers[i].containerCache.over) {
                                        this.containers[i]._trigger("out", event, this._uiHash(this));
                                        this.containers[i].containerCache.over = 0;
@@ -731,24 +726,34 @@ $.widget("ui.sortable", $.ui.mouse, {
                        }
 
                }
-               
-               // if no intersecting containers found, return 
-               if(!innermostContainer) return; 
+
+               // if no intersecting containers found, return
+               if(!innermostContainer) return;
 
                // move the item into the container if it's not there already
                if(this.containers.length === 1) {
                        this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
                        this.containers[innermostIndex].containerCache.over = 1;
-               } else if(this.currentContainer != this.containers[innermostIndex]) {
+               } else {
 
                        //When entering a new container, we will find the item with the least distance and append our item near it
-                       var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[innermostIndex].floating ? 'left' : 'top'];
+                       var dist = 10000; var itemWithLeastDistance = null;
+                       var posProperty = this.containers[innermostIndex].floating ? 'left' : 'top';
+                       var sizeProperty = this.containers[innermostIndex].floating ? 'width' : 'height';
+                       var base = this.positionAbs[posProperty] + this.offset.click[posProperty];
                        for (var j = this.items.length - 1; j >= 0; j--) {
-                               if(!$.ui.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue;
-                               var cur = this.containers[innermostIndex].floating ? this.items[j].item.offset().left : this.items[j].item.offset().top;
+                               if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue;
+                               if(this.items[j].item[0] == this.currentItem[0]) continue;
+                               var cur = this.items[j].item.offset()[posProperty];
+                               var nearBottom = false;
+                               if(Math.abs(cur - base) > Math.abs(cur + this.items[j][sizeProperty] - base)){
+                                       nearBottom = true;
+                                       cur += this.items[j][sizeProperty];
+                               }
+
                                if(Math.abs(cur - base) < dist) {
                                        dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];
-                                       this.direction = (cur - base > 0) ? 'down' : 'up';
+                                       this.direction = nearBottom ? "up": "down";
                                }
                        }
 
@@ -765,9 +770,9 @@ $.widget("ui.sortable", $.ui.mouse, {
 
                        this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
                        this.containers[innermostIndex].containerCache.over = 1;
-               } 
-       
-               
+               }
+
+
        },
 
        _createHelper: function(event) {
@@ -820,13 +825,13 @@ $.widget("ui.sortable", $.ui.mouse, {
                // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
                // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
                //    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
-               if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
+               if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
                        po.left += this.scrollParent.scrollLeft();
                        po.top += this.scrollParent.scrollTop();
                }
 
                if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
-               || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
+               || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.ui.ie)) //Ugly IE fix
                        po = { top: 0, left: 0 };
 
                return {
@@ -894,20 +899,20 @@ $.widget("ui.sortable", $.ui.mouse, {
 
                if(!pos) pos = this.position;
                var mod = d == "absolute" ? 1 : -1;
-               var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+               var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
 
                return {
                        top: (
                                pos.top                                                                                                                                 // The absolute mouse position
                                + this.offset.relative.top * mod                                                                                // Only for relative positioned nodes: Relative offset from element to offset parent
                                + this.offset.parent.top * mod                                                                                  // The offsetParent's offset without borders (offset + border)
-                               - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
+                               - ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
                        ),
                        left: (
                                pos.left                                                                                                                                // The absolute mouse position
                                + this.offset.relative.left * mod                                                                               // Only for relative positioned nodes: Relative offset from element to offset parent
                                + this.offset.parent.left * mod                                                                                 // The offsetParent's offset without borders (offset + border)
-                               - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
+                               - ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
                        )
                };
 
@@ -915,7 +920,7 @@ $.widget("ui.sortable", $.ui.mouse, {
 
        _generatePosition: function(event) {
 
-               var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+               var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
 
                // This is another very weird special case that only happens for relative elements:
                // 1. If the css position is relative
@@ -958,14 +963,14 @@ $.widget("ui.sortable", $.ui.mouse, {
                                - this.offset.click.top                                                                                                 // Click offset (relative to the element)
                                - this.offset.relative.top                                                                                              // Only for relative positioned nodes: Relative offset from element to offset parent
                                - this.offset.parent.top                                                                                                // The offsetParent's offset without borders (offset + border)
-                               + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
+                               + ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
                        ),
                        left: (
                                pageX                                                                                                                           // The absolute mouse position
                                - this.offset.click.left                                                                                                // Click offset (relative to the element)
                                - this.offset.relative.left                                                                                             // Only for relative positioned nodes: Relative offset from element to offset parent
                                - this.offset.parent.left                                                                                               // The offsetParent's offset without borders (offset + border)
-                               + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
+                               + ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
                        )
                };
 
@@ -981,11 +986,11 @@ $.widget("ui.sortable", $.ui.mouse, {
                // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
                // 4. this lets only the last addition to the timeout stack through
                this.counter = this.counter ? ++this.counter : 1;
-               var self = this, counter = this.counter;
+               var counter = this.counter;
 
-               window.setTimeout(function() {
-                       if(counter == self.counter) self.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
-               },0);
+               this._delay(function() {
+                       if(counter == this.counter) this.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
+               });
 
        },
 
@@ -994,7 +999,7 @@ $.widget("ui.sortable", $.ui.mouse, {
                this.reverting = false;
                // We delay all events that have to be triggered to after the point where the placeholder has been removed and
                // everything else normalized again
-               var delayedTriggers = [], self = this;
+               var delayedTriggers = [];
 
                // We first have to update the dom position of the actual currentItem
                // Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
@@ -1023,6 +1028,7 @@ $.widget("ui.sortable", $.ui.mouse, {
                        }
                }
 
+
                //Post events to containers
                for (var i = this.containers.length - 1; i >= 0; i--){
                        if(!noPropagation) delayedTriggers.push((function(c) { return function(event) { c._trigger("deactivate", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
@@ -1072,23 +1078,19 @@ $.widget("ui.sortable", $.ui.mouse, {
                }
        },
 
-       _uiHash: function(inst) {
-               var self = inst || this;
+       _uiHash: function(_inst) {
+               var inst = _inst || this;
                return {
-                       helper: self.helper,
-                       placeholder: self.placeholder || $([]),
-                       position: self.position,
-                       originalPosition: self.originalPosition,
-                       offset: self.positionAbs,
-                       item: self.currentItem,
-                       sender: inst ? inst.element : null
+                       helper: inst.helper,
+                       placeholder: inst.placeholder || $([]),
+                       position: inst.position,
+                       originalPosition: inst.originalPosition,
+                       offset: inst.positionAbs,
+                       item: inst.currentItem,
+                       sender: _inst ? _inst.element : null
                };
        }
 
 });
 
-$.extend($.ui.sortable, {
-       version: "1.8.24"
-});
-
 })(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.spinner.js b/resources/lib/jquery.ui/jquery.ui.spinner.js
new file mode 100644 (file)
index 0000000..98dc9df
--- /dev/null
@@ -0,0 +1,478 @@
+/*!
+ * jQuery UI Spinner 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/spinner/
+ *
+ * Depends:
+ *  jquery.ui.core.js
+ *  jquery.ui.widget.js
+ *  jquery.ui.button.js
+ */
+(function( $ ) {
+
+function modifier( fn ) {
+       return function() {
+               var previous = this.element.val();
+               fn.apply( this, arguments );
+               this._refresh();
+               if ( previous !== this.element.val() ) {
+                       this._trigger( "change" );
+               }
+       };
+}
+
+$.widget( "ui.spinner", {
+       version: "1.9.2",
+       defaultElement: "<input>",
+       widgetEventPrefix: "spin",
+       options: {
+               culture: null,
+               icons: {
+                       down: "ui-icon-triangle-1-s",
+                       up: "ui-icon-triangle-1-n"
+               },
+               incremental: true,
+               max: null,
+               min: null,
+               numberFormat: null,
+               page: 10,
+               step: 1,
+
+               change: null,
+               spin: null,
+               start: null,
+               stop: null
+       },
+
+       _create: function() {
+               // handle string values that need to be parsed
+               this._setOption( "max", this.options.max );
+               this._setOption( "min", this.options.min );
+               this._setOption( "step", this.options.step );
+
+               // format the value, but don't constrain
+               this._value( this.element.val(), true );
+
+               this._draw();
+               this._on( this._events );
+               this._refresh();
+
+               // turning off autocomplete prevents the browser from remembering the
+               // value when navigating through history, so we re-enable autocomplete
+               // if the page is unloaded before the widget is destroyed. #7790
+               this._on( this.window, {
+                       beforeunload: function() {
+                               this.element.removeAttr( "autocomplete" );
+                       }
+               });
+       },
+
+       _getCreateOptions: function() {
+               var options = {},
+                       element = this.element;
+
+               $.each( [ "min", "max", "step" ], function( i, option ) {
+                       var value = element.attr( option );
+                       if ( value !== undefined && value.length ) {
+                               options[ option ] = value;
+                       }
+               });
+
+               return options;
+       },
+
+       _events: {
+               keydown: function( event ) {
+                       if ( this._start( event ) && this._keydown( event ) ) {
+                               event.preventDefault();
+                       }
+               },
+               keyup: "_stop",
+               focus: function() {
+                       this.previous = this.element.val();
+               },
+               blur: function( event ) {
+                       if ( this.cancelBlur ) {
+                               delete this.cancelBlur;
+                               return;
+                       }
+
+                       this._refresh();
+                       if ( this.previous !== this.element.val() ) {
+                               this._trigger( "change", event );
+                       }
+               },
+               mousewheel: function( event, delta ) {
+                       if ( !delta ) {
+                               return;
+                       }
+                       if ( !this.spinning && !this._start( event ) ) {
+                               return false;
+                       }
+
+                       this._spin( (delta > 0 ? 1 : -1) * this.options.step, event );
+                       clearTimeout( this.mousewheelTimer );
+                       this.mousewheelTimer = this._delay(function() {
+                               if ( this.spinning ) {
+                                       this._stop( event );
+                               }
+                       }, 100 );
+                       event.preventDefault();
+               },
+               "mousedown .ui-spinner-button": function( event ) {
+                       var previous;
+
+                       // We never want the buttons to have focus; whenever the user is
+                       // interacting with the spinner, the focus should be on the input.
+                       // If the input is focused then this.previous is properly set from
+                       // when the input first received focus. If the input is not focused
+                       // then we need to set this.previous based on the value before spinning.
+                       previous = this.element[0] === this.document[0].activeElement ?
+                               this.previous : this.element.val();
+                       function checkFocus() {
+                               var isActive = this.element[0] === this.document[0].activeElement;
+                               if ( !isActive ) {
+                                       this.element.focus();
+                                       this.previous = previous;
+                                       // support: IE
+                                       // IE sets focus asynchronously, so we need to check if focus
+                                       // moved off of the input because the user clicked on the button.
+                                       this._delay(function() {
+                                               this.previous = previous;
+                                       });
+                               }
+                       }
+
+                       // ensure focus is on (or stays on) the text field
+                       event.preventDefault();
+                       checkFocus.call( this );
+
+                       // support: IE
+                       // IE doesn't prevent moving focus even with event.preventDefault()
+                       // so we set a flag to know when we should ignore the blur event
+                       // and check (again) if focus moved off of the input.
+                       this.cancelBlur = true;
+                       this._delay(function() {
+                               delete this.cancelBlur;
+                               checkFocus.call( this );
+                       });
+
+                       if ( this._start( event ) === false ) {
+                               return;
+                       }
+
+                       this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1 : -1, event );
+               },
+               "mouseup .ui-spinner-button": "_stop",
+               "mouseenter .ui-spinner-button": function( event ) {
+                       // button will add ui-state-active if mouse was down while mouseleave and kept down
+                       if ( !$( event.currentTarget ).hasClass( "ui-state-active" ) ) {
+                               return;
+                       }
+
+                       if ( this._start( event ) === false ) {
+                               return false;
+                       }
+                       this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1 : -1, event );
+               },
+               // TODO: do we really want to consider this a stop?
+               // shouldn't we just stop the repeater and wait until mouseup before
+               // we trigger the stop event?
+               "mouseleave .ui-spinner-button": "_stop"
+       },
+
+       _draw: function() {
+               var uiSpinner = this.uiSpinner = this.element
+                       .addClass( "ui-spinner-input" )
+                       .attr( "autocomplete", "off" )
+                       .wrap( this._uiSpinnerHtml() )
+                       .parent()
+                               // add buttons
+                               .append( this._buttonHtml() );
+
+               this.element.attr( "role", "spinbutton" );
+
+               // button bindings
+               this.buttons = uiSpinner.find( ".ui-spinner-button" )
+                       .attr( "tabIndex", -1 )
+                       .button()
+                       .removeClass( "ui-corner-all" );
+
+               // IE 6 doesn't understand height: 50% for the buttons
+               // unless the wrapper has an explicit height
+               if ( this.buttons.height() > Math.ceil( uiSpinner.height() * 0.5 ) &&
+                               uiSpinner.height() > 0 ) {
+                       uiSpinner.height( uiSpinner.height() );
+               }
+
+               // disable spinner if element was already disabled
+               if ( this.options.disabled ) {
+                       this.disable();
+               }
+       },
+
+       _keydown: function( event ) {
+               var options = this.options,
+                       keyCode = $.ui.keyCode;
+
+               switch ( event.keyCode ) {
+               case keyCode.UP:
+                       this._repeat( null, 1, event );
+                       return true;
+               case keyCode.DOWN:
+                       this._repeat( null, -1, event );
+                       return true;
+               case keyCode.PAGE_UP:
+                       this._repeat( null, options.page, event );
+                       return true;
+               case keyCode.PAGE_DOWN:
+                       this._repeat( null, -options.page, event );
+                       return true;
+               }
+
+               return false;
+       },
+
+       _uiSpinnerHtml: function() {
+               return "<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>";
+       },
+
+       _buttonHtml: function() {
+               return "" +
+                       "<a class='ui-spinner-button ui-spinner-up ui-corner-tr'>" +
+                               "<span class='ui-icon " + this.options.icons.up + "'>&#9650;</span>" +
+                       "</a>" +
+                       "<a class='ui-spinner-button ui-spinner-down ui-corner-br'>" +
+                               "<span class='ui-icon " + this.options.icons.down + "'>&#9660;</span>" +
+                       "</a>";
+       },
+
+       _start: function( event ) {
+               if ( !this.spinning && this._trigger( "start", event ) === false ) {
+                       return false;
+               }
+
+               if ( !this.counter ) {
+                       this.counter = 1;
+               }
+               this.spinning = true;
+               return true;
+       },
+
+       _repeat: function( i, steps, event ) {
+               i = i || 500;
+
+               clearTimeout( this.timer );
+               this.timer = this._delay(function() {
+                       this._repeat( 40, steps, event );
+               }, i );
+
+               this._spin( steps * this.options.step, event );
+       },
+
+       _spin: function( step, event ) {
+               var value = this.value() || 0;
+
+               if ( !this.counter ) {
+                       this.counter = 1;
+               }
+
+               value = this._adjustValue( value + step * this._increment( this.counter ) );
+
+               if ( !this.spinning || this._trigger( "spin", event, { value: value } ) !== false) {
+                       this._value( value );
+                       this.counter++;
+               }
+       },
+
+       _increment: function( i ) {
+               var incremental = this.options.incremental;
+
+               if ( incremental ) {
+                       return $.isFunction( incremental ) ?
+                               incremental( i ) :
+                               Math.floor( i*i*i/50000 - i*i/500 + 17*i/200 + 1 );
+               }
+
+               return 1;
+       },
+
+       _precision: function() {
+               var precision = this._precisionOf( this.options.step );
+               if ( this.options.min !== null ) {
+                       precision = Math.max( precision, this._precisionOf( this.options.min ) );
+               }
+               return precision;
+       },
+
+       _precisionOf: function( num ) {
+               var str = num.toString(),
+                       decimal = str.indexOf( "." );
+               return decimal === -1 ? 0 : str.length - decimal - 1;
+       },
+
+       _adjustValue: function( value ) {
+               var base, aboveMin,
+                       options = this.options;
+
+               // make sure we're at a valid step
+               // - find out where we are relative to the base (min or 0)
+               base = options.min !== null ? options.min : 0;
+               aboveMin = value - base;
+               // - round to the nearest step
+               aboveMin = Math.round(aboveMin / options.step) * options.step;
+               // - rounding is based on 0, so adjust back to our base
+               value = base + aboveMin;
+
+               // fix precision from bad JS floating point math
+               value = parseFloat( value.toFixed( this._precision() ) );
+
+               // clamp the value
+               if ( options.max !== null && value > options.max) {
+                       return options.max;
+               }
+               if ( options.min !== null && value < options.min ) {
+                       return options.min;
+               }
+
+               return value;
+       },
+
+       _stop: function( event ) {
+               if ( !this.spinning ) {
+                       return;
+               }
+
+               clearTimeout( this.timer );
+               clearTimeout( this.mousewheelTimer );
+               this.counter = 0;
+               this.spinning = false;
+               this._trigger( "stop", event );
+       },
+
+       _setOption: function( key, value ) {
+               if ( key === "culture" || key === "numberFormat" ) {
+                       var prevValue = this._parse( this.element.val() );
+                       this.options[ key ] = value;
+                       this.element.val( this._format( prevValue ) );
+                       return;
+               }
+
+               if ( key === "max" || key === "min" || key === "step" ) {
+                       if ( typeof value === "string" ) {
+                               value = this._parse( value );
+                       }
+               }
+
+               this._super( key, value );
+
+               if ( key === "disabled" ) {
+                       if ( value ) {
+                               this.element.prop( "disabled", true );
+                               this.buttons.button( "disable" );
+                       } else {
+                               this.element.prop( "disabled", false );
+                               this.buttons.button( "enable" );
+                       }
+               }
+       },
+
+       _setOptions: modifier(function( options ) {
+               this._super( options );
+               this._value( this.element.val() );
+       }),
+
+       _parse: function( val ) {
+               if ( typeof val === "string" && val !== "" ) {
+                       val = window.Globalize && this.options.numberFormat ?
+                               Globalize.parseFloat( val, 10, this.options.culture ) : +val;
+               }
+               return val === "" || isNaN( val ) ? null : val;
+       },
+
+       _format: function( value ) {
+               if ( value === "" ) {
+                       return "";
+               }
+               return window.Globalize && this.options.numberFormat ?
+                       Globalize.format( value, this.options.numberFormat, this.options.culture ) :
+                       value;
+       },
+
+       _refresh: function() {
+               this.element.attr({
+                       "aria-valuemin": this.options.min,
+                       "aria-valuemax": this.options.max,
+                       // TODO: what should we do with values that can't be parsed?
+                       "aria-valuenow": this._parse( this.element.val() )
+               });
+       },
+
+       // update the value without triggering change
+       _value: function( value, allowAny ) {
+               var parsed;
+               if ( value !== "" ) {
+                       parsed = this._parse( value );
+                       if ( parsed !== null ) {
+                               if ( !allowAny ) {
+                                       parsed = this._adjustValue( parsed );
+                               }
+                               value = this._format( parsed );
+                       }
+               }
+               this.element.val( value );
+               this._refresh();
+       },
+
+       _destroy: function() {
+               this.element
+                       .removeClass( "ui-spinner-input" )
+                       .prop( "disabled", false )
+                       .removeAttr( "autocomplete" )
+                       .removeAttr( "role" )
+                       .removeAttr( "aria-valuemin" )
+                       .removeAttr( "aria-valuemax" )
+                       .removeAttr( "aria-valuenow" );
+               this.uiSpinner.replaceWith( this.element );
+       },
+
+       stepUp: modifier(function( steps ) {
+               this._stepUp( steps );
+       }),
+       _stepUp: function( steps ) {
+               this._spin( (steps || 1) * this.options.step );
+       },
+
+       stepDown: modifier(function( steps ) {
+               this._stepDown( steps );
+       }),
+       _stepDown: function( steps ) {
+               this._spin( (steps || 1) * -this.options.step );
+       },
+
+       pageUp: modifier(function( pages ) {
+               this._stepUp( (pages || 1) * this.options.page );
+       }),
+
+       pageDown: modifier(function( pages ) {
+               this._stepDown( (pages || 1) * this.options.page );
+       }),
+
+       value: function( newVal ) {
+               if ( !arguments.length ) {
+                       return this._parse( this.element.val() );
+               }
+               modifier( this._value ).call( this, newVal );
+       },
+
+       widget: function() {
+               return this.uiSpinner;
+       }
+});
+
+}( jQuery ) );
index 0c47f0e..6ea164e 100644 (file)
@@ -1,11 +1,12 @@
 /*!
- * jQuery UI Tabs 1.8.24
+ * jQuery UI Tabs 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Tabs
+ * http://api.jqueryui.com/tabs/
  *
  * Depends:
  *     jquery.ui.core.js
 (function( $, undefined ) {
 
 var tabId = 0,
-       listId = 0;
+       rhash = /#.*$/;
 
 function getNextTabId() {
        return ++tabId;
 }
 
-function getNextListId() {
-       return ++listId;
+function isLocal( anchor ) {
+       return anchor.hash.length > 1 &&
+               anchor.href.replace( rhash, "" ) ===
+                       location.href.replace( rhash, "" )
+                               // support: Safari 5.1
+                               // Safari 5.1 doesn't encode spaces in window.location
+                               // but it does encode spaces from anchors (#8777)
+                               .replace( /\s/g, "%20" );
 }
 
 $.widget( "ui.tabs", {
+       version: "1.9.2",
+       delay: 300,
        options: {
-               add: null,
-               ajaxOptions: null,
-               cache: false,
-               cookie: null, // e.g. { expires: 7, path: '/', domain: 'jquery.com', secure: true }
+               active: null,
                collapsible: false,
-               disable: null,
-               disabled: [],
-               enable: null,
                event: "click",
-               fx: null, // e.g. { height: 'toggle', opacity: 'toggle', duration: 200 }
-               idPrefix: "ui-tabs-",
-               load: null,
-               panelTemplate: "<div></div>",
-               remove: null,
-               select: null,
+               heightStyle: "content",
+               hide: null,
                show: null,
-               spinner: "<em>Loading&#8230;</em>",
-               tabTemplate: "<li><a href='#{href}'><span>#{label}</span></a></li>"
+
+               // callbacks
+               activate: null,
+               beforeActivate: null,
+               beforeLoad: null,
+               load: null
        },
 
        _create: function() {
-               this._tabify( true );
-       },
+               var that = this,
+                       options = this.options,
+                       active = options.active,
+                       locationHash = location.hash.substring( 1 );
 
-       _setOption: function( key, value ) {
-               if ( key == "selected" ) {
-                       if (this.options.collapsible && value == this.options.selected ) {
-                               return;
+               this.running = false;
+
+               this.element
+                       .addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" )
+                       .toggleClass( "ui-tabs-collapsible", options.collapsible )
+                       // Prevent users from focusing disabled tabs via click
+                       .delegate( ".ui-tabs-nav > li", "mousedown" + this.eventNamespace, function( event ) {
+                               if ( $( this ).is( ".ui-state-disabled" ) ) {
+                                       event.preventDefault();
+                               }
+                       })
+                       // support: IE <9
+                       // Preventing the default action in mousedown doesn't prevent IE
+                       // from focusing the element, so if the anchor gets focused, blur.
+                       // We don't have to worry about focusing the previously focused
+                       // element since clicking on a non-focusable element should focus
+                       // the body anyway.
+                       .delegate( ".ui-tabs-anchor", "focus" + this.eventNamespace, function() {
+                               if ( $( this ).closest( "li" ).is( ".ui-state-disabled" ) ) {
+                                       this.blur();
+                               }
+                       });
+
+               this._processTabs();
+
+               if ( active === null ) {
+                       // check the fragment identifier in the URL
+                       if ( locationHash ) {
+                               this.tabs.each(function( i, tab ) {
+                                       if ( $( tab ).attr( "aria-controls" ) === locationHash ) {
+                                               active = i;
+                                               return false;
+                                       }
+                               });
+                       }
+
+                       // check for a tab marked active via a class
+                       if ( active === null ) {
+                               active = this.tabs.index( this.tabs.filter( ".ui-tabs-active" ) );
+                       }
+
+                       // no active tab, set to false
+                       if ( active === null || active === -1 ) {
+                               active = this.tabs.length ? 0 : false;
                        }
-                       this.select( value );
-               } else {
-                       this.options[ key ] = value;
-                       this._tabify();
                }
-       },
 
-       _tabId: function( a ) {
-               return a.title && a.title.replace( /\s/g, "_" ).replace( /[^\w\u00c0-\uFFFF-]/g, "" ) ||
-                       this.options.idPrefix + getNextTabId();
-       },
+               // handle numbers: negative, out of range
+               if ( active !== false ) {
+                       active = this.tabs.index( this.tabs.eq( active ) );
+                       if ( active === -1 ) {
+                               active = options.collapsible ? false : 0;
+                       }
+               }
+               options.active = active;
 
-       _sanitizeSelector: function( hash ) {
-               // we need this because an id may contain a ":"
-               return hash.replace( /:/g, "\\:" );
-       },
+               // don't allow collapsible: false and active: false
+               if ( !options.collapsible && options.active === false && this.anchors.length ) {
+                       options.active = 0;
+               }
+
+               // Take disabling tabs via class attribute from HTML
+               // into account and update option properly.
+               if ( $.isArray( options.disabled ) ) {
+                       options.disabled = $.unique( options.disabled.concat(
+                               $.map( this.tabs.filter( ".ui-state-disabled" ), function( li ) {
+                                       return that.tabs.index( li );
+                               })
+                       ) ).sort();
+               }
+
+               // check for length avoids error when initializing empty list
+               if ( this.options.active !== false && this.anchors.length ) {
+                       this.active = this._findActive( this.options.active );
+               } else {
+                       this.active = $();
+               }
+
+               this._refresh();
 
-       _cookie: function() {
-               var cookie = this.cookie ||
-                       ( this.cookie = this.options.cookie.name || "ui-tabs-" + getNextListId() );
-               return $.cookie.apply( null, [ cookie ].concat( $.makeArray( arguments ) ) );
+               if ( this.active.length ) {
+                       this.load( options.active );
+               }
        },
 
-       _ui: function( tab, panel ) {
+       _getCreateEventData: function() {
                return {
-                       tab: tab,
-                       panel: panel,
-                       index: this.anchors.index( tab )
+                       tab: this.active,
+                       panel: !this.active.length ? $() : this._getPanelForTab( this.active )
                };
        },
 
-       _cleanup: function() {
-               // restore all former loading tabs labels
-               this.lis.filter( ".ui-state-processing" )
-                       .removeClass( "ui-state-processing" )
-                       .find( "span:data(label.tabs)" )
-                               .each(function() {
-                                       var el = $( this );
-                                       el.html( el.data( "label.tabs" ) ).removeData( "label.tabs" );
-                               });
+       _tabKeydown: function( event ) {
+               var focusedTab = $( this.document[0].activeElement ).closest( "li" ),
+                       selectedIndex = this.tabs.index( focusedTab ),
+                       goingForward = true;
+
+               if ( this._handlePageNav( event ) ) {
+                       return;
+               }
+
+               switch ( event.keyCode ) {
+                       case $.ui.keyCode.RIGHT:
+                       case $.ui.keyCode.DOWN:
+                               selectedIndex++;
+                               break;
+                       case $.ui.keyCode.UP:
+                       case $.ui.keyCode.LEFT:
+                               goingForward = false;
+                               selectedIndex--;
+                               break;
+                       case $.ui.keyCode.END:
+                               selectedIndex = this.anchors.length - 1;
+                               break;
+                       case $.ui.keyCode.HOME:
+                               selectedIndex = 0;
+                               break;
+                       case $.ui.keyCode.SPACE:
+                               // Activate only, no collapsing
+                               event.preventDefault();
+                               clearTimeout( this.activating );
+                               this._activate( selectedIndex );
+                               return;
+                       case $.ui.keyCode.ENTER:
+                               // Toggle (cancel delayed activation, allow collapsing)
+                               event.preventDefault();
+                               clearTimeout( this.activating );
+                               // Determine if we should collapse or activate
+                               this._activate( selectedIndex === this.options.active ? false : selectedIndex );
+                               return;
+                       default:
+                               return;
+               }
+
+               // Focus the appropriate tab, based on which key was pressed
+               event.preventDefault();
+               clearTimeout( this.activating );
+               selectedIndex = this._focusNextTab( selectedIndex, goingForward );
+
+               // Navigating with control key will prevent automatic activation
+               if ( !event.ctrlKey ) {
+                       // Update aria-selected immediately so that AT think the tab is already selected.
+                       // Otherwise AT may confuse the user by stating that they need to activate the tab,
+                       // but the tab will already be activated by the time the announcement finishes.
+                       focusedTab.attr( "aria-selected", "false" );
+                       this.tabs.eq( selectedIndex ).attr( "aria-selected", "true" );
+
+                       this.activating = this._delay(function() {
+                               this.option( "active", selectedIndex );
+                       }, this.delay );
+               }
        },
 
-       _tabify: function( init ) {
-               var self = this,
-                       o = this.options,
-                       fragmentId = /^#.+/; // Safari 2 reports '#' for an empty hash
+       _panelKeydown: function( event ) {
+               if ( this._handlePageNav( event ) ) {
+                       return;
+               }
 
-               this.list = this.element.find( "ol,ul" ).eq( 0 );
-               this.lis = $( " > li:has(a[href])", this.list );
-               this.anchors = this.lis.map(function() {
-                       return $( "a", this )[ 0 ];
-               });
-               this.panels = $( [] );
-
-               this.anchors.each(function( i, a ) {
-                       var href = $( a ).attr( "href" );
-                       // For dynamically created HTML that contains a hash as href IE < 8 expands
-                       // such href to the full page url with hash and then misinterprets tab as ajax.
-                       // Same consideration applies for an added tab with a fragment identifier
-                       // since a[href=#fragment-identifier] does unexpectedly not match.
-                       // Thus normalize href attribute...
-                       var hrefBase = href.split( "#" )[ 0 ],
-                               baseEl;
-                       if ( hrefBase && ( hrefBase === location.toString().split( "#" )[ 0 ] ||
-                                       ( baseEl = $( "base" )[ 0 ]) && hrefBase === baseEl.href ) ) {
-                               href = a.hash;
-                               a.href = href;
-                       }
+               // Ctrl+up moves focus to the current tab
+               if ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {
+                       event.preventDefault();
+                       this.active.focus();
+               }
+       },
 
-                       // inline tab
-                       if ( fragmentId.test( href ) ) {
-                               self.panels = self.panels.add( self.element.find( self._sanitizeSelector( href ) ) );
-                       // remote tab
-                       // prevent loading the page itself if href is just "#"
-                       } else if ( href && href !== "#" ) {
-                               // required for restore on destroy
-                               $.data( a, "href.tabs", href );
-
-                               // TODO until #3808 is fixed strip fragment identifier from url
-                               // (IE fails to load from such url)
-                               $.data( a, "load.tabs", href.replace( /#.*$/, "" ) );
-
-                               var id = self._tabId( a );
-                               a.href = "#" + id;
-                               var $panel = self.element.find( "#" + id );
-                               if ( !$panel.length ) {
-                                       $panel = $( o.panelTemplate )
-                                               .attr( "id", id )
-                                               .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
-                                               .insertAfter( self.panels[ i - 1 ] || self.list );
-                                       $panel.data( "destroy.tabs", true );
-                               }
-                               self.panels = self.panels.add( $panel );
-                       // invalid tab href
-                       } else {
-                               o.disabled.push( i );
-                       }
-               });
+       // Alt+page up/down moves focus to the previous/next tab (and activates)
+       _handlePageNav: function( event ) {
+               if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {
+                       this._activate( this._focusNextTab( this.options.active - 1, false ) );
+                       return true;
+               }
+               if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {
+                       this._activate( this._focusNextTab( this.options.active + 1, true ) );
+                       return true;
+               }
+       },
 
-               // initialization from scratch
-               if ( init ) {
-                       // attach necessary classes for styling
-                       this.element.addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" );
-                       this.list.addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" );
-                       this.lis.addClass( "ui-state-default ui-corner-top" );
-                       this.panels.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" );
-
-                       // Selected tab
-                       // use "selected" option or try to retrieve:
-                       // 1. from fragment identifier in url
-                       // 2. from cookie
-                       // 3. from selected class attribute on <li>
-                       if ( o.selected === undefined ) {
-                               if ( location.hash ) {
-                                       this.anchors.each(function( i, a ) {
-                                               if ( a.hash == location.hash ) {
-                                                       o.selected = i;
-                                                       return false;
-                                               }
-                                       });
-                               }
-                               if ( typeof o.selected !== "number" && o.cookie ) {
-                                       o.selected = parseInt( self._cookie(), 10 );
-                               }
-                               if ( typeof o.selected !== "number" && this.lis.filter( ".ui-tabs-selected" ).length ) {
-                                       o.selected = this.lis.index( this.lis.filter( ".ui-tabs-selected" ) );
-                               }
-                               o.selected = o.selected || ( this.lis.length ? 0 : -1 );
-                       } else if ( o.selected === null ) { // usage of null is deprecated, TODO remove in next release
-                               o.selected = -1;
-                       }
-
-                       // sanity check - default to first tab...
-                       o.selected = ( ( o.selected >= 0 && this.anchors[ o.selected ] ) || o.selected < 0 )
-                               ? o.selected
-                               : 0;
-
-                       // Take disabling tabs via class attribute from HTML
-                       // into account and update option properly.
-                       // A selected tab cannot become disabled.
-                       o.disabled = $.unique( o.disabled.concat(
-                               $.map( this.lis.filter( ".ui-state-disabled" ), function( n, i ) {
-                                       return self.lis.index( n );
-                               })
-                       ) ).sort();
+       _findNextTab: function( index, goingForward ) {
+               var lastTabIndex = this.tabs.length - 1;
 
-                       if ( $.inArray( o.selected, o.disabled ) != -1 ) {
-                               o.disabled.splice( $.inArray( o.selected, o.disabled ), 1 );
+               function constrain() {
+                       if ( index > lastTabIndex ) {
+                               index = 0;
                        }
+                       if ( index < 0 ) {
+                               index = lastTabIndex;
+                       }
+                       return index;
+               }
 
-                       // highlight selected tab
-                       this.panels.addClass( "ui-tabs-hide" );
-                       this.lis.removeClass( "ui-tabs-selected ui-state-active" );
-                       // check for length avoids error when initializing empty list
-                       if ( o.selected >= 0 && this.anchors.length ) {
-                               self.element.find( self._sanitizeSelector( self.anchors[ o.selected ].hash ) ).removeClass( "ui-tabs-hide" );
-                               this.lis.eq( o.selected ).addClass( "ui-tabs-selected ui-state-active" );
+               while ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {
+                       index = goingForward ? index + 1 : index - 1;
+               }
 
-                               // seems to be expected behavior that the show callback is fired
-                               self.element.queue( "tabs", function() {
-                                       self._trigger( "show", null,
-                                               self._ui( self.anchors[ o.selected ], self.element.find( self._sanitizeSelector( self.anchors[ o.selected ].hash ) )[ 0 ] ) );
-                               });
+               return index;
+       },
 
-                               this.load( o.selected );
-                       }
+       _focusNextTab: function( index, goingForward ) {
+               index = this._findNextTab( index, goingForward );
+               this.tabs.eq( index ).focus();
+               return index;
+       },
 
-                       // clean up to avoid memory leaks in certain versions of IE 6
-                       // TODO: namespace this event
-                       $( window ).bind( "unload", function() {
-                               self.lis.add( self.anchors ).unbind( ".tabs" );
-                               self.lis = self.anchors = self.panels = null;
-                       });
-               // update selected after add/remove
-               } else {
-                       o.selected = this.lis.index( this.lis.filter( ".ui-tabs-selected" ) );
+       _setOption: function( key, value ) {
+               if ( key === "active" ) {
+                       // _activate() will handle invalid values and update this.options
+                       this._activate( value );
+                       return;
                }
 
-               // update collapsible
-               // TODO: use .toggleClass()
-               this.element[ o.collapsible ? "addClass" : "removeClass" ]( "ui-tabs-collapsible" );
+               if ( key === "disabled" ) {
+                       // don't use the widget factory's disabled handling
+                       this._setupDisabled( value );
+                       return;
+               }
+
+               this._super( key, value);
 
-               // set or update cookie after init and add/remove respectively
-               if ( o.cookie ) {
-                       this._cookie( o.selected, o.cookie );
+               if ( key === "collapsible" ) {
+                       this.element.toggleClass( "ui-tabs-collapsible", value );
+                       // Setting collapsible: false while collapsed; open first panel
+                       if ( !value && this.options.active === false ) {
+                               this._activate( 0 );
+                       }
                }
 
-               // disable tabs
-               for ( var i = 0, li; ( li = this.lis[ i ] ); i++ ) {
-                       $( li )[ $.inArray( i, o.disabled ) != -1 &&
-                               // TODO: use .toggleClass()
-                               !$( li ).hasClass( "ui-tabs-selected" ) ? "addClass" : "removeClass" ]( "ui-state-disabled" );
+               if ( key === "event" ) {
+                       this._setupEvents( value );
                }
 
-               // reset cache if switching from cached to not cached
-               if ( o.cache === false ) {
-                       this.anchors.removeData( "cache.tabs" );
+               if ( key === "heightStyle" ) {
+                       this._setupHeightStyle( value );
                }
+       },
 
-               // remove all handlers before, tabify may run on existing tabs after add or option change
-               this.lis.add( this.anchors ).unbind( ".tabs" );
+       _tabId: function( tab ) {
+               return tab.attr( "aria-controls" ) || "ui-tabs-" + getNextTabId();
+       },
 
-               if ( o.event !== "mouseover" ) {
-                       var addState = function( state, el ) {
-                               if ( el.is( ":not(.ui-state-disabled)" ) ) {
-                                       el.addClass( "ui-state-" + state );
-                               }
-                       };
-                       var removeState = function( state, el ) {
-                               el.removeClass( "ui-state-" + state );
-                       };
-                       this.lis.bind( "mouseover.tabs" , function() {
-                               addState( "hover", $( this ) );
+       _sanitizeSelector: function( hash ) {
+               return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, "\\$&" ) : "";
+       },
+
+       refresh: function() {
+               var options = this.options,
+                       lis = this.tablist.children( ":has(a[href])" );
+
+               // get disabled tabs from class attribute from HTML
+               // this will get converted to a boolean if needed in _refresh()
+               options.disabled = $.map( lis.filter( ".ui-state-disabled" ), function( tab ) {
+                       return lis.index( tab );
+               });
+
+               this._processTabs();
+
+               // was collapsed or no tabs
+               if ( options.active === false || !this.anchors.length ) {
+                       options.active = false;
+                       this.active = $();
+               // was active, but active tab is gone
+               } else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {
+                       // all remaining tabs are disabled
+                       if ( this.tabs.length === options.disabled.length ) {
+                               options.active = false;
+                               this.active = $();
+                       // activate previous tab
+                       } else {
+                               this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );
+                       }
+               // was active, active tab still exists
+               } else {
+                       // make sure active index is correct
+                       options.active = this.tabs.index( this.active );
+               }
+
+               this._refresh();
+       },
+
+       _refresh: function() {
+               this._setupDisabled( this.options.disabled );
+               this._setupEvents( this.options.event );
+               this._setupHeightStyle( this.options.heightStyle );
+
+               this.tabs.not( this.active ).attr({
+                       "aria-selected": "false",
+                       tabIndex: -1
+               });
+               this.panels.not( this._getPanelForTab( this.active ) )
+                       .hide()
+                       .attr({
+                               "aria-expanded": "false",
+                               "aria-hidden": "true"
                        });
-                       this.lis.bind( "mouseout.tabs", function() {
-                               removeState( "hover", $( this ) );
+
+               // Make sure one tab is in the tab order
+               if ( !this.active.length ) {
+                       this.tabs.eq( 0 ).attr( "tabIndex", 0 );
+               } else {
+                       this.active
+                               .addClass( "ui-tabs-active ui-state-active" )
+                               .attr({
+                                       "aria-selected": "true",
+                                       tabIndex: 0
+                               });
+                       this._getPanelForTab( this.active )
+                               .show()
+                               .attr({
+                                       "aria-expanded": "true",
+                                       "aria-hidden": "false"
+                               });
+               }
+       },
+
+       _processTabs: function() {
+               var that = this;
+
+               this.tablist = this._getList()
+                       .addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
+                       .attr( "role", "tablist" );
+
+               this.tabs = this.tablist.find( "> li:has(a[href])" )
+                       .addClass( "ui-state-default ui-corner-top" )
+                       .attr({
+                               role: "tab",
+                               tabIndex: -1
                        });
-                       this.anchors.bind( "focus.tabs", function() {
-                               addState( "focus", $( this ).closest( "li" ) );
+
+               this.anchors = this.tabs.map(function() {
+                               return $( "a", this )[ 0 ];
+                       })
+                       .addClass( "ui-tabs-anchor" )
+                       .attr({
+                               role: "presentation",
+                               tabIndex: -1
                        });
-                       this.anchors.bind( "blur.tabs", function() {
-                               removeState( "focus", $( this ).closest( "li" ) );
+
+               this.panels = $();
+
+               this.anchors.each(function( i, anchor ) {
+                       var selector, panel, panelId,
+                               anchorId = $( anchor ).uniqueId().attr( "id" ),
+                               tab = $( anchor ).closest( "li" ),
+                               originalAriaControls = tab.attr( "aria-controls" );
+
+                       // inline tab
+                       if ( isLocal( anchor ) ) {
+                               selector = anchor.hash;
+                               panel = that.element.find( that._sanitizeSelector( selector ) );
+                       // remote tab
+                       } else {
+                               panelId = that._tabId( tab );
+                               selector = "#" + panelId;
+                               panel = that.element.find( selector );
+                               if ( !panel.length ) {
+                                       panel = that._createPanel( panelId );
+                                       panel.insertAfter( that.panels[ i - 1 ] || that.tablist );
+                               }
+                               panel.attr( "aria-live", "polite" );
+                       }
+
+                       if ( panel.length) {
+                               that.panels = that.panels.add( panel );
+                       }
+                       if ( originalAriaControls ) {
+                               tab.data( "ui-tabs-aria-controls", originalAriaControls );
+                       }
+                       tab.attr({
+                               "aria-controls": selector.substring( 1 ),
+                               "aria-labelledby": anchorId
                        });
+                       panel.attr( "aria-labelledby", anchorId );
+               });
+
+               this.panels
+                       .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
+                       .attr( "role", "tabpanel" );
+       },
+
+       // allow overriding how to find the list for rare usage scenarios (#7715)
+       _getList: function() {
+               return this.element.find( "ol,ul" ).eq( 0 );
+       },
+
+       _createPanel: function( id ) {
+               return $( "<div>" )
+                       .attr( "id", id )
+                       .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
+                       .data( "ui-tabs-destroy", true );
+       },
+
+       _setupDisabled: function( disabled ) {
+               if ( $.isArray( disabled ) ) {
+                       if ( !disabled.length ) {
+                               disabled = false;
+                       } else if ( disabled.length === this.anchors.length ) {
+                               disabled = true;
+                       }
                }
 
-               // set up animations
-               var hideFx, showFx;
-               if ( o.fx ) {
-                       if ( $.isArray( o.fx ) ) {
-                               hideFx = o.fx[ 0 ];
-                               showFx = o.fx[ 1 ];
+               // disable tabs
+               for ( var i = 0, li; ( li = this.tabs[ i ] ); i++ ) {
+                       if ( disabled === true || $.inArray( i, disabled ) !== -1 ) {
+                               $( li )
+                                       .addClass( "ui-state-disabled" )
+                                       .attr( "aria-disabled", "true" );
                        } else {
-                               hideFx = showFx = o.fx;
+                               $( li )
+                                       .removeClass( "ui-state-disabled" )
+                                       .removeAttr( "aria-disabled" );
                        }
                }
 
-               // Reset certain styles left over from animation
-               // and prevent IE's ClearType bug...
-               function resetStyle( $el, fx ) {
-                       $el.css( "display", "" );
-                       if ( !$.support.opacity && fx.opacity ) {
-                               $el[ 0 ].style.removeAttribute( "filter" );
+               this.options.disabled = disabled;
+       },
+
+       _setupEvents: function( event ) {
+               var events = {
+                       click: function( event ) {
+                               event.preventDefault();
                        }
+               };
+               if ( event ) {
+                       $.each( event.split(" "), function( index, eventName ) {
+                               events[ eventName ] = "_eventHandler";
+                       });
                }
 
-               // Show a tab...
-               var showTab = showFx
-                       ? function( clicked, $show ) {
-                               $( clicked ).closest( "li" ).addClass( "ui-tabs-selected ui-state-active" );
-                               $show.hide().removeClass( "ui-tabs-hide" ) // avoid flicker that way
-                                       .animate( showFx, showFx.duration || "normal", function() {
-                                               resetStyle( $show, showFx );
-                                               self._trigger( "show", null, self._ui( clicked, $show[ 0 ] ) );
-                                       });
-                       }
-                       : function( clicked, $show ) {
-                               $( clicked ).closest( "li" ).addClass( "ui-tabs-selected ui-state-active" );
-                               $show.removeClass( "ui-tabs-hide" );
-                               self._trigger( "show", null, self._ui( clicked, $show[ 0 ] ) );
-                       };
+               this._off( this.anchors.add( this.tabs ).add( this.panels ) );
+               this._on( this.anchors, events );
+               this._on( this.tabs, { keydown: "_tabKeydown" } );
+               this._on( this.panels, { keydown: "_panelKeydown" } );
 
-               // Hide a tab, $show is optional...
-               var hideTab = hideFx
-                       ? function( clicked, $hide ) {
-                               $hide.animate( hideFx, hideFx.duration || "normal", function() {
-                                       self.lis.removeClass( "ui-tabs-selected ui-state-active" );
-                                       $hide.addClass( "ui-tabs-hide" );
-                                       resetStyle( $hide, hideFx );
-                                       self.element.dequeue( "tabs" );
-                               });
+               this._focusable( this.tabs );
+               this._hoverable( this.tabs );
+       },
+
+       _setupHeightStyle: function( heightStyle ) {
+               var maxHeight, overflow,
+                       parent = this.element.parent();
+
+               if ( heightStyle === "fill" ) {
+                       // IE 6 treats height like minHeight, so we need to turn off overflow
+                       // in order to get a reliable height
+                       // we use the minHeight support test because we assume that only
+                       // browsers that don't support minHeight will treat height as minHeight
+                       if ( !$.support.minHeight ) {
+                               overflow = parent.css( "overflow" );
+                               parent.css( "overflow", "hidden");
                        }
-                       : function( clicked, $hide, $show ) {
-                               self.lis.removeClass( "ui-tabs-selected ui-state-active" );
-                               $hide.addClass( "ui-tabs-hide" );
-                               self.element.dequeue( "tabs" );
-                       };
+                       maxHeight = parent.height();
+                       this.element.siblings( ":visible" ).each(function() {
+                               var elem = $( this ),
+                                       position = elem.css( "position" );
 
-               // attach tab event handler, unbind to avoid duplicates from former tabifying...
-               this.anchors.bind( o.event + ".tabs", function() {
-                       var el = this,
-                               $li = $(el).closest( "li" ),
-                               $hide = self.panels.filter( ":not(.ui-tabs-hide)" ),
-                               $show = self.element.find( self._sanitizeSelector( el.hash ) );
-
-                       // If tab is already selected and not collapsible or tab disabled or
-                       // or is already loading or click callback returns false stop here.
-                       // Check if click handler returns false last so that it is not executed
-                       // for a disabled or loading tab!
-                       if ( ( $li.hasClass( "ui-tabs-selected" ) && !o.collapsible) ||
-                               $li.hasClass( "ui-state-disabled" ) ||
-                               $li.hasClass( "ui-state-processing" ) ||
-                               self.panels.filter( ":animated" ).length ||
-                               self._trigger( "select", null, self._ui( this, $show[ 0 ] ) ) === false ) {
-                               this.blur();
-                               return false;
+                               if ( position === "absolute" || position === "fixed" ) {
+                                       return;
+                               }
+                               maxHeight -= elem.outerHeight( true );
+                       });
+                       if ( overflow ) {
+                               parent.css( "overflow", overflow );
                        }
 
-                       o.selected = self.anchors.index( this );
+                       this.element.children().not( this.panels ).each(function() {
+                               maxHeight -= $( this ).outerHeight( true );
+                       });
 
-                       self.abort();
+                       this.panels.each(function() {
+                               $( this ).height( Math.max( 0, maxHeight -
+                                       $( this ).innerHeight() + $( this ).height() ) );
+                       })
+                       .css( "overflow", "auto" );
+               } else if ( heightStyle === "auto" ) {
+                       maxHeight = 0;
+                       this.panels.each(function() {
+                               maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
+                       }).height( maxHeight );
+               }
+       },
 
-                       // if tab may be closed
-                       if ( o.collapsible ) {
-                               if ( $li.hasClass( "ui-tabs-selected" ) ) {
-                                       o.selected = -1;
+       _eventHandler: function( event ) {
+               var options = this.options,
+                       active = this.active,
+                       anchor = $( event.currentTarget ),
+                       tab = anchor.closest( "li" ),
+                       clickedIsActive = tab[ 0 ] === active[ 0 ],
+                       collapsing = clickedIsActive && options.collapsible,
+                       toShow = collapsing ? $() : this._getPanelForTab( tab ),
+                       toHide = !active.length ? $() : this._getPanelForTab( active ),
+                       eventData = {
+                               oldTab: active,
+                               oldPanel: toHide,
+                               newTab: collapsing ? $() : tab,
+                               newPanel: toShow
+                       };
 
-                                       if ( o.cookie ) {
-                                               self._cookie( o.selected, o.cookie );
-                                       }
+               event.preventDefault();
+
+               if ( tab.hasClass( "ui-state-disabled" ) ||
+                               // tab is already loading
+                               tab.hasClass( "ui-tabs-loading" ) ||
+                               // can't switch durning an animation
+                               this.running ||
+                               // click on active header, but not collapsible
+                               ( clickedIsActive && !options.collapsible ) ||
+                               // allow canceling activation
+                               ( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
+                       return;
+               }
 
-                                       self.element.queue( "tabs", function() {
-                                               hideTab( el, $hide );
-                                       }).dequeue( "tabs" );
+               options.active = collapsing ? false : this.tabs.index( tab );
 
-                                       this.blur();
-                                       return false;
-                               } else if ( !$hide.length ) {
-                                       if ( o.cookie ) {
-                                               self._cookie( o.selected, o.cookie );
-                                       }
+               this.active = clickedIsActive ? $() : tab;
+               if ( this.xhr ) {
+                       this.xhr.abort();
+               }
 
-                                       self.element.queue( "tabs", function() {
-                                               showTab( el, $show );
-                                       });
+               if ( !toHide.length && !toShow.length ) {
+                       $.error( "jQuery UI Tabs: Mismatching fragment identifier." );
+               }
 
-                                       // TODO make passing in node possible, see also http://dev.jqueryui.com/ticket/3171
-                                       self.load( self.anchors.index( this ) );
+               if ( toShow.length ) {
+                       this.load( this.tabs.index( tab ), event );
+               }
+               this._toggle( event, eventData );
+       },
 
-                                       this.blur();
-                                       return false;
-                               }
-                       }
+       // handles show/hide for selecting tabs
+       _toggle: function( event, eventData ) {
+               var that = this,
+                       toShow = eventData.newPanel,
+                       toHide = eventData.oldPanel;
 
-                       if ( o.cookie ) {
-                               self._cookie( o.selected, o.cookie );
-                       }
+               this.running = true;
 
-                       // show new tab
-                       if ( $show.length ) {
-                               if ( $hide.length ) {
-                                       self.element.queue( "tabs", function() {
-                                               hideTab( el, $hide );
-                                       });
-                               }
-                               self.element.queue( "tabs", function() {
-                                       showTab( el, $show );
-                               });
+               function complete() {
+                       that.running = false;
+                       that._trigger( "activate", event, eventData );
+               }
+
+               function show() {
+                       eventData.newTab.closest( "li" ).addClass( "ui-tabs-active ui-state-active" );
 
-                               self.load( self.anchors.index( this ) );
+                       if ( toShow.length && that.options.show ) {
+                               that._show( toShow, that.options.show, complete );
                        } else {
-                               throw "jQuery UI Tabs: Mismatching fragment identifier.";
+                               toShow.show();
+                               complete();
                        }
+               }
 
-                       // Prevent IE from keeping other link focussed when using the back button
-                       // and remove dotted border from clicked link. This is controlled via CSS
-                       // in modern browsers; blur() removes focus from address bar in Firefox
-                       // which can become a usability and annoying problem with tabs('rotate').
-                       if ( $.browser.msie ) {
-                               this.blur();
-                       }
+               // start out by hiding, then showing, then completing
+               if ( toHide.length && this.options.hide ) {
+                       this._hide( toHide, this.options.hide, function() {
+                               eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
+                               show();
+                       });
+               } else {
+                       eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
+                       toHide.hide();
+                       show();
+               }
+
+               toHide.attr({
+                       "aria-expanded": "false",
+                       "aria-hidden": "true"
                });
+               eventData.oldTab.attr( "aria-selected", "false" );
+               // If we're switching tabs, remove the old tab from the tab order.
+               // If we're opening from collapsed state, remove the previous tab from the tab order.
+               // If we're collapsing, then keep the collapsing tab in the tab order.
+               if ( toShow.length && toHide.length ) {
+                       eventData.oldTab.attr( "tabIndex", -1 );
+               } else if ( toShow.length ) {
+                       this.tabs.filter(function() {
+                               return $( this ).attr( "tabIndex" ) === 0;
+                       })
+                       .attr( "tabIndex", -1 );
+               }
 
-               // disable click in any case
-               this.anchors.bind( "click.tabs", function(){
-                       return false;
+               toShow.attr({
+                       "aria-expanded": "true",
+                       "aria-hidden": "false"
+               });
+               eventData.newTab.attr({
+                       "aria-selected": "true",
+                       tabIndex: 0
                });
        },
 
-    _getIndex: function( index ) {
+       _activate: function( index ) {
+               var anchor,
+                       active = this._findActive( index );
+
+               // trying to activate the already active panel
+               if ( active[ 0 ] === this.active[ 0 ] ) {
+                       return;
+               }
+
+               // trying to collapse, simulate a click on the current active header
+               if ( !active.length ) {
+                       active = this.active;
+               }
+
+               anchor = active.find( ".ui-tabs-anchor" )[ 0 ];
+               this._eventHandler({
+                       target: anchor,
+                       currentTarget: anchor,
+                       preventDefault: $.noop
+               });
+       },
+
+       _findActive: function( index ) {
+               return index === false ? $() : this.tabs.eq( index );
+       },
+
+       _getIndex: function( index ) {
                // meta-function to give users option to provide a href string instead of a numerical index.
-               // also sanitizes numerical indexes to valid values.
-               if ( typeof index == "string" ) {
+               if ( typeof index === "string" ) {
                        index = this.anchors.index( this.anchors.filter( "[href$='" + index + "']" ) );
                }
 
                return index;
        },
 
-       destroy: function() {
-               var o = this.options;
+       _destroy: function() {
+               if ( this.xhr ) {
+                       this.xhr.abort();
+               }
 
-               this.abort();
+               this.element.removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" );
 
-               this.element
-                       .unbind( ".tabs" )
-                       .removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" )
-                       .removeData( "tabs" );
+               this.tablist
+                       .removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
+                       .removeAttr( "role" );
 
-               this.list.removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" );
+               this.anchors
+                       .removeClass( "ui-tabs-anchor" )
+                       .removeAttr( "role" )
+                       .removeAttr( "tabIndex" )
+                       .removeData( "href.tabs" )
+                       .removeData( "load.tabs" )
+                       .removeUniqueId();
 
-               this.anchors.each(function() {
-                       var href = $.data( this, "href.tabs" );
-                       if ( href ) {
-                               this.href = href;
+               this.tabs.add( this.panels ).each(function() {
+                       if ( $.data( this, "ui-tabs-destroy" ) ) {
+                               $( this ).remove();
+                       } else {
+                               $( this )
+                                       .removeClass( "ui-state-default ui-state-active ui-state-disabled " +
+                                               "ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel" )
+                                       .removeAttr( "tabIndex" )
+                                       .removeAttr( "aria-live" )
+                                       .removeAttr( "aria-busy" )
+                                       .removeAttr( "aria-selected" )
+                                       .removeAttr( "aria-labelledby" )
+                                       .removeAttr( "aria-hidden" )
+                                       .removeAttr( "aria-expanded" )
+                                       .removeAttr( "role" );
                        }
-                       var $this = $( this ).unbind( ".tabs" );
-                       $.each( [ "href", "load", "cache" ], function( i, prefix ) {
-                               $this.removeData( prefix + ".tabs" );
-                       });
                });
 
-               this.lis.unbind( ".tabs" ).add( this.panels ).each(function() {
-                       if ( $.data( this, "destroy.tabs" ) ) {
-                               $( this ).remove();
+               this.tabs.each(function() {
+                       var li = $( this ),
+                               prev = li.data( "ui-tabs-aria-controls" );
+                       if ( prev ) {
+                               li.attr( "aria-controls", prev );
                        } else {
-                               $( this ).removeClass([
-                                       "ui-state-default",
-                                       "ui-corner-top",
-                                       "ui-tabs-selected",
-                                       "ui-state-active",
-                                       "ui-state-hover",
-                                       "ui-state-focus",
-                                       "ui-state-disabled",
-                                       "ui-tabs-panel",
-                                       "ui-widget-content",
-                                       "ui-corner-bottom",
-                                       "ui-tabs-hide"
-                               ].join( " " ) );
+                               li.removeAttr( "aria-controls" );
                        }
                });
 
-               if ( o.cookie ) {
-                       this._cookie( null, o.cookie );
-               }
+               this.panels.show();
 
-               return this;
+               if ( this.options.heightStyle !== "content" ) {
+                       this.panels.css( "height", "" );
+               }
        },
 
-       add: function( url, label, index ) {
-               if ( index === undefined ) {
-                       index = this.anchors.length;
+       enable: function( index ) {
+               var disabled = this.options.disabled;
+               if ( disabled === false ) {
+                       return;
                }
 
-               var self = this,
-                       o = this.options,
-                       $li = $( o.tabTemplate.replace( /#\{href\}/g, url ).replace( /#\{label\}/g, label ) ),
-                       id = !url.indexOf( "#" ) ? url.replace( "#", "" ) : this._tabId( $( "a", $li )[ 0 ] );
-
-               $li.addClass( "ui-state-default ui-corner-top" ).data( "destroy.tabs", true );
+               if ( index === undefined ) {
+                       disabled = false;
+               } else {
+                       index = this._getIndex( index );
+                       if ( $.isArray( disabled ) ) {
+                               disabled = $.map( disabled, function( num ) {
+                                       return num !== index ? num : null;
+                               });
+                       } else {
+                               disabled = $.map( this.tabs, function( li, num ) {
+                                       return num !== index ? num : null;
+                               });
+                       }
+               }
+               this._setupDisabled( disabled );
+       },
 
-               // try to find an existing element before creating a new one
-               var $panel = self.element.find( "#" + id );
-               if ( !$panel.length ) {
-                       $panel = $( o.panelTemplate )
-                               .attr( "id", id )
-                               .data( "destroy.tabs", true );
+       disable: function( index ) {
+               var disabled = this.options.disabled;
+               if ( disabled === true ) {
+                       return;
                }
-               $panel.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" );
 
-               if ( index >= this.lis.length ) {
-                       $li.appendTo( this.list );
-                       $panel.appendTo( this.list[ 0 ].parentNode );
+               if ( index === undefined ) {
+                       disabled = true;
                } else {
-                       $li.insertBefore( this.lis[ index ] );
-                       $panel.insertBefore( this.panels[ index ] );
+                       index = this._getIndex( index );
+                       if ( $.inArray( index, disabled ) !== -1 ) {
+                               return;
+                       }
+                       if ( $.isArray( disabled ) ) {
+                               disabled = $.merge( [ index ], disabled ).sort();
+                       } else {
+                               disabled = [ index ];
+                       }
                }
+               this._setupDisabled( disabled );
+       },
 
-               o.disabled = $.map( o.disabled, function( n, i ) {
-                       return n >= index ? ++n : n;
-               });
+       load: function( index, event ) {
+               index = this._getIndex( index );
+               var that = this,
+                       tab = this.tabs.eq( index ),
+                       anchor = tab.find( ".ui-tabs-anchor" ),
+                       panel = this._getPanelForTab( tab ),
+                       eventData = {
+                               tab: tab,
+                               panel: panel
+                       };
 
-               this._tabify();
+               // not remote
+               if ( isLocal( anchor[ 0 ] ) ) {
+                       return;
+               }
 
-               if ( this.anchors.length == 1 ) {
-                       o.selected = 0;
-                       $li.addClass( "ui-tabs-selected ui-state-active" );
-                       $panel.removeClass( "ui-tabs-hide" );
-                       this.element.queue( "tabs", function() {
-                               self._trigger( "show", null, self._ui( self.anchors[ 0 ], self.panels[ 0 ] ) );
-                       });
+               this.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );
+
+               // support: jQuery <1.8
+               // jQuery <1.8 returns false if the request is canceled in beforeSend,
+               // but as of 1.8, $.ajax() always returns a jqXHR object.
+               if ( this.xhr && this.xhr.statusText !== "canceled" ) {
+                       tab.addClass( "ui-tabs-loading" );
+                       panel.attr( "aria-busy", "true" );
+
+                       this.xhr
+                               .success(function( response ) {
+                                       // support: jQuery <1.8
+                                       // http://bugs.jquery.com/ticket/11778
+                                       setTimeout(function() {
+                                               panel.html( response );
+                                               that._trigger( "load", event, eventData );
+                                       }, 1 );
+                               })
+                               .complete(function( jqXHR, status ) {
+                                       // support: jQuery <1.8
+                                       // http://bugs.jquery.com/ticket/11778
+                                       setTimeout(function() {
+                                               if ( status === "abort" ) {
+                                                       that.panels.stop( false, true );
+                                               }
+
+                                               tab.removeClass( "ui-tabs-loading" );
+                                               panel.removeAttr( "aria-busy" );
 
-                       this.load( 0 );
+                                               if ( jqXHR === that.xhr ) {
+                                                       delete that.xhr;
+                                               }
+                                       }, 1 );
+                               });
                }
+       },
 
-               this._trigger( "add", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
-               return this;
+       // TODO: Remove this function in 1.10 when ajaxOptions is removed
+       _ajaxSettings: function( anchor, event, eventData ) {
+               var that = this;
+               return {
+                       url: anchor.attr( "href" ),
+                       beforeSend: function( jqXHR, settings ) {
+                               return that._trigger( "beforeLoad", event,
+                                       $.extend( { jqXHR : jqXHR, ajaxSettings: settings }, eventData ) );
+                       }
+               };
        },
 
-       remove: function( index ) {
-               index = this._getIndex( index );
-               var o = this.options,
-                       $li = this.lis.eq( index ).remove(),
-                       $panel = this.panels.eq( index ).remove();
-
-               // If selected tab was removed focus tab to the right or
-               // in case the last tab was removed the tab to the left.
-               if ( $li.hasClass( "ui-tabs-selected" ) && this.anchors.length > 1) {
-                       this.select( index + ( index + 1 < this.anchors.length ? 1 : -1 ) );
-               }
-
-               o.disabled = $.map(
-                       $.grep( o.disabled, function(n, i) {
-                               return n != index;
-                       }),
-                       function( n, i ) {
-                               return n >= index ? --n : n;
-                       });
+       _getPanelForTab: function( tab ) {
+               var id = $( tab ).attr( "aria-controls" );
+               return this.element.find( this._sanitizeSelector( "#" + id ) );
+       }
+});
 
-               this._tabify();
+// DEPRECATED
+if ( $.uiBackCompat !== false ) {
 
-               this._trigger( "remove", null, this._ui( $li.find( "a" )[ 0 ], $panel[ 0 ] ) );
-               return this;
-       },
+       // helper method for a lot of the back compat extensions
+       $.ui.tabs.prototype._ui = function( tab, panel ) {
+               return {
+                       tab: tab,
+                       panel: panel,
+                       index: this.anchors.index( tab )
+               };
+       };
 
-       enable: function( index ) {
-               index = this._getIndex( index );
-               var o = this.options;
-               if ( $.inArray( index, o.disabled ) == -1 ) {
-                       return;
+       // url method
+       $.widget( "ui.tabs", $.ui.tabs, {
+               url: function( index, url ) {
+                       this.anchors.eq( index ).attr( "href", url );
                }
+       });
+
+       // TODO: Remove _ajaxSettings() method when removing this extension
+       // ajaxOptions and cache options
+       $.widget( "ui.tabs", $.ui.tabs, {
+               options: {
+                       ajaxOptions: null,
+                       cache: false
+               },
+
+               _create: function() {
+                       this._super();
+
+                       var that = this;
+
+                       this._on({ tabsbeforeload: function( event, ui ) {
+                               // tab is already cached
+                               if ( $.data( ui.tab[ 0 ], "cache.tabs" ) ) {
+                                       event.preventDefault();
+                                       return;
+                               }
 
-               this.lis.eq( index ).removeClass( "ui-state-disabled" );
-               o.disabled = $.grep( o.disabled, function( n, i ) {
-                       return n != index;
-               });
-
-               this._trigger( "enable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
-               return this;
-       },
+                               ui.jqXHR.success(function() {
+                                       if ( that.options.cache ) {
+                                               $.data( ui.tab[ 0 ], "cache.tabs", true );
+                                       }
+                               });
+                       }});
+               },
+
+               _ajaxSettings: function( anchor, event, ui ) {
+                       var ajaxOptions = this.options.ajaxOptions;
+                       return $.extend( {}, ajaxOptions, {
+                               error: function( xhr, status ) {
+                                       try {
+                                               // Passing index avoid a race condition when this method is
+                                               // called after the user has selected another tab.
+                                               // Pass the anchor that initiated this request allows
+                                               // loadError to manipulate the tab content panel via $(a.hash)
+                                               ajaxOptions.error(
+                                                       xhr, status, ui.tab.closest( "li" ).index(), ui.tab[ 0 ] );
+                                       }
+                                       catch ( error ) {}
+                               }
+                       }, this._superApply( arguments ) );
+               },
 
-       disable: function( index ) {
-               index = this._getIndex( index );
-               var self = this, o = this.options;
-               // cannot disable already selected tab
-               if ( index != o.selected ) {
-                       this.lis.eq( index ).addClass( "ui-state-disabled" );
+               _setOption: function( key, value ) {
+                       // reset cache if switching from cached to not cached
+                       if ( key === "cache" && value === false ) {
+                               this.anchors.removeData( "cache.tabs" );
+                       }
+                       this._super( key, value );
+               },
 
-                       o.disabled.push( index );
-                       o.disabled.sort();
+               _destroy: function() {
+                       this.anchors.removeData( "cache.tabs" );
+                       this._super();
+               },
 
-                       this._trigger( "disable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
+               url: function( index ){
+                       this.anchors.eq( index ).removeData( "cache.tabs" );
+                       this._superApply( arguments );
                }
+       });
 
-               return this;
-       },
-
-       select: function( index ) {
-               index = this._getIndex( index );
-               if ( index == -1 ) {
-                       if ( this.options.collapsible && this.options.selected != -1 ) {
-                               index = this.options.selected;
-                       } else {
-                               return this;
+       // abort method
+       $.widget( "ui.tabs", $.ui.tabs, {
+               abort: function() {
+                       if ( this.xhr ) {
+                               this.xhr.abort();
                        }
                }
-               this.anchors.eq( index ).trigger( this.options.event + ".tabs" );
-               return this;
-       },
+       });
+
+       // spinner
+       $.widget( "ui.tabs", $.ui.tabs, {
+               options: {
+                       spinner: "<em>Loading&#8230;</em>"
+               },
+               _create: function() {
+                       this._super();
+                       this._on({
+                               tabsbeforeload: function( event, ui ) {
+                                       // Don't react to nested tabs or tabs that don't use a spinner
+                                       if ( event.target !== this.element[ 0 ] ||
+                                                       !this.options.spinner ) {
+                                               return;
+                                       }
 
-       load: function( index ) {
-               index = this._getIndex( index );
-               var self = this,
-                       o = this.options,
-                       a = this.anchors.eq( index )[ 0 ],
-                       url = $.data( a, "load.tabs" );
+                                       var span = ui.tab.find( "span" ),
+                                               html = span.html();
+                                       span.html( this.options.spinner );
+                                       ui.jqXHR.complete(function() {
+                                               span.html( html );
+                                       });
+                               }
+                       });
+               }
+       });
+
+       // enable/disable events
+       $.widget( "ui.tabs", $.ui.tabs, {
+               options: {
+                       enable: null,
+                       disable: null
+               },
+
+               enable: function( index ) {
+                       var options = this.options,
+                               trigger;
+
+                       if ( index && options.disabled === true ||
+                                       ( $.isArray( options.disabled ) && $.inArray( index, options.disabled ) !== -1 ) ) {
+                               trigger = true;
+                       }
 
-               this.abort();
+                       this._superApply( arguments );
 
-               // not remote or from cache
-               if ( !url || this.element.queue( "tabs" ).length !== 0 && $.data( a, "cache.tabs" ) ) {
-                       this.element.dequeue( "tabs" );
-                       return;
-               }
+                       if ( trigger ) {
+                               this._trigger( "enable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
+                       }
+               },
 
-               // load remote from here on
-               this.lis.eq( index ).addClass( "ui-state-processing" );
+               disable: function( index ) {
+                       var options = this.options,
+                               trigger;
 
-               if ( o.spinner ) {
-                       var span = $( "span", a );
-                       span.data( "label.tabs", span.html() ).html( o.spinner );
-               }
+                       if ( index && options.disabled === false ||
+                                       ( $.isArray( options.disabled ) && $.inArray( index, options.disabled ) === -1 ) ) {
+                               trigger = true;
+                       }
 
-               this.xhr = $.ajax( $.extend( {}, o.ajaxOptions, {
-                       url: url,
-                       success: function( r, s ) {
-                               self.element.find( self._sanitizeSelector( a.hash ) ).html( r );
+                       this._superApply( arguments );
 
-                               // take care of tab labels
-                               self._cleanup();
+                       if ( trigger ) {
+                               this._trigger( "disable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
+                       }
+               }
+       });
+
+       // add/remove methods and events
+       $.widget( "ui.tabs", $.ui.tabs, {
+               options: {
+                       add: null,
+                       remove: null,
+                       tabTemplate: "<li><a href='#{href}'><span>#{label}</span></a></li>"
+               },
+
+               add: function( url, label, index ) {
+                       if ( index === undefined ) {
+                               index = this.anchors.length;
+                       }
 
-                               if ( o.cache ) {
-                                       $.data( a, "cache.tabs", true );
+                       var doInsertAfter, panel,
+                               options = this.options,
+                               li = $( options.tabTemplate
+                                       .replace( /#\{href\}/g, url )
+                                       .replace( /#\{label\}/g, label ) ),
+                               id = !url.indexOf( "#" ) ?
+                                       url.replace( "#", "" ) :
+                                       this._tabId( li );
+
+                       li.addClass( "ui-state-default ui-corner-top" ).data( "ui-tabs-destroy", true );
+                       li.attr( "aria-controls", id );
+
+                       doInsertAfter = index >= this.tabs.length;
+
+                       // try to find an existing element before creating a new one
+                       panel = this.element.find( "#" + id );
+                       if ( !panel.length ) {
+                               panel = this._createPanel( id );
+                               if ( doInsertAfter ) {
+                                       if ( index > 0 ) {
+                                               panel.insertAfter( this.panels.eq( -1 ) );
+                                       } else {
+                                               panel.appendTo( this.element );
+                                       }
+                               } else {
+                                       panel.insertBefore( this.panels[ index ] );
                                }
+                       }
+                       panel.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" ).hide();
 
-                               self._trigger( "load", null, self._ui( self.anchors[ index ], self.panels[ index ] ) );
-                               try {
-                                       o.ajaxOptions.success( r, s );
-                               }
-                               catch ( e ) {}
-                       },
-                       error: function( xhr, s, e ) {
-                               // take care of tab labels
-                               self._cleanup();
-
-                               self._trigger( "load", null, self._ui( self.anchors[ index ], self.panels[ index ] ) );
-                               try {
-                                       // Passing index avoid a race condition when this method is
-                                       // called after the user has selected another tab.
-                                       // Pass the anchor that initiated this request allows
-                                       // loadError to manipulate the tab content panel via $(a.hash)
-                                       o.ajaxOptions.error( xhr, s, index, a );
-                               }
-                               catch ( e ) {}
+                       if ( doInsertAfter ) {
+                               li.appendTo( this.tablist );
+                       } else {
+                               li.insertBefore( this.tabs[ index ] );
                        }
-               } ) );
 
-               // last, so that load event is fired before show...
-               self.element.dequeue( "tabs" );
+                       options.disabled = $.map( options.disabled, function( n ) {
+                               return n >= index ? ++n : n;
+                       });
 
-               return this;
-       },
+                       this.refresh();
+                       if ( this.tabs.length === 1 && options.active === false ) {
+                               this.option( "active", 0 );
+                       }
 
-       abort: function() {
-               // stop possibly running animations
-               this.element.queue( [] );
-               this.panels.stop( false, true );
+                       this._trigger( "add", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
+                       return this;
+               },
+
+               remove: function( index ) {
+                       index = this._getIndex( index );
+                       var options = this.options,
+                               tab = this.tabs.eq( index ).remove(),
+                               panel = this._getPanelForTab( tab ).remove();
+
+                       // If selected tab was removed focus tab to the right or
+                       // in case the last tab was removed the tab to the left.
+                       // We check for more than 2 tabs, because if there are only 2,
+                       // then when we remove this tab, there will only be one tab left
+                       // so we don't need to detect which tab to activate.
+                       if ( tab.hasClass( "ui-tabs-active" ) && this.anchors.length > 2 ) {
+                               this._activate( index + ( index + 1 < this.anchors.length ? 1 : -1 ) );
+                       }
 
-               // "tabs" queue must not contain more than two elements,
-               // which are the callbacks for the latest clicked tab...
-               this.element.queue( "tabs", this.element.queue( "tabs" ).splice( -2, 2 ) );
+                       options.disabled = $.map(
+                               $.grep( options.disabled, function( n ) {
+                                       return n !== index;
+                               }),
+                               function( n ) {
+                                       return n >= index ? --n : n;
+                               });
 
-               // terminate pending requests from other tabs
-               if ( this.xhr ) {
-                       this.xhr.abort();
-                       delete this.xhr;
+                       this.refresh();
+
+                       this._trigger( "remove", null, this._ui( tab.find( "a" )[ 0 ], panel[ 0 ] ) );
+                       return this;
                }
+       });
 
-               // take care of tab labels
-               this._cleanup();
-               return this;
-       },
+       // length method
+       $.widget( "ui.tabs", $.ui.tabs, {
+               length: function() {
+                       return this.anchors.length;
+               }
+       });
+
+       // panel ids (idPrefix option + title attribute)
+       $.widget( "ui.tabs", $.ui.tabs, {
+               options: {
+                       idPrefix: "ui-tabs-"
+               },
+
+               _tabId: function( tab ) {
+                       var a = tab.is( "li" ) ? tab.find( "a[href]" ) : tab;
+                       a = a[0];
+                       return $( a ).closest( "li" ).attr( "aria-controls" ) ||
+                               a.title && a.title.replace( /\s/g, "_" ).replace( /[^\w\u00c0-\uFFFF\-]/g, "" ) ||
+                               this.options.idPrefix + getNextTabId();
+               }
+       });
 
-       url: function( index, url ) {
-               this.anchors.eq( index ).removeData( "cache.tabs" ).data( "load.tabs", url );
-               return this;
-       },
+       // _createPanel method
+       $.widget( "ui.tabs", $.ui.tabs, {
+               options: {
+                       panelTemplate: "<div></div>"
+               },
 
-       length: function() {
-               return this.anchors.length;
-       }
-});
+               _createPanel: function( id ) {
+                       return $( this.options.panelTemplate )
+                               .attr( "id", id )
+                               .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
+                               .data( "ui-tabs-destroy", true );
+               }
+       });
+
+       // selected option
+       $.widget( "ui.tabs", $.ui.tabs, {
+               _create: function() {
+                       var options = this.options;
+                       if ( options.active === null && options.selected !== undefined ) {
+                               options.active = options.selected === -1 ? false : options.selected;
+                       }
+                       this._super();
+                       options.selected = options.active;
+                       if ( options.selected === false ) {
+                               options.selected = -1;
+                       }
+               },
 
-$.extend( $.ui.tabs, {
-       version: "1.8.24"
-});
+               _setOption: function( key, value ) {
+                       if ( key !== "selected" ) {
+                               return this._super( key, value );
+                       }
 
-/*
- * Tabs Extensions
- */
+                       var options = this.options;
+                       this._super( "active", value === -1 ? false : value );
+                       options.selected = options.active;
+                       if ( options.selected === false ) {
+                               options.selected = -1;
+                       }
+               },
 
-/*
- * Rotate
- */
-$.extend( $.ui.tabs.prototype, {
-       rotation: null,
-       rotate: function( ms, continuing ) {
-               var self = this,
-                       o = this.options;
-
-               var rotate = self._rotate || ( self._rotate = function( e ) {
-                       clearTimeout( self.rotation );
-                       self.rotation = setTimeout(function() {
-                               var t = o.selected;
-                               self.select( ++t < self.anchors.length ? t : 0 );
-                       }, ms );
-                       
-                       if ( e ) {
-                               e.stopPropagation();
+               _eventHandler: function() {
+                       this._superApply( arguments );
+                       this.options.selected = this.options.active;
+                       if ( this.options.selected === false ) {
+                               this.options.selected = -1;
                        }
-               });
+               }
+       });
+
+       // show and select event
+       $.widget( "ui.tabs", $.ui.tabs, {
+               options: {
+                       show: null,
+                       select: null
+               },
+               _create: function() {
+                       this._super();
+                       if ( this.options.active !== false ) {
+                               this._trigger( "show", null, this._ui(
+                                       this.active.find( ".ui-tabs-anchor" )[ 0 ],
+                                       this._getPanelForTab( this.active )[ 0 ] ) );
+                       }
+               },
+               _trigger: function( type, event, data ) {
+                       var tab, panel,
+                               ret = this._superApply( arguments );
 
-               var stop = self._unrotate || ( self._unrotate = !continuing
-                       ? function(e) {
-                               if (e.clientX) { // in case of a true click
-                                       self.rotate(null);
+                       if ( !ret ) {
+                               return false;
+                       }
+
+                       if ( type === "beforeActivate" ) {
+                               tab = data.newTab.length ? data.newTab : data.oldTab;
+                               panel = data.newPanel.length ? data.newPanel : data.oldPanel;
+                               ret = this._super( "select", event, {
+                                       tab: tab.find( ".ui-tabs-anchor" )[ 0],
+                                       panel: panel[ 0 ],
+                                       index: tab.closest( "li" ).index()
+                               });
+                       } else if ( type === "activate" && data.newTab.length ) {
+                               ret = this._super( "show", event, {
+                                       tab: data.newTab.find( ".ui-tabs-anchor" )[ 0 ],
+                                       panel: data.newPanel[ 0 ],
+                                       index: data.newTab.closest( "li" ).index()
+                               });
+                       }
+                       return ret;
+               }
+       });
+
+       // select method
+       $.widget( "ui.tabs", $.ui.tabs, {
+               select: function( index ) {
+                       index = this._getIndex( index );
+                       if ( index === -1 ) {
+                               if ( this.options.collapsible && this.options.selected !== -1 ) {
+                                       index = this.options.selected;
+                               } else {
+                                       return;
                                }
                        }
-                       : function( e ) {
-                               rotate();
-                       });
+                       this.anchors.eq( index ).trigger( this.options.event + this.eventNamespace );
+               }
+       });
+
+       // cookie option
+       (function() {
+
+       var listId = 0;
+
+       $.widget( "ui.tabs", $.ui.tabs, {
+               options: {
+                       cookie: null // e.g. { expires: 7, path: '/', domain: 'jquery.com', secure: true }
+               },
+               _create: function() {
+                       var options = this.options,
+                               active;
+                       if ( options.active == null && options.cookie ) {
+                               active = parseInt( this._cookie(), 10 );
+                               if ( active === -1 ) {
+                                       active = false;
+                               }
+                               options.active = active;
+                       }
+                       this._super();
+               },
+               _cookie: function( active ) {
+                       var cookie = [ this.cookie ||
+                               ( this.cookie = this.options.cookie.name || "ui-tabs-" + (++listId) ) ];
+                       if ( arguments.length ) {
+                               cookie.push( active === false ? -1 : active );
+                               cookie.push( this.options.cookie );
+                       }
+                       return $.cookie.apply( null, cookie );
+               },
+               _refresh: function() {
+                       this._super();
+                       if ( this.options.cookie ) {
+                               this._cookie( this.options.active, this.options.cookie );
+                       }
+               },
+               _eventHandler: function() {
+                       this._superApply( arguments );
+                       if ( this.options.cookie ) {
+                               this._cookie( this.options.active, this.options.cookie );
+                       }
+               },
+               _destroy: function() {
+                       this._super();
+                       if ( this.options.cookie ) {
+                               this._cookie( null, this.options.cookie );
+                       }
+               }
+       });
 
-               // start rotation
-               if ( ms ) {
-                       this.element.bind( "tabsshow", rotate );
-                       this.anchors.bind( o.event + ".tabs", stop );
-                       rotate();
-               // stop rotation
-               } else {
-                       clearTimeout( self.rotation );
-                       this.element.unbind( "tabsshow", rotate );
-                       this.anchors.unbind( o.event + ".tabs", stop );
-                       delete this._rotate;
-                       delete this._unrotate;
+       })();
+
+       // load event
+       $.widget( "ui.tabs", $.ui.tabs, {
+               _trigger: function( type, event, data ) {
+                       var _data = $.extend( {}, data );
+                       if ( type === "load" ) {
+                               _data.panel = _data.panel[ 0 ];
+                               _data.tab = _data.tab.find( ".ui-tabs-anchor" )[ 0 ];
+                       }
+                       return this._super( type, event, _data );
                }
+       });
+
+       // fx option
+       // The new animation options (show, hide) conflict with the old show callback.
+       // The old fx option wins over show/hide anyway (always favor back-compat).
+       // If a user wants to use the new animation API, they must give up the old API.
+       $.widget( "ui.tabs", $.ui.tabs, {
+               options: {
+                       fx: null // e.g. { height: "toggle", opacity: "toggle", duration: 200 }
+               },
+
+               _getFx: function() {
+                       var hide, show,
+                               fx = this.options.fx;
+
+                       if ( fx ) {
+                               if ( $.isArray( fx ) ) {
+                                       hide = fx[ 0 ];
+                                       show = fx[ 1 ];
+                               } else {
+                                       hide = show = fx;
+                               }
+                       }
 
-               return this;
-       }
-});
+                       return fx ? { show: show, hide: hide } : null;
+               },
+
+               _toggle: function( event, eventData ) {
+                       var that = this,
+                               toShow = eventData.newPanel,
+                               toHide = eventData.oldPanel,
+                               fx = this._getFx();
+
+                       if ( !fx ) {
+                               return this._super( event, eventData );
+                       }
+
+                       that.running = true;
+
+                       function complete() {
+                               that.running = false;
+                               that._trigger( "activate", event, eventData );
+                       }
+
+                       function show() {
+                               eventData.newTab.closest( "li" ).addClass( "ui-tabs-active ui-state-active" );
+
+                               if ( toShow.length && fx.show ) {
+                                       toShow
+                                               .animate( fx.show, fx.show.duration, function() {
+                                                       complete();
+                                               });
+                               } else {
+                                       toShow.show();
+                                       complete();
+                               }
+                       }
+
+                       // start out by hiding, then showing, then completing
+                       if ( toHide.length && fx.hide ) {
+                               toHide.animate( fx.hide, fx.hide.duration, function() {
+                                       eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
+                                       show();
+                               });
+                       } else {
+                               eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
+                               toHide.hide();
+                               show();
+                       }
+               }
+       });
+}
 
 })( jQuery );
diff --git a/resources/lib/jquery.ui/jquery.ui.tooltip.js b/resources/lib/jquery.ui/jquery.ui.tooltip.js
new file mode 100644 (file)
index 0000000..2b50b44
--- /dev/null
@@ -0,0 +1,398 @@
+/*!
+ * jQuery UI Tooltip 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/tooltip/
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.widget.js
+ *     jquery.ui.position.js
+ */
+(function( $ ) {
+
+var increments = 0;
+
+function addDescribedBy( elem, id ) {
+       var describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ );
+       describedby.push( id );
+       elem
+               .data( "ui-tooltip-id", id )
+               .attr( "aria-describedby", $.trim( describedby.join( " " ) ) );
+}
+
+function removeDescribedBy( elem ) {
+       var id = elem.data( "ui-tooltip-id" ),
+               describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ ),
+               index = $.inArray( id, describedby );
+       if ( index !== -1 ) {
+               describedby.splice( index, 1 );
+       }
+
+       elem.removeData( "ui-tooltip-id" );
+       describedby = $.trim( describedby.join( " " ) );
+       if ( describedby ) {
+               elem.attr( "aria-describedby", describedby );
+       } else {
+               elem.removeAttr( "aria-describedby" );
+       }
+}
+
+$.widget( "ui.tooltip", {
+       version: "1.9.2",
+       options: {
+               content: function() {
+                       return $( this ).attr( "title" );
+               },
+               hide: true,
+               // Disabled elements have inconsistent behavior across browsers (#8661)
+               items: "[title]:not([disabled])",
+               position: {
+                       my: "left top+15",
+                       at: "left bottom",
+                       collision: "flipfit flip"
+               },
+               show: true,
+               tooltipClass: null,
+               track: false,
+
+               // callbacks
+               close: null,
+               open: null
+       },
+
+       _create: function() {
+               this._on({
+                       mouseover: "open",
+                       focusin: "open"
+               });
+
+               // IDs of generated tooltips, needed for destroy
+               this.tooltips = {};
+               // IDs of parent tooltips where we removed the title attribute
+               this.parents = {};
+
+               if ( this.options.disabled ) {
+                       this._disable();
+               }
+       },
+
+       _setOption: function( key, value ) {
+               var that = this;
+
+               if ( key === "disabled" ) {
+                       this[ value ? "_disable" : "_enable" ]();
+                       this.options[ key ] = value;
+                       // disable element style changes
+                       return;
+               }
+
+               this._super( key, value );
+
+               if ( key === "content" ) {
+                       $.each( this.tooltips, function( id, element ) {
+                               that._updateContent( element );
+                       });
+               }
+       },
+
+       _disable: function() {
+               var that = this;
+
+               // close open tooltips
+               $.each( this.tooltips, function( id, element ) {
+                       var event = $.Event( "blur" );
+                       event.target = event.currentTarget = element[0];
+                       that.close( event, true );
+               });
+
+               // remove title attributes to prevent native tooltips
+               this.element.find( this.options.items ).andSelf().each(function() {
+                       var element = $( this );
+                       if ( element.is( "[title]" ) ) {
+                               element
+                                       .data( "ui-tooltip-title", element.attr( "title" ) )
+                                       .attr( "title", "" );
+                       }
+               });
+       },
+
+       _enable: function() {
+               // restore title attributes
+               this.element.find( this.options.items ).andSelf().each(function() {
+                       var element = $( this );
+                       if ( element.data( "ui-tooltip-title" ) ) {
+                               element.attr( "title", element.data( "ui-tooltip-title" ) );
+                       }
+               });
+       },
+
+       open: function( event ) {
+               var that = this,
+                       target = $( event ? event.target : this.element )
+                               // we need closest here due to mouseover bubbling,
+                               // but always pointing at the same event target
+                               .closest( this.options.items );
+
+               // No element to show a tooltip for or the tooltip is already open
+               if ( !target.length || target.data( "ui-tooltip-id" ) ) {
+                       return;
+               }
+
+               if ( target.attr( "title" ) ) {
+                       target.data( "ui-tooltip-title", target.attr( "title" ) );
+               }
+
+               target.data( "ui-tooltip-open", true );
+
+               // kill parent tooltips, custom or native, for hover
+               if ( event && event.type === "mouseover" ) {
+                       target.parents().each(function() {
+                               var parent = $( this ),
+                                       blurEvent;
+                               if ( parent.data( "ui-tooltip-open" ) ) {
+                                       blurEvent = $.Event( "blur" );
+                                       blurEvent.target = blurEvent.currentTarget = this;
+                                       that.close( blurEvent, true );
+                               }
+                               if ( parent.attr( "title" ) ) {
+                                       parent.uniqueId();
+                                       that.parents[ this.id ] = {
+                                               element: this,
+                                               title: parent.attr( "title" )
+                                       };
+                                       parent.attr( "title", "" );
+                               }
+                       });
+               }
+
+               this._updateContent( target, event );
+       },
+
+       _updateContent: function( target, event ) {
+               var content,
+                       contentOption = this.options.content,
+                       that = this,
+                       eventType = event ? event.type : null;
+
+               if ( typeof contentOption === "string" ) {
+                       return this._open( event, target, contentOption );
+               }
+
+               content = contentOption.call( target[0], function( response ) {
+                       // ignore async response if tooltip was closed already
+                       if ( !target.data( "ui-tooltip-open" ) ) {
+                               return;
+                       }
+                       // IE may instantly serve a cached response for ajax requests
+                       // delay this call to _open so the other call to _open runs first
+                       that._delay(function() {
+                               // jQuery creates a special event for focusin when it doesn't
+                               // exist natively. To improve performance, the native event
+                               // object is reused and the type is changed. Therefore, we can't
+                               // rely on the type being correct after the event finished
+                               // bubbling, so we set it back to the previous value. (#8740)
+                               if ( event ) {
+                                       event.type = eventType;
+                               }
+                               this._open( event, target, response );
+                       });
+               });
+               if ( content ) {
+                       this._open( event, target, content );
+               }
+       },
+
+       _open: function( event, target, content ) {
+               var tooltip, events, delayedShow,
+                       positionOption = $.extend( {}, this.options.position );
+
+               if ( !content ) {
+                       return;
+               }
+
+               // Content can be updated multiple times. If the tooltip already
+               // exists, then just update the content and bail.
+               tooltip = this._find( target );
+               if ( tooltip.length ) {
+                       tooltip.find( ".ui-tooltip-content" ).html( content );
+                       return;
+               }
+
+               // if we have a title, clear it to prevent the native tooltip
+               // we have to check first to avoid defining a title if none exists
+               // (we don't want to cause an element to start matching [title])
+               //
+               // We use removeAttr only for key events, to allow IE to export the correct
+               // accessible attributes. For mouse events, set to empty string to avoid
+               // native tooltip showing up (happens only when removing inside mouseover).
+               if ( target.is( "[title]" ) ) {
+                       if ( event && event.type === "mouseover" ) {
+                               target.attr( "title", "" );
+                       } else {
+                               target.removeAttr( "title" );
+                       }
+               }
+
+               tooltip = this._tooltip( target );
+               addDescribedBy( target, tooltip.attr( "id" ) );
+               tooltip.find( ".ui-tooltip-content" ).html( content );
+
+               function position( event ) {
+                       positionOption.of = event;
+                       if ( tooltip.is( ":hidden" ) ) {
+                               return;
+                       }
+                       tooltip.position( positionOption );
+               }
+               if ( this.options.track && event && /^mouse/.test( event.type ) ) {
+                       this._on( this.document, {
+                               mousemove: position
+                       });
+                       // trigger once to override element-relative positioning
+                       position( event );
+               } else {
+                       tooltip.position( $.extend({
+                               of: target
+                       }, this.options.position ) );
+               }
+
+               tooltip.hide();
+
+               this._show( tooltip, this.options.show );
+               // Handle tracking tooltips that are shown with a delay (#8644). As soon
+               // as the tooltip is visible, position the tooltip using the most recent
+               // event.
+               if ( this.options.show && this.options.show.delay ) {
+                       delayedShow = setInterval(function() {
+                               if ( tooltip.is( ":visible" ) ) {
+                                       position( positionOption.of );
+                                       clearInterval( delayedShow );
+                               }
+                       }, $.fx.interval );
+               }
+
+               this._trigger( "open", event, { tooltip: tooltip } );
+
+               events = {
+                       keyup: function( event ) {
+                               if ( event.keyCode === $.ui.keyCode.ESCAPE ) {
+                                       var fakeEvent = $.Event(event);
+                                       fakeEvent.currentTarget = target[0];
+                                       this.close( fakeEvent, true );
+                               }
+                       },
+                       remove: function() {
+                               this._removeTooltip( tooltip );
+                       }
+               };
+               if ( !event || event.type === "mouseover" ) {
+                       events.mouseleave = "close";
+               }
+               if ( !event || event.type === "focusin" ) {
+                       events.focusout = "close";
+               }
+               this._on( true, target, events );
+       },
+
+       close: function( event ) {
+               var that = this,
+                       target = $( event ? event.currentTarget : this.element ),
+                       tooltip = this._find( target );
+
+               // disabling closes the tooltip, so we need to track when we're closing
+               // to avoid an infinite loop in case the tooltip becomes disabled on close
+               if ( this.closing ) {
+                       return;
+               }
+
+               // only set title if we had one before (see comment in _open())
+               if ( target.data( "ui-tooltip-title" ) ) {
+                       target.attr( "title", target.data( "ui-tooltip-title" ) );
+               }
+
+               removeDescribedBy( target );
+
+               tooltip.stop( true );
+               this._hide( tooltip, this.options.hide, function() {
+                       that._removeTooltip( $( this ) );
+               });
+
+               target.removeData( "ui-tooltip-open" );
+               this._off( target, "mouseleave focusout keyup" );
+               // Remove 'remove' binding only on delegated targets
+               if ( target[0] !== this.element[0] ) {
+                       this._off( target, "remove" );
+               }
+               this._off( this.document, "mousemove" );
+
+               if ( event && event.type === "mouseleave" ) {
+                       $.each( this.parents, function( id, parent ) {
+                               $( parent.element ).attr( "title", parent.title );
+                               delete that.parents[ id ];
+                       });
+               }
+
+               this.closing = true;
+               this._trigger( "close", event, { tooltip: tooltip } );
+               this.closing = false;
+       },
+
+       _tooltip: function( element ) {
+               var id = "ui-tooltip-" + increments++,
+                       tooltip = $( "<div>" )
+                               .attr({
+                                       id: id,
+                                       role: "tooltip"
+                               })
+                               .addClass( "ui-tooltip ui-widget ui-corner-all ui-widget-content " +
+                                       ( this.options.tooltipClass || "" ) );
+               $( "<div>" )
+                       .addClass( "ui-tooltip-content" )
+                       .appendTo( tooltip );
+               tooltip.appendTo( this.document[0].body );
+               if ( $.fn.bgiframe ) {
+                       tooltip.bgiframe();
+               }
+               this.tooltips[ id ] = element;
+               return tooltip;
+       },
+
+       _find: function( target ) {
+               var id = target.data( "ui-tooltip-id" );
+               return id ? $( "#" + id ) : $();
+       },
+
+       _removeTooltip: function( tooltip ) {
+               tooltip.remove();
+               delete this.tooltips[ tooltip.attr( "id" ) ];
+       },
+
+       _destroy: function() {
+               var that = this;
+
+               // close open tooltips
+               $.each( this.tooltips, function( id, element ) {
+                       // Delegate to close method to handle common cleanup
+                       var event = $.Event( "blur" );
+                       event.target = event.currentTarget = element[0];
+                       that.close( event, true );
+
+                       // Remove immediately; destroying an open tooltip doesn't use the
+                       // hide animation
+                       $( "#" + id ).remove();
+
+                       // Restore the title
+                       if ( element.data( "ui-tooltip-title" ) ) {
+                               element.attr( "title", element.data( "ui-tooltip-title" ) );
+                               element.removeData( "ui-tooltip-title" );
+                       }
+               });
+       }
+});
+
+}( jQuery ) );
index 66ef013..067476d 100644 (file)
@@ -1,48 +1,32 @@
 /*!
- * jQuery UI Widget 1.8.24
+ * jQuery UI Widget 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Widget
+ * http://api.jqueryui.com/jQuery.widget/
  */
 (function( $, undefined ) {
 
-// jQuery 1.4+
-if ( $.cleanData ) {
-       var _cleanData = $.cleanData;
-       $.cleanData = function( elems ) {
-               for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
-                       try {
-                               $( elem ).triggerHandler( "remove" );
-                       // http://bugs.jquery.com/ticket/8235
-                       } catch( e ) {}
-               }
-               _cleanData( elems );
-       };
-} else {
-       var _remove = $.fn.remove;
-       $.fn.remove = function( selector, keepData ) {
-               return this.each(function() {
-                       if ( !keepData ) {
-                               if ( !selector || $.filter( selector, [ this ] ).length ) {
-                                       $( "*", this ).add( [ this ] ).each(function() {
-                                               try {
-                                                       $( this ).triggerHandler( "remove" );
-                                               // http://bugs.jquery.com/ticket/8235
-                                               } catch( e ) {}
-                                       });
-                               }
-                       }
-                       return _remove.call( $(this), selector, keepData );
-               });
-       };
-}
+var uuid = 0,
+       slice = Array.prototype.slice,
+       _cleanData = $.cleanData;
+$.cleanData = function( elems ) {
+       for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+               try {
+                       $( elem ).triggerHandler( "remove" );
+               // http://bugs.jquery.com/ticket/8235
+               } catch( e ) {}
+       }
+       _cleanData( elems );
+};
 
 $.widget = function( name, base, prototype ) {
-       var namespace = name.split( "." )[ 0 ],
-               fullName;
+       var fullName, existingConstructor, constructor, basePrototype,
+               namespace = name.split( "." )[ 0 ];
+
        name = name.split( "." )[ 1 ];
        fullName = namespace + "-" + name;
 
@@ -52,81 +36,167 @@ $.widget = function( name, base, prototype ) {
        }
 
        // create selector for plugin
-       $.expr[ ":" ][ fullName ] = function( elem ) {
-               return !!$.data( elem, name );
+       $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
+               return !!$.data( elem, fullName );
        };
 
        $[ namespace ] = $[ namespace ] || {};
-       $[ namespace ][ name ] = function( options, element ) {
+       existingConstructor = $[ namespace ][ name ];
+       constructor = $[ namespace ][ name ] = function( options, element ) {
+               // allow instantiation without "new" keyword
+               if ( !this._createWidget ) {
+                       return new constructor( options, element );
+               }
+
                // allow instantiation without initializing for simple inheritance
+               // must use "new" keyword (the code above always passes args)
                if ( arguments.length ) {
                        this._createWidget( options, element );
                }
        };
-
-       var basePrototype = new base();
+       // extend with the existing constructor to carry over any static properties
+       $.extend( constructor, existingConstructor, {
+               version: prototype.version,
+               // copy the object used to create the prototype in case we need to
+               // redefine the widget later
+               _proto: $.extend( {}, prototype ),
+               // track widgets that inherit from this widget in case this widget is
+               // redefined after a widget inherits from it
+               _childConstructors: []
+       });
+
+       basePrototype = new base();
        // we need to make the options hash a property directly on the new instance
        // otherwise we'll modify the options hash on the prototype that we're
        // inheriting from
-//     $.each( basePrototype, function( key, val ) {
-//             if ( $.isPlainObject(val) ) {
-//                     basePrototype[ key ] = $.extend( {}, val );
-//             }
-//     });
-       basePrototype.options = $.extend( true, {}, basePrototype.options );
-       $[ namespace ][ name ].prototype = $.extend( true, basePrototype, {
+       basePrototype.options = $.widget.extend( {}, basePrototype.options );
+       $.each( prototype, function( prop, value ) {
+               if ( $.isFunction( value ) ) {
+                       prototype[ prop ] = (function() {
+                               var _super = function() {
+                                               return base.prototype[ prop ].apply( this, arguments );
+                                       },
+                                       _superApply = function( args ) {
+                                               return base.prototype[ prop ].apply( this, args );
+                                       };
+                               return function() {
+                                       var __super = this._super,
+                                               __superApply = this._superApply,
+                                               returnValue;
+
+                                       this._super = _super;
+                                       this._superApply = _superApply;
+
+                                       returnValue = value.apply( this, arguments );
+
+                                       this._super = __super;
+                                       this._superApply = __superApply;
+
+                                       return returnValue;
+                               };
+                       })();
+               }
+       });
+       constructor.prototype = $.widget.extend( basePrototype, {
+               // TODO: remove support for widgetEventPrefix
+               // always use the name + a colon as the prefix, e.g., draggable:start
+               // don't prefix for widgets that aren't DOM-based
+               widgetEventPrefix: existingConstructor ? basePrototype.widgetEventPrefix : name
+       }, prototype, {
+               constructor: constructor,
                namespace: namespace,
                widgetName: name,
-               widgetEventPrefix: $[ namespace ][ name ].prototype.widgetEventPrefix || name,
-               widgetBaseClass: fullName
-       }, prototype );
+               // TODO remove widgetBaseClass, see #8155
+               widgetBaseClass: fullName,
+               widgetFullName: fullName
+       });
+
+       // If this widget is being redefined then we need to find all widgets that
+       // are inheriting from it and redefine all of them so that they inherit from
+       // the new version of this widget. We're essentially trying to replace one
+       // level in the prototype chain.
+       if ( existingConstructor ) {
+               $.each( existingConstructor._childConstructors, function( i, child ) {
+                       var childPrototype = child.prototype;
+
+                       // redefine the child widget using the same prototype that was
+                       // originally used, but inherit from the new version of the base
+                       $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
+               });
+               // remove the list of existing child constructors from the old constructor
+               // so the old child constructors can be garbage collected
+               delete existingConstructor._childConstructors;
+       } else {
+               base._childConstructors.push( constructor );
+       }
 
-       $.widget.bridge( name, $[ namespace ][ name ] );
+       $.widget.bridge( name, constructor );
+};
+
+$.widget.extend = function( target ) {
+       var input = slice.call( arguments, 1 ),
+               inputIndex = 0,
+               inputLength = input.length,
+               key,
+               value;
+       for ( ; inputIndex < inputLength; inputIndex++ ) {
+               for ( key in input[ inputIndex ] ) {
+                       value = input[ inputIndex ][ key ];
+                       if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
+                               // Clone objects
+                               if ( $.isPlainObject( value ) ) {
+                                       target[ key ] = $.isPlainObject( target[ key ] ) ?
+                                               $.widget.extend( {}, target[ key ], value ) :
+                                               // Don't extend strings, arrays, etc. with objects
+                                               $.widget.extend( {}, value );
+                               // Copy everything else by reference
+                               } else {
+                                       target[ key ] = value;
+                               }
+                       }
+               }
+       }
+       return target;
 };
 
 $.widget.bridge = function( name, object ) {
+       var fullName = object.prototype.widgetFullName || name;
        $.fn[ name ] = function( options ) {
                var isMethodCall = typeof options === "string",
-                       args = Array.prototype.slice.call( arguments, 1 ),
+                       args = slice.call( arguments, 1 ),
                        returnValue = this;
 
                // allow multiple hashes to be passed on init
                options = !isMethodCall && args.length ?
-                       $.extend.apply( null, [ true, options ].concat(args) ) :
+                       $.widget.extend.apply( null, [ options ].concat(args) ) :
                        options;
 
-               // prevent calls to internal methods
-               if ( isMethodCall && options.charAt( 0 ) === "_" ) {
-                       return returnValue;
-               }
-
                if ( isMethodCall ) {
                        this.each(function() {
-                               var instance = $.data( this, name ),
-                                       methodValue = instance && $.isFunction( instance[options] ) ?
-                                               instance[ options ].apply( instance, args ) :
-                                               instance;
-                               // TODO: add this back in 1.9 and use $.error() (see #5972)
-//                             if ( !instance ) {
-//                                     throw "cannot call methods on " + name + " prior to initialization; " +
-//                                             "attempted to call method '" + options + "'";
-//                             }
-//                             if ( !$.isFunction( instance[options] ) ) {
-//                                     throw "no such method '" + options + "' for " + name + " widget instance";
-//                             }
-//                             var methodValue = instance[ options ].apply( instance, args );
+                               var methodValue,
+                                       instance = $.data( this, fullName );
+                               if ( !instance ) {
+                                       return $.error( "cannot call methods on " + name + " prior to initialization; " +
+                                               "attempted to call method '" + options + "'" );
+                               }
+                               if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
+                                       return $.error( "no such method '" + options + "' for " + name + " widget instance" );
+                               }
+                               methodValue = instance[ options ].apply( instance, args );
                                if ( methodValue !== instance && methodValue !== undefined ) {
-                                       returnValue = methodValue;
+                                       returnValue = methodValue && methodValue.jquery ?
+                                               returnValue.pushStack( methodValue.get() ) :
+                                               methodValue;
                                        return false;
                                }
                        });
                } else {
                        this.each(function() {
-                               var instance = $.data( this, name );
+                               var instance = $.data( this, fullName );
                                if ( instance ) {
                                        instance.option( options || {} )._init();
                                } else {
-                                       $.data( this, name, new object( options, this ) );
+                                       $.data( this, fullName, new object( options, this ) );
                                }
                        });
                }
@@ -135,74 +205,126 @@ $.widget.bridge = function( name, object ) {
        };
 };
 
-$.Widget = function( options, element ) {
-       // allow instantiation without initializing for simple inheritance
-       if ( arguments.length ) {
-               this._createWidget( options, element );
-       }
-};
+$.Widget = function( /* options, element */ ) {};
+$.Widget._childConstructors = [];
 
 $.Widget.prototype = {
        widgetName: "widget",
        widgetEventPrefix: "",
+       defaultElement: "<div>",
        options: {
-               disabled: false
+               disabled: false,
+
+               // callbacks
+               create: null
        },
        _createWidget: function( options, element ) {
-               // $.widget.bridge stores the plugin instance, but we do it anyway
-               // so that it's stored even before the _create function runs
-               $.data( element, this.widgetName, this );
+               element = $( element || this.defaultElement || this )[ 0 ];
                this.element = $( element );
-               this.options = $.extend( true, {},
+               this.uuid = uuid++;
+               this.eventNamespace = "." + this.widgetName + this.uuid;
+               this.options = $.widget.extend( {},
                        this.options,
                        this._getCreateOptions(),
                        options );
 
-               var self = this;
-               this.element.bind( "remove." + this.widgetName, function() {
-                       self.destroy();
-               });
+               this.bindings = $();
+               this.hoverable = $();
+               this.focusable = $();
+
+               if ( element !== this ) {
+                       // 1.9 BC for #7810
+                       // TODO remove dual storage
+                       $.data( element, this.widgetName, this );
+                       $.data( element, this.widgetFullName, this );
+                       this._on( true, this.element, {
+                               remove: function( event ) {
+                                       if ( event.target === element ) {
+                                               this.destroy();
+                                       }
+                               }
+                       });
+                       this.document = $( element.style ?
+                               // element within the document
+                               element.ownerDocument :
+                               // element is window or document
+                               element.document || element );
+                       this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
+               }
 
                this._create();
-               this._trigger( "create" );
+               this._trigger( "create", null, this._getCreateEventData() );
                this._init();
        },
-       _getCreateOptions: function() {
-               return $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ];
-       },
-       _create: function() {},
-       _init: function() {},
+       _getCreateOptions: $.noop,
+       _getCreateEventData: $.noop,
+       _create: $.noop,
+       _init: $.noop,
 
        destroy: function() {
+               this._destroy();
+               // we can probably remove the unbind calls in 2.0
+               // all event bindings should go through this._on()
                this.element
-                       .unbind( "." + this.widgetName )
-                       .removeData( this.widgetName );
+                       .unbind( this.eventNamespace )
+                       // 1.9 BC for #7810
+                       // TODO remove dual storage
+                       .removeData( this.widgetName )
+                       .removeData( this.widgetFullName )
+                       // support: jquery <1.6.3
+                       // http://bugs.jquery.com/ticket/9413
+                       .removeData( $.camelCase( this.widgetFullName ) );
                this.widget()
-                       .unbind( "." + this.widgetName )
+                       .unbind( this.eventNamespace )
                        .removeAttr( "aria-disabled" )
                        .removeClass(
-                               this.widgetBaseClass + "-disabled " +
+                               this.widgetFullName + "-disabled " +
                                "ui-state-disabled" );
+
+               // clean up events and states
+               this.bindings.unbind( this.eventNamespace );
+               this.hoverable.removeClass( "ui-state-hover" );
+               this.focusable.removeClass( "ui-state-focus" );
        },
+       _destroy: $.noop,
 
        widget: function() {
                return this.element;
        },
 
        option: function( key, value ) {
-               var options = key;
+               var options = key,
+                       parts,
+                       curOption,
+                       i;
 
                if ( arguments.length === 0 ) {
                        // don't return a reference to the internal hash
-                       return $.extend( {}, this.options );
+                       return $.widget.extend( {}, this.options );
                }
 
-               if  (typeof key === "string" ) {
-                       if ( value === undefined ) {
-                               return this.options[ key ];
-                       }
+               if ( typeof key === "string" ) {
+                       // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
                        options = {};
-                       options[ key ] = value;
+                       parts = key.split( "." );
+                       key = parts.shift();
+                       if ( parts.length ) {
+                               curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
+                               for ( i = 0; i < parts.length - 1; i++ ) {
+                                       curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
+                                       curOption = curOption[ parts[ i ] ];
+                               }
+                               key = parts.pop();
+                               if ( value === undefined ) {
+                                       return curOption[ key ] === undefined ? null : curOption[ key ];
+                               }
+                               curOption[ key ] = value;
+                       } else {
+                               if ( value === undefined ) {
+                                       return this.options[ key ] === undefined ? null : this.options[ key ];
+                               }
+                               options[ key ] = value;
+                       }
                }
 
                this._setOptions( options );
@@ -210,10 +332,11 @@ $.Widget.prototype = {
                return this;
        },
        _setOptions: function( options ) {
-               var self = this;
-               $.each( options, function( key, value ) {
-                       self._setOption( key, value );
-               });
+               var key;
+
+               for ( key in options ) {
+                       this._setOption( key, options[ key ] );
+               }
 
                return this;
        },
@@ -222,10 +345,10 @@ $.Widget.prototype = {
 
                if ( key === "disabled" ) {
                        this.widget()
-                               [ value ? "addClass" : "removeClass"](
-                                       this.widgetBaseClass + "-disabled" + " " +
-                                       "ui-state-disabled" )
+                               .toggleClass( this.widgetFullName + "-disabled ui-state-disabled", !!value )
                                .attr( "aria-disabled", value );
+                       this.hoverable.removeClass( "ui-state-hover" );
+                       this.focusable.removeClass( "ui-state-focus" );
                }
 
                return this;
@@ -238,6 +361,97 @@ $.Widget.prototype = {
                return this._setOption( "disabled", true );
        },
 
+       _on: function( suppressDisabledCheck, element, handlers ) {
+               var delegateElement,
+                       instance = this;
+
+               // no suppressDisabledCheck flag, shuffle arguments
+               if ( typeof suppressDisabledCheck !== "boolean" ) {
+                       handlers = element;
+                       element = suppressDisabledCheck;
+                       suppressDisabledCheck = false;
+               }
+
+               // no element argument, shuffle and use this.element
+               if ( !handlers ) {
+                       handlers = element;
+                       element = this.element;
+                       delegateElement = this.widget();
+               } else {
+                       // accept selectors, DOM elements
+                       element = delegateElement = $( element );
+                       this.bindings = this.bindings.add( element );
+               }
+
+               $.each( handlers, function( event, handler ) {
+                       function handlerProxy() {
+                               // allow widgets to customize the disabled handling
+                               // - disabled as an array instead of boolean
+                               // - disabled class as method for disabling individual parts
+                               if ( !suppressDisabledCheck &&
+                                               ( instance.options.disabled === true ||
+                                                       $( this ).hasClass( "ui-state-disabled" ) ) ) {
+                                       return;
+                               }
+                               return ( typeof handler === "string" ? instance[ handler ] : handler )
+                                       .apply( instance, arguments );
+                       }
+
+                       // copy the guid so direct unbinding works
+                       if ( typeof handler !== "string" ) {
+                               handlerProxy.guid = handler.guid =
+                                       handler.guid || handlerProxy.guid || $.guid++;
+                       }
+
+                       var match = event.match( /^(\w+)\s*(.*)$/ ),
+                               eventName = match[1] + instance.eventNamespace,
+                               selector = match[2];
+                       if ( selector ) {
+                               delegateElement.delegate( selector, eventName, handlerProxy );
+                       } else {
+                               element.bind( eventName, handlerProxy );
+                       }
+               });
+       },
+
+       _off: function( element, eventName ) {
+               eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;
+               element.unbind( eventName ).undelegate( eventName );
+       },
+
+       _delay: function( handler, delay ) {
+               function handlerProxy() {
+                       return ( typeof handler === "string" ? instance[ handler ] : handler )
+                               .apply( instance, arguments );
+               }
+               var instance = this;
+               return setTimeout( handlerProxy, delay || 0 );
+       },
+
+       _hoverable: function( element ) {
+               this.hoverable = this.hoverable.add( element );
+               this._on( element, {
+                       mouseenter: function( event ) {
+                               $( event.currentTarget ).addClass( "ui-state-hover" );
+                       },
+                       mouseleave: function( event ) {
+                               $( event.currentTarget ).removeClass( "ui-state-hover" );
+                       }
+               });
+       },
+
+       _focusable: function( element ) {
+               this.focusable = this.focusable.add( element );
+               this._on( element, {
+                       focusin: function( event ) {
+                               $( event.currentTarget ).addClass( "ui-state-focus" );
+                       },
+                       focusout: function( event ) {
+                               $( event.currentTarget ).removeClass( "ui-state-focus" );
+                       }
+               });
+       },
+
        _trigger: function( type, event, data ) {
                var prop, orig,
                        callback = this.options[ type ];
@@ -262,11 +476,53 @@ $.Widget.prototype = {
                }
 
                this.element.trigger( event, data );
-
-               return !( $.isFunction(callback) &&
-                       callback.call( this.element[0], event, data ) === false ||
+               return !( $.isFunction( callback ) &&
+                       callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
                        event.isDefaultPrevented() );
        }
 };
 
+$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
+       $.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
+               if ( typeof options === "string" ) {
+                       options = { effect: options };
+               }
+               var hasOptions,
+                       effectName = !options ?
+                               method :
+                               options === true || typeof options === "number" ?
+                                       defaultEffect :
+                                       options.effect || defaultEffect;
+               options = options || {};
+               if ( typeof options === "number" ) {
+                       options = { duration: options };
+               }
+               hasOptions = !$.isEmptyObject( options );
+               options.complete = callback;
+               if ( options.delay ) {
+                       element.delay( options.delay );
+               }
+               if ( hasOptions && $.effects && ( $.effects.effect[ effectName ] || $.uiBackCompat !== false && $.effects[ effectName ] ) ) {
+                       element[ method ]( options );
+               } else if ( effectName !== method && element[ effectName ] ) {
+                       element[ effectName ]( options.duration, options.easing, callback );
+               } else {
+                       element.queue(function( next ) {
+                               $( this )[ method ]();
+                               if ( callback ) {
+                                       callback.call( element[ 0 ] );
+                               }
+                               next();
+                       });
+               }
+       };
+});
+
+// DEPRECATED
+if ( $.uiBackCompat !== false ) {
+       $.Widget.prototype._getCreateOptions = function() {
+               return $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ];
+       };
+}
+
 })( jQuery );
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-bg_flat_0_aaaaaa_40x100.png b/resources/lib/jquery.ui/themes/default/images/ui-bg_flat_0_aaaaaa_40x100.png
deleted file mode 100644 (file)
index e425e6e..0000000
Binary files a/resources/lib/jquery.ui/themes/default/images/ui-bg_flat_0_aaaaaa_40x100.png and /dev/null differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-bg_flat_75_ffffff_40x100.png b/resources/lib/jquery.ui/themes/default/images/ui-bg_flat_75_ffffff_40x100.png
deleted file mode 100644 (file)
index 72d4757..0000000
Binary files a/resources/lib/jquery.ui/themes/default/images/ui-bg_flat_75_ffffff_40x100.png and /dev/null differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_55_fbf9ee_1x400.png b/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_55_fbf9ee_1x400.png
deleted file mode 100644 (file)
index 3b2914a..0000000
Binary files a/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_55_fbf9ee_1x400.png and /dev/null differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_65_ffffff_1x400.png b/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_65_ffffff_1x400.png
deleted file mode 100644 (file)
index 8569c1b..0000000
Binary files a/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_65_ffffff_1x400.png and /dev/null differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_75_dadada_1x400.png b/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_75_dadada_1x400.png
deleted file mode 100644 (file)
index d6cc3c5..0000000
Binary files a/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_75_dadada_1x400.png and /dev/null differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_75_e6e6e6_1x400.png b/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_75_e6e6e6_1x400.png
deleted file mode 100644 (file)
index 86c2baa..0000000
Binary files a/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_75_e6e6e6_1x400.png and /dev/null differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_95_fef1ec_1x400.png b/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_95_fef1ec_1x400.png
deleted file mode 100644 (file)
index 4443fdc..0000000
Binary files a/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_95_fef1ec_1x400.png and /dev/null differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/resources/lib/jquery.ui/themes/default/images/ui-bg_highlight-soft_75_cccccc_1x100.png
deleted file mode 100644 (file)
index 3cd467e..0000000
Binary files a/resources/lib/jquery.ui/themes/default/images/ui-bg_highlight-soft_75_cccccc_1x100.png and /dev/null differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-icons_222222_256x240.png b/resources/lib/jquery.ui/themes/default/images/ui-icons_222222_256x240.png
deleted file mode 100644 (file)
index 9a9606f..0000000
Binary files a/resources/lib/jquery.ui/themes/default/images/ui-icons_222222_256x240.png and /dev/null differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-icons_2e83ff_256x240.png b/resources/lib/jquery.ui/themes/default/images/ui-icons_2e83ff_256x240.png
deleted file mode 100644 (file)
index 08d2617..0000000
Binary files a/resources/lib/jquery.ui/themes/default/images/ui-icons_2e83ff_256x240.png and /dev/null differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-icons_454545_256x240.png b/resources/lib/jquery.ui/themes/default/images/ui-icons_454545_256x240.png
deleted file mode 100644 (file)
index 80cb644..0000000
Binary files a/resources/lib/jquery.ui/themes/default/images/ui-icons_454545_256x240.png and /dev/null differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-icons_888888_256x240.png b/resources/lib/jquery.ui/themes/default/images/ui-icons_888888_256x240.png
deleted file mode 100644 (file)
index 8373712..0000000
Binary files a/resources/lib/jquery.ui/themes/default/images/ui-icons_888888_256x240.png and /dev/null differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-icons_cd0a0a_256x240.png b/resources/lib/jquery.ui/themes/default/images/ui-icons_cd0a0a_256x240.png
deleted file mode 100644 (file)
index 34fc893..0000000
Binary files a/resources/lib/jquery.ui/themes/default/images/ui-icons_cd0a0a_256x240.png and /dev/null differ
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.accordion.css b/resources/lib/jquery.ui/themes/default/jquery.ui.accordion.css
deleted file mode 100644 (file)
index cd8f971..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/*!
- * jQuery UI Accordion 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Accordion#theming
- */
-/* IE/Win - Fix animation bug - #4615 */
-.ui-accordion { width: 100%; }
-.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
-.ui-accordion .ui-accordion-li-fix { display: inline; }
-.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
-.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
-.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
-.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
-.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
-.ui-accordion .ui-accordion-content-active { display: block; }
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.autocomplete.css b/resources/lib/jquery.ui/themes/default/jquery.ui.autocomplete.css
deleted file mode 100644 (file)
index c7eaff2..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/*!
- * jQuery UI Autocomplete 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Autocomplete#theming
- */
-.ui-autocomplete { position: absolute; cursor: default; }      
-
-/* workarounds */
-* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
-
-/*
- * jQuery UI Menu 1.8.24
- *
- * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Menu#theming
- */
-.ui-menu {
-       list-style:none;
-       padding: 2px;
-       margin: 0;
-       display:block;
-       float: left;
-}
-.ui-menu .ui-menu {
-       margin-top: -3px;
-}
-.ui-menu .ui-menu-item {
-       margin:0;
-       padding: 0;
-       zoom: 1;
-       float: left;
-       clear: left;
-       width: 100%;
-}
-.ui-menu .ui-menu-item a {
-       text-decoration:none;
-       display:block;
-       padding:.2em .4em;
-       line-height:1.5;
-       zoom:1;
-}
-.ui-menu .ui-menu-item a.ui-state-hover,
-.ui-menu .ui-menu-item a.ui-state-active {
-       font-weight: normal;
-       margin: -1px;
-}
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.button.css b/resources/lib/jquery.ui/themes/default/jquery.ui.button.css
deleted file mode 100644 (file)
index cd2dbb6..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-/*!
- * jQuery UI Button 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Button#theming
- */
-
-.ui-button {
-       display: inline-block;
-       position: relative;
-       padding: 0;
-       margin-right: .1em;
-       text-decoration: none !important;
-       cursor: pointer;
-       text-align: center;
-       zoom: 1;
-       overflow: visible; /* the overflow property removes extra width in IE */
-}
-/* to make room for the icon, a width needs to be set here */
-.ui-button-icon-only {
-       width: 2.2em;
-}
-
-/* button elements seem to need a little more width */
-button.ui-button-icon-only {
-       width: 2.4em;
-}
-.ui-button-icons-only {
-       width: 3.4em;
-}
-button.ui-button-icons-only {
-       width: 3.7em;
-}
-
-/*button text element */
-.ui-button .ui-button-text {
-       display: block;
-       line-height: 1.4;
-}
-.ui-button-text-only .ui-button-text {
-       padding: .4em 1em;
-}
-.ui-button-icon-only .ui-button-text,
-.ui-button-icons-only .ui-button-text {
-       padding: .4em;
-       text-indent: -9999999px;
-}
-.ui-button-text-icon-primary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
-       padding: .4em 1em .4em 2.1em;
-}
-.ui-button-text-icon-secondary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
-       padding: .4em 2.1em .4em 1em;
-}
-.ui-button-text-icons .ui-button-text {
-       padding-left: 2.1em;
-       padding-right: 2.1em;
-}
-/* no icon support for input elements, provide padding by default */
-       input.ui-button {
-       padding: .4em 1em;
-}
-
-/*button icon element(s) */
-.ui-button-icon-only .ui-icon,
-.ui-button-text-icon-primary .ui-icon,
-.ui-button-text-icon-secondary .ui-icon,
-.ui-button-text-icons .ui-icon,
-.ui-button-icons-only .ui-icon {
-       position: absolute;
-       top: 50%;
-       margin-top: -8px;
-}
-.ui-button-icon-only .ui-icon {
-       left: 50%;
-       margin-left: -8px;
-}
-.ui-button-text-icon-primary .ui-button-icon-primary,
-.ui-button-text-icons .ui-button-icon-primary,
-.ui-button-icons-only .ui-button-icon-primary {
-       left: .5em;
-}
-.ui-button-text-icon-secondary .ui-button-icon-secondary,
-.ui-button-text-icons .ui-button-icon-secondary,
-.ui-button-icons-only .ui-button-icon-secondary {
-       right: .5em;
-}
-.ui-button-text-icons .ui-button-icon-secondary,
-.ui-button-icons-only .ui-button-icon-secondary {
-       right: .5em;
-}
-
-/*button sets*/
-.ui-buttonset {
-       margin-right: 7px;
-}
-.ui-buttonset .ui-button {
-       margin-left: 0;
-       margin-right: -.3em;
-}
-
-/* workarounds */
-button.ui-button::-moz-focus-inner {
-       border: 0;
-       padding: 0; /* reset extra padding in Firefox */
-}
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.core.css b/resources/lib/jquery.ui/themes/default/jquery.ui.core.css
deleted file mode 100644 (file)
index 8b953a2..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/*!
- * 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.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Theming/API
- */
-
-/* Layout helpers
-----------------------------------*/
-.ui-helper-hidden { display: none; }
-.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
-.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
-.ui-helper-clearfix:before, .ui-helper-clearfix:after { content: ""; display: table; }
-.ui-helper-clearfix:after { clear: both; }
-.ui-helper-clearfix { zoom: 1; }
-.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
-
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-disabled { cursor: default !important; }
-
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Overlays */
-.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.datepicker.css b/resources/lib/jquery.ui/themes/default/jquery.ui.datepicker.css
deleted file mode 100644 (file)
index 37d3a98..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-/*!
- * jQuery UI Datepicker 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Datepicker#theming
- */
-.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
-.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
-.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
-.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
-.ui-datepicker .ui-datepicker-prev { left:2px; }
-.ui-datepicker .ui-datepicker-next { right:2px; }
-.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
-.ui-datepicker .ui-datepicker-next-hover { right:1px; }
-.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
-.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
-.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
-.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
-.ui-datepicker select.ui-datepicker-month, 
-.ui-datepicker select.ui-datepicker-year { width: 49%;}
-.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
-.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
-.ui-datepicker td { border: 0; padding: 1px; }
-.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
-.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
-.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
-.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
-
-/* with multiple calendars */
-.ui-datepicker.ui-datepicker-multi { width:auto; }
-.ui-datepicker-multi .ui-datepicker-group { float:left; }
-.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
-.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
-.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
-.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
-.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
-.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
-.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
-.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; }
-
-/* RTL support */
-.ui-datepicker-rtl { direction: rtl; }
-.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
-.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
-.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
-.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
-.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
-.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
-.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
-.ui-datepicker-rtl .ui-datepicker-group { float:right; }
-.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
-.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
-
-/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
-.ui-datepicker-cover {
-    position: absolute; /*must have*/
-    z-index: -1; /*must have*/
-    filter: mask(); /*must have*/
-    top: -4px; /*must have*/
-    left: -4px; /*must have*/
-    width: 200px; /*must have*/
-    height: 200px; /*must have*/
-}
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.dialog.css b/resources/lib/jquery.ui/themes/default/jquery.ui.dialog.css
deleted file mode 100644 (file)
index 04515f4..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/*!
- * jQuery UI Dialog 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Dialog#theming
- */
-.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
-.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative;  }
-.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } 
-.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
-.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
-.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
-.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
-.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
-.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
-.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
-.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
-.ui-draggable .ui-dialog-titlebar { cursor: move; }
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.progressbar.css b/resources/lib/jquery.ui/themes/default/jquery.ui.progressbar.css
deleted file mode 100644 (file)
index 90bf308..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-/*!
- * jQuery UI Progressbar 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Progressbar#theming
- */
-.ui-progressbar { height:2em; text-align: left; overflow: hidden; }
-.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.resizable.css b/resources/lib/jquery.ui/themes/default/jquery.ui.resizable.css
deleted file mode 100644 (file)
index d17873e..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-/*!
- * jQuery UI Resizable 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Resizable#theming
- */
-.ui-resizable { position: relative;}
-.ui-resizable-handle { position: absolute;font-size: 0.1px; display: block; }
-.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
-.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
-.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
-.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
-.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
-.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
-.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
-.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
-.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.selectable.css b/resources/lib/jquery.ui/themes/default/jquery.ui.selectable.css
deleted file mode 100644 (file)
index 9850ee7..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-/*!
- * jQuery UI Selectable 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Selectable#theming
- */
-.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.slider.css b/resources/lib/jquery.ui/themes/default/jquery.ui.slider.css
deleted file mode 100644 (file)
index fbfe665..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * jQuery UI Slider 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Slider#theming
- */
-.ui-slider { position: relative; text-align: left; }
-.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
-.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
-
-.ui-slider-horizontal { height: .8em; }
-.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
-.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
-.ui-slider-horizontal .ui-slider-range-min { left: 0; }
-.ui-slider-horizontal .ui-slider-range-max { right: 0; }
-
-.ui-slider-vertical { width: .8em; height: 100px; }
-.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
-.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
-.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
-.ui-slider-vertical .ui-slider-range-max { top: 0; }
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.tabs.css b/resources/lib/jquery.ui/themes/default/jquery.ui.tabs.css
deleted file mode 100644 (file)
index f0bee7a..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/*!
- * jQuery UI Tabs 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Tabs#theming
- */
-.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
-.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
-.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
-.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
-.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
-.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
-.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
-.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
-.ui-tabs .ui-tabs-hide { display: none !important; }
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.theme.css b/resources/lib/jquery.ui/themes/default/jquery.ui.theme.css
deleted file mode 100644 (file)
index b7d2f61..0000000
+++ /dev/null
@@ -1,247 +0,0 @@
-/*!
- * 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.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Theming/API
- *
- * To view and modify this theme, visit http://jqueryui.com/themeroller/
- */
-
-
-/* Component containers
-----------------------------------*/
-.ui-widget { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1.1em/*{fsDefault}*/; }
-.ui-widget .ui-widget { font-size: 1em; }
-.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1em; }
-.ui-widget-content { border: 1px solid #aaaaaa/*{borderColorContent}*/; background: #ffffff/*{bgColorContent}*/ url(images/ui-bg_flat_75_ffffff_40x100.png)/*{bgImgUrlContent}*/ 50%/*{bgContentXPos}*/ 50%/*{bgContentYPos}*/ repeat-x/*{bgContentRepeat}*/; color: #222222/*{fcContent}*/; }
-.ui-widget-content a { color: #222222/*{fcContent}*/; }
-.ui-widget-header { border: 1px solid #aaaaaa/*{borderColorHeader}*/; background: #cccccc/*{bgColorHeader}*/ url(images/ui-bg_highlight-soft_75_cccccc_1x100.png)/*{bgImgUrlHeader}*/ 50%/*{bgHeaderXPos}*/ 50%/*{bgHeaderYPos}*/ repeat-x/*{bgHeaderRepeat}*/; color: #222222/*{fcHeader}*/; font-weight: bold; }
-.ui-widget-header a { color: #222222/*{fcHeader}*/; }
-
-/* Interaction states
-----------------------------------*/
-.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3/*{borderColorDefault}*/; background: #e6e6e6/*{bgColorDefault}*/ url(images/ui-bg_glass_75_e6e6e6_1x400.png)/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #555555/*{fcDefault}*/; }
-.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555/*{fcDefault}*/; text-decoration: none; }
-.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999/*{borderColorHover}*/; background: #dadada/*{bgColorHover}*/ url(images/ui-bg_glass_75_dadada_1x400.png)/*{bgImgUrlHover}*/ 50%/*{bgHoverXPos}*/ 50%/*{bgHoverYPos}*/ repeat-x/*{bgHoverRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcHover}*/; }
-.ui-state-hover a, .ui-state-hover a:hover { color: #212121/*{fcHover}*/; text-decoration: none; }
-.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa/*{borderColorActive}*/; background: #ffffff/*{bgColorActive}*/ url(images/ui-bg_glass_65_ffffff_1x400.png)/*{bgImgUrlActive}*/ 50%/*{bgActiveXPos}*/ 50%/*{bgActiveYPos}*/ repeat-x/*{bgActiveRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcActive}*/; }
-.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121/*{fcActive}*/; text-decoration: none; }
-.ui-widget :active { outline: none; }
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #fcefa1/*{borderColorHighlight}*/; background: #fbf9ee/*{bgColorHighlight}*/ url(images/ui-bg_glass_55_fbf9ee_1x400.png)/*{bgImgUrlHighlight}*/ 50%/*{bgHighlightXPos}*/ 50%/*{bgHighlightYPos}*/ repeat-x/*{bgHighlightRepeat}*/; color: #363636/*{fcHighlight}*/; }
-.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636/*{fcHighlight}*/; }
-.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a/*{borderColorError}*/; background: #fef1ec/*{bgColorError}*/ url(images/ui-bg_glass_95_fef1ec_1x400.png)/*{bgImgUrlError}*/ 50%/*{bgErrorXPos}*/ 50%/*{bgErrorYPos}*/ repeat-x/*{bgErrorRepeat}*/; color: #cd0a0a/*{fcError}*/; }
-.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a/*{fcError}*/; }
-.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a/*{fcError}*/; }
-.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
-.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
-.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; }
-.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; }
-.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsHeader}*/; }
-.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png)/*{iconsDefault}*/; }
-.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsHover}*/; }
-.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsActive}*/; }
-.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png)/*{iconsHighlight}*/; }
-.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png)/*{iconsError}*/; }
-
-/* positioning */
-.ui-icon-carat-1-n { background-position: 0 0; }
-.ui-icon-carat-1-ne { background-position: -16px 0; }
-.ui-icon-carat-1-e { background-position: -32px 0; }
-.ui-icon-carat-1-se { background-position: -48px 0; }
-.ui-icon-carat-1-s { background-position: -64px 0; }
-.ui-icon-carat-1-sw { background-position: -80px 0; }
-.ui-icon-carat-1-w { background-position: -96px 0; }
-.ui-icon-carat-1-nw { background-position: -112px 0; }
-.ui-icon-carat-2-n-s { background-position: -128px 0; }
-.ui-icon-carat-2-e-w { background-position: -144px 0; }
-.ui-icon-triangle-1-n { background-position: 0 -16px; }
-.ui-icon-triangle-1-ne { background-position: -16px -16px; }
-.ui-icon-triangle-1-e { background-position: -32px -16px; }
-.ui-icon-triangle-1-se { background-position: -48px -16px; }
-.ui-icon-triangle-1-s { background-position: -64px -16px; }
-.ui-icon-triangle-1-sw { background-position: -80px -16px; }
-.ui-icon-triangle-1-w { background-position: -96px -16px; }
-.ui-icon-triangle-1-nw { background-position: -112px -16px; }
-.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
-.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
-.ui-icon-arrow-1-n { background-position: 0 -32px; }
-.ui-icon-arrow-1-ne { background-position: -16px -32px; }
-.ui-icon-arrow-1-e { background-position: -32px -32px; }
-.ui-icon-arrow-1-se { background-position: -48px -32px; }
-.ui-icon-arrow-1-s { background-position: -64px -32px; }
-.ui-icon-arrow-1-sw { background-position: -80px -32px; }
-.ui-icon-arrow-1-w { background-position: -96px -32px; }
-.ui-icon-arrow-1-nw { background-position: -112px -32px; }
-.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
-.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
-.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
-.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
-.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
-.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
-.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
-.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
-.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
-.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
-.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
-.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
-.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
-.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
-.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
-.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
-.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
-.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
-.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
-.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
-.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
-.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
-.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
-.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
-.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
-.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
-.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
-.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
-.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
-.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
-.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
-.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
-.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
-.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
-.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
-.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
-.ui-icon-arrow-4 { background-position: 0 -80px; }
-.ui-icon-arrow-4-diag { background-position: -16px -80px; }
-.ui-icon-extlink { background-position: -32px -80px; }
-.ui-icon-newwin { background-position: -48px -80px; }
-.ui-icon-refresh { background-position: -64px -80px; }
-.ui-icon-shuffle { background-position: -80px -80px; }
-.ui-icon-transfer-e-w { background-position: -96px -80px; }
-.ui-icon-transferthick-e-w { background-position: -112px -80px; }
-.ui-icon-folder-collapsed { background-position: 0 -96px; }
-.ui-icon-folder-open { background-position: -16px -96px; }
-.ui-icon-document { background-position: -32px -96px; }
-.ui-icon-document-b { background-position: -48px -96px; }
-.ui-icon-note { background-position: -64px -96px; }
-.ui-icon-mail-closed { background-position: -80px -96px; }
-.ui-icon-mail-open { background-position: -96px -96px; }
-.ui-icon-suitcase { background-position: -112px -96px; }
-.ui-icon-comment { background-position: -128px -96px; }
-.ui-icon-person { background-position: -144px -96px; }
-.ui-icon-print { background-position: -160px -96px; }
-.ui-icon-trash { background-position: -176px -96px; }
-.ui-icon-locked { background-position: -192px -96px; }
-.ui-icon-unlocked { background-position: -208px -96px; }
-.ui-icon-bookmark { background-position: -224px -96px; }
-.ui-icon-tag { background-position: -240px -96px; }
-.ui-icon-home { background-position: 0 -112px; }
-.ui-icon-flag { background-position: -16px -112px; }
-.ui-icon-calendar { background-position: -32px -112px; }
-.ui-icon-cart { background-position: -48px -112px; }
-.ui-icon-pencil { background-position: -64px -112px; }
-.ui-icon-clock { background-position: -80px -112px; }
-.ui-icon-disk { background-position: -96px -112px; }
-.ui-icon-calculator { background-position: -112px -112px; }
-.ui-icon-zoomin { background-position: -128px -112px; }
-.ui-icon-zoomout { background-position: -144px -112px; }
-.ui-icon-search { background-position: -160px -112px; }
-.ui-icon-wrench { background-position: -176px -112px; }
-.ui-icon-gear { background-position: -192px -112px; }
-.ui-icon-heart { background-position: -208px -112px; }
-.ui-icon-star { background-position: -224px -112px; }
-.ui-icon-link { background-position: -240px -112px; }
-.ui-icon-cancel { background-position: 0 -128px; }
-.ui-icon-plus { background-position: -16px -128px; }
-.ui-icon-plusthick { background-position: -32px -128px; }
-.ui-icon-minus { background-position: -48px -128px; }
-.ui-icon-minusthick { background-position: -64px -128px; }
-.ui-icon-close { background-position: -80px -128px; }
-.ui-icon-closethick { background-position: -96px -128px; }
-.ui-icon-key { background-position: -112px -128px; }
-.ui-icon-lightbulb { background-position: -128px -128px; }
-.ui-icon-scissors { background-position: -144px -128px; }
-.ui-icon-clipboard { background-position: -160px -128px; }
-.ui-icon-copy { background-position: -176px -128px; }
-.ui-icon-contact { background-position: -192px -128px; }
-.ui-icon-image { background-position: -208px -128px; }
-.ui-icon-video { background-position: -224px -128px; }
-.ui-icon-script { background-position: -240px -128px; }
-.ui-icon-alert { background-position: 0 -144px; }
-.ui-icon-info { background-position: -16px -144px; }
-.ui-icon-notice { background-position: -32px -144px; }
-.ui-icon-help { background-position: -48px -144px; }
-.ui-icon-check { background-position: -64px -144px; }
-.ui-icon-bullet { background-position: -80px -144px; }
-.ui-icon-radio-off { background-position: -96px -144px; }
-.ui-icon-radio-on { background-position: -112px -144px; }
-.ui-icon-pin-w { background-position: -128px -144px; }
-.ui-icon-pin-s { background-position: -144px -144px; }
-.ui-icon-play { background-position: 0 -160px; }
-.ui-icon-pause { background-position: -16px -160px; }
-.ui-icon-seek-next { background-position: -32px -160px; }
-.ui-icon-seek-prev { background-position: -48px -160px; }
-.ui-icon-seek-end { background-position: -64px -160px; }
-.ui-icon-seek-start { background-position: -80px -160px; }
-/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
-.ui-icon-seek-first { background-position: -80px -160px; }
-.ui-icon-stop { background-position: -96px -160px; }
-.ui-icon-eject { background-position: -112px -160px; }
-.ui-icon-volume-off { background-position: -128px -160px; }
-.ui-icon-volume-on { background-position: -144px -160px; }
-.ui-icon-power { background-position: 0 -176px; }
-.ui-icon-signal-diag { background-position: -16px -176px; }
-.ui-icon-signal { background-position: -32px -176px; }
-.ui-icon-battery-0 { background-position: -48px -176px; }
-.ui-icon-battery-1 { background-position: -64px -176px; }
-.ui-icon-battery-2 { background-position: -80px -176px; }
-.ui-icon-battery-3 { background-position: -96px -176px; }
-.ui-icon-circle-plus { background-position: 0 -192px; }
-.ui-icon-circle-minus { background-position: -16px -192px; }
-.ui-icon-circle-close { background-position: -32px -192px; }
-.ui-icon-circle-triangle-e { background-position: -48px -192px; }
-.ui-icon-circle-triangle-s { background-position: -64px -192px; }
-.ui-icon-circle-triangle-w { background-position: -80px -192px; }
-.ui-icon-circle-triangle-n { background-position: -96px -192px; }
-.ui-icon-circle-arrow-e { background-position: -112px -192px; }
-.ui-icon-circle-arrow-s { background-position: -128px -192px; }
-.ui-icon-circle-arrow-w { background-position: -144px -192px; }
-.ui-icon-circle-arrow-n { background-position: -160px -192px; }
-.ui-icon-circle-zoomin { background-position: -176px -192px; }
-.ui-icon-circle-zoomout { background-position: -192px -192px; }
-.ui-icon-circle-check { background-position: -208px -192px; }
-.ui-icon-circlesmall-plus { background-position: 0 -208px; }
-.ui-icon-circlesmall-minus { background-position: -16px -208px; }
-.ui-icon-circlesmall-close { background-position: -32px -208px; }
-.ui-icon-squaresmall-plus { background-position: -48px -208px; }
-.ui-icon-squaresmall-minus { background-position: -64px -208px; }
-.ui-icon-squaresmall-close { background-position: -80px -208px; }
-.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
-.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
-.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
-.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
-.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
-.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Corner radius */
-.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; -khtml-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; }
-.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; -khtml-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; }
-.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; -khtml-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; }
-.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; -khtml-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; }
-
-/* Overlays */
-.ui-widget-overlay { background: #aaaaaa/*{bgColorOverlay}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlOverlay}*/ 50%/*{bgOverlayXPos}*/ 50%/*{bgOverlayYPos}*/ repeat-x/*{bgOverlayRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityOverlay}*/; }
-.ui-widget-shadow { margin: -8px/*{offsetTopShadow}*/ 0 0 -8px/*{offsetLeftShadow}*/; padding: 8px/*{thicknessShadow}*/; background: #aaaaaa/*{bgColorShadow}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlShadow}*/ 50%/*{bgShadowXPos}*/ 50%/*{bgShadowYPos}*/ repeat-x/*{bgShadowRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityShadow}*/; -moz-border-radius: 8px/*{cornerRadiusShadow}*/; -khtml-border-radius: 8px/*{cornerRadiusShadow}*/; -webkit-border-radius: 8px/*{cornerRadiusShadow}*/; border-radius: 8px/*{cornerRadiusShadow}*/; }
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png b/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png
new file mode 100755 (executable)
index 0000000..67b1fdd
Binary files /dev/null and b/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png differ
diff --git a/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_flat_75_ffffff_40x100.png b/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_flat_75_ffffff_40x100.png
new file mode 100755 (executable)
index 0000000..efa0b15
Binary files /dev/null and b/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_flat_75_ffffff_40x100.png differ
diff --git a/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png b/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png
new file mode 100755 (executable)
index 0000000..6467bba
Binary files /dev/null and b/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png differ
diff --git a/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_65_ffffff_1x400.png b/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_65_ffffff_1x400.png
new file mode 100755 (executable)
index 0000000..ca988a3
Binary files /dev/null and b/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_65_ffffff_1x400.png differ
diff --git a/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_75_dadada_1x400.png b/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_75_dadada_1x400.png
new file mode 100755 (executable)
index 0000000..6e20803
Binary files /dev/null and b/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_75_dadada_1x400.png differ
diff --git a/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png b/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png
new file mode 100755 (executable)
index 0000000..9a11b43
Binary files /dev/null and b/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png differ
diff --git a/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png b/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png
new file mode 100755 (executable)
index 0000000..01048f8
Binary files /dev/null and b/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png differ
diff --git a/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png
new file mode 100755 (executable)
index 0000000..35976e8
Binary files /dev/null and b/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png differ
diff --git a/resources/lib/jquery.ui/themes/smoothness/images/ui-icons_222222_256x240.png b/resources/lib/jquery.ui/themes/smoothness/images/ui-icons_222222_256x240.png
new file mode 100755 (executable)
index 0000000..c1cb117
Binary files /dev/null and b/resources/lib/jquery.ui/themes/smoothness/images/ui-icons_222222_256x240.png differ
diff --git a/resources/lib/jquery.ui/themes/smoothness/images/ui-icons_2e83ff_256x240.png b/resources/lib/jquery.ui/themes/smoothness/images/ui-icons_2e83ff_256x240.png
new file mode 100755 (executable)
index 0000000..84b601b
Binary files /dev/null and b/resources/lib/jquery.ui/themes/smoothness/images/ui-icons_2e83ff_256x240.png differ
diff --git a/resources/lib/jquery.ui/themes/smoothness/images/ui-icons_454545_256x240.png b/resources/lib/jquery.ui/themes/smoothness/images/ui-icons_454545_256x240.png
new file mode 100755 (executable)
index 0000000..b6db1ac
Binary files /dev/null and b/resources/lib/jquery.ui/themes/smoothness/images/ui-icons_454545_256x240.png differ
diff --git a/resources/lib/jquery.ui/themes/smoothness/images/ui-icons_888888_256x240.png b/resources/lib/jquery.ui/themes/smoothness/images/ui-icons_888888_256x240.png
new file mode 100755 (executable)
index 0000000..feea0e2
Binary files /dev/null and b/resources/lib/jquery.ui/themes/smoothness/images/ui-icons_888888_256x240.png differ
diff --git a/resources/lib/jquery.ui/themes/smoothness/images/ui-icons_cd0a0a_256x240.png b/resources/lib/jquery.ui/themes/smoothness/images/ui-icons_cd0a0a_256x240.png
new file mode 100755 (executable)
index 0000000..ed5b6b0
Binary files /dev/null and b/resources/lib/jquery.ui/themes/smoothness/images/ui-icons_cd0a0a_256x240.png differ
diff --git a/resources/lib/jquery.ui/themes/smoothness/jquery.ui.accordion.css b/resources/lib/jquery.ui/themes/smoothness/jquery.ui.accordion.css
new file mode 100644 (file)
index 0000000..d429fd2
--- /dev/null
@@ -0,0 +1,16 @@
+/*!
+ * jQuery UI Accordion 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion#theming
+ */
+.ui-accordion .ui-accordion-header { display: block; cursor: pointer; position: relative; margin-top: 2px; padding: .5em .5em .5em .7em; zoom: 1; }
+.ui-accordion .ui-accordion-icons { padding-left: 2.2em; }
+.ui-accordion .ui-accordion-noicons { padding-left: .7em; }
+.ui-accordion .ui-accordion-icons .ui-accordion-icons { padding-left: 2.2em; }
+.ui-accordion .ui-accordion-header .ui-accordion-header-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
+.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; overflow: auto; zoom: 1; }
diff --git a/resources/lib/jquery.ui/themes/smoothness/jquery.ui.autocomplete.css b/resources/lib/jquery.ui/themes/smoothness/jquery.ui.autocomplete.css
new file mode 100644 (file)
index 0000000..4ef3497
--- /dev/null
@@ -0,0 +1,19 @@
+/*!
+ * jQuery UI Autocomplete 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete#theming
+ */
+.ui-autocomplete {
+       position: absolute;
+       top: 0;
+       left: 0;
+       cursor: default;
+}
+
+/* workarounds */
+* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
diff --git a/resources/lib/jquery.ui/themes/smoothness/jquery.ui.button.css b/resources/lib/jquery.ui/themes/smoothness/jquery.ui.button.css
new file mode 100644 (file)
index 0000000..44a7d9b
--- /dev/null
@@ -0,0 +1,40 @@
+/*!
+ * jQuery UI Button 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button#theming
+ */
+.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
+.ui-button, .ui-button:link, .ui-button:visited, .ui-button:hover, .ui-button:active { text-decoration: none; }
+.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
+button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
+.ui-button-icons-only { width: 3.4em; } 
+button.ui-button-icons-only { width: 3.7em; } 
+
+/*button text element */
+.ui-button .ui-button-text { display: block; line-height: 1.4;  }
+.ui-button-text-only .ui-button-text { padding: .4em 1em; }
+.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
+.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
+.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
+.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
+/* no icon support for input elements, provide padding by default */
+input.ui-button { padding: .4em 1em; }
+
+/*button icon element(s) */
+.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
+.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
+.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
+.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+
+/*button sets*/
+.ui-buttonset { margin-right: 7px; }
+.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
+
+/* workarounds */
+button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
diff --git a/resources/lib/jquery.ui/themes/smoothness/jquery.ui.core.css b/resources/lib/jquery.ui/themes/smoothness/jquery.ui.core.css
new file mode 100644 (file)
index 0000000..2e088ca
--- /dev/null
@@ -0,0 +1,39 @@
+/*!
+ * jQuery UI CSS Framework 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden { display: none; }
+.ui-helper-hidden-accessible { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; }
+.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
+.ui-helper-clearfix:before, .ui-helper-clearfix:after { content: ""; display: table; }
+.ui-helper-clearfix:after { clear: both; }
+.ui-helper-clearfix { zoom: 1; }
+.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled { cursor: default !important; }
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
diff --git a/resources/lib/jquery.ui/themes/smoothness/jquery.ui.datepicker.css b/resources/lib/jquery.ui/themes/smoothness/jquery.ui.datepicker.css
new file mode 100644 (file)
index 0000000..f56bb75
--- /dev/null
@@ -0,0 +1,67 @@
+/*!
+ * jQuery UI Datepicker 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker#theming
+ */
+.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
+.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
+.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
+.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
+.ui-datepicker .ui-datepicker-prev { left:2px; }
+.ui-datepicker .ui-datepicker-next { right:2px; }
+.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
+.ui-datepicker .ui-datepicker-next-hover { right:1px; }
+.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
+.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
+.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
+.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
+.ui-datepicker select.ui-datepicker-month, 
+.ui-datepicker select.ui-datepicker-year { width: 49%;}
+.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
+.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
+.ui-datepicker td { border: 0; padding: 1px; }
+.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
+.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
+.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi { width:auto; }
+.ui-datepicker-multi .ui-datepicker-group { float:left; }
+.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
+.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
+.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
+.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
+.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; }
+
+/* RTL support */
+.ui-datepicker-rtl { direction: rtl; }
+.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+
+/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
+.ui-datepicker-cover {
+    position: absolute; /*must have*/
+    z-index: -1; /*must have*/
+    filter: mask(); /*must have*/
+    top: -4px; /*must have*/
+    left: -4px; /*must have*/
+    width: 200px; /*must have*/
+    height: 200px; /*must have*/
+}
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/themes/smoothness/jquery.ui.dialog.css b/resources/lib/jquery.ui/themes/smoothness/jquery.ui.dialog.css
new file mode 100644 (file)
index 0000000..1313a5e
--- /dev/null
@@ -0,0 +1,22 @@
+/*!
+ * jQuery UI Dialog 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog#theming
+ */
+.ui-dialog { position: absolute; top: 0; left: 0; padding: .2em; width: 300px; overflow: hidden; }
+.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative;  }
+.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; }
+.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
+.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
+.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
+.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
+.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
+.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
+.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
+.ui-draggable .ui-dialog-titlebar { cursor: move; }
diff --git a/resources/lib/jquery.ui/themes/smoothness/jquery.ui.menu.css b/resources/lib/jquery.ui/themes/smoothness/jquery.ui.menu.css
new file mode 100644 (file)
index 0000000..83fd84e
--- /dev/null
@@ -0,0 +1,30 @@
+/*!
+ * jQuery UI Menu 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Menu#theming
+ */
+.ui-menu { list-style:none; padding: 2px; margin: 0; display:block; outline: none; }
+.ui-menu .ui-menu { margin-top: -3px; position: absolute; }
+.ui-menu .ui-menu-item { margin: 0; padding: 0; zoom: 1; width: 100%; }
+.ui-menu .ui-menu-divider { margin: 5px -2px 5px -2px; height: 0; font-size: 0; line-height: 0; border-width: 1px 0 0 0; }
+.ui-menu .ui-menu-item a { text-decoration: none; display: block; padding: 2px .4em; line-height: 1.5; zoom: 1; font-weight: normal; }
+.ui-menu .ui-menu-item a.ui-state-focus,
+.ui-menu .ui-menu-item a.ui-state-active { font-weight: normal; margin: -1px; }
+
+.ui-menu .ui-state-disabled { font-weight: normal; margin: .4em 0 .2em; line-height: 1.5; }
+.ui-menu .ui-state-disabled a { cursor: default; }
+
+/* icon support */
+.ui-menu-icons { position: relative; }
+.ui-menu-icons .ui-menu-item a { position: relative; padding-left: 2em; }
+
+/* left-aligned */
+.ui-menu .ui-icon { position: absolute; top: .2em; left: .2em; }
+
+/* right-aligned */
+.ui-menu .ui-menu-icon { position: static; float: right; }
diff --git a/resources/lib/jquery.ui/themes/smoothness/jquery.ui.progressbar.css b/resources/lib/jquery.ui/themes/smoothness/jquery.ui.progressbar.css
new file mode 100644 (file)
index 0000000..bd7e403
--- /dev/null
@@ -0,0 +1,12 @@
+/*!
+ * jQuery UI Progressbar 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar#theming
+ */
+.ui-progressbar { height:2em; text-align: left; overflow: hidden; }
+.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/themes/smoothness/jquery.ui.resizable.css b/resources/lib/jquery.ui/themes/smoothness/jquery.ui.resizable.css
new file mode 100644 (file)
index 0000000..2f87843
--- /dev/null
@@ -0,0 +1,21 @@
+/*!
+ * jQuery UI Resizable 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizable#theming
+ */
+.ui-resizable { position: relative;}
+.ui-resizable-handle { position: absolute;font-size: 0.1px; display: block; }
+.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
+.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
+.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
+.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
+.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
+.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
+.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/themes/smoothness/jquery.ui.selectable.css b/resources/lib/jquery.ui/themes/smoothness/jquery.ui.selectable.css
new file mode 100644 (file)
index 0000000..5854c41
--- /dev/null
@@ -0,0 +1,11 @@
+/*!
+ * jQuery UI Selectable 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectable#theming
+ */
+.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
diff --git a/resources/lib/jquery.ui/themes/smoothness/jquery.ui.slider.css b/resources/lib/jquery.ui/themes/smoothness/jquery.ui.slider.css
new file mode 100644 (file)
index 0000000..e579478
--- /dev/null
@@ -0,0 +1,25 @@
+/*!
+ * jQuery UI Slider 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider#theming
+ */
+.ui-slider { position: relative; text-align: left; }
+.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
+.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
+
+.ui-slider-horizontal { height: .8em; }
+.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
+.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
+.ui-slider-horizontal .ui-slider-range-min { left: 0; }
+.ui-slider-horizontal .ui-slider-range-max { right: 0; }
+
+.ui-slider-vertical { width: .8em; height: 100px; }
+.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
+.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
+.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
+.ui-slider-vertical .ui-slider-range-max { top: 0; }
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/themes/smoothness/jquery.ui.spinner.css b/resources/lib/jquery.ui/themes/smoothness/jquery.ui.spinner.css
new file mode 100644 (file)
index 0000000..e89b720
--- /dev/null
@@ -0,0 +1,23 @@
+/*!
+ * jQuery UI Spinner 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Spinner#theming
+ */
+.ui-spinner { position:relative; display: inline-block; overflow: hidden; padding: 0; vertical-align: middle; }
+.ui-spinner-input { border: none; background: none; padding: 0; margin: .2em 0; vertical-align: middle; margin-left: .4em; margin-right: 22px; }
+.ui-spinner-button { width: 16px; height: 50%; font-size: .5em; padding: 0; margin: 0; text-align: center; position: absolute; cursor: default; display: block; overflow: hidden; right: 0; }
+.ui-spinner a.ui-spinner-button { border-top: none; border-bottom: none; border-right: none; } /* more specificity required here to overide default borders */
+.ui-spinner .ui-icon { position: absolute; margin-top: -8px; top: 50%; left: 0; } /* vertical centre icon */
+.ui-spinner-up { top: 0; }
+.ui-spinner-down { bottom: 0; }
+
+/* TR overrides */
+.ui-spinner .ui-icon-triangle-1-s {
+       /* need to fix icons sprite */
+       background-position:-65px -16px;
+}
diff --git a/resources/lib/jquery.ui/themes/smoothness/jquery.ui.tabs.css b/resources/lib/jquery.ui/themes/smoothness/jquery.ui.tabs.css
new file mode 100644 (file)
index 0000000..11a000f
--- /dev/null
@@ -0,0 +1,18 @@
+/*!
+ * jQuery UI Tabs 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs#theming
+ */
+.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
+.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 0; margin: 1px .2em 0 0; border-bottom: 0; padding: 0; white-space: nowrap; }
+.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-active { margin-bottom: -1px; padding-bottom: 1px; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-active a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-tabs-loading a { cursor: text; }
+.ui-tabs .ui-tabs-nav li a, .ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
+.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
diff --git a/resources/lib/jquery.ui/themes/smoothness/jquery.ui.theme.css b/resources/lib/jquery.ui/themes/smoothness/jquery.ui.theme.css
new file mode 100644 (file)
index 0000000..d170081
--- /dev/null
@@ -0,0 +1,248 @@
+/*!
+ * jQuery UI CSS Framework 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ *
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
+ */
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; }
+.ui-widget .ui-widget { font-size: 1em; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; }
+.ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url("images/ui-bg_flat_75_ffffff_40x100.png") 50% 50% repeat-x; color: #222222; }
+.ui-widget-content a { color: #222222; }
+.ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x; color: #222222; font-weight: bold; }
+.ui-widget-header a { color: #222222; }
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x; font-weight: normal; color: #555555; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; }
+.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x; font-weight: normal; color: #212121; }
+.ui-state-hover a, .ui-state-hover a:hover, .ui-state-hover a:link, .ui-state-hover a:visited { color: #212121; text-decoration: none; }
+.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x; font-weight: normal; color: #212121; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; }
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #fcefa1; background: #fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x; color: #363636; }
+.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
+.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x; color: #cd0a0a; }
+.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; }
+.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
+.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
+.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
+.ui-state-disabled .ui-icon { filter:Alpha(Opacity=35); } /* For IE8 - See #6059 */
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { width: 16px; height: 16px; background-image: url("images/ui-icons_222222_256x240.png"); }
+.ui-widget-content .ui-icon {background-image: url("images/ui-icons_222222_256x240.png"); }
+.ui-widget-header .ui-icon {background-image: url("images/ui-icons_222222_256x240.png"); }
+.ui-state-default .ui-icon { background-image: url("images/ui-icons_888888_256x240.png"); }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url("images/ui-icons_454545_256x240.png"); }
+.ui-state-active .ui-icon {background-image: url("images/ui-icons_454545_256x240.png"); }
+.ui-state-highlight .ui-icon {background-image: url("images/ui-icons_2e83ff_256x240.png"); }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url("images/ui-icons_cd0a0a_256x240.png"); }
+
+/* positioning */
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-on { background-position: -96px -144px; }
+.ui-icon-radio-off { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px; border-top-left-radius: 4px; }
+.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px; border-top-right-radius: 4px; }
+.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
+.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+
+/* Overlays */
+.ui-widget-overlay { background: #aaaaaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x; opacity: .3;filter:Alpha(Opacity=30); }
+.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x; opacity: .3;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -khtml-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/themes/smoothness/jquery.ui.tooltip.css b/resources/lib/jquery.ui/themes/smoothness/jquery.ui.tooltip.css
new file mode 100644 (file)
index 0000000..88b0d02
--- /dev/null
@@ -0,0 +1,21 @@
+/*!
+ * jQuery UI Tooltip 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+.ui-tooltip {
+       padding: 8px;
+       position: absolute;
+       z-index: 9999;
+       max-width: 300px;
+       -webkit-box-shadow: 0 0 5px #aaa;
+       box-shadow: 0 0 5px #aaa;
+}
+/* Fades and background-images don't work well together in IE6, drop the image */
+* html .ui-tooltip {
+       background-image: none;
+}
+body .ui-tooltip { border-width: 2px; }
diff --git a/resources/lib/jquery/jquery.cycle.all.js b/resources/lib/jquery/jquery.cycle.all.js
deleted file mode 100644 (file)
index d57fb72..0000000
+++ /dev/null
@@ -1,1529 +0,0 @@
-/*!
- * jQuery Cycle Plugin (with Transition Definitions)
- * Examples and documentation at: http://jquery.malsup.com/cycle/
- * Copyright (c) 2007-2010 M. Alsup
- * Version: 2.9999 (13-NOV-2011)
- * Dual licensed under the MIT and GPL licenses.
- * http://jquery.malsup.com/license.html
- * Requires: jQuery v1.3.2 or later
- */
-;(function($, undefined) {
-
-var ver = '2.9999';
-
-// if $.support is not defined (pre jQuery 1.3) add what I need
-if ($.support == undefined) {
-       $.support = {
-               opacity: !($.browser.msie)
-       };
-}
-
-function debug(s) {
-       $.fn.cycle.debug && log(s);
-}              
-function log() {
-       window.console && console.log && console.log('[cycle] ' + Array.prototype.join.call(arguments,' '));
-}
-$.expr[':'].paused = function(el) {
-       return el.cyclePause;
-}
-
-
-// the options arg can be...
-//   a number  - indicates an immediate transition should occur to the given slide index
-//   a string  - 'pause', 'resume', 'toggle', 'next', 'prev', 'stop', 'destroy' or the name of a transition effect (ie, 'fade', 'zoom', etc)
-//   an object - properties to control the slideshow
-//
-// the arg2 arg can be...
-//   the name of an fx (only used in conjunction with a numeric value for 'options')
-//   the value true (only used in first arg == 'resume') and indicates
-//      that the resume should occur immediately (not wait for next timeout)
-
-$.fn.cycle = function(options, arg2) {
-       var o = { s: this.selector, c: this.context };
-
-       // in 1.3+ we can fix mistakes with the ready state
-       if (this.length === 0 && options != 'stop') {
-               if (!$.isReady && o.s) {
-                       log('DOM not ready, queuing slideshow');
-                       $(function() {
-                               $(o.s,o.c).cycle(options,arg2);
-                       });
-                       return this;
-               }
-               // is your DOM ready?  http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
-               log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
-               return this;
-       }
-
-       // iterate the matched nodeset
-       return this.each(function() {
-               var opts = handleArguments(this, options, arg2);
-               if (opts === false)
-                       return;
-
-               opts.updateActivePagerLink = opts.updateActivePagerLink || $.fn.cycle.updateActivePagerLink;
-               
-               // stop existing slideshow for this container (if there is one)
-               if (this.cycleTimeout)
-                       clearTimeout(this.cycleTimeout);
-               this.cycleTimeout = this.cyclePause = 0;
-
-               var $cont = $(this);
-               var $slides = opts.slideExpr ? $(opts.slideExpr, this) : $cont.children();
-               var els = $slides.get();
-
-               var opts2 = buildOptions($cont, $slides, els, opts, o);
-               if (opts2 === false)
-                       return;
-
-               if (els.length < 2) {
-                       log('terminating; too few slides: ' + els.length);
-                       return;
-               }
-
-               var startTime = opts2.continuous ? 10 : getTimeout(els[opts2.currSlide], els[opts2.nextSlide], opts2, !opts2.backwards);
-
-               // if it's an auto slideshow, kick it off
-               if (startTime) {
-                       startTime += (opts2.delay || 0);
-                       if (startTime < 10)
-                               startTime = 10;
-                       debug('first timeout: ' + startTime);
-                       this.cycleTimeout = setTimeout(function(){go(els,opts2,0,!opts.backwards)}, startTime);
-               }
-       });
-};
-
-function triggerPause(cont, byHover, onPager) {
-       var opts = $(cont).data('cycle.opts');
-       var paused = !!cont.cyclePause;
-       if (paused && opts.paused)
-               opts.paused(cont, opts, byHover, onPager);
-       else if (!paused && opts.resumed)
-               opts.resumed(cont, opts, byHover, onPager);
-}
-
-// process the args that were passed to the plugin fn
-function handleArguments(cont, options, arg2) {
-       if (cont.cycleStop == undefined)
-               cont.cycleStop = 0;
-       if (options === undefined || options === null)
-               options = {};
-       if (options.constructor == String) {
-               switch(options) {
-               case 'destroy':
-               case 'stop':
-                       var opts = $(cont).data('cycle.opts');
-                       if (!opts)
-                               return false;
-                       cont.cycleStop++; // callbacks look for change
-                       if (cont.cycleTimeout)
-                               clearTimeout(cont.cycleTimeout);
-                       cont.cycleTimeout = 0;
-                       opts.elements && $(opts.elements).stop();
-                       $(cont).removeData('cycle.opts');
-                       if (options == 'destroy')
-                               destroy(opts);
-                       return false;
-               case 'toggle':
-                       cont.cyclePause = (cont.cyclePause === 1) ? 0 : 1;
-                       checkInstantResume(cont.cyclePause, arg2, cont);
-                       triggerPause(cont);
-                       return false;
-               case 'pause':
-                       cont.cyclePause = 1;
-                       triggerPause(cont);
-                       return false;
-               case 'resume':
-                       cont.cyclePause = 0;
-                       checkInstantResume(false, arg2, cont);
-                       triggerPause(cont);
-                       return false;
-               case 'prev':
-               case 'next':
-                       var opts = $(cont).data('cycle.opts');
-                       if (!opts) {
-                               log('options not found, "prev/next" ignored');
-                               return false;
-                       }
-                       $.fn.cycle[options](opts);
-                       return false;
-               default:
-                       options = { fx: options };
-               };
-               return options;
-       }
-       else if (options.constructor == Number) {
-               // go to the requested slide
-               var num = options;
-               options = $(cont).data('cycle.opts');
-               if (!options) {
-                       log('options not found, can not advance slide');
-                       return false;
-               }
-               if (num < 0 || num >= options.elements.length) {
-                       log('invalid slide index: ' + num);
-                       return false;
-               }
-               options.nextSlide = num;
-               if (cont.cycleTimeout) {
-                       clearTimeout(cont.cycleTimeout);
-                       cont.cycleTimeout = 0;
-               }
-               if (typeof arg2 == 'string')
-                       options.oneTimeFx = arg2;
-               go(options.elements, options, 1, num >= options.currSlide);
-               return false;
-       }
-       return options;
-       
-       function checkInstantResume(isPaused, arg2, cont) {
-               if (!isPaused && arg2 === true) { // resume now!
-                       var options = $(cont).data('cycle.opts');
-                       if (!options) {
-                               log('options not found, can not resume');
-                               return false;
-                       }
-                       if (cont.cycleTimeout) {
-                               clearTimeout(cont.cycleTimeout);
-                               cont.cycleTimeout = 0;
-                       }
-                       go(options.elements, options, 1, !options.backwards);
-               }
-       }
-};
-
-function removeFilter(el, opts) {
-       if (!$.support.opacity && opts.cleartype && el.style.filter) {
-               try { el.style.removeAttribute('filter'); }
-               catch(smother) {} // handle old opera versions
-       }
-};
-
-// unbind event handlers
-function destroy(opts) {
-       if (opts.next)
-               $(opts.next).unbind(opts.prevNextEvent);
-       if (opts.prev)
-               $(opts.prev).unbind(opts.prevNextEvent);
-       
-       if (opts.pager || opts.pagerAnchorBuilder)
-               $.each(opts.pagerAnchors || [], function() {
-                       this.unbind().remove();
-               });
-       opts.pagerAnchors = null;
-       if (opts.destroy) // callback
-               opts.destroy(opts);
-};
-
-// one-time initialization
-function buildOptions($cont, $slides, els, options, o) {
-       var startingSlideSpecified;
-       // support metadata plugin (v1.0 and v2.0)
-       var opts = $.extend({}, $.fn.cycle.defaults, options || {}, $.metadata ? $cont.metadata() : $.meta ? $cont.data() : {});
-       var meta = $.isFunction($cont.data) ? $cont.data(opts.metaAttr) : null;
-       if (meta)
-               opts = $.extend(opts, meta);
-       if (opts.autostop)
-               opts.countdown = opts.autostopCount || els.length;
-
-       var cont = $cont[0];
-       $cont.data('cycle.opts', opts);
-       opts.$cont = $cont;
-       opts.stopCount = cont.cycleStop;
-       opts.elements = els;
-       opts.before = opts.before ? [opts.before] : [];
-       opts.after = opts.after ? [opts.after] : [];
-
-       // push some after callbacks
-       if (!$.support.opacity && opts.cleartype)
-               opts.after.push(function() { removeFilter(this, opts); });
-       if (opts.continuous)
-               opts.after.push(function() { go(els,opts,0,!opts.backwards); });
-
-       saveOriginalOpts(opts);
-
-       // clearType corrections
-       if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg)
-               clearTypeFix($slides);
-
-       // container requires non-static position so that slides can be position within
-       if ($cont.css('position') == 'static')
-               $cont.css('position', 'relative');
-       if (opts.width)
-               $cont.width(opts.width);
-       if (opts.height && opts.height != 'auto')
-               $cont.height(opts.height);
-
-       if (opts.startingSlide != undefined) {
-               opts.startingSlide = parseInt(opts.startingSlide,10);
-               if (opts.startingSlide >= els.length || opts.startSlide < 0)
-                       opts.startingSlide = 0; // catch bogus input
-               else 
-                       startingSlideSpecified = true;
-       }
-       else if (opts.backwards)
-               opts.startingSlide = els.length - 1;
-       else
-               opts.startingSlide = 0;
-
-       // if random, mix up the slide array
-       if (opts.random) {
-               opts.randomMap = [];
-               for (var i = 0; i < els.length; i++)
-                       opts.randomMap.push(i);
-               opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;});
-               if (startingSlideSpecified) {
-                       // try to find the specified starting slide and if found set start slide index in the map accordingly
-                       for ( var cnt = 0; cnt < els.length; cnt++ ) {
-                               if ( opts.startingSlide == opts.randomMap[cnt] ) {
-                                       opts.randomIndex = cnt;
-                               }
-                       }
-               }
-               else {
-                       opts.randomIndex = 1;
-                       opts.startingSlide = opts.randomMap[1];
-               }
-       }
-       else if (opts.startingSlide >= els.length)
-               opts.startingSlide = 0; // catch bogus input
-       opts.currSlide = opts.startingSlide || 0;
-       var first = opts.startingSlide;
-
-       // set position and zIndex on all the slides
-       $slides.css({position: 'absolute', top:0, left:0}).hide().each(function(i) {
-               var z;
-               if (opts.backwards)
-                       z = first ? i <= first ? els.length + (i-first) : first-i : els.length-i;
-               else
-                       z = first ? i >= first ? els.length - (i-first) : first-i : els.length-i;
-               $(this).css('z-index', z)
-       });
-
-       // make sure first slide is visible
-       $(els[first]).css('opacity',1).show(); // opacity bit needed to handle restart use case
-       removeFilter(els[first], opts);
-
-       // stretch slides
-       if (opts.fit) {
-               if (!opts.aspect) {
-               if (opts.width)
-                   $slides.width(opts.width);
-               if (opts.height && opts.height != 'auto')
-                   $slides.height(opts.height);
-               } else {
-                       $slides.each(function(){
-                               var $slide = $(this);
-                               var ratio = (opts.aspect === true) ? $slide.width()/$slide.height() : opts.aspect;
-                               if( opts.width && $slide.width() != opts.width ) {
-                                       $slide.width( opts.width );
-                                       $slide.height( opts.width / ratio );
-                               }
-
-                               if( opts.height && $slide.height() < opts.height ) {
-                                       $slide.height( opts.height );
-                                       $slide.width( opts.height * ratio );
-                               }
-                       });
-               }
-       }
-
-       if (opts.center && ((!opts.fit) || opts.aspect)) {
-               $slides.each(function(){
-                       var $slide = $(this);
-                       $slide.css({
-                               "margin-left": opts.width ?
-                                       ((opts.width - $slide.width()) / 2) + "px" :
-                                       0,
-                               "margin-top": opts.height ?
-                                       ((opts.height - $slide.height()) / 2) + "px" :
-                                       0
-                       });
-               });
-       }
-
-       if (opts.center && !opts.fit && !opts.slideResize) {
-               $slides.each(function(){
-               var $slide = $(this);
-               $slide.css({
-                       "margin-left": opts.width ? ((opts.width - $slide.width()) / 2) + "px" : 0,
-                       "margin-top": opts.height ? ((opts.height - $slide.height()) / 2) + "px" : 0
-               });
-               });
-       }
-               
-       // stretch container
-       var reshape = opts.containerResize && !$cont.innerHeight();
-       if (reshape) { // do this only if container has no size http://tinyurl.com/da2oa9
-               var maxw = 0, maxh = 0;
-               for(var j=0; j < els.length; j++) {
-                       var $e = $(els[j]), e = $e[0], w = $e.outerWidth(), h = $e.outerHeight();
-                       if (!w) w = e.offsetWidth || e.width || $e.attr('width');
-                       if (!h) h = e.offsetHeight || e.height || $e.attr('height');
-                       maxw = w > maxw ? w : maxw;
-                       maxh = h > maxh ? h : maxh;
-               }
-               if (maxw > 0 && maxh > 0)
-                       $cont.css({width:maxw+'px',height:maxh+'px'});
-       }
-
-       var pauseFlag = false;  // https://github.com/malsup/cycle/issues/44
-       if (opts.pause)
-               $cont.hover(
-                       function(){
-                               pauseFlag = true;
-                               this.cyclePause++;
-                               triggerPause(cont, true);
-                       },
-                       function(){
-                               pauseFlag && this.cyclePause--;
-                               triggerPause(cont, true);
-                       }
-               );
-
-       if (supportMultiTransitions(opts) === false)
-               return false;
-
-       // apparently a lot of people use image slideshows without height/width attributes on the images.
-       // Cycle 2.50+ requires the sizing info for every slide; this block tries to deal with that.
-       var requeue = false;
-       options.requeueAttempts = options.requeueAttempts || 0;
-       $slides.each(function() {
-               // try to get height/width of each slide
-               var $el = $(this);
-               this.cycleH = (opts.fit && opts.height) ? opts.height : ($el.height() || this.offsetHeight || this.height || $el.attr('height') || 0);
-               this.cycleW = (opts.fit && opts.width) ? opts.width : ($el.width() || this.offsetWidth || this.width || $el.attr('width') || 0);
-
-               if ( $el.is('img') ) {
-                       // sigh..  sniffing, hacking, shrugging...  this crappy hack tries to account for what browsers do when
-                       // an image is being downloaded and the markup did not include sizing info (height/width attributes);
-                       // there seems to be some "default" sizes used in this situation
-                       var loadingIE   = ($.browser.msie  && this.cycleW == 28 && this.cycleH == 30 && !this.complete);
-                       var loadingFF   = ($.browser.mozilla && this.cycleW == 34 && this.cycleH == 19 && !this.complete);
-                       var loadingOp   = ($.browser.opera && ((this.cycleW == 42 && this.cycleH == 19) || (this.cycleW == 37 && this.cycleH == 17)) && !this.complete);
-                       var loadingOther = (this.cycleH == 0 && this.cycleW == 0 && !this.complete);
-                       // don't requeue for images that are still loading but have a valid size
-                       if (loadingIE || loadingFF || loadingOp || loadingOther) {
-                               if (o.s && opts.requeueOnImageNotLoaded && ++options.requeueAttempts < 100) { // track retry count so we don't loop forever
-                                       log(options.requeueAttempts,' - img slide not loaded, requeuing slideshow: ', this.src, this.cycleW, this.cycleH);
-                                       setTimeout(function() {$(o.s,o.c).cycle(options)}, opts.requeueTimeout);
-                                       requeue = true;
-                                       return false; // break each loop
-                               }
-                               else {
-                                       log('could not determine size of image: '+this.src, this.cycleW, this.cycleH);
-                               }
-                       }
-               }
-               return true;
-       });
-
-       if (requeue)
-               return false;
-
-       opts.cssBefore = opts.cssBefore || {};
-       opts.cssAfter = opts.cssAfter || {};
-       opts.cssFirst = opts.cssFirst || {};
-       opts.animIn = opts.animIn || {};
-       opts.animOut = opts.animOut || {};
-
-       $slides.not(':eq('+first+')').css(opts.cssBefore);
-       $($slides[first]).css(opts.cssFirst);
-
-       if (opts.timeout) {
-               opts.timeout = parseInt(opts.timeout,10);
-               // ensure that timeout and speed settings are sane
-               if (opts.speed.constructor == String)
-                       opts.speed = $.fx.speeds[opts.speed] || parseInt(opts.speed,10);
-               if (!opts.sync)
-                       opts.speed = opts.speed / 2;
-               
-               var buffer = opts.fx == 'none' ? 0 : opts.fx == 'shuffle' ? 500 : 250;
-               while((opts.timeout - opts.speed) < buffer) // sanitize timeout
-                       opts.timeout += opts.speed;
-       }
-       if (opts.easing)
-               opts.easeIn = opts.easeOut = opts.easing;
-       if (!opts.speedIn)
-               opts.speedIn = opts.speed;
-       if (!opts.speedOut)
-               opts.speedOut = opts.speed;
-
-       opts.slideCount = els.length;
-       opts.currSlide = opts.lastSlide = first;
-       if (opts.random) {
-               if (++opts.randomIndex == els.length)
-                       opts.randomIndex = 0;
-               opts.nextSlide = opts.randomMap[opts.randomIndex];
-       }
-       else if (opts.backwards)
-               opts.nextSlide = opts.startingSlide == 0 ? (els.length-1) : opts.startingSlide-1;
-       else
-               opts.nextSlide = opts.startingSlide >= (els.length-1) ? 0 : opts.startingSlide+1;
-
-       // run transition init fn
-       if (!opts.multiFx) {
-               var init = $.fn.cycle.transitions[opts.fx];
-               if ($.isFunction(init))
-                       init($cont, $slides, opts);
-               else if (opts.fx != 'custom' && !opts.multiFx) {
-                       log('unknown transition: ' + opts.fx,'; slideshow terminating');
-                       return false;
-               }
-       }
-
-       // fire artificial events
-       var e0 = $slides[first];
-       if (!opts.skipInitializationCallbacks) {
-               if (opts.before.length)
-                       opts.before[0].apply(e0, [e0, e0, opts, true]);
-               if (opts.after.length)
-                       opts.after[0].apply(e0, [e0, e0, opts, true]);
-       }
-       if (opts.next)
-               $(opts.next).bind(opts.prevNextEvent,function(){return advance(opts,1)});
-       if (opts.prev)
-               $(opts.prev).bind(opts.prevNextEvent,function(){return advance(opts,0)});
-       if (opts.pager || opts.pagerAnchorBuilder)
-               buildPager(els,opts);
-
-       exposeAddSlide(opts, els);
-
-       return opts;
-};
-
-// save off original opts so we can restore after clearing state
-function saveOriginalOpts(opts) {
-       opts.original = { before: [], after: [] };
-       opts.original.cssBefore = $.extend({}, opts.cssBefore);
-       opts.original.cssAfter  = $.extend({}, opts.cssAfter);
-       opts.original.animIn    = $.extend({}, opts.animIn);
-       opts.original.animOut   = $.extend({}, opts.animOut);
-       $.each(opts.before, function() { opts.original.before.push(this); });
-       $.each(opts.after,  function() { opts.original.after.push(this); });
-};
-
-function supportMultiTransitions(opts) {
-       var i, tx, txs = $.fn.cycle.transitions;
-       // look for multiple effects
-       if (opts.fx.indexOf(',') > 0) {
-               opts.multiFx = true;
-               opts.fxs = opts.fx.replace(/\s*/g,'').split(',');
-               // discard any bogus effect names
-               for (i=0; i < opts.fxs.length; i++) {
-                       var fx = opts.fxs[i];
-                       tx = txs[fx];
-                       if (!tx || !txs.hasOwnProperty(fx) || !$.isFunction(tx)) {
-                               log('discarding unknown transition: ',fx);
-                               opts.fxs.splice(i,1);
-                               i--;
-                       }
-               }
-               // if we have an empty list then we threw everything away!
-               if (!opts.fxs.length) {
-                       log('No valid transitions named; slideshow terminating.');
-                       return false;
-               }
-       }
-       else if (opts.fx == 'all') {  // auto-gen the list of transitions
-               opts.multiFx = true;
-               opts.fxs = [];
-               for (p in txs) {
-                       tx = txs[p];
-                       if (txs.hasOwnProperty(p) && $.isFunction(tx))
-                               opts.fxs.push(p);
-               }
-       }
-       if (opts.multiFx && opts.randomizeEffects) {
-               // munge the fxs array to make effect selection random
-               var r1 = Math.floor(Math.random() * 20) + 30;
-               for (i = 0; i < r1; i++) {
-                       var r2 = Math.floor(Math.random() * opts.fxs.length);
-                       opts.fxs.push(opts.fxs.splice(r2,1)[0]);
-               }
-               debug('randomized fx sequence: ',opts.fxs);
-       }
-       return true;
-};
-
-// provide a mechanism for adding slides after the slideshow has started
-function exposeAddSlide(opts, els) {
-       opts.addSlide = function(newSlide, prepend) {
-               var $s = $(newSlide), s = $s[0];
-               if (!opts.autostopCount)
-                       opts.countdown++;
-               els[prepend?'unshift':'push'](s);
-               if (opts.els)
-                       opts.els[prepend?'unshift':'push'](s); // shuffle needs this
-               opts.slideCount = els.length;
-
-               // add the slide to the random map and resort
-               if (opts.random) {
-                       opts.randomMap.push(opts.slideCount-1);
-                       opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;});
-               }
-
-               $s.css('position','absolute');
-               $s[prepend?'prependTo':'appendTo'](opts.$cont);
-
-               if (prepend) {
-                       opts.currSlide++;
-                       opts.nextSlide++;
-               }
-
-               if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg)
-                       clearTypeFix($s);
-
-               if (opts.fit && opts.width)
-                       $s.width(opts.width);
-               if (opts.fit && opts.height && opts.height != 'auto')
-                       $s.height(opts.height);
-               s.cycleH = (opts.fit && opts.height) ? opts.height : $s.height();
-               s.cycleW = (opts.fit && opts.width) ? opts.width : $s.width();
-
-               $s.css(opts.cssBefore);
-
-               if (opts.pager || opts.pagerAnchorBuilder)
-                       $.fn.cycle.createPagerAnchor(els.length-1, s, $(opts.pager), els, opts);
-
-               if ($.isFunction(opts.onAddSlide))
-                       opts.onAddSlide($s);
-               else
-                       $s.hide(); // default behavior
-       };
-}
-
-// reset internal state; we do this on every pass in order to support multiple effects
-$.fn.cycle.resetState = function(opts, fx) {
-       fx = fx || opts.fx;
-       opts.before = []; opts.after = [];
-       opts.cssBefore = $.extend({}, opts.original.cssBefore);
-       opts.cssAfter  = $.extend({}, opts.original.cssAfter);
-       opts.animIn     = $.extend({}, opts.original.animIn);
-       opts.animOut   = $.extend({}, opts.original.animOut);
-       opts.fxFn = null;
-       $.each(opts.original.before, function() { opts.before.push(this); });
-       $.each(opts.original.after,  function() { opts.after.push(this); });
-
-       // re-init
-       var init = $.fn.cycle.transitions[fx];
-       if ($.isFunction(init))
-               init(opts.$cont, $(opts.elements), opts);
-};
-
-// this is the main engine fn, it handles the timeouts, callbacks and slide index mgmt
-function go(els, opts, manual, fwd) {
-       // opts.busy is true if we're in the middle of an animation
-       if (manual && opts.busy && opts.manualTrump) {
-               // let manual transitions requests trump active ones
-               debug('manualTrump in go(), stopping active transition');
-               $(els).stop(true,true);
-               opts.busy = 0;
-       }
-       // don't begin another timeout-based transition if there is one active
-       if (opts.busy) {
-               debug('transition active, ignoring new tx request');
-               return;
-       }
-
-       var p = opts.$cont[0], curr = els[opts.currSlide], next = els[opts.nextSlide];
-
-       // stop cycling if we have an outstanding stop request
-       if (p.cycleStop != opts.stopCount || p.cycleTimeout === 0 && !manual)
-               return;
-
-       // check to see if we should stop cycling based on autostop options
-       if (!manual && !p.cyclePause && !opts.bounce &&
-               ((opts.autostop && (--opts.countdown <= 0)) ||
-               (opts.nowrap && !opts.random && opts.nextSlide < opts.currSlide))) {
-               if (opts.end)
-                       opts.end(opts);
-               return;
-       }
-
-       // if slideshow is paused, only transition on a manual trigger
-       var changed = false;
-       if ((manual || !p.cyclePause) && (opts.nextSlide != opts.currSlide)) {
-               changed = true;
-               var fx = opts.fx;
-               // keep trying to get the slide size if we don't have it yet
-               curr.cycleH = curr.cycleH || $(curr).height();
-               curr.cycleW = curr.cycleW || $(curr).width();
-               next.cycleH = next.cycleH || $(next).height();
-               next.cycleW = next.cycleW || $(next).width();
-
-               // support multiple transition types
-               if (opts.multiFx) {
-                       if (fwd && (opts.lastFx == undefined || ++opts.lastFx >= opts.fxs.length))
-                               opts.lastFx = 0;
-                       else if (!fwd && (opts.lastFx == undefined || --opts.lastFx < 0))
-                               opts.lastFx = opts.fxs.length - 1;
-                       fx = opts.fxs[opts.lastFx];
-               }
-
-               // one-time fx overrides apply to:  $('div').cycle(3,'zoom');
-               if (opts.oneTimeFx) {
-                       fx = opts.oneTimeFx;
-                       opts.oneTimeFx = null;
-               }
-
-               $.fn.cycle.resetState(opts, fx);
-
-               // run the before callbacks
-               if (opts.before.length)
-                       $.each(opts.before, function(i,o) {
-                               if (p.cycleStop != opts.stopCount) return;
-                               o.apply(next, [curr, next, opts, fwd]);
-                       });
-
-               // stage the after callacks
-               var after = function() {
-                       opts.busy = 0;
-                       $.each(opts.after, function(i,o) {
-                               if (p.cycleStop != opts.stopCount) return;
-                               o.apply(next, [curr, next, opts, fwd]);
-                       });
-                       if (!p.cycleStop) {
-                               // queue next transition
-                               queueNext();
-                       }
-               };
-
-               debug('tx firing('+fx+'); currSlide: ' + opts.currSlide + '; nextSlide: ' + opts.nextSlide);
-               
-               // get ready to perform the transition
-               opts.busy = 1;
-               if (opts.fxFn) // fx function provided?
-                       opts.fxFn(curr, next, opts, after, fwd, manual && opts.fastOnEvent);
-               else if ($.isFunction($.fn.cycle[opts.fx])) // fx plugin ?
-                       $.fn.cycle[opts.fx](curr, next, opts, after, fwd, manual && opts.fastOnEvent);
-               else
-                       $.fn.cycle.custom(curr, next, opts, after, fwd, manual && opts.fastOnEvent);
-       }
-       else {
-               queueNext();
-       }
-
-       if (changed || opts.nextSlide == opts.currSlide) {
-               // calculate the next slide
-               opts.lastSlide = opts.currSlide;
-               if (opts.random) {
-                       opts.currSlide = opts.nextSlide;
-                       if (++opts.randomIndex == els.length) {
-                               opts.randomIndex = 0;
-                               opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;});
-                       }
-                       opts.nextSlide = opts.randomMap[opts.randomIndex];
-                       if (opts.nextSlide == opts.currSlide)
-                               opts.nextSlide = (opts.currSlide == opts.slideCount - 1) ? 0 : opts.currSlide + 1;
-               }
-               else if (opts.backwards) {
-                       var roll = (opts.nextSlide - 1) < 0;
-                       if (roll && opts.bounce) {
-                               opts.backwards = !opts.backwards;
-                               opts.nextSlide = 1;
-                               opts.currSlide = 0;
-                       }
-                       else {
-                               opts.nextSlide = roll ? (els.length-1) : opts.nextSlide-1;
-                               opts.currSlide = roll ? 0 : opts.nextSlide+1;
-                       }
-               }
-               else { // sequence
-                       var roll = (opts.nextSlide + 1) == els.length;
-                       if (roll && opts.bounce) {
-                               opts.backwards = !opts.backwards;
-                               opts.nextSlide = els.length-2;
-                               opts.currSlide = els.length-1;
-                       }
-                       else {
-                               opts.nextSlide = roll ? 0 : opts.nextSlide+1;
-                               opts.currSlide = roll ? els.length-1 : opts.nextSlide-1;
-                       }
-               }
-       }
-       if (changed && opts.pager)
-               opts.updateActivePagerLink(opts.pager, opts.currSlide, opts.activePagerClass);
-       
-       function queueNext() {
-               // stage the next transition
-               var ms = 0, timeout = opts.timeout;
-               if (opts.timeout && !opts.continuous) {
-                       ms = getTimeout(els[opts.currSlide], els[opts.nextSlide], opts, fwd);
-         if (opts.fx == 'shuffle')
-            ms -= opts.speedOut;
-      }
-               else if (opts.continuous && p.cyclePause) // continuous shows work off an after callback, not this timer logic
-                       ms = 10;
-               if (ms > 0)
-                       p.cycleTimeout = setTimeout(function(){ go(els, opts, 0, !opts.backwards) }, ms);
-       }
-};
-
-// invoked after transition
-$.fn.cycle.updateActivePagerLink = function(pager, currSlide, clsName) {
-   $(pager).each(function() {
-       $(this).children().removeClass(clsName).eq(currSlide).addClass(clsName);
-   });
-};
-
-// calculate timeout value for current transition
-function getTimeout(curr, next, opts, fwd) {
-       if (opts.timeoutFn) {
-               // call user provided calc fn
-               var t = opts.timeoutFn.call(curr,curr,next,opts,fwd);
-               while (opts.fx != 'none' && (t - opts.speed) < 250) // sanitize timeout
-                       t += opts.speed;
-               debug('calculated timeout: ' + t + '; speed: ' + opts.speed);
-               if (t !== false)
-                       return t;
-       }
-       return opts.timeout;
-};
-
-// expose next/prev function, caller must pass in state
-$.fn.cycle.next = function(opts) { advance(opts,1); };
-$.fn.cycle.prev = function(opts) { advance(opts,0);};
-
-// advance slide forward or back
-function advance(opts, moveForward) {
-       var val = moveForward ? 1 : -1;
-       var els = opts.elements;
-       var p = opts.$cont[0], timeout = p.cycleTimeout;
-       if (timeout) {
-               clearTimeout(timeout);
-               p.cycleTimeout = 0;
-       }
-       if (opts.random && val < 0) {
-               // move back to the previously display slide
-               opts.randomIndex--;
-               if (--opts.randomIndex == -2)
-                       opts.randomIndex = els.length-2;
-               else if (opts.randomIndex == -1)
-                       opts.randomIndex = els.length-1;
-               opts.nextSlide = opts.randomMap[opts.randomIndex];
-       }
-       else if (opts.random) {
-               opts.nextSlide = opts.randomMap[opts.randomIndex];
-       }
-       else {
-               opts.nextSlide = opts.currSlide + val;
-               if (opts.nextSlide < 0) {
-                       if (opts.nowrap) return false;
-                       opts.nextSlide = els.length - 1;
-               }
-               else if (opts.nextSlide >= els.length) {
-                       if (opts.nowrap) return false;
-                       opts.nextSlide = 0;
-               }
-       }
-
-       var cb = opts.onPrevNextEvent || opts.prevNextClick; // prevNextClick is deprecated
-       if ($.isFunction(cb))
-               cb(val > 0, opts.nextSlide, els[opts.nextSlide]);
-       go(els, opts, 1, moveForward);
-       return false;
-};
-
-function buildPager(els, opts) {
-       var $p = $(opts.pager);
-       $.each(els, function(i,o) {
-               $.fn.cycle.createPagerAnchor(i,o,$p,els,opts);
-       });
-       opts.updateActivePagerLink(opts.pager, opts.startingSlide, opts.activePagerClass);
-};
-
-$.fn.cycle.createPagerAnchor = function(i, el, $p, els, opts) {
-       var a;
-       if ($.isFunction(opts.pagerAnchorBuilder)) {
-               a = opts.pagerAnchorBuilder(i,el);
-               debug('pagerAnchorBuilder('+i+', el) returned: ' + a);
-       }
-       else
-               a = '<a href="#">'+(i+1)+'</a>';
-               
-       if (!a)
-               return;
-       var $a = $(a);
-       // don't reparent if anchor is in the dom
-       if ($a.parents('body').length === 0) {
-               var arr = [];
-               if ($p.length > 1) {
-                       $p.each(function() {
-                               var $clone = $a.clone(true);
-                               $(this).append($clone);
-                               arr.push($clone[0]);
-                       });
-                       $a = $(arr);
-               }
-               else {
-                       $a.appendTo($p);
-               }
-       }
-
-       opts.pagerAnchors =  opts.pagerAnchors || [];
-       opts.pagerAnchors.push($a);
-       
-       var pagerFn = function(e) {
-               e.preventDefault();
-               opts.nextSlide = i;
-               var p = opts.$cont[0], timeout = p.cycleTimeout;
-               if (timeout) {
-                       clearTimeout(timeout);
-                       p.cycleTimeout = 0;
-               }
-               var cb = opts.onPagerEvent || opts.pagerClick; // pagerClick is deprecated
-               if ($.isFunction(cb))
-                       cb(opts.nextSlide, els[opts.nextSlide]);
-               go(els,opts,1,opts.currSlide < i); // trigger the trans
-//             return false; // <== allow bubble
-       }
-       
-       if ( /mouseenter|mouseover/i.test(opts.pagerEvent) ) {
-               $a.hover(pagerFn, function(){/* no-op */} );
-       }
-       else {
-               $a.bind(opts.pagerEvent, pagerFn);
-       }
-       
-       if ( ! /^click/.test(opts.pagerEvent) && !opts.allowPagerClickBubble)
-               $a.bind('click.cycle', function(){return false;}); // suppress click
-       
-       var cont = opts.$cont[0];
-       var pauseFlag = false; // https://github.com/malsup/cycle/issues/44
-       if (opts.pauseOnPagerHover) {
-               $a.hover(
-                       function() { 
-                               pauseFlag = true;
-                               cont.cyclePause++; 
-                               triggerPause(cont,true,true);
-                       }, function() { 
-                               pauseFlag && cont.cyclePause--; 
-                               triggerPause(cont,true,true);
-                       } 
-               );
-       }
-};
-
-// helper fn to calculate the number of slides between the current and the next
-$.fn.cycle.hopsFromLast = function(opts, fwd) {
-       var hops, l = opts.lastSlide, c = opts.currSlide;
-       if (fwd)
-               hops = c > l ? c - l : opts.slideCount - l;
-       else
-               hops = c < l ? l - c : l + opts.slideCount - c;
-       return hops;
-};
-
-// fix clearType problems in ie6 by setting an explicit bg color
-// (otherwise text slides look horrible during a fade transition)
-function clearTypeFix($slides) {
-       debug('applying clearType background-color hack');
-       function hex(s) {
-               s = parseInt(s,10).toString(16);
-               return s.length < 2 ? '0'+s : s;
-       };
-       function getBg(e) {
-               for ( ; e && e.nodeName.toLowerCase() != 'html'; e = e.parentNode) {
-                       var v = $.css(e,'background-color');
-                       if (v && v.indexOf('rgb') >= 0 ) {
-                               var rgb = v.match(/\d+/g);
-                               return '#'+ hex(rgb[0]) + hex(rgb[1]) + hex(rgb[2]);
-                       }
-                       if (v && v != 'transparent')
-                               return v;
-               }
-               return '#ffffff';
-       };
-       $slides.each(function() { $(this).css('background-color', getBg(this)); });
-};
-
-// reset common props before the next transition
-$.fn.cycle.commonReset = function(curr,next,opts,w,h,rev) {
-       $(opts.elements).not(curr).hide();
-       if (typeof opts.cssBefore.opacity == 'undefined')
-               opts.cssBefore.opacity = 1;
-       opts.cssBefore.display = 'block';
-       if (opts.slideResize && w !== false && next.cycleW > 0)
-               opts.cssBefore.width = next.cycleW;
-       if (opts.slideResize && h !== false && next.cycleH > 0)
-               opts.cssBefore.height = next.cycleH;
-       opts.cssAfter = opts.cssAfter || {};
-       opts.cssAfter.display = 'none';
-       $(curr).css('zIndex',opts.slideCount + (rev === true ? 1 : 0));
-       $(next).css('zIndex',opts.slideCount + (rev === true ? 0 : 1));
-};
-
-// the actual fn for effecting a transition
-$.fn.cycle.custom = function(curr, next, opts, cb, fwd, speedOverride) {
-       var $l = $(curr), $n = $(next);
-       var speedIn = opts.speedIn, speedOut = opts.speedOut, easeIn = opts.easeIn, easeOut = opts.easeOut;
-       $n.css(opts.cssBefore);
-       if (speedOverride) {
-               if (typeof speedOverride == 'number')
-                       speedIn = speedOut = speedOverride;
-               else
-                       speedIn = speedOut = 1;
-               easeIn = easeOut = null;
-       }
-       var fn = function() {
-               $n.animate(opts.animIn, speedIn, easeIn, function() {
-                       cb();
-               });
-       };
-       $l.animate(opts.animOut, speedOut, easeOut, function() {
-               $l.css(opts.cssAfter);
-               if (!opts.sync) 
-                       fn();
-       });
-       if (opts.sync) fn();
-};
-
-// transition definitions - only fade is defined here, transition pack defines the rest
-$.fn.cycle.transitions = {
-       fade: function($cont, $slides, opts) {
-               $slides.not(':eq('+opts.currSlide+')').css('opacity',0);
-               opts.before.push(function(curr,next,opts) {
-                       $.fn.cycle.commonReset(curr,next,opts);
-                       opts.cssBefore.opacity = 0;
-               });
-               opts.animIn        = { opacity: 1 };
-               opts.animOut   = { opacity: 0 };
-               opts.cssBefore = { top: 0, left: 0 };
-       }
-};
-
-$.fn.cycle.ver = function() { return ver; };
-
-// override these globally if you like (they are all optional)
-$.fn.cycle.defaults = {
-       activePagerClass: 'activeSlide', // class name used for the active pager link
-       after:             null,  // transition callback (scope set to element that was shown):  function(currSlideElement, nextSlideElement, options, forwardFlag)
-       allowPagerClickBubble: false, // allows or prevents click event on pager anchors from bubbling
-       animIn:            null,  // properties that define how the slide animates in
-       animOut:           null,  // properties that define how the slide animates out
-       aspect:            false,  // preserve aspect ratio during fit resizing, cropping if necessary (must be used with fit option)
-       autostop:          0,     // true to end slideshow after X transitions (where X == slide count)
-       autostopCount: 0,         // number of transitions (optionally used with autostop to define X)
-       backwards:     false, // true to start slideshow at last slide and move backwards through the stack
-       before:            null,  // transition callback (scope set to element to be shown):     function(currSlideElement, nextSlideElement, options, forwardFlag)
-       center:            null,  // set to true to have cycle add top/left margin to each slide (use with width and height options)
-       cleartype:         !$.support.opacity,  // true if clearType corrections should be applied (for IE)
-       cleartypeNoBg: false, // set to true to disable extra cleartype fixing (leave false to force background color setting on slides)
-       containerResize: 1,       // resize container to fit largest slide
-       continuous:        0,     // true to start next transition immediately after current one completes
-       cssAfter:          null,  // properties that defined the state of the slide after transitioning out
-       cssBefore:         null,  // properties that define the initial state of the slide before transitioning in
-       delay:             0,     // additional delay (in ms) for first transition (hint: can be negative)
-       easeIn:            null,  // easing for "in" transition
-       easeOut:           null,  // easing for "out" transition
-       easing:            null,  // easing method for both in and out transitions
-       end:               null,  // callback invoked when the slideshow terminates (use with autostop or nowrap options): function(options)
-       fastOnEvent:   0,         // force fast transitions when triggered manually (via pager or prev/next); value == time in ms
-       fit:               0,     // force slides to fit container
-       fx:                       'fade', // name of transition effect (or comma separated names, ex: 'fade,scrollUp,shuffle')
-       fxFn:              null,  // function used to control the transition: function(currSlideElement, nextSlideElement, options, afterCalback, forwardFlag)
-       height:           'auto', // container height (if the 'fit' option is true, the slides will be set to this height as well)
-       manualTrump:   true,  // causes manual transition to stop an active transition instead of being ignored
-       metaAttr:     'cycle',// data- attribute that holds the option data for the slideshow
-       next:              null,  // element, jQuery object, or jQuery selector string for the element to use as event trigger for next slide
-       nowrap:            0,     // true to prevent slideshow from wrapping
-       onPagerEvent:  null,  // callback fn for pager events: function(zeroBasedSlideIndex, slideElement)
-       onPrevNextEvent: null,// callback fn for prev/next events: function(isNext, zeroBasedSlideIndex, slideElement)
-       pager:             null,  // element, jQuery object, or jQuery selector string for the element to use as pager container
-       pagerAnchorBuilder: null, // callback fn for building anchor links:  function(index, DOMelement)
-       pagerEvent:       'click.cycle', // name of event which drives the pager navigation
-       pause:             0,     // true to enable "pause on hover"
-       pauseOnPagerHover: 0, // true to pause when hovering over pager link
-       prev:              null,  // element, jQuery object, or jQuery selector string for the element to use as event trigger for previous slide
-       prevNextEvent:'click.cycle',// event which drives the manual transition to the previous or next slide
-       random:            0,     // true for random, false for sequence (not applicable to shuffle fx)
-       randomizeEffects: 1,  // valid when multiple effects are used; true to make the effect sequence random
-       requeueOnImageNotLoaded: true, // requeue the slideshow if any image slides are not yet loaded
-       requeueTimeout: 250,  // ms delay for requeue
-       rev:               0,     // causes animations to transition in reverse (for effects that support it such as scrollHorz/scrollVert/shuffle)
-       shuffle:           null,  // coords for shuffle animation, ex: { top:15, left: 200 }
-       skipInitializationCallbacks: false, // set to true to disable the first before/after callback that occurs prior to any transition
-       slideExpr:         null,  // expression for selecting slides (if something other than all children is required)
-       slideResize:   1,     // force slide width/height to fixed size before every transition
-       speed:             1000,  // speed of the transition (any valid fx speed value)
-       speedIn:           null,  // speed of the 'in' transition
-       speedOut:          null,  // speed of the 'out' transition
-       startingSlide: undefined,         // zero-based index of the first slide to be displayed
-       sync:              1,     // true if in/out transitions should occur simultaneously
-       timeout:           4000,  // milliseconds between slide transitions (0 to disable auto advance)
-       timeoutFn:     null,  // callback for determining per-slide timeout value:  function(currSlideElement, nextSlideElement, options, forwardFlag)
-       updateActivePagerLink: null, // callback fn invoked to update the active pager link (adds/removes activePagerClass style)
-       width:         null   // container width (if the 'fit' option is true, the slides will be set to this width as well)
-};
-
-})(jQuery);
-
-
-/*!
- * jQuery Cycle Plugin Transition Definitions
- * This script is a plugin for the jQuery Cycle Plugin
- * Examples and documentation at: http://malsup.com/jquery/cycle/
- * Copyright (c) 2007-2010 M. Alsup
- * Version:     2.73
- * Dual licensed under the MIT and GPL licenses:
- * http://www.opensource.org/licenses/mit-license.php
- * http://www.gnu.org/licenses/gpl.html
- */
-(function($) {
-
-//
-// These functions define slide initialization and properties for the named
-// transitions. To save file size feel free to remove any of these that you
-// don't need.
-//
-$.fn.cycle.transitions.none = function($cont, $slides, opts) {
-       opts.fxFn = function(curr,next,opts,after){
-               $(next).show();
-               $(curr).hide();
-               after();
-       };
-};
-
-// not a cross-fade, fadeout only fades out the top slide
-$.fn.cycle.transitions.fadeout = function($cont, $slides, opts) {
-       $slides.not(':eq('+opts.currSlide+')').css({ display: 'block', 'opacity': 1 });
-       opts.before.push(function(curr,next,opts,w,h,rev) {
-               $(curr).css('zIndex',opts.slideCount + (!rev === true ? 1 : 0));
-               $(next).css('zIndex',opts.slideCount + (!rev === true ? 0 : 1));
-       });
-       opts.animIn.opacity = 1;
-       opts.animOut.opacity = 0;
-       opts.cssBefore.opacity = 1;
-       opts.cssBefore.display = 'block';
-       opts.cssAfter.zIndex = 0;
-};
-
-// scrollUp/Down/Left/Right
-$.fn.cycle.transitions.scrollUp = function($cont, $slides, opts) {
-       $cont.css('overflow','hidden');
-       opts.before.push($.fn.cycle.commonReset);
-       var h = $cont.height();
-       opts.cssBefore.top = h;
-       opts.cssBefore.left = 0;
-       opts.cssFirst.top = 0;
-       opts.animIn.top = 0;
-       opts.animOut.top = -h;
-};
-$.fn.cycle.transitions.scrollDown = function($cont, $slides, opts) {
-       $cont.css('overflow','hidden');
-       opts.before.push($.fn.cycle.commonReset);
-       var h = $cont.height();
-       opts.cssFirst.top = 0;
-       opts.cssBefore.top = -h;
-       opts.cssBefore.left = 0;
-       opts.animIn.top = 0;
-       opts.animOut.top = h;
-};
-$.fn.cycle.transitions.scrollLeft = function($cont, $slides, opts) {
-       $cont.css('overflow','hidden');
-       opts.before.push($.fn.cycle.commonReset);
-       var w = $cont.width();
-       opts.cssFirst.left = 0;
-       opts.cssBefore.left = w;
-       opts.cssBefore.top = 0;
-       opts.animIn.left = 0;
-       opts.animOut.left = 0-w;
-};
-$.fn.cycle.transitions.scrollRight = function($cont, $slides, opts) {
-       $cont.css('overflow','hidden');
-       opts.before.push($.fn.cycle.commonReset);
-       var w = $cont.width();
-       opts.cssFirst.left = 0;
-       opts.cssBefore.left = -w;
-       opts.cssBefore.top = 0;
-       opts.animIn.left = 0;
-       opts.animOut.left = w;
-};
-$.fn.cycle.transitions.scrollHorz = function($cont, $slides, opts) {
-       $cont.css('overflow','hidden').width();
-       opts.before.push(function(curr, next, opts, fwd) {
-               if (opts.rev)
-                       fwd = !fwd;
-               $.fn.cycle.commonReset(curr,next,opts);
-               opts.cssBefore.left = fwd ? (next.cycleW-1) : (1-next.cycleW);
-               opts.animOut.left = fwd ? -curr.cycleW : curr.cycleW;
-       });
-       opts.cssFirst.left = 0;
-       opts.cssBefore.top = 0;
-       opts.animIn.left = 0;
-       opts.animOut.top = 0;
-};
-$.fn.cycle.transitions.scrollVert = function($cont, $slides, opts) {
-       $cont.css('overflow','hidden');
-       opts.before.push(function(curr, next, opts, fwd) {
-               if (opts.rev)
-                       fwd = !fwd;
-               $.fn.cycle.commonReset(curr,next,opts);
-               opts.cssBefore.top = fwd ? (1-next.cycleH) : (next.cycleH-1);
-               opts.animOut.top = fwd ? curr.cycleH : -curr.cycleH;
-       });
-       opts.cssFirst.top = 0;
-       opts.cssBefore.left = 0;
-       opts.animIn.top = 0;
-       opts.animOut.left = 0;
-};
-
-// slideX/slideY
-$.fn.cycle.transitions.slideX = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $(opts.elements).not(curr).hide();
-               $.fn.cycle.commonReset(curr,next,opts,false,true);
-               opts.animIn.width = next.cycleW;
-       });
-       opts.cssBefore.left = 0;
-       opts.cssBefore.top = 0;
-       opts.cssBefore.width = 0;
-       opts.animIn.width = 'show';
-       opts.animOut.width = 0;
-};
-$.fn.cycle.transitions.slideY = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $(opts.elements).not(curr).hide();
-               $.fn.cycle.commonReset(curr,next,opts,true,false);
-               opts.animIn.height = next.cycleH;
-       });
-       opts.cssBefore.left = 0;
-       opts.cssBefore.top = 0;
-       opts.cssBefore.height = 0;
-       opts.animIn.height = 'show';
-       opts.animOut.height = 0;
-};
-
-// shuffle
-$.fn.cycle.transitions.shuffle = function($cont, $slides, opts) {
-       var i, w = $cont.css('overflow', 'visible').width();
-       $slides.css({left: 0, top: 0});
-       opts.before.push(function(curr,next,opts) {
-               $.fn.cycle.commonReset(curr,next,opts,true,true,true);
-       });
-       // only adjust speed once!
-       if (!opts.speedAdjusted) {
-               opts.speed = opts.speed / 2; // shuffle has 2 transitions
-               opts.speedAdjusted = true;
-       }
-       opts.random = 0;
-       opts.shuffle = opts.shuffle || {left:-w, top:15};
-       opts.els = [];
-       for (i=0; i < $slides.length; i++)
-               opts.els.push($slides[i]);
-
-       for (i=0; i < opts.currSlide; i++)
-               opts.els.push(opts.els.shift());
-
-       // custom transition fn (hat tip to Benjamin Sterling for this bit of sweetness!)
-       opts.fxFn = function(curr, next, opts, cb, fwd) {
-               if (opts.rev)
-                       fwd = !fwd;
-               var $el = fwd ? $(curr) : $(next);
-               $(next).css(opts.cssBefore);
-               var count = opts.slideCount;
-               $el.animate(opts.shuffle, opts.speedIn, opts.easeIn, function() {
-                       var hops = $.fn.cycle.hopsFromLast(opts, fwd);
-                       for (var k=0; k < hops; k++)
-                               fwd ? opts.els.push(opts.els.shift()) : opts.els.unshift(opts.els.pop());
-                       if (fwd) {
-                               for (var i=0, len=opts.els.length; i < len; i++)
-                                       $(opts.els[i]).css('z-index', len-i+count);
-                       }
-                       else {
-                               var z = $(curr).css('z-index');
-                               $el.css('z-index', parseInt(z,10)+1+count);
-                       }
-                       $el.animate({left:0, top:0}, opts.speedOut, opts.easeOut, function() {
-                               $(fwd ? this : curr).hide();
-                               if (cb) cb();
-                       });
-               });
-       };
-       $.extend(opts.cssBefore, { display: 'block', opacity: 1, top: 0, left: 0 });
-};
-
-// turnUp/Down/Left/Right
-$.fn.cycle.transitions.turnUp = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,true,false);
-               opts.cssBefore.top = next.cycleH;
-               opts.animIn.height = next.cycleH;
-               opts.animOut.width = next.cycleW;
-       });
-       opts.cssFirst.top = 0;
-       opts.cssBefore.left = 0;
-       opts.cssBefore.height = 0;
-       opts.animIn.top = 0;
-       opts.animOut.height = 0;
-};
-$.fn.cycle.transitions.turnDown = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,true,false);
-               opts.animIn.height = next.cycleH;
-               opts.animOut.top   = curr.cycleH;
-       });
-       opts.cssFirst.top = 0;
-       opts.cssBefore.left = 0;
-       opts.cssBefore.top = 0;
-       opts.cssBefore.height = 0;
-       opts.animOut.height = 0;
-};
-$.fn.cycle.transitions.turnLeft = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,false,true);
-               opts.cssBefore.left = next.cycleW;
-               opts.animIn.width = next.cycleW;
-       });
-       opts.cssBefore.top = 0;
-       opts.cssBefore.width = 0;
-       opts.animIn.left = 0;
-       opts.animOut.width = 0;
-};
-$.fn.cycle.transitions.turnRight = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,false,true);
-               opts.animIn.width = next.cycleW;
-               opts.animOut.left = curr.cycleW;
-       });
-       $.extend(opts.cssBefore, { top: 0, left: 0, width: 0 });
-       opts.animIn.left = 0;
-       opts.animOut.width = 0;
-};
-
-// zoom
-$.fn.cycle.transitions.zoom = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,false,false,true);
-               opts.cssBefore.top = next.cycleH/2;
-               opts.cssBefore.left = next.cycleW/2;
-               $.extend(opts.animIn, { top: 0, left: 0, width: next.cycleW, height: next.cycleH });
-               $.extend(opts.animOut, { width: 0, height: 0, top: curr.cycleH/2, left: curr.cycleW/2 });
-       });
-       opts.cssFirst.top = 0;
-       opts.cssFirst.left = 0;
-       opts.cssBefore.width = 0;
-       opts.cssBefore.height = 0;
-};
-
-// fadeZoom
-$.fn.cycle.transitions.fadeZoom = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,false,false);
-               opts.cssBefore.left = next.cycleW/2;
-               opts.cssBefore.top = next.cycleH/2;
-               $.extend(opts.animIn, { top: 0, left: 0, width: next.cycleW, height: next.cycleH });
-       });
-       opts.cssBefore.width = 0;
-       opts.cssBefore.height = 0;
-       opts.animOut.opacity = 0;
-};
-
-// blindX
-$.fn.cycle.transitions.blindX = function($cont, $slides, opts) {
-       var w = $cont.css('overflow','hidden').width();
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts);
-               opts.animIn.width = next.cycleW;
-               opts.animOut.left   = curr.cycleW;
-       });
-       opts.cssBefore.left = w;
-       opts.cssBefore.top = 0;
-       opts.animIn.left = 0;
-       opts.animOut.left = w;
-};
-// blindY
-$.fn.cycle.transitions.blindY = function($cont, $slides, opts) {
-       var h = $cont.css('overflow','hidden').height();
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts);
-               opts.animIn.height = next.cycleH;
-               opts.animOut.top   = curr.cycleH;
-       });
-       opts.cssBefore.top = h;
-       opts.cssBefore.left = 0;
-       opts.animIn.top = 0;
-       opts.animOut.top = h;
-};
-// blindZ
-$.fn.cycle.transitions.blindZ = function($cont, $slides, opts) {
-       var h = $cont.css('overflow','hidden').height();
-       var w = $cont.width();
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts);
-               opts.animIn.height = next.cycleH;
-               opts.animOut.top   = curr.cycleH;
-       });
-       opts.cssBefore.top = h;
-       opts.cssBefore.left = w;
-       opts.animIn.top = 0;
-       opts.animIn.left = 0;
-       opts.animOut.top = h;
-       opts.animOut.left = w;
-};
-
-// growX - grow horizontally from centered 0 width
-$.fn.cycle.transitions.growX = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,false,true);
-               opts.cssBefore.left = this.cycleW/2;
-               opts.animIn.left = 0;
-               opts.animIn.width = this.cycleW;
-               opts.animOut.left = 0;
-       });
-       opts.cssBefore.top = 0;
-       opts.cssBefore.width = 0;
-};
-// growY - grow vertically from centered 0 height
-$.fn.cycle.transitions.growY = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,true,false);
-               opts.cssBefore.top = this.cycleH/2;
-               opts.animIn.top = 0;
-               opts.animIn.height = this.cycleH;
-               opts.animOut.top = 0;
-       });
-       opts.cssBefore.height = 0;
-       opts.cssBefore.left = 0;
-};
-
-// curtainX - squeeze in both edges horizontally
-$.fn.cycle.transitions.curtainX = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,false,true,true);
-               opts.cssBefore.left = next.cycleW/2;
-               opts.animIn.left = 0;
-               opts.animIn.width = this.cycleW;
-               opts.animOut.left = curr.cycleW/2;
-               opts.animOut.width = 0;
-       });
-       opts.cssBefore.top = 0;
-       opts.cssBefore.width = 0;
-};
-// curtainY - squeeze in both edges vertically
-$.fn.cycle.transitions.curtainY = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,true,false,true);
-               opts.cssBefore.top = next.cycleH/2;
-               opts.animIn.top = 0;
-               opts.animIn.height = next.cycleH;
-               opts.animOut.top = curr.cycleH/2;
-               opts.animOut.height = 0;
-       });
-       opts.cssBefore.height = 0;
-       opts.cssBefore.left = 0;
-};
-
-// cover - curr slide covered by next slide
-$.fn.cycle.transitions.cover = function($cont, $slides, opts) {
-       var d = opts.direction || 'left';
-       var w = $cont.css('overflow','hidden').width();
-       var h = $cont.height();
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts);
-               if (d == 'right')
-                       opts.cssBefore.left = -w;
-               else if (d == 'up')
-                       opts.cssBefore.top = h;
-               else if (d == 'down')
-                       opts.cssBefore.top = -h;
-               else
-                       opts.cssBefore.left = w;
-       });
-       opts.animIn.left = 0;
-       opts.animIn.top = 0;
-       opts.cssBefore.top = 0;
-       opts.cssBefore.left = 0;
-};
-
-// uncover - curr slide moves off next slide
-$.fn.cycle.transitions.uncover = function($cont, $slides, opts) {
-       var d = opts.direction || 'left';
-       var w = $cont.css('overflow','hidden').width();
-       var h = $cont.height();
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,true,true,true);
-               if (d == 'right')
-                       opts.animOut.left = w;
-               else if (d == 'up')
-                       opts.animOut.top = -h;
-               else if (d == 'down')
-                       opts.animOut.top = h;
-               else
-                       opts.animOut.left = -w;
-       });
-       opts.animIn.left = 0;
-       opts.animIn.top = 0;
-       opts.cssBefore.top = 0;
-       opts.cssBefore.left = 0;
-};
-
-// toss - move top slide and fade away
-$.fn.cycle.transitions.toss = function($cont, $slides, opts) {
-       var w = $cont.css('overflow','visible').width();
-       var h = $cont.height();
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,true,true,true);
-               // provide default toss settings if animOut not provided
-               if (!opts.animOut.left && !opts.animOut.top)
-                       $.extend(opts.animOut, { left: w*2, top: -h/2, opacity: 0 });
-               else
-                       opts.animOut.opacity = 0;
-       });
-       opts.cssBefore.left = 0;
-       opts.cssBefore.top = 0;
-       opts.animIn.left = 0;
-};
-
-// wipe - clip animation
-$.fn.cycle.transitions.wipe = function($cont, $slides, opts) {
-       var w = $cont.css('overflow','hidden').width();
-       var h = $cont.height();
-       opts.cssBefore = opts.cssBefore || {};
-       var clip;
-       if (opts.clip) {
-               if (/l2r/.test(opts.clip))
-                       clip = 'rect(0px 0px '+h+'px 0px)';
-               else if (/r2l/.test(opts.clip))
-                       clip = 'rect(0px '+w+'px '+h+'px '+w+'px)';
-               else if (/t2b/.test(opts.clip))
-                       clip = 'rect(0px '+w+'px 0px 0px)';
-               else if (/b2t/.test(opts.clip))
-                       clip = 'rect('+h+'px '+w+'px '+h+'px 0px)';
-               else if (/zoom/.test(opts.clip)) {
-                       var top = parseInt(h/2,10);
-                       var left = parseInt(w/2,10);
-                       clip = 'rect('+top+'px '+left+'px '+top+'px '+left+'px)';
-               }
-       }
-
-       opts.cssBefore.clip = opts.cssBefore.clip || clip || 'rect(0px 0px 0px 0px)';
-
-       var d = opts.cssBefore.clip.match(/(\d+)/g);
-       var t = parseInt(d[0],10), r = parseInt(d[1],10), b = parseInt(d[2],10), l = parseInt(d[3],10);
-
-       opts.before.push(function(curr, next, opts) {
-               if (curr == next) return;
-               var $curr = $(curr), $next = $(next);
-               $.fn.cycle.commonReset(curr,next,opts,true,true,false);
-               opts.cssAfter.display = 'block';
-
-               var step = 1, count = parseInt((opts.speedIn / 13),10) - 1;
-               (function f() {
-                       var tt = t ? t - parseInt(step * (t/count),10) : 0;
-                       var ll = l ? l - parseInt(step * (l/count),10) : 0;
-                       var bb = b < h ? b + parseInt(step * ((h-b)/count || 1),10) : h;
-                       var rr = r < w ? r + parseInt(step * ((w-r)/count || 1),10) : w;
-                       $next.css({ clip: 'rect('+tt+'px '+rr+'px '+bb+'px '+ll+'px)' });
-                       (step++ <= count) ? setTimeout(f, 13) : $curr.css('display', 'none');
-               })();
-       });
-       $.extend(opts.cssBefore, { display: 'block', opacity: 1, top: 0, left: 0 });
-       opts.animIn        = { left: 0 };
-       opts.animOut   = { left: 0 };
-};
-
-})(jQuery);
index 324833c..902a5cc 100644 (file)
 
         // set next check
         if(nextExpire != Infinity){
-            _ttl_timeout = setTimeout(_handleTTL, nextExpire - curtime);
+            _ttl_timeout = setTimeout(Math.min(_handleTTL, nextExpire - curtime, 0x7FFFFFFF));
         }
 
         // save changes
          * @param {Mixed} value Value to set. This can be any value that is JSON
          *              compatible (Numbers, Strings, Objects etc.).
          * @param {Object} [options] - possible options to use
-         * @param {Number} [options.TTL] - optional TTL value
+         * @param {Number} [options.TTL] - optional TTL value, in milliseconds
          * @return {Mixed} the used value
          */
         set: function(key, value, options){
index 25b6c81..5b18236 100644 (file)
@@ -2,6 +2,8 @@
  * jQuery Migrate - v1.2.1 - 2013-05-08
  * https://github.com/jquery/jquery-migrate
  * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors; Licensed MIT
+ *
+ * Patched for MediaWiki to add mw.track calls. --Krinkle 2014-04-14
  */
 (function( jQuery, window, undefined ) {
 // See http://bugs.jquery.com/ticket/13335
@@ -32,8 +34,36 @@ jQuery.migrateReset = function() {
        jQuery.migrateWarnings.length = 0;
 };
 
-function migrateWarn( msg) {
+function migrateWarn( msg, key ) {
        var console = window.console;
+       /*
+               MediaWiki patch for tracking usage.
+
+               Custom keys:
+               - andSelf
+               - attr-pass
+               - attr-prop
+               - bind-error
+               - clean
+               - create-html
+               - data-events
+               - die
+               - event-ajax
+               - event-global
+               - event-hover
+               - event-handle
+               - input-type
+               - json-invalid
+               - live
+               - sub
+               - toggle-handle
+
+               Prop keys:
+               - attrFn
+               - browser
+       */
+       mw.track( "jquery.migrate", key || "unknown" );
+
        if ( !warnedAbout[ msg ] ) {
                warnedAbout[ msg ] = true;
                jQuery.migrateWarnings.push( msg );
@@ -46,7 +76,7 @@ function migrateWarn( msg) {
        }
 }
 
-function migrateWarnProp( obj, prop, value, msg ) {
+function migrateWarnProp( obj, prop, value, msg, key ) {
        if ( Object.defineProperty ) {
                // On ES5 browsers (non-oldIE), warn if the code tries to get prop;
                // allow property to be overwritten in case some other plugin wants it
@@ -55,11 +85,11 @@ function migrateWarnProp( obj, prop, value, msg ) {
                                configurable: true,
                                enumerable: true,
                                get: function() {
-                                       migrateWarn( msg );
+                                       migrateWarn( msg, key || prop );
                                        return value;
                                },
                                set: function( newValue ) {
-                                       migrateWarn( msg );
+                                       migrateWarn( msg, key || prop );
                                        value = newValue;
                                }
                        });
@@ -102,7 +132,7 @@ jQuery.attr = function( elem, name, value, pass ) {
                // Since pass is used internally, we only warn for new jQuery
                // versions where there isn't a pass arg in the formal params
                if ( oldAttr.length < 4 ) {
-                       migrateWarn("jQuery.fn.attr( props, pass ) is deprecated");
+                       migrateWarn("jQuery.fn.attr( props, pass ) is deprecated", "attr-pass" );
                }
                if ( elem && !rnoAttrNodeType.test( nType ) &&
                        (attrFn ? name in attrFn : jQuery.isFunction(jQuery.fn[name])) ) {
@@ -113,7 +143,7 @@ jQuery.attr = function( elem, name, value, pass ) {
        // Warn if user tries to set `type`, since it breaks on IE 6/7/8; by checking
        // for disconnected elements we don't warn on $( "<button>", { type: "button" } ).
        if ( name === "type" && value !== undefined && rnoType.test( elem.nodeName ) && elem.parentNode ) {
-               migrateWarn("Can't change the 'type' of an input or button in IE 6/7/8");
+               migrateWarn("Can't change the 'type' of an input or button in IE 6/7/8", "input-type");
        }
 
        // Restore boolHook for boolean property/attribute synchronization
@@ -152,7 +182,7 @@ jQuery.attr = function( elem, name, value, pass ) {
 
                // Warn only for attributes that can remain distinct from their properties post-1.9
                if ( ruseDefault.test( lowerName ) ) {
-                       migrateWarn( "jQuery.fn.attr('" + lowerName + "') may use property instead of attribute" );
+                       migrateWarn( "jQuery.fn.attr('" + lowerName + "') may use property instead of attribute", "attr-prop" );
                }
        }
 
@@ -167,7 +197,7 @@ jQuery.attrHooks.value = {
                        return valueAttrGet.apply( this, arguments );
                }
                if ( nodeName !== "input" && nodeName !== "option" ) {
-                       migrateWarn("jQuery.fn.attr('value') no longer gets properties");
+                       migrateWarn("jQuery.fn.attr('value') no longer gets properties", "attr-prop");
                }
                return name in elem ?
                        elem.value :
@@ -179,7 +209,7 @@ jQuery.attrHooks.value = {
                        return valueAttrSet.apply( this, arguments );
                }
                if ( nodeName !== "input" && nodeName !== "option" ) {
-                       migrateWarn("jQuery.fn.attr('value', val) no longer sets properties");
+                       migrateWarn("jQuery.fn.attr('value', val) no longer sets properties", "attr-prop");
                }
                // Does not return so that setAttribute is also used
                elem.value = value;
@@ -201,15 +231,15 @@ jQuery.fn.init = function( selector, context, rootjQuery ) {
                        (match = rquickExpr.exec( jQuery.trim( selector ) )) && match[ 0 ] ) {
                // This is an HTML string according to the "old" rules; is it still?
                if ( selector.charAt( 0 ) !== "<" ) {
-                       migrateWarn("$(html) HTML strings must start with '<' character");
+                       migrateWarn("$(html) HTML strings must start with '<' character", "create-html");
                }
                if ( match[ 3 ] ) {
-                       migrateWarn("$(html) HTML text after last tag is ignored");
+                       migrateWarn("$(html) HTML text after last tag is ignored", "create-html");
                }
                // Consistently reject any HTML-like string starting with a hash (#9521)
                // Note that this may break jQuery 1.6.x code that otherwise would work.
                if ( match[ 0 ].charAt( 0 ) === "#" ) {
-                       migrateWarn("HTML string cannot start with a '#' character");
+                       migrateWarn("HTML string cannot start with a '#' character", "create-html");
                        jQuery.error("JQMIGRATE: Invalid selector string (XSS)");
                }
                // Now process using loose rules; let pre-1.8 play too
@@ -229,7 +259,7 @@ jQuery.fn.init.prototype = jQuery.fn;
 // Let $.parseJSON(falsy_value) return null
 jQuery.parseJSON = function( json ) {
        if ( !json && json !== null ) {
-               migrateWarn("jQuery.parseJSON requires a valid JSON string");
+               migrateWarn("jQuery.parseJSON requires a valid JSON string", "json-invalid");
                return null;
        }
        return oldParseJSON.apply( this, arguments );
@@ -292,7 +322,7 @@ jQuery.sub = function() {
        };
        jQuerySub.fn.init.prototype = jQuerySub.fn;
        var rootjQuerySub = jQuerySub(document);
-       migrateWarn( "jQuery.sub() is deprecated" );
+       migrateWarn( "jQuery.sub() is deprecated", "sub" );
        return jQuerySub;
 };
 
@@ -316,7 +346,7 @@ jQuery.fn.data = function( name ) {
                ret = jQuery.data( elem, name );
                evt = jQuery._data( elem, name );
                if ( ( ret === undefined || ret === evt ) && evt !== undefined ) {
-                       migrateWarn("Use of jQuery.fn.data('events') is deprecated");
+                       migrateWarn("Use of jQuery.fn.data('events') is deprecated", "data-events");
                        return evt;
                }
        }
@@ -328,7 +358,7 @@ var rscriptType = /\/(java|ecma)script/i,
        oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack;
 
 jQuery.fn.andSelf = function() {
-       migrateWarn("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()");
+       migrateWarn("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()", "andSelf");
        return oldSelf.apply( this, arguments );
 };
 
@@ -340,7 +370,7 @@ if ( !jQuery.clean ) {
                context = !context.nodeType && context[0] || context;
                context = context.ownerDocument || context;
 
-               migrateWarn("jQuery.clean() is deprecated");
+               migrateWarn("jQuery.clean() is deprecated", "clean");
 
                var i, elem, handleScript, jsTags,
                        ret = [];
@@ -396,7 +426,7 @@ var eventAdd = jQuery.event.add,
                        return events;
                }
                if ( rhoverHack.test( events ) ) {
-                       migrateWarn("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'");
+                       migrateWarn("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'", "event-hover");
                }
                return events && events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
        };
@@ -408,13 +438,13 @@ if ( jQuery.event.props && jQuery.event.props[ 0 ] !== "attrChange" ) {
 
 // Undocumented jQuery.event.handle was "deprecated" in jQuery 1.7
 if ( jQuery.event.dispatch ) {
-       migrateWarnProp( jQuery.event, "handle", jQuery.event.dispatch, "jQuery.event.handle is undocumented and deprecated" );
+       migrateWarnProp( jQuery.event, "handle", jQuery.event.dispatch, "jQuery.event.handle is undocumented and deprecated", "event-handle" );
 }
 
 // Support for 'hover' pseudo-event and ajax event warnings
 jQuery.event.add = function( elem, types, handler, data, selector ){
        if ( elem !== document && rajaxEvent.test( types ) ) {
-               migrateWarn( "AJAX events should be attached to document: " + types );
+               migrateWarn( "AJAX events should be attached to document: " + types, "event-ajax" );
        }
        eventAdd.call( this, elem, hoverHack( types || "" ), handler, data, selector );
 };
@@ -424,7 +454,7 @@ jQuery.event.remove = function( elem, types, handler, selector, mappedTypes ){
 
 jQuery.fn.error = function() {
        var args = Array.prototype.slice.call( arguments, 0);
-       migrateWarn("jQuery.fn.error() is deprecated");
+       migrateWarn("jQuery.fn.error() is deprecated", "bind-error");
        args.splice( 0, 0, "error" );
        if ( arguments.length ) {
                return this.bind.apply( this, args );
@@ -440,7 +470,7 @@ jQuery.fn.toggle = function( fn, fn2 ) {
        if ( !jQuery.isFunction( fn ) || !jQuery.isFunction( fn2 ) ) {
                return oldToggle.apply( this, arguments );
        }
-       migrateWarn("jQuery.fn.toggle(handler, handler...) is deprecated");
+       migrateWarn("jQuery.fn.toggle(handler, handler...) is deprecated", "toggle-handle");
 
        // Save reference to arguments for access in closure
        var args = arguments,
@@ -468,7 +498,7 @@ jQuery.fn.toggle = function( fn, fn2 ) {
 };
 
 jQuery.fn.live = function( types, data, fn ) {
-       migrateWarn("jQuery.fn.live() is deprecated");
+       migrateWarn("jQuery.fn.live() is deprecated", "live");
        if ( oldLive ) {
                return oldLive.apply( this, arguments );
        }
@@ -477,7 +507,7 @@ jQuery.fn.live = function( types, data, fn ) {
 };
 
 jQuery.fn.die = function( types, fn ) {
-       migrateWarn("jQuery.fn.die() is deprecated");
+       migrateWarn("jQuery.fn.die() is deprecated", "die");
        if ( oldDie ) {
                return oldDie.apply( this, arguments );
        }
@@ -488,7 +518,7 @@ jQuery.fn.die = function( types, fn ) {
 // Turn global events into document-triggered events
 jQuery.event.trigger = function( event, data, elem, onlyHandlers  ){
        if ( !elem && !rajaxEvent.test( event ) ) {
-               migrateWarn( "Global events are undocumented and deprecated" );
+               migrateWarn( "Global events are undocumented and deprecated", "event-global" );
        }
        return eventTrigger.call( this,  event, data, elem || document, onlyHandlers  );
 };
index 0ef6829..08fbe0b 100644 (file)
@@ -1,8 +1,13 @@
 {
        "@metadata": {
                "authors": [
-                       "Чаховіч Уладзіслаў"
+                       "Чаховіч Уладзіслаў",
+                       "Artificial123"
                ]
        },
-       "ooui-dialog-action-close": "Закрыць"
+       "ooui-dialog-action-close": "Закрыць",
+       "ooui-dialog-confirm-title": "Пацвердзіць",
+       "ooui-dialog-confirm-default-prompt": "Вы ўпэўненыя?",
+       "ooui-dialog-confirm-default-ok": "ОК",
+       "ooui-dialog-confirm-default-cancel": "Адмяніць"
 }
index 75e3547..14280a7 100644 (file)
@@ -8,5 +8,9 @@
        "ooui-outline-control-move-down": "Premjesti stavku dole",
        "ooui-outline-control-move-up": "Premjesti stavku gore",
        "ooui-outline-control-remove": "Ukloni stavku",
-       "ooui-toolbar-more": "Više"
+       "ooui-toolbar-more": "Više",
+       "ooui-dialog-confirm-title": "Potvrdi",
+       "ooui-dialog-confirm-default-prompt": "Da li ste sigurni?",
+       "ooui-dialog-confirm-default-ok": "U redu",
+       "ooui-dialog-confirm-default-cancel": "Otkaži"
 }
index 122be19..de86daf 100644 (file)
@@ -9,7 +9,7 @@
        "ooui-outline-control-move-down": "Лаха яккха элемент",
        "ooui-outline-control-move-up": "Лаккха яккха элемент",
        "ooui-outline-control-remove": "ДӀадаха меттиг",
-       "ooui-toolbar-more": "Кхин тӀе",
+       "ooui-toolbar-more": "Кхин",
        "ooui-dialog-confirm-title": "Бакъдан",
        "ooui-dialog-confirm-default-prompt": "Бакъалла лаьий хӀуна?",
        "ooui-dialog-confirm-default-ok": "ХӀаъ",
index 949b034..a4b6787 100644 (file)
@@ -10,5 +10,9 @@
        "ooui-outline-control-move-down": "Mover o elemento abaixo",
        "ooui-outline-control-move-up": "Mover o elemento arriba",
        "ooui-outline-control-remove": "Eliminar o elemento",
-       "ooui-toolbar-more": "Máis"
+       "ooui-toolbar-more": "Máis",
+       "ooui-dialog-confirm-title": "Confirmar",
+       "ooui-dialog-confirm-default-prompt": "Está seguro?",
+       "ooui-dialog-confirm-default-ok": "Aceptar",
+       "ooui-dialog-confirm-default-cancel": "Cancelar"
 }
index afc727c..f16f984 100644 (file)
@@ -9,5 +9,6 @@
        "ooui-dialog-action-close": "zatvori",
        "ooui-outline-control-move-down": "Premjesti stavku dolje",
        "ooui-outline-control-move-up": "Premjesti stavku gore",
+       "ooui-outline-control-remove": "Ukloni",
        "ooui-toolbar-more": "Više mogućnosti"
 }
index 1adbb35..0f423b3 100644 (file)
@@ -12,5 +12,8 @@
        "ooui-outline-control-move-down": "Elem mozgatása lefelé",
        "ooui-outline-control-move-up": "Elem mozgatása felfelé",
        "ooui-outline-control-remove": "Elem eltávolítása",
-       "ooui-toolbar-more": "Tovább..."
+       "ooui-toolbar-more": "Tovább...",
+       "ooui-dialog-confirm-title": "Megerősítés",
+       "ooui-dialog-confirm-default-prompt": "Biztos vagy benne?",
+       "ooui-dialog-confirm-default-cancel": "Mégse"
 }
index de54b47..f1c9ced 100644 (file)
@@ -4,5 +4,13 @@
                        "McDutchie"
                ]
        },
-       "ooui-dialog-action-close": "Clauder"
+       "ooui-dialog-action-close": "Clauder",
+       "ooui-outline-control-move-down": "Displaciar elemento in basso",
+       "ooui-outline-control-move-up": "Displaciar elemento in alto",
+       "ooui-outline-control-remove": "Remover elemento",
+       "ooui-toolbar-more": "Plus",
+       "ooui-dialog-confirm-title": "Confirmation",
+       "ooui-dialog-confirm-default-prompt": "Es tu secur?",
+       "ooui-dialog-confirm-default-ok": "OK",
+       "ooui-dialog-confirm-default-cancel": "Cancellar"
 }
index 76b654b..85931f5 100644 (file)
@@ -6,6 +6,8 @@
                ]
        },
        "ooui-dialog-action-close": "ಮುಚ್ಚಿ",
+       "ooui-outline-control-move-down": "ವಸ್ತು ಕೆಲ್ಗೆ ಸ್ಥಲಾನ್ಥರಿಸು",
+       "ooui-outline-control-move-up": "ವಸ್ತು ಮೆಲೆ ಸ್ಥಲಾನ್ಥರಿಸು",
        "ooui-outline-control-remove": "ವಸ್ತು ತೆಗೆ",
        "ooui-toolbar-more": "ಹೆಚ್ಚು",
        "ooui-dialog-confirm-title": "ಧೃಡಪಡಿಸು",
index a44d0e5..6dfe34a 100644 (file)
@@ -5,5 +5,13 @@
                        "Jagwar"
                ]
        },
-       "ooui-dialog-action-close": "Tutuik"
+       "ooui-dialog-action-close": "Tutuik",
+       "ooui-outline-control-move-down": "Pindahan ko ka bawah",
+       "ooui-outline-control-move-up": "Pindahan ko ka ateh",
+       "ooui-outline-control-remove": "Hapuih ko",
+       "ooui-toolbar-more": "Lainnyo",
+       "ooui-dialog-confirm-title": "Pastian",
+       "ooui-dialog-confirm-default-prompt": "Yakin?",
+       "ooui-dialog-confirm-default-ok": "Yo",
+       "ooui-dialog-confirm-default-cancel": "Batal"
 }
index f7bbff4..da4b829 100644 (file)
@@ -2,12 +2,17 @@
        "@metadata": {
                "authors": [
                        "RajeshPandey",
-                       "सरोज कुमार ढकाल"
+                       "सरोज कुमार ढकाल",
+                       "Ganesh Paudel"
                ]
        },
        "ooui-dialog-action-close": "बन्द गर्ने",
        "ooui-outline-control-move-down": "वस्तुलाई तल सार्ने",
        "ooui-outline-control-move-up": "वस्तुलाई माथि सार्ने",
        "ooui-outline-control-remove": "वस्तुलाई हटाउने",
-       "ooui-toolbar-more": "थप"
+       "ooui-toolbar-more": "थप",
+       "ooui-dialog-confirm-title": "निश्चित गर्ने",
+       "ooui-dialog-confirm-default-prompt": "निश्चित हुनुहुन्छ ?",
+       "ooui-dialog-confirm-default-ok": "हुन्छ",
+       "ooui-dialog-confirm-default-cancel": "रद्द गर्ने"
 }
index f56773f..f0ccce5 100644 (file)
@@ -11,5 +11,9 @@
        "ooui-outline-control-move-down": "Prestavi predmet nižje",
        "ooui-outline-control-move-up": "Prestavi predmet višje",
        "ooui-outline-control-remove": "Odstrani vnos",
-       "ooui-toolbar-more": "Več"
+       "ooui-toolbar-more": "Več",
+       "ooui-dialog-confirm-title": "Potrdi",
+       "ooui-dialog-confirm-default-prompt": "Ste prepričani?",
+       "ooui-dialog-confirm-default-ok": "V redu",
+       "ooui-dialog-confirm-default-cancel": "Prekliči"
 }
index 08bbb59..308ed84 100644 (file)
@@ -12,6 +12,7 @@
        "ooui-outline-control-remove": "Уклони ставку",
        "ooui-toolbar-more": "Више",
        "ooui-dialog-confirm-title": "Потврди",
+       "ooui-dialog-confirm-default-prompt": "Јесте ли сигурни?",
        "ooui-dialog-confirm-default-ok": "У реду",
        "ooui-dialog-confirm-default-cancel": "Откажи"
 }
index 1f2da2d..889b0f6 100644 (file)
@@ -8,5 +8,6 @@
        "ooui-outline-control-move-down": "Premesti stavku na dole",
        "ooui-outline-control-move-up": "Premesti stavku na gore",
        "ooui-outline-control-remove": "Ukloni stavku",
-       "ooui-toolbar-more": "Više"
+       "ooui-toolbar-more": "Više",
+       "ooui-dialog-confirm-default-prompt": "Jeste li sigurni?"
 }
index 8ce4b25..e549b17 100644 (file)
@@ -1,8 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12" height="12" viewBox="0, 0, 12, 12">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12px"
+        height="12px" viewBox="0 0 12 12">
   <g id="deprecated" opacity="0.75">
-    <path d="M6,12 C2.686,12 -0,9.314 -0,6 C-0,2.686 2.686,-0 6,-0 C9.314,-0 12,2.686 12,6 C12,9.314 9.314,12 6,12 z M5,7 L7,7 L7,2 L5,2 z M5,10 L7,10 L7,8 L5,8 z" fill="#000000"/>
+    <path d="M6,12 C2.686,12 -0,9.314 -0,6 C-0,2.686 2.686,-0 6,-0 C9.314,-0 12,2.686 12,6 C12,9.314 9.314,12 6,12 z M5,7 L7,7 L7,2 L5,2 z M5,10 L7,10 L7,8 L5,8 z"/>
   </g>
   <defs/>
 </svg>
diff --git a/resources/lib/oojs-ui/images/indicators/arrow-down.png b/resources/lib/oojs-ui/images/indicators/arrow-down.png
new file mode 100644 (file)
index 0000000..64e3bac
Binary files /dev/null and b/resources/lib/oojs-ui/images/indicators/arrow-down.png differ
diff --git a/resources/lib/oojs-ui/images/indicators/arrow-down.svg b/resources/lib/oojs-ui/images/indicators/arrow-down.svg
new file mode 100644 (file)
index 0000000..89c21e3
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12px"
+        height="12px" viewBox="0 0 12 12">
+<g id="down" style="opacity:0.75;">
+       <polygon id="arrow" points="2,3 5.5,9 9,3"/>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/indicators/arrow-ltr.png b/resources/lib/oojs-ui/images/indicators/arrow-ltr.png
new file mode 100644 (file)
index 0000000..4eafd0f
Binary files /dev/null and b/resources/lib/oojs-ui/images/indicators/arrow-ltr.png differ
diff --git a/resources/lib/oojs-ui/images/indicators/arrow-ltr.svg b/resources/lib/oojs-ui/images/indicators/arrow-ltr.svg
new file mode 100644 (file)
index 0000000..ad87640
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12px"
+        height="12px" viewBox="0 0 12 12">
+<g id="ltr" opacity="0.75">
+       <path id="arrow" d="M3,9 L3,2 L9,5.5 z"/>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/indicators/arrow-rtl.png b/resources/lib/oojs-ui/images/indicators/arrow-rtl.png
new file mode 100644 (file)
index 0000000..ce13ba0
Binary files /dev/null and b/resources/lib/oojs-ui/images/indicators/arrow-rtl.png differ
diff --git a/resources/lib/oojs-ui/images/indicators/arrow-rtl.svg b/resources/lib/oojs-ui/images/indicators/arrow-rtl.svg
new file mode 100644 (file)
index 0000000..010b24e
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12px"
+        height="12px" viewBox="0 0 12 12">
+<g id="rtl" opacity="0.75">
+       <path id="arrow" d="M3,5.5 L9,9 L9,2 z"/>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/indicators/arrow-up.png b/resources/lib/oojs-ui/images/indicators/arrow-up.png
new file mode 100644 (file)
index 0000000..401cde6
Binary files /dev/null and b/resources/lib/oojs-ui/images/indicators/arrow-up.png differ
diff --git a/resources/lib/oojs-ui/images/indicators/arrow-up.svg b/resources/lib/oojs-ui/images/indicators/arrow-up.svg
new file mode 100644 (file)
index 0000000..bbc2b3c
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12px"
+        height="12px" viewBox="0 0 12 12">
+<g id="up" style="opacity:0.75;">
+       <polygon id="arrow" points="5.5,2 2,8 9,8"/>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/indicators/down.png b/resources/lib/oojs-ui/images/indicators/down.png
deleted file mode 100644 (file)
index 47ff54c..0000000
Binary files a/resources/lib/oojs-ui/images/indicators/down.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/indicators/down.svg b/resources/lib/oojs-ui/images/indicators/down.svg
deleted file mode 100644 (file)
index c871f60..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12px"
-        height="12px" viewBox="0 0 12 12" style="enable-background:new 0 0 12 12;" xml:space="preserve">
-<g id="down" style="opacity:0.75;">
-       <polygon id="arrow" style="fill-rule:evenodd;clip-rule:evenodd;" points="2.023,3 5.512,8.953 9,3"/>
-</g>
-</svg>
index ee1baf7..d8b36b1 100644 (file)
@@ -1,10 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12" height="12" viewBox="0, 0, 12, 12">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12px"
+        height="12px" viewBox="0 0 12 12">
   <g id="required" opacity="0.75">
-    <path d="M5,1 L7,1 L7,11 L5,11 z" fill="#000000"/>
-    <path d="M9.83,2.634 L10.83,4.366 L2.17,9.366 L1.17,7.634 z" fill="#000000"/>
-    <path d="M1.17,4.366 L2.17,2.634 L10.83,7.634 L9.83,9.366 z" fill="#000000"/>
+    <path d="M5,1 L7,1 L7,11 L5,11 z"/>
+    <path d="M9.83,2.634 L10.83,4.366 L2.17,9.366 L1.17,7.634 z"/>
+    <path d="M1.17,4.366 L2.17,2.634 L10.83,7.634 L9.83,9.366 z"/>
   </g>
   <defs/>
 </svg>
diff --git a/resources/lib/oojs-ui/images/indicators/up.png b/resources/lib/oojs-ui/images/indicators/up.png
deleted file mode 100644 (file)
index b827f6d..0000000
Binary files a/resources/lib/oojs-ui/images/indicators/up.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/indicators/up.svg b/resources/lib/oojs-ui/images/indicators/up.svg
deleted file mode 100644 (file)
index a5d7f38..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12px"
-        height="12px" viewBox="0 0 12 12" style="enable-background:new 0 0 12 12;" xml:space="preserve">
-<g id="up" style="opacity:0.75;">
-       <polygon id="arrow" style="fill-rule:evenodd;clip-rule:evenodd;" points="5.512,2.006 2,8 9.024,8                "/>
-</g>
-</svg>
index e915ee8..94ebbe3 100644 (file)
@@ -1,7 +1,21 @@
 .oo-ui-dialog {
   background-color: #fff;
   background-color: rgba(255, 255, 255, 0.5);
+  /* Opening and closing animation */
+
   opacity: 0;
+}
+
+.oo-ui-dialog > .oo-ui-window-frame {
+  -webkit-transform: scale(0.5);
+     -moz-transform: scale(0.5);
+      -ms-transform: scale(0.5);
+       -o-transform: scale(0.5);
+          transform: scale(0.5);
+}
+
+.oo-ui-dialog.oo-ui-window-setup,
+.oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
   -webkit-transition: all 250ms ease-in-out;
      -moz-transition: all 250ms ease-in-out;
       -ms-transition: all 250ms ease-in-out;
@@ -9,6 +23,18 @@
           transition: all 250ms ease-in-out;
 }
 
+.oo-ui-dialog.oo-ui-window-ready {
+  opacity: 1;
+}
+
+.oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
+  -webkit-transform: scale(1);
+     -moz-transform: scale(1);
+      -ms-transform: scale(1);
+       -o-transform: scale(1);
+          transform: scale(1);
+}
+
 .oo-ui-dialog-content .oo-ui-window-head,
 .oo-ui-dialog-content .oo-ui-window-body,
 .oo-ui-dialog-content .oo-ui-window-foot {
   background-color: #fff;
   border: solid 1px #ccc;
   border-radius: 0.5em;
-  -webkit-transform: scale(0.5);
-     -moz-transform: scale(0.5);
-      -ms-transform: scale(0.5);
-       -o-transform: scale(0.5);
-          transform: scale(0.5);
   box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
-  -webkit-transition: all 250ms ease-in-out;
-     -moz-transition: all 250ms ease-in-out;
-      -ms-transition: all 250ms ease-in-out;
-       -o-transition: all 250ms ease-in-out;
-          transition: all 250ms ease-in-out;
 }
 
 .oo-ui-dialog-small > .oo-ui-window-frame {
   max-height: 690px;
 }
 
-.oo-ui-dialog-open {
-  opacity: 1;
-}
-
-.oo-ui-dialog-open > .oo-ui-window-frame {
-  -webkit-transform: scale(1);
-     -moz-transform: scale(1);
-      -ms-transform: scale(1);
-       -o-transform: scale(1);
-          transform: scale(1);
-}
-
 .oo-ui-dialog-content .oo-ui-window-head,
 .oo-ui-dialog-content .oo-ui-window-foot {
   z-index: 1;
diff --git a/resources/lib/oojs-ui/oojs-ui.css b/resources/lib/oojs-ui/oojs-ui.css
new file mode 100644 (file)
index 0000000..fa07706
--- /dev/null
@@ -0,0 +1,1159 @@
+/*!
+ * OOjs UI v0.1.0
+ * https://www.mediawiki.org/wiki/OOjs_UI
+ *
+ * Copyright 2011–2014 OOjs Team and other contributors.
+ * Released under the MIT license
+ * http://oojs.mit-license.org
+ *
+ * Date: Fri May 30 2014 12:12:37 GMT-0700 (PDT)
+ */
+
+/* Textures */
+
+.oo-ui-texture-pending {
+  background-image: /* @embed */ url(images/textures/pending.gif);
+}
+
+.oo-ui-texture-transparency {
+  background-image: /* @embed */ url(images/textures/transparency.png);
+}
+
+/* RTL Definitions */
+
+/* @noflip */
+
+.oo-ui-rtl {
+  direction: rtl;
+}
+
+/* @noflip */
+
+.oo-ui-ltr {
+  direction: ltr;
+}
+
+.oo-ui-dialog {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  padding: 1em;
+  line-height: 1em;
+  /* Fix for strange opacity-related rendering issues.
+          CAUTION: -webkit-backface-visibility: hidden; is EXTREMELY DANGEROUS.
+          If applied to a VE surface directly, it will break selection of
+          FocusableNodes, and in the past it's caused transparent PNGs to
+          render as opaque black images. For some reason applying it to the dialog
+          wrapper in the main document fixes opacity-related behavior in the iframe
+          document, but doesn't break the surface inside the iframe. */
+
+  -webkit-backface-visibility: hidden;
+          backface-visibility: hidden;
+}
+
+.oo-ui-dialog > .oo-ui-window-frame {
+  position: fixed;
+  right: 0;
+  left: 0;
+  min-height: 12em;
+  margin: auto;
+  overflow: hidden;
+}
+
+.oo-ui-dialog > .oo-ui-window-frame .oo-ui-frame {
+  width: 100%;
+  height: 100%;
+}
+
+.oo-ui-dialog-content .oo-ui-window-foot .oo-ui-buttonedElement-framed {
+  float: left;
+}
+
+.oo-ui-dialog-content .oo-ui-window-foot .oo-ui-flaggableElement-primary,
+.oo-ui-dialog-content .oo-ui-window-foot .oo-ui-flaggableElement-constructive,
+.oo-ui-dialog-content .oo-ui-window-foot .oo-ui-flaggableElement-destructive {
+  float: right;
+}
+
+.oo-ui-dialog-content-footless .oo-ui-window-foot {
+  display: none;
+}
+
+.oo-ui-frame {
+  padding: 0;
+  margin: 0;
+}
+
+.oo-ui-frame-body {
+  padding: 0;
+  margin: 0;
+  background: none;
+}
+
+.oo-ui-frame-content:focus {
+  outline: none;
+}
+
+.oo-ui-toolbar {
+  clear: both;
+}
+
+.oo-ui-toolbar-bar {
+  line-height: 1em;
+}
+
+.oo-ui-toolbar-bottom .oo-ui-toolbar-bar {
+  position: absolute;
+}
+
+.oo-ui-toolbar-actions {
+  float: right;
+}
+
+.oo-ui-toolbar-tools {
+  float: left;
+}
+
+.oo-ui-toolbar-tools,
+.oo-ui-toolbar-actions,
+.oo-ui-toolbar-shadow {
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
+}
+
+.oo-ui-toolbar-actions .oo-ui-popupWidget {
+  -webkit-user-select: all;
+     -moz-user-select: all;
+      -ms-user-select: all;
+          user-select: all;
+  -webkit-touch-callout: default;
+}
+
+.oo-ui-toolbar-shadow {
+  position: absolute;
+  width: 100%;
+  pointer-events: none;
+  background-position: left top;
+  background-repeat: repeat-x;
+}
+
+.oo-ui-toolGroup {
+  display: inline-block;
+  margin: 0.3em;
+  vertical-align: middle;
+}
+
+.oo-ui-toolGroup-empty {
+  display: none;
+}
+
+.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-window-head {
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
+}
+
+.oo-ui-window-icon {
+  float: left;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-window-title {
+  float: left;
+  white-space: nowrap;
+  cursor: default;
+}
+
+.oo-ui-window-overlay {
+  position: absolute;
+  top: 0;
+  left: 0;
+}
+
+.oo-ui-buttonedElement .oo-ui-buttonedElement-button {
+  display: inline-block;
+  vertical-align: middle;
+  cursor: pointer;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
+}
+
+.oo-ui-buttonedElement .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+  display: none;
+  margin-left: 0;
+}
+
+.oo-ui-buttonedElement .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator {
+  display: none;
+  margin-right: -0.75em;
+}
+
+.oo-ui-buttonedElement.oo-ui-widget-disabled .oo-ui-buttonedElement-button {
+  cursor: default;
+}
+
+.oo-ui-buttonedElement.oo-ui-indicatedElement .oo-ui-buttonedElement-button > .oo-ui-indicatedElement-indicator,
+.oo-ui-buttonedElement.oo-ui-iconedElement .oo-ui-buttonedElement-button > .oo-ui-iconedElement-icon {
+  display: inline-block;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-buttonedElement-frameless {
+  position: relative;
+  display: inline-block;
+}
+
+.oo-ui-buttonedElement-frameless .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
+  display: inline-block;
+  margin-left: 0.25em;
+  vertical-align: middle;
+}
+
+.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
+  display: inline-block;
+  text-align: center;
+  vertical-align: top;
+}
+
+.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button > .oo-ui-labeledElement-label {
+  display: inline-block;
+  line-height: 1.9em;
+  vertical-align: middle;
+}
+
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button,
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button.oo-ui-buttonedElement-active,
+.oo-ui-buttonedElement-framed.oo-ui-widget-disabled .oo-ui-buttonedElement-button.oo-ui-buttonedElement-pressed {
+  cursor: default;
+}
+
+.oo-ui-clippableElement-clippable {
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
+  overflow-y: hidden;
+}
+
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+  width: 100%;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
+  overflow-y: auto;
+}
+
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
+  padding: 2em;
+}
+
+.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 3em;
+  left: 0;
+  overflow-y: auto;
+}
+
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  left: 0;
+}
+
+.oo-ui-fieldLayout {
+  margin-bottom: 1em;
+}
+
+.oo-ui-fieldLayout:last-child {
+  margin-bottom: 0;
+}
+
+.oo-ui-fieldLayout:before,
+.oo-ui-fieldLayout:after {
+  display: table;
+  content: " ";
+}
+
+.oo-ui-fieldLayout:after {
+  clear: both;
+}
+
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labeledElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labeledElement-label {
+  display: block;
+  float: left;
+  width: 35%;
+  padding-top: 0.5em;
+  margin-right: 5%;
+}
+
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+  display: block;
+  float: left;
+  width: 60%;
+}
+
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labeledElement-label {
+  text-align: right;
+}
+
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labeledElement-label {
+  display: inline-block;
+  padding: 0.75em 0.5em 0.5em 0.5em;
+  vertical-align: middle;
+}
+
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+  display: inline-block;
+  padding: 0.5em 0;
+  vertical-align: middle;
+}
+
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labeledElement-label {
+  padding: 0.5em 0;
+}
+
+.oo-ui-fieldsetLayout {
+  position: relative;
+  padding: 0;
+  margin: 0;
+}
+
+.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
+  margin-top: 2em;
+}
+
+.oo-ui-fieldsetLayout-labeled {
+  margin-top: -0.75em;
+}
+
+.oo-ui-fieldsetLayout > .oo-ui-labeledElement-label {
+  padding: 0.25em 0;
+  margin-bottom: 0.5em;
+}
+
+.oo-ui-fieldsetLayout.oo-ui-iconedElement > .oo-ui-labeledElement-label {
+  padding-left: 1.75em;
+  line-height: 1.33em;
+}
+
+.oo-ui-fieldsetLayout.oo-ui-iconedElement > .oo-ui-iconedElement-icon {
+  position: absolute;
+  top: 0.25em;
+  left: 0;
+  display: block;
+  width: 2em;
+  height: 2em;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-gridLayout {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+}
+
+.oo-ui-labelWidget {
+  padding: 0.5em 0;
+}
+
+.oo-ui-panelLayout-scrollable {
+  overflow-y: auto;
+}
+
+.oo-ui-stackLayout > .oo-ui-panelLayout {
+  display: none;
+}
+
+.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
+  position: relative;
+  display: block;
+}
+
+.oo-ui-barToolGroup > .oo-ui-iconedElement-icon,
+.oo-ui-barToolGroup > .oo-ui-labeledElement-label {
+  display: none;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool {
+  position: relative;
+  display: inline-block;
+  vertical-align: top;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool-link {
+  display: block;
+  height: 1.5em;
+  padding: 0.25em;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  display: block;
+  width: 1.5em;
+  height: 1.5em;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  display: none;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+
+.oo-ui-barToolGroup .oo-ui-tool-title,
+.oo-ui-barToolGroup .oo-ui-tool-accel {
+  display: none;
+}
+
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
+  cursor: pointer;
+}
+
+.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
+  padding: 0.25em;
+}
+
+.oo-ui-listToolGroup .oo-ui-tool {
+  display: inline-block;
+  width: 100%;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.oo-ui-listToolGroup .oo-ui-tool-link {
+  display: block;
+  padding-right: 0.5em;
+  white-space: nowrap;
+  cursor: pointer;
+}
+
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+
+.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
+  min-width: 8em;
+}
+
+.oo-ui-menuToolGroup .oo-ui-tool {
+  display: block;
+}
+
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+  display: block;
+  padding: 0.25em 1em 0.25em 0.25em;
+  white-space: nowrap;
+  cursor: pointer;
+}
+
+.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  background-image: none;
+}
+
+.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  background-image: /* @embed */ url(images/icons/check.png);
+}
+
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+
+.oo-ui-popupToolGroup {
+  position: relative;
+  height: 2em;
+  min-width: 2.5em;
+}
+
+.oo-ui-popupToolGroup.oo-ui-indicatedElement.oo-ui-iconedElement {
+  min-width: 3.5em;
+}
+
+.oo-ui-popupToolGroup-handle {
+  display: block;
+  cursor: pointer;
+}
+
+.oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon {
+  position: absolute;
+  top: 0;
+  width: 2em;
+  height: 2em;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator {
+  right: 0;
+}
+
+.oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon {
+  left: 0.25em;
+}
+
+.oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
+  margin: 0 1em;
+  font-size: 0.8em;
+  line-height: 2.6em;
+}
+
+.oo-ui-popupToolGroup-header {
+  margin: 0 0.6em;
+  font-size: 0.8em;
+  font-weight: bold;
+  line-height: 2.6em;
+}
+
+.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
+  cursor: default;
+}
+
+.oo-ui-popupToolGroup.oo-ui-iconedElement .oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
+  margin-left: 3em;
+}
+
+.oo-ui-popupToolGroup.oo-ui-indicatedElement .oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label {
+  margin-right: 2.25em;
+}
+
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+  position: absolute;
+  top: 2em;
+  left: -1px;
+  z-index: 4;
+  display: none;
+}
+
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconedElement-icon {
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
+  display: block;
+}
+
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon {
+  display: inline-block;
+  width: 2em;
+  height: 2em;
+  margin-right: 0.25em;
+  vertical-align: middle;
+}
+
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  display: inline-block;
+  font-size: 0.8em;
+  line-height: 2em;
+  vertical-align: middle;
+}
+
+.oo-ui-popupToolGroup .oo-ui-tool-accel {
+  display: none;
+}
+
+.oo-ui-popupTool .oo-ui-popupWidget {
+  margin-left: 1.25em;
+  font-size: 0.8em;
+}
+
+.oo-ui-popupTool .oo-ui-popupWidget-popup,
+.oo-ui-popupTool .oo-ui-popupWidget-tail {
+  z-index: 4;
+}
+
+.oo-ui-iconWidget {
+  display: inline-block;
+  width: 1.9em;
+  height: 1.9em;
+  line-height: 2.5em;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+  opacity: 0.8;
+}
+
+.oo-ui-iconWidget.oo-ui-widget-disabled {
+  opacity: 0.2;
+}
+
+.oo-ui-indicatorWidget {
+  display: inline-block;
+  width: 1.9em;
+  height: 1.9em;
+  line-height: 2.5em;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+  opacity: 0.8;
+}
+
+.oo-ui-indicatorWidget.oo-ui-widget-disabled {
+  opacity: 0.2;
+}
+
+.oo-ui-selectWidget {
+  padding: 0;
+  margin: 0;
+  list-style: none;
+}
+
+.oo-ui-optionWidget {
+  position: relative;
+  display: block;
+  margin: 0;
+  list-style: none;
+  cursor: pointer;
+  border: none;
+}
+
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+  cursor: default;
+}
+
+.oo-ui-optionWidget .oo-ui-labeledElement-label {
+  display: block;
+  overflow: hidden;
+  line-height: 1.5em;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.oo-ui-optionWidget .oo-ui-iconedElement-icon,
+.oo-ui-optionWidget .oo-ui-indicatedElement-indicator {
+  position: absolute;
+  top: 50%;
+  width: 2em;
+  height: 2em;
+  margin-top: -1em;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-optionWidget .oo-ui-iconedElement-icon {
+  left: 0.5em;
+}
+
+.oo-ui-optionWidget .oo-ui-indicatedElement-indicator {
+  right: 0.5em;
+}
+
+.oo-ui-menuWidget {
+  position: absolute;
+}
+
+.oo-ui-menuWidget input {
+  position: absolute;
+  width: 0;
+  height: 0;
+  overflow: hidden;
+  opacity: 0;
+}
+
+.oo-ui-popupWidget-popup {
+  position: absolute;
+  overflow: hidden;
+}
+
+.oo-ui-popupWidget-tail {
+  display: none;
+}
+
+.oo-ui-popupWidget-tailed .oo-ui-popupWidget-popup {
+  margin-top: 7px;
+}
+
+.oo-ui-popupWidget-tailed .oo-ui-popupWidget-tail {
+  position: absolute;
+  display: block;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-popupWidget-head {
+  height: 2.5em;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
+}
+
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+  float: right;
+  margin: 0.25em;
+}
+
+.oo-ui-popupWidget-head .oo-ui-labeledElement-label {
+  float: left;
+  margin: 0.75em 1em;
+  cursor: default;
+}
+
+.oo-ui-popupWidget-body {
+  clear: both;
+}
+
+.oo-ui-buttonGroupWidget {
+  border-radius: 0.3em;
+}
+
+.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
+  margin-bottom: -1px;
+  margin-left: -1px;
+  border-radius: 0;
+}
+
+.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed:first-child .oo-ui-buttonedElement-button {
+  margin-left: 0;
+  border-bottom-left-radius: 0.3em;
+  border-top-left-radius: 0.3em;
+}
+
+.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed:last-child .oo-ui-buttonedElement-button {
+  border-top-right-radius: 0.3em;
+  border-bottom-right-radius: 0.3em;
+}
+
+.oo-ui-buttonOptionWidget {
+  display: inline-block;
+  background-color: transparent;
+}
+
+.oo-ui-buttonOptionWidget .oo-ui-buttonedElement-button {
+  position: relative;
+  height: 1.9em;
+}
+
+.oo-ui-buttonOptionWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatedElement .oo-ui-indicatedElement-indicator {
+  position: static;
+  display: inline-block;
+  height: 1.9em;
+  margin-top: 0;
+  vertical-align: middle;
+}
+
+.oo-ui-buttonSelectWidget {
+  display: inline-block;
+  white-space: nowrap;
+}
+
+.oo-ui-buttonWidget {
+  display: inline-block;
+  vertical-align: middle;
+}
+
+.oo-ui-inlineMenuWidget {
+  position: relative;
+  display: inline-block;
+  min-width: 20em;
+  margin: 0.25em 0;
+}
+
+.oo-ui-inlineMenuWidget-handle {
+  display: inline-block;
+  width: 100%;
+  height: 2.5em;
+  cursor: pointer;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
+}
+
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatedElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconedElement-icon {
+  position: absolute;
+  top: 0;
+  width: 2.5em;
+  height: 2.5em;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatedElement-indicator {
+  right: 0;
+}
+
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconedElement-icon {
+  left: 0.25em;
+}
+
+.oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label {
+  margin: 0 0.5em;
+  line-height: 2.5em;
+}
+
+.oo-ui-inlineMenuWidget.oo-ui-iconedElement .oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label {
+  margin-left: 3em;
+}
+
+.oo-ui-inlineMenuWidget.oo-ui-indicatedElement .oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label {
+  margin-right: 2em;
+}
+
+.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
+  z-index: 1;
+  width: 100%;
+}
+
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+  cursor: default;
+}
+
+.oo-ui-menuItemWidget {
+  position: relative;
+}
+
+.oo-ui-menuItemWidget .oo-ui-iconedElement-icon {
+  display: none;
+}
+
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+  background-color: transparent;
+}
+
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconedElement-icon {
+  display: block;
+}
+
+.oo-ui-menuSectionItemWidget {
+  cursor: default;
+}
+
+.oo-ui-outlineControlsWidget {
+  height: 3em;
+}
+
+.oo-ui-outlineControlsWidget-adders,
+.oo-ui-outlineControlsWidget-movers {
+  float: left;
+  height: 2em;
+  padding: 0;
+  margin: 0.5em;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.oo-ui-outlineControlsWidget > .oo-ui-iconedElement-icon {
+  float: left;
+  width: 1.5em;
+  height: 2em;
+  margin: 0.5em 0 0.5em 0.5em;
+  background-position: right center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-outlineControlsWidget-adders {
+  float: left;
+  margin-left: 0;
+}
+
+.oo-ui-outlineControlsWidget-adders .oo-ui-buttonWidget {
+  float: left;
+}
+
+.oo-ui-outlineControlsWidget-movers {
+  float: right;
+}
+
+.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
+  float: right;
+}
+
+.oo-ui-outlineItemWidget {
+  position: relative;
+  padding: 0.75em;
+  cursor: pointer;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
+}
+
+.oo-ui-popupButtonWidget {
+  position: relative;
+}
+
+.oo-ui-popupButtonWidget .oo-ui-popupWidget {
+  position: absolute;
+  left: 1em;
+  cursor: auto;
+}
+
+.oo-ui-searchWidget-query {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  height: 4em;
+  padding: 0 1em;
+}
+
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+  width: 100%;
+  margin: 0.75em 0;
+}
+
+.oo-ui-searchWidget-results {
+  position: absolute;
+  top: 4em;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  padding: 1em;
+  overflow-x: hidden;
+  overflow-y: auto;
+  line-height: 0;
+}
+
+.oo-ui-textInputWidget {
+  position: relative;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+  display: inline-block;
+  width: 100%;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+  resize: none;
+}
+
+.oo-ui-textInputWidget-icon {
+  position: absolute;
+  top: 0;
+  left: 0;
+  height: 100%;
+  background-position: right center;
+  background-repeat: no-repeat;
+}
+
+.oo-ui-toggleSwitchWidget {
+  position: relative;
+  display: inline-block;
+  width: 4em;
+  height: 2em;
+  overflow: hidden;
+  vertical-align: middle;
+  cursor: pointer;
+  -webkit-transform: translateZ(0);
+     -moz-transform: translateZ(0);
+      -ms-transform: translateZ(0);
+       -o-transform: translateZ(0);
+          transform: translateZ(0);
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
+  cursor: default;
+}
+
+.oo-ui-toggleSwitchWidget-grip {
+  position: absolute;
+  top: 0.25em;
+  left: 0.25em;
+  display: block;
+  width: 1.5em;
+  height: 1.5em;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+  -webkit-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+     -moz-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+      -ms-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+       -o-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+          transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+}
+
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  -webkit-transition: opacity 200ms ease-in-out;
+     -moz-transition: opacity 200ms ease-in-out;
+      -ms-transition: opacity 200ms ease-in-out;
+       -o-transition: opacity 200ms ease-in-out;
+          transition: opacity 200ms ease-in-out;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
+}
+
+.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
+  left: 2.25em;
+  margin-left: -2px;
+}
+
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
+  left: 0.25em;
+  margin-left: 0;
+}
+
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+  display: none;
+}
+
+/* Icons */
+
+.oo-ui-icon-add-item {
+  background-image: /* @embed */ url(images/icons/add-item.png);
+}
+
+.oo-ui-icon-advanced {
+  background-image: /* @embed */ url(images/icons/advanced.png);
+}
+
+.oo-ui-icon-alert {
+  background-image: /* @embed */ url(images/icons/alert.png);
+}
+
+.oo-ui-icon-check {
+  background-image: /* @embed */ url(images/icons/check.png);
+}
+
+.oo-ui-icon-clear {
+  background-image: /* @embed */ url(images/icons/clear.png);
+}
+
+.oo-ui-icon-close {
+  background-image: /* @embed */ url(images/icons/close.png);
+}
+
+.oo-ui-icon-code {
+  background-image: /* @embed */ url(images/icons/code.png);
+}
+
+.oo-ui-icon-collapse {
+  background-image: /* @embed */ url(images/icons/collapse.png);
+}
+
+.oo-ui-icon-comment {
+  background-image: /* @embed */ url(images/icons/comment.png);
+}
+
+.oo-ui-icon-expand {
+  background-image: /* @embed */ url(images/icons/expand.png);
+}
+
+.oo-ui-icon-help {
+  background-image: /* @embed */ url(images/icons/help.png);
+}
+
+.oo-ui-icon-info {
+  background-image: /* @embed */ url(images/icons/info.png);
+}
+
+.oo-ui-icon-link {
+  background-image: /* @embed */ url(images/icons/link.png);
+}
+
+.oo-ui-icon-menu {
+  background-image: /* @embed */ url(images/icons/menu.png);
+}
+
+.oo-ui-icon-next {
+  background-image: /* @embed */ url(images/icons/move-ltr.png);
+}
+
+.oo-ui-icon-picture {
+  background-image: /* @embed */ url(images/icons/picture.png);
+}
+
+.oo-ui-icon-previous {
+  background-image: /* @embed */ url(images/icons/move-rtl.png);
+}
+
+.oo-ui-icon-redo {
+  background-image: /* @embed */ url(images/icons/arched-arrow-ltr.png);
+}
+
+.oo-ui-icon-remove {
+  background-image: /* @embed */ url(images/icons/remove.png);
+}
+
+.oo-ui-icon-search {
+  background-image: /* @embed */ url(images/icons/search.png);
+}
+
+.oo-ui-icon-settings {
+  background-image: /* @embed */ url(images/icons/settings.png);
+}
+
+.oo-ui-icon-tag {
+  background-image: /* @embed */ url(images/icons/tag.png);
+}
+
+.oo-ui-icon-undo {
+  background-image: /* @embed */ url(images/icons/arched-arrow-rtl.png);
+}
+
+.oo-ui-icon-window {
+  background-image: /* @embed */ url(images/icons/window.png);
+}
+
+/* Indicators */
+
+.oo-ui-indicator-alert {
+  background-image: /* @embed */ url(images/indicators/alert.png);
+}
+
+.oo-ui-indicator-down {
+  background-image: /* @embed */ url(images/indicators/down.png);
+}
+
+.oo-ui-indicator-required {
+  background-image: /* @embed */ url(images/indicators/required.png);
+}
+
+.oo-ui-indicator-up {
+  background-image: /* @embed */ url(images/indicators/up.png);
+}
\ No newline at end of file
index 0dcadd4..7e3aadf 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (7b283a9dcc)
+ * OOjs UI v0.1.0-pre (7a0e222a75)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: Tue May 27 2014 15:41:42 GMT-0700 (PDT)
+ * Date: Wed Jun 18 2014 16:19:15 GMT-0700 (PDT)
  */
 ( function ( OO ) {
 
@@ -486,18 +486,32 @@ OO.ui.Element.scrollIntoView = function ( el, config ) {
        // Configuration initialization
        config = config || {};
 
-       var anim = {},
+       var rel, anim = {},
                callback = typeof config.complete === 'function' && config.complete,
                sc = this.getClosestScrollableContainer( el, config.direction ),
                $sc = $( sc ),
                eld = this.getDimensions( el ),
                scd = this.getDimensions( sc ),
+               $win = $( this.getWindow( el ) );
+
+       // Compute the distances between the edges of el and the edges of the scroll viewport
+       if ( $sc.is( 'body' ) ) {
+               // If the scrollable container is the <body> this is easy
+               rel = {
+                       'top': eld.rect.top,
+                       'bottom': $win.innerHeight() - eld.rect.bottom,
+                       'left': eld.rect.left,
+                       'right': $win.innerWidth() - eld.rect.right
+               };
+       } else {
+               // Otherwise, we have to subtract el's coordinates from sc's coordinates
                rel = {
                        'top': eld.rect.top - ( scd.rect.top + scd.borders.top ),
                        'bottom': scd.rect.bottom - scd.borders.bottom - scd.scrollbar.bottom - eld.rect.bottom,
                        'left': eld.rect.left - ( scd.rect.left + scd.borders.left ),
                        'right': scd.rect.right - scd.borders.right - scd.scrollbar.right - eld.rect.right
                };
+       }
 
        if ( !config.direction || config.direction === 'y' ) {
                if ( rel.top < 0 ) {
@@ -606,6 +620,7 @@ OO.ui.Element.prototype.scrollElementIntoView = function ( config ) {
 /**
  * Bind a handler for an event on this.$element
  *
+ * @deprecated Use jQuery#on instead.
  * @param {string} event
  * @param {Function} callback
  */
@@ -616,6 +631,7 @@ OO.ui.Element.prototype.onDOMEvent = function ( event, callback ) {
 /**
  * Unbind a handler bound with #offDOMEvent
  *
+ * @deprecated Use jQuery#off instead.
  * @param {string} event
  * @param {Function} callback
  */
@@ -624,105 +640,33 @@ OO.ui.Element.prototype.offDOMEvent = function ( event, callback ) {
 };
 
 ( function () {
-       // Static
-
-       // jQuery 1.8.3 has a bug with handling focusin/focusout events inside iframes.
-       // Firefox doesn't support focusin/focusout at all, so we listen for 'focus'/'blur' on the
-       // document, and simulate a 'focusin'/'focusout' event on the target element and make
-       // it bubble from there.
-       //
-       // - http://jsfiddle.net/sw3hr/
-       // - http://bugs.jquery.com/ticket/14180
-       // - https://github.com/jquery/jquery/commit/1cecf64e5aa4153
-       function specialEvent( simulatedName, realName ) {
-               function handler( e ) {
-                       jQuery.event.simulate(
-                               simulatedName,
-                               e.target,
-                               jQuery.event.fix( e ),
-                               /* bubble = */ true
-                       );
-               }
-
-               return {
-                       setup: function () {
-                               var doc = this.ownerDocument || this,
-                                       attaches = $.data( doc, 'ooui-' + simulatedName + '-attaches' );
-                               if ( !attaches ) {
-                                       doc.addEventListener( realName, handler, true );
-                               }
-                               $.data( doc, 'ooui-' + simulatedName + '-attaches', ( attaches || 0 ) + 1 );
-                       },
-                       teardown: function () {
-                               var doc = this.ownerDocument || this,
-                                       attaches = $.data( doc, 'ooui-' + simulatedName + '-attaches' ) - 1;
-                               if ( !attaches ) {
-                                       doc.removeEventListener( realName, handler, true );
-                                       $.removeData( doc, 'ooui-' + simulatedName + '-attaches' );
-                               } else {
-                                       $.data( doc, 'ooui-' + simulatedName + '-attaches', attaches );
-                               }
-                       }
-               };
-       }
-
-       var hasOwn = Object.prototype.hasOwnProperty,
-               specialEvents = {
-                       focusin: specialEvent( 'focusin', 'focus' ),
-                       focusout: specialEvent( 'focusout', 'blur' )
-               };
-
        /**
         * Bind a handler for an event on a DOM element.
         *
-        * Uses jQuery internally for everything except for events which are
-        * known to have issues in the browser or in jQuery. This method
-        * should become obsolete eventually.
+        * Used to be for working around a jQuery bug (jqbug.com/14180),
+        * but obsolete as of jQuery 1.11.0.
         *
         * @static
+        * @deprecated Use jQuery#on instead.
         * @param {HTMLElement|jQuery} el DOM element
         * @param {string} event Event to bind
         * @param {Function} callback Callback to call when the event fires
         */
        OO.ui.Element.onDOMEvent = function ( el, event, callback ) {
-               var orig;
-
-               if ( hasOwn.call( specialEvents, event ) ) {
-                       // Replace jQuery's override with our own
-                       orig = $.event.special[event];
-                       $.event.special[event] = specialEvents[event];
-
-                       $( el ).on( event, callback );
-
-                       // Restore
-                       $.event.special[event] = orig;
-               } else {
-                       $( el ).on( event, callback );
-               }
+               $( el ).on( event, callback );
        };
 
        /**
         * Unbind a handler bound with #static-method-onDOMEvent.
         *
+        * @deprecated Use jQuery#off instead.
         * @static
         * @param {HTMLElement|jQuery} el DOM element
         * @param {string} event Event to unbind
         * @param {Function} [callback] Callback to unbind
         */
        OO.ui.Element.offDOMEvent = function ( el, event, callback ) {
-               var orig;
-               if ( hasOwn.call( specialEvents, event ) ) {
-                       // Replace jQuery's override with our own
-                       orig = $.event.special[event];
-                       $.event.special[event] = specialEvents[event];
-
-                       $( el ).off( event, callback );
-
-                       // Restore
-                       $.event.special[event] = orig;
-               } else {
-                       $( el ).off( event, callback );
-               }
+               $( el ).off( event, callback );
        };
 }() );
 /**
@@ -743,8 +687,7 @@ OO.ui.Frame = function OoUiFrame( config ) {
        OO.EventEmitter.call( this );
 
        // Properties
-       this.loading = false;
-       this.loaded = false;
+       this.loading = null;
        this.config = config;
 
        // Initialize
@@ -780,10 +723,10 @@ OO.ui.Frame.static.tagName = 'iframe';
  *
  * This loops over the style sheets in the parent document, and copies their nodes to the
  * frame's document. It then polls the document to see when all styles have loaded, and once they
- * have, invokes the callback.
+ * have, resolves the promise.
  *
  * If the styles still haven't loaded after a long time (5 seconds by default), we give up waiting
- * and invoke the callback anyway. This protects against cases like a display: none; iframe in
+ * and resolve the promise anyway. This protects against cases like a display: none; iframe in
  * Firefox, where the styles won't load until the iframe becomes visible.
  *
  * For details of how we arrived at the strategy used in this function, see #load.
@@ -792,18 +735,19 @@ OO.ui.Frame.static.tagName = 'iframe';
  * @inheritable
  * @param {HTMLDocument} parentDoc Document to transplant styles from
  * @param {HTMLDocument} frameDoc Document to transplant styles to
- * @param {Function} [callback] Callback to execute once styles have loaded
  * @param {number} [timeout=5000] How long to wait before giving up (in ms). If 0, never give up.
+ * @return {jQuery.Promise} Promise resolved when styles have loaded
  */
-OO.ui.Frame.static.transplantStyles = function ( parentDoc, frameDoc, callback, timeout ) {
+OO.ui.Frame.static.transplantStyles = function ( parentDoc, frameDoc, timeout ) {
        var i, numSheets, styleNode, newNode, timeoutID, pollNodeId, $pendingPollNodes,
                $pollNodes = $( [] ),
                // Fake font-family value
-               fontFamily = 'oo-ui-frame-transplantStyles-loaded';
+               fontFamily = 'oo-ui-frame-transplantStyles-loaded',
+               deferred = $.Deferred();
 
        for ( i = 0, numSheets = parentDoc.styleSheets.length; i < numSheets; i++ ) {
                styleNode = parentDoc.styleSheets[i].ownerNode;
-               if ( callback && styleNode.nodeName.toLowerCase() === 'link' ) {
+               if ( styleNode.nodeName.toLowerCase() === 'link' ) {
                        // External stylesheet
                        // Create a node with a unique ID that we're going to monitor to see when the CSS
                        // has loaded
@@ -825,40 +769,40 @@ OO.ui.Frame.static.transplantStyles = function ( parentDoc, frameDoc, callback,
                frameDoc.head.appendChild( newNode );
        }
 
-       if ( callback ) {
-               // Poll every 100ms until all external stylesheets have loaded
-               $pendingPollNodes = $pollNodes;
-               timeoutID = setTimeout( function pollExternalStylesheets() {
-                       while (
-                               $pendingPollNodes.length > 0 &&
-                               $pendingPollNodes.eq( 0 ).css( 'font-family' ) === fontFamily
-                       ) {
-                               $pendingPollNodes = $pendingPollNodes.slice( 1 );
-                       }
+       // Poll every 100ms until all external stylesheets have loaded
+       $pendingPollNodes = $pollNodes;
+       timeoutID = setTimeout( function pollExternalStylesheets() {
+               while (
+                       $pendingPollNodes.length > 0 &&
+                       $pendingPollNodes.eq( 0 ).css( 'font-family' ) === fontFamily
+               ) {
+                       $pendingPollNodes = $pendingPollNodes.slice( 1 );
+               }
 
-                       if ( $pendingPollNodes.length === 0 ) {
-                               // We're done!
-                               if ( timeoutID !== null ) {
-                                       timeoutID = null;
-                                       $pollNodes.remove();
-                                       callback();
-                               }
-                       } else {
-                               timeoutID = setTimeout( pollExternalStylesheets, 100 );
+               if ( $pendingPollNodes.length === 0 ) {
+                       // We're done!
+                       if ( timeoutID !== null ) {
+                               timeoutID = null;
+                               $pollNodes.remove();
+                               deferred.resolve();
                        }
-               }, 100 );
-               // ...but give up after a while
-               if ( timeout !== 0 ) {
-                       setTimeout( function () {
-                               if ( timeoutID ) {
-                                       clearTimeout( timeoutID );
-                                       timeoutID = null;
-                                       $pollNodes.remove();
-                                       callback();
-                               }
-                       }, timeout || 5000 );
+               } else {
+                       timeoutID = setTimeout( pollExternalStylesheets, 100 );
                }
+       }, 100 );
+       // ...but give up after a while
+       if ( timeout !== 0 ) {
+               setTimeout( function () {
+                       if ( timeoutID ) {
+                               clearTimeout( timeoutID );
+                               timeoutID = null;
+                               $pollNodes.remove();
+                               deferred.reject();
+                       }
+               }, timeout || 5000 );
        }
+
+       return deferred.promise();
 };
 
 /* Methods */
@@ -866,7 +810,10 @@ OO.ui.Frame.static.transplantStyles = function ( parentDoc, frameDoc, callback,
 /**
  * Load the frame contents.
  *
- * Once the iframe's stylesheets are loaded, the `initialize` event will be emitted.
+ * Once the iframe's stylesheets are loaded, the `load` event will be emitted and the returned
+ * promise will be resolved. Calling while loading will return a promise but not trigger a new
+ * loading cycle. Calling after loading is complete will return a promise that's already been
+ * resolved.
  *
  * Sounds simple right? Read on...
  *
@@ -894,15 +841,22 @@ OO.ui.Frame.static.transplantStyles = function ( parentDoc, frameDoc, callback,
  *
  * All this stylesheet injection and polling magic is in #transplantStyles.
  *
- * @private
+ * @return {jQuery.Promise} Promise resolved when loading is complete
  * @fires load
  */
 OO.ui.Frame.prototype.load = function () {
-       var win = this.$element.prop( 'contentWindow' ),
-               doc = win.document,
-               frame = this;
+       var win, doc;
+
+       // Return existing promise if already loading or loaded
+       if ( this.loading ) {
+               return this.loading.promise();
+       }
 
-       this.loading = true;
+       // Load the frame
+       this.loading = $.Deferred();
+
+       win = this.$element.prop( 'contentWindow' );
+       doc = win.document;
 
        // Figure out directionality:
        this.dir = OO.ui.Element.getDir( this.$element ) || 'ltr';
@@ -924,37 +878,14 @@ OO.ui.Frame.prototype.load = function () {
        this.$content = this.$( '.oo-ui-frame-content' ).attr( 'tabIndex', 0 );
        this.$document = this.$( doc );
 
-       this.constructor.static.transplantStyles(
-               this.getElementDocument(),
-               this.$document[0],
-               function () {
-                       frame.loading = false;
-                       frame.loaded = true;
-                       frame.emit( 'load' );
-               }
-       );
-};
+       // Initialization
+       this.constructor.static.transplantStyles( this.getElementDocument(), this.$document[0] )
+               .always( OO.ui.bind( function () {
+                       this.emit( 'load' );
+                       this.loading.resolve();
+               }, this ) );
 
-/**
- * Run a callback as soon as the frame has been loaded.
- *
- *
- * This will start loading if it hasn't already, and runs
- * immediately if the frame is already loaded.
- *
- * Don't call this until the element is attached.
- *
- * @param {Function} callback
- */
-OO.ui.Frame.prototype.run = function ( callback ) {
-       if ( this.loaded ) {
-               callback();
-       } else {
-               if ( !this.loading ) {
-                       this.load();
-               }
-               this.once( 'load', callback );
-       }
+       return this.loading.promise();
 };
 
 /**
@@ -995,8 +926,9 @@ OO.ui.Window = function OoUiWindow( config ) {
 
        // Properties
        this.visible = false;
-       this.opening = false;
-       this.closing = false;
+       this.opening = null;
+       this.closing = null;
+       this.opened = null;
        this.title = OO.ui.resolveMsg( config.title || this.constructor.static.title );
        this.icon = config.icon || this.constructor.static.icon;
        this.frame = new OO.ui.Frame( { '$': this.$ } );
@@ -1035,28 +967,29 @@ OO.mixinClass( OO.ui.Window, OO.EventEmitter );
 /* Events */
 
 /**
- * Initialize contents.
+ * Window is setup.
  *
- * Fired asynchronously after construction when iframe is ready.
+ * Fired after the setup process has been executed.
  *
- * @event initialize
+ * @event setup
+ * @param {Object} data Window opening data
  */
 
 /**
- * Open window.
+ * Window is ready.
  *
- * Fired after window has been opened.
+ * Fired after the ready process has been executed.
  *
- * @event open
+ * @event ready
  * @param {Object} data Window opening data
  */
 
 /**
- * Close window.
+ * Window is torn down
  *
- * Fired after window has been closed.
+ * Fired after the teardown process has been executed.
  *
- * @event close
+ * @event teardown
  * @param {Object} data Window closing data
  */
 
@@ -1101,7 +1034,7 @@ OO.ui.Window.prototype.isVisible = function () {
  * @return {boolean} Window is opening
  */
 OO.ui.Window.prototype.isOpening = function () {
-       return this.opening;
+       return !!this.opening && this.opening.state() === 'pending';
 };
 
 /**
@@ -1110,7 +1043,16 @@ OO.ui.Window.prototype.isOpening = function () {
  * @return {boolean} Window is closing
  */
 OO.ui.Window.prototype.isClosing = function () {
-       return this.closing;
+       return !!this.closing && this.closing.state() === 'pending';
+};
+
+/**
+ * Check if window is opened.
+ *
+ * @return {boolean} Window is opened
+ */
+OO.ui.Window.prototype.isOpened = function () {
+       return !!this.opened && this.opened.state() === 'pending';
 };
 
 /**
@@ -1246,7 +1188,6 @@ OO.ui.Window.prototype.fitWidthToContents = function ( min, max ) {
  *
  * Once this method is called, this.$$ can be used to create elements within the frame.
  *
- * @fires initialize
  * @chainable
  */
 OO.ui.Window.prototype.initialize = function () {
@@ -1273,93 +1214,156 @@ OO.ui.Window.prototype.initialize = function () {
 };
 
 /**
- * Setup window for use.
+ * Get a process for setting up a window for use.
+ *
+ * Each time the window is opened this process will set it up for use in a particular context, based
+ * on the `data` argument.
+ *
+ * When you override this method, you can add additional setup steps to the process the parent
+ * method provides using the 'first' and 'next' methods.
+ *
+ * @abstract
+ * @param {Object} [data] Window opening data
+ * @return {OO.ui.Process} Setup process
+ */
+OO.ui.Window.prototype.getSetupProcess = function () {
+       return new OO.ui.Process();
+};
+
+/**
+ * Get a process for readying a window for use.
  *
- * Each time the window is opened, once it's ready to be interacted with, this will set it up for
- * use in a particular context, based on the `data` argument.
+ * Each time the window is open and setup, this process will ready it up for use in a particular
+ * context, based on the `data` argument.
  *
- * When you override this method, you must call the parent method at the very beginning.
+ * When you override this method, you can add additional setup steps to the process the parent
+ * method provides using the 'first' and 'next' methods.
  *
  * @abstract
  * @param {Object} [data] Window opening data
+ * @return {OO.ui.Process} Setup process
  */
-OO.ui.Window.prototype.setup = function () {
-       // Override to do something
+OO.ui.Window.prototype.getReadyProcess = function () {
+       return new OO.ui.Process();
 };
 
 /**
- * Tear down window after use.
+ * Get a process for tearing down a window after use.
  *
- * Each time the window is closed, and it's done being interacted with, this will tear it down and
- * do something with the user's interactions within the window, based on the `data` argument.
+ * Each time the window is closed this process will tear it down and do something with the user's
+ * interactions within the window, based on the `data` argument.
  *
- * When you override this method, you must call the parent method at the very end.
+ * When you override this method, you can add additional teardown steps to the process the parent
+ * method provides using the 'first' and 'next' methods.
  *
  * @abstract
  * @param {Object} [data] Window closing data
+ * @return {OO.ui.Process} Teardown process
  */
-OO.ui.Window.prototype.teardown = function () {
-       // Override to do something
+OO.ui.Window.prototype.getTeardownProcess = function () {
+       return new OO.ui.Process();
 };
 
 /**
  * Open window.
  *
- * Do not override this method. See #setup for a way to make changes each time the window opens.
+ * Do not override this method. Use #getSetupProcess to do something each time the window closes.
  *
  * @param {Object} [data] Window opening data
+ * @fires initialize
  * @fires opening
  * @fires open
  * @fires ready
- * @chainable
+ * @return {jQuery.Promise} Promise resolved when window is opened; when the promise is resolved the
+ *   first argument will be a promise which will be resolved when the window begins closing
  */
 OO.ui.Window.prototype.open = function ( data ) {
-       if ( !this.opening && !this.closing && !this.visible ) {
-               this.opening = true;
-               this.frame.run( OO.ui.bind( function () {
-                       this.$element.show();
-                       this.visible = true;
-                       this.emit( 'opening', data );
-                       this.setup( data );
-                       this.emit( 'open', data );
+       // Return existing promise if already opening or open
+       if ( this.opening ) {
+               return this.opening.promise();
+       }
+
+       // Open the window
+       this.opening = $.Deferred();
+
+       // So we can restore focus on closing
+       this.$prevFocus = $( document.activeElement );
+
+       this.frame.load().done( OO.ui.bind( function () {
+               this.$element.show();
+               this.visible = true;
+               this.getSetupProcess( data ).execute().done( OO.ui.bind( function () {
+                       this.$element.addClass( 'oo-ui-window-setup' );
+                       this.emit( 'setup', data );
                        setTimeout( OO.ui.bind( function () {
-                               // Focus the content div (which has a tabIndex) to inactivate
-                               // (but not clear) selections in the parent frame.
-                               // Must happen after 'open' is emitted (to ensure it is visible)
-                               // but before 'ready' is emitted (so subclasses can give focus to something else)
                                this.frame.$content.focus();
-                               this.emit( 'ready', data );
-                               this.opening = false;
+                               this.getReadyProcess( data ).execute().done( OO.ui.bind( function () {
+                                       this.$element.addClass( 'oo-ui-window-ready' );
+                                       this.emit( 'ready', data );
+                                       this.opened = $.Deferred();
+                                       // Now that we are totally done opening, it's safe to allow closing
+                                       this.closing = null;
+                                       this.opening.resolve( this.opened.promise() );
+                               }, this ) );
                        }, this ) );
                }, this ) );
-       }
+       }, this ) );
 
-       return this;
+       return this.opening.promise();
 };
 
 /**
  * Close window.
  *
- * See #teardown for a way to do something each time the window closes.
+ * Do not override this method. Use #getTeardownProcess to do something each time the window closes.
  *
  * @param {Object} [data] Window closing data
  * @fires closing
  * @fires close
- * @chainable
+ * @return {jQuery.Promise} Promise resolved when window is closed
  */
 OO.ui.Window.prototype.close = function ( data ) {
-       if ( !this.opening && !this.closing && this.visible ) {
-               this.frame.$content.find( ':focus' ).blur();
-               this.closing = true;
+       var close;
+
+       // Return existing promise if already closing or closed
+       if ( this.closing ) {
+               return this.closing.promise();
+       }
+
+       // Close after opening is done if opening is in progress
+       if ( this.opening && this.opening.state() === 'pending' ) {
+               close = OO.ui.bind( function () {
+                       return this.close( data );
+               }, this );
+               return this.opening.then( close, close );
+       }
+
+       // Close the window
+       // This.closing needs to exist before we emit the closing event so that handlers can call
+       // window.close() and trigger the safety check above
+       this.closing = $.Deferred();
+       this.frame.$content.find( ':focus' ).blur();
+       this.$element.removeClass( 'oo-ui-window-ready' );
+       this.getTeardownProcess( data ).execute().done( OO.ui.bind( function () {
+               this.$element.removeClass( 'oo-ui-window-setup' );
+               this.emit( 'teardown', data );
+               // To do something different with #opened, resolve/reject #opened in the teardown process
+               if ( this.opened && this.opened.state() === 'pending' ) {
+                       this.opened.resolve();
+               }
                this.$element.hide();
+               // Restore focus to whatever was focused before opening
+               if ( this.$prevFocus ) {
+                       this.$prevFocus.focus();
+                       this.$prevFocus = undefined;
+               }
                this.visible = false;
-               this.emit( 'closing', data );
-               this.teardown( data );
-               this.emit( 'close', data );
-               this.closing = false;
-       }
+               this.closing.resolve();
+               // Now that we are totally done closing, it's safe to allow opening
+               this.opening = null;
+       }, this ) );
 
-       return this;
+       return this.closing.promise();
 };
 /**
  * Set of mutually exclusive windows.
@@ -1409,78 +1413,61 @@ OO.mixinClass( OO.ui.WindowSet, OO.EventEmitter );
 /* Events */
 
 /**
- * @event opening
- * @param {OO.ui.Window} win Window that's being opened
+ * @event setup
+ * @param {OO.ui.Window} win Window that's been setup
  * @param {Object} config Window opening information
  */
 
 /**
- * @event open
- * @param {OO.ui.Window} win Window that's been opened
+ * @event ready
+ * @param {OO.ui.Window} win Window that's ready
  * @param {Object} config Window opening information
  */
 
 /**
- * @event closing
- * @param {OO.ui.Window} win Window that's being closed
- * @param {Object} config Window closing information
- */
-
-/**
- * @event close
- * @param {OO.ui.Window} win Window that's been closed
+ * @event teardown
+ * @param {OO.ui.Window} win Window that's been torn down
  * @param {Object} config Window closing information
  */
 
 /* Methods */
 
 /**
- * Handle a window that's being opened.
+ * Handle a window setup event.
  *
- * @param {OO.ui.Window} win Window that's being opened
+ * @param {OO.ui.Window} win Window that's been setup
  * @param {Object} [config] Window opening information
- * @fires opening
+ * @fires setup
  */
-OO.ui.WindowSet.prototype.onWindowOpening = function ( win, config ) {
+OO.ui.WindowSet.prototype.onWindowSetup = function ( win, config ) {
        if ( this.currentWindow && this.currentWindow !== win ) {
                this.currentWindow.close();
        }
        this.currentWindow = win;
-       this.emit( 'opening', win, config );
+       this.emit( 'setup', win, config );
 };
 
 /**
- * Handle a window that's been opened.
+ * Handle a window ready event.
  *
- * @param {OO.ui.Window} win Window that's been opened
+ * @param {OO.ui.Window} win Window that's ready
  * @param {Object} [config] Window opening information
- * @fires open
+ * @fires ready
  */
-OO.ui.WindowSet.prototype.onWindowOpen = function ( win, config ) {
-       this.emit( 'open', win, config );
+OO.ui.WindowSet.prototype.onWindowReady = function ( win, config ) {
+       this.emit( 'ready', win, config );
 };
 
 /**
- * Handle a window that's being closed.
+ * Handle a window teardown event.
  *
- * @param {OO.ui.Window} win Window that's being closed
+ * @param {OO.ui.Window} win Window that's been torn down
  * @param {Object} [config] Window closing information
- * @fires closing
+ * @fires teardown
  */
-OO.ui.WindowSet.prototype.onWindowClosing = function ( win, config ) {
+OO.ui.WindowSet.prototype.onWindowTeardown = function ( win, config ) {
        this.currentWindow = null;
-       this.emit( 'closing', win, config );
-};
-
-/**
- * Handle a window that's been closed.
- *
- * @param {OO.ui.Window} win Window that's been closed
- * @param {Object} [config] Window closing information
- * @fires close
- */
-OO.ui.WindowSet.prototype.onWindowClose = function ( win, config ) {
-       this.emit( 'close', win, config );
+       this.emit( 'teardown', win, config );
 };
 
 /**
@@ -1527,7 +1514,7 @@ OO.ui.WindowSet.prototype.createWindow = function ( name ) {
  * Connects event handlers and attaches it to the DOM. Calling
  * OO.ui.Window#open will not work until the window is added to the set.
  *
- * @param {OO.ui.Window} win
+ * @param {OO.ui.Window} win Window to add
  */
 OO.ui.WindowSet.prototype.addWindow = function ( win ) {
        if ( this.windowList.indexOf( win ) !== -1 ) {
@@ -1537,10 +1524,9 @@ OO.ui.WindowSet.prototype.addWindow = function ( win ) {
        this.windowList.push( win );
 
        win.connect( this, {
-               'opening': [ 'onWindowOpening', win ],
-               'open': [ 'onWindowOpen', win ],
-               'closing': [ 'onWindowClosing', win ],
-               'close': [ 'onWindowClose', win ]
+               'setup': [ 'onWindowSetup', win ],
+               'ready': [ 'onWindowReady', win ],
+               'teardown': [ 'onWindowTeardown', win ]
        } );
        this.$element.append( win.$element );
 };
@@ -1573,10 +1559,9 @@ OO.ui.Dialog = function OoUiDialog( config ) {
 
        // Events
        this.$element.on( 'mousedown', false );
-       this.connect( this, { 'opening': 'onOpening' } );
 
        // Initialization
-       this.$element.addClass( 'oo-ui-dialog' );
+       this.$element.addClass( 'oo-ui-dialog' ).attr( 'role', 'dialog' );
        this.setSize( config.size );
 };
 
@@ -1659,11 +1644,6 @@ OO.ui.Dialog.prototype.onFrameDocumentKeyDown = function ( e ) {
        }
 };
 
-/** */
-OO.ui.Dialog.prototype.onOpening = function () {
-       this.$element.addClass( 'oo-ui-dialog-open' );
-};
-
 /**
  * Set dialog size.
  *
@@ -1681,9 +1661,6 @@ OO.ui.Dialog.prototype.setSize = function ( size ) {
                state = name === size;
                cssClass = sizeCssClasses[name];
                this.$element.toggleClass( cssClass, state );
-               if ( this.frame.$content ) {
-                       this.frame.$content.toggleClass( cssClass, state );
-               }
        }
 };
 
@@ -1692,7 +1669,7 @@ OO.ui.Dialog.prototype.setSize = function ( size ) {
  */
 OO.ui.Dialog.prototype.initialize = function () {
        // Parent method
-       OO.ui.Window.prototype.initialize.call( this );
+       OO.ui.Dialog.super.prototype.initialize.call( this );
 
        // Properties
        this.closeButton = new OO.ui.ButtonWidget( {
@@ -1718,41 +1695,29 @@ OO.ui.Dialog.prototype.initialize = function () {
 /**
  * @inheritdoc
  */
-OO.ui.Dialog.prototype.setup = function ( data ) {
-       // Parent method
-       OO.ui.Window.prototype.setup.call( this, data );
-
-       // Prevent scrolling in top-level window
-       this.$( window ).on( 'mousewheel', this.onWindowMouseWheelHandler );
-       this.$( document ).on( 'keydown', this.onDocumentKeyDownHandler );
-};
-
-/**
- * @inheritdoc
- */
-OO.ui.Dialog.prototype.teardown = function ( data ) {
-       // Parent method
-       OO.ui.Window.prototype.teardown.call( this, data );
-
-       // Allow scrolling in top-level window
-       this.$( window ).off( 'mousewheel', this.onWindowMouseWheelHandler );
-       this.$( document ).off( 'keydown', this.onDocumentKeyDownHandler );
+OO.ui.Dialog.prototype.getSetupProcess = function ( data ) {
+       return OO.ui.Dialog.super.prototype.getSetupProcess.call( this, data )
+               .next( function () {
+                       // Prevent scrolling in top-level window
+                       this.$( window ).on( 'mousewheel', this.onWindowMouseWheelHandler );
+                       this.$( document ).on( 'keydown', this.onDocumentKeyDownHandler );
+               }, this );
 };
 
 /**
  * @inheritdoc
  */
-OO.ui.Dialog.prototype.close = function ( data ) {
-       var dialog = this;
-       if ( !dialog.opening && !dialog.closing && dialog.visible ) {
-               // Trigger transition
-               dialog.$element.removeClass( 'oo-ui-dialog-open' );
-               // Allow transition to complete before actually closing
-               setTimeout( function () {
-                       // Parent method
-                       OO.ui.Window.prototype.close.call( dialog, data );
-               }, 250 );
-       }
+OO.ui.Dialog.prototype.getTeardownProcess = function ( data ) {
+       return OO.ui.Dialog.super.prototype.getTeardownProcess.call( this, data )
+               .first( function () {
+                       // Wait for closing transition
+                       return OO.ui.Process.static.delay( 250 );
+               }, this )
+               .next( function () {
+                       // Allow scrolling in top-level window
+                       this.$( window ).off( 'mousewheel', this.onWindowMouseWheelHandler );
+                       this.$( document ).off( 'keydown', this.onDocumentKeyDownHandler );
+               }, this );
 };
 
 /**
@@ -1911,6 +1876,122 @@ OO.ui.Widget.prototype.setDisabled = function ( disabled ) {
        this.wasDisabled = isDisabled;
        return this;
 };
+/**
+ * A list of functions, called in sequence.
+ *
+ * If a function added to a process returns boolean false the process will stop; if it returns an
+ * object with a `promise` method the process will use the promise to either continue to the next
+ * step when the promise is resolved or stop when the promise is rejected.
+ *
+ * @class
+ *
+ * @constructor
+ */
+OO.ui.Process = function () {
+       // Properties
+       this.steps = [];
+};
+
+/* Setup */
+
+OO.initClass( OO.ui.Process );
+
+/* Static Methods */
+
+/**
+ * Generate a promise which is resolved after a set amount of time.
+ *
+ * @param {number} length Number of milliseconds before resolving the promise
+ * @return {jQuery.Promise} Promise that will be resolved after a set amount of time
+ */
+OO.ui.Process.static.delay = function ( length ) {
+       var deferred = $.Deferred();
+
+       setTimeout( function () {
+               deferred.resolve();
+       }, length );
+
+       return deferred.promise();
+};
+
+/* Methods */
+
+/**
+ * Start the process.
+ *
+ * @return {jQuery.Promise} Promise that is resolved when all steps have completed or rejected when
+ *   any of the steps return boolean false or a promise which gets rejected; upon stopping the
+ *   process, the remaining steps will not be taken
+ */
+OO.ui.Process.prototype.execute = function () {
+       var i, len, promise;
+
+       /**
+        * Continue execution.
+        *
+        * @ignore
+        * @param {Array} step A function and the context it should be called in
+        * @return {Function} Function that continues the process
+        */
+       function proceed( step ) {
+               return function () {
+                       // Execute step in the correct context
+                       var result = step[0].call( step[1] );
+
+                       if ( result === false ) {
+                               // Use rejected promise for boolean false results
+                               return $.Deferred().reject().promise();
+                       }
+                       // Duck-type the object to see if it can produce a promise
+                       if ( result && $.isFunction( result.promise ) ) {
+                               // Use a promise generated from the result
+                               return result.promise();
+                       }
+                       // Use resolved promise for other results
+                       return $.Deferred().resolve().promise();
+               };
+       }
+
+       if ( this.steps.length ) {
+               // Generate a chain reaction of promises
+               promise = proceed( this.steps[0] )();
+               for ( i = 1, len = this.steps.length; i < len; i++ ) {
+                       promise = promise.then( proceed( this.steps[i] ) );
+               }
+       } else {
+               promise = $.Deferred().resolve().promise();
+       }
+
+       return promise;
+};
+
+/**
+ * Add step to the beginning of the process.
+ *
+ * @param {Function} step Function to execute; if it returns boolean false the process will stop; if
+ *   it returns an object with a `promise` method the process will use the promise to either
+ *   continue to the next step when the promise is resolved or stop when the promise is rejected
+ * @param {Object} [context=null] Context to call the step function in
+ * @chainable
+ */
+OO.ui.Process.prototype.first = function ( step, context ) {
+       this.steps.unshift( [ step, context || null ] );
+       return this;
+};
+
+/**
+ * Add step to the end of the process.
+ *
+ * @param {Function} step Function to execute; if it returns boolean false the process will stop; if
+ *   it returns an object with a `promise` method the process will use the promise to either
+ *   continue to the next step when the promise is resolved or stop when the promise is rejected
+ * @param {Object} [context=null] Context to call the step function in
+ * @chainable
+ */
+OO.ui.Process.prototype.next = function ( step, context ) {
+       this.steps.push( [ step, context || null ] );
+       return this;
+};
 /**
  * Dialog for showing a confirmation/warning message.
  *
@@ -1958,10 +2039,10 @@ OO.ui.ConfirmationDialog.prototype.initialize = function () {
        this.$promptContainer = this.$( '<div>' ).addClass( 'oo-ui-dialog-confirm-promptContainer' );
 
        this.cancelButton = new OO.ui.ButtonWidget();
-       this.cancelButton.connect( this, { 'click': [ 'emit', 'cancel' ] } );
+       this.cancelButton.connect( this, { 'click': [ 'close', 'cancel' ] } );
 
        this.okButton = new OO.ui.ButtonWidget();
-       this.okButton.connect( this, { 'click': [ 'emit', 'ok' ] } );
+       this.okButton.connect( this, { 'click': [ 'close', 'ok' ] } );
 
        // Make the buttons
        contentLayout.$element.append( this.$promptContainer );
@@ -1972,15 +2053,11 @@ OO.ui.ConfirmationDialog.prototype.initialize = function () {
                this.cancelButton.$element
        );
 
-       this.connect( this, {
-               'ok': 'close',
-               'cancel': 'close',
-               'close': [ 'emit', 'cancel' ]
-       } );
+       this.connect( this, { 'teardown': [ 'close', 'cancel' ] } );
 };
 
 /*
- * Open a confirmation dialog.
+ * Setup a confirmation dialog.
  *
  * @param {Object} [data] Window opening data including text of the dialog and text for the buttons
  * @param {jQuery|string} [data.prompt] Text to display or list of nodes to use as content of the dialog.
@@ -1988,25 +2065,42 @@ OO.ui.ConfirmationDialog.prototype.initialize = function () {
  * @param {jQuery|string|Function|null} [data.cancelLabel] Label of the cancel button
  * @param {string|string[]} [data.okFlags="constructive"] Flags for the OK button
  * @param {string|string[]} [data.cancelFlags="destructive"] Flags for the cancel button
+ * @return {OO.ui.Process} Setup process
  */
-OO.ui.ConfirmationDialog.prototype.setup = function ( data ) {
+OO.ui.ConfirmationDialog.prototype.getSetupProcess = function ( data ) {
        // Parent method
-       OO.ui.Dialog.prototype.setup.call( this, data );
-
-       var prompt = data.prompt || OO.ui.deferMsg( 'ooui-dialog-confirm-default-prompt' ),
-               okLabel = data.okLabel || OO.ui.deferMsg( 'ooui-dialog-confirm-default-ok' ),
-               cancelLabel = data.cancelLabel || OO.ui.deferMsg( 'ooui-dialog-confirm-default-cancel' ),
-               okFlags = data.okFlags || 'constructive',
-               cancelFlags = data.cancelFlags || 'destructive';
+       return OO.ui.ConfirmationDialog.super.prototype.getSetupProcess.call( this, data )
+               .next( function () {
+                       var prompt = data.prompt || OO.ui.deferMsg( 'ooui-dialog-confirm-default-prompt' ),
+                               okLabel = data.okLabel || OO.ui.deferMsg( 'ooui-dialog-confirm-default-ok' ),
+                               cancelLabel = data.cancelLabel || OO.ui.deferMsg( 'ooui-dialog-confirm-default-cancel' ),
+                               okFlags = data.okFlags || 'constructive',
+                               cancelFlags = data.cancelFlags || 'destructive';
+
+                       if ( typeof prompt === 'string' ) {
+                               this.$promptContainer.text( prompt );
+                       } else {
+                               this.$promptContainer.empty().append( prompt );
+                       }
 
-       if ( typeof prompt === 'string' ) {
-               this.$promptContainer.text( prompt );
-       } else {
-               this.$promptContainer.empty().append( prompt );
-       }
+                       this.okButton.setLabel( okLabel ).clearFlags().setFlags( okFlags );
+                       this.cancelButton.setLabel( cancelLabel ).clearFlags().setFlags( cancelFlags );
+               }, this );
+};
 
-       this.okButton.setLabel( okLabel ).clearFlags().setFlags( okFlags );
-       this.cancelButton.setLabel( cancelLabel ).clearFlags().setFlags( cancelFlags );
+/**
+ * @inheritdoc
+ */
+OO.ui.ConfirmationDialog.prototype.getTeardownProcess = function ( data ) {
+       // Parent method
+       return OO.ui.ConfirmationDialog.super.prototype.getTeardownProcess.call( this, data )
+               .first( function () {
+                       if ( data === 'ok' ) {
+                               this.opened.resolve();
+                       } else if ( data === 'cancel' ) {
+                               this.opened.reject();
+                       }
+               }, this );
 };
 /**
  * Element with a button.
@@ -2046,6 +2140,21 @@ OO.ui.ButtonedElement = function OoUiButtonedElement( $button, config ) {
        }
 };
 
+/* Setup */
+
+OO.initClass( OO.ui.ButtonedElement );
+
+/* Static Properties */
+
+/**
+ * Cancel mouse down events.
+ *
+ * @static
+ * @inheritable
+ * @property {boolean}
+ */
+OO.ui.ButtonedElement.static.cancelButtonMouseDownEvents = true;
+
 /* Methods */
 
 /**
@@ -2057,16 +2166,20 @@ OO.ui.ButtonedElement.prototype.onMouseDown = function ( e ) {
        if ( this.isDisabled() || e.which !== 1 ) {
                return false;
        }
-       // tabIndex should generally be interacted with via the property,
-       // but it's not possible to reliably unset a tabIndex via a property
-       // so we use the (lowercase) "tabindex" attribute instead.
+       // tabIndex should generally be interacted with via the property, but it's not possible to
+       // reliably unset a tabIndex via a property so we use the (lowercase) "tabindex" attribute
        this.tabIndex = this.$button.attr( 'tabindex' );
-       // Remove the tab-index while the button is down to prevent the button from stealing focus
        this.$button
+               // Remove the tab-index while the button is down to prevent the button from stealing focus
                .removeAttr( 'tabindex' )
                .addClass( 'oo-ui-buttonedElement-pressed' );
+       // Run the mouseup handler no matter where the mouse is when the button is let go, so we can
+       // reliably reapply the tabindex and remove the pressed class
        this.getElementDocument().addEventListener( 'mouseup', this.onMouseUpHandler, true );
-       return false;
+       // Prevent change of focus unless specifically configured otherwise
+       if ( this.constructor.static.cancelButtonMouseDownEvents ) {
+               return false;
+       }
 };
 
 /**
@@ -2078,10 +2191,11 @@ OO.ui.ButtonedElement.prototype.onMouseUp = function ( e ) {
        if ( this.isDisabled() || e.which !== 1 ) {
                return false;
        }
-       // Restore the tab-index after the button is up to restore the button's accesssibility
        this.$button
+               // Restore the tab-index after the button is up to restore the button's accesssibility
                .attr( 'tabindex', this.tabIndex )
                .removeClass( 'oo-ui-buttonedElement-pressed' );
+       // Stop listening for mouseup, since we only needed this once
        this.getElementDocument().removeEventListener( 'mouseup', this.onMouseUpHandler, true );
 };
 
@@ -2350,7 +2464,6 @@ OO.ui.GroupElement = function OoUiGroupElement( $group, config ) {
        // Properties
        this.$group = $group;
        this.items = [];
-       this.$items = this.$( [] );
        this.aggregateItemEvents = {};
 };
 
@@ -2427,7 +2540,7 @@ OO.ui.GroupElement.prototype.aggregate = function ( events ) {
  */
 OO.ui.GroupElement.prototype.addItems = function ( items, index ) {
        var i, len, item, event, events, currentIndex,
-               $items = this.$( [] );
+               itemElements = [];
 
        for ( i = 0, len = items.length; i < len; i++ ) {
                item = items[i];
@@ -2450,22 +2563,20 @@ OO.ui.GroupElement.prototype.addItems = function ( items, index ) {
                        item.connect( this, events );
                }
                item.setElementGroup( this );
-               $items = $items.add( item.$element );
+               itemElements.push( item.$element.get( 0 ) );
        }
 
        if ( index === undefined || index < 0 || index >= this.items.length ) {
-               this.$group.append( $items );
+               this.$group.append( itemElements );
                this.items.push.apply( this.items, items );
        } else if ( index === 0 ) {
-               this.$group.prepend( $items );
+               this.$group.prepend( itemElements );
                this.items.unshift.apply( this.items, items );
        } else {
-               this.$items.eq( index ).before( $items );
+               this.items[index].$element.before( itemElements );
                this.items.splice.apply( this.items, [ index, 0 ].concat( items ) );
        }
 
-       this.$items = this.$items.add( $items );
-
        return this;
 };
 
@@ -2498,7 +2609,6 @@ OO.ui.GroupElement.prototype.removeItems = function ( items ) {
                        item.setElementGroup( null );
                        this.items.splice( index, 1 );
                        item.$element.detach();
-                       this.$items = this.$items.not( item.$element );
                }
        }
 
@@ -2529,11 +2639,10 @@ OO.ui.GroupElement.prototype.clearItems = function () {
                        item.disconnect( this, remove );
                }
                item.setElementGroup( null );
+               item.$element.detach();
        }
-       this.items = [];
-       this.$items.detach();
-       this.$items = this.$( [] );
 
+       this.items = [];
        return this;
 };
 /**
@@ -4211,7 +4320,6 @@ OO.ui.GridLayout.prototype.getPanel = function ( x, y ) {
  * @cfg {boolean} [autoFocus=true] Focus on the first focusable element when changing to a page
  * @cfg {boolean} [outlined=false] Show an outline
  * @cfg {boolean} [editable=false] Show controls for adding, removing and reordering pages
- * @cfg {Object[]} [adders] List of adders for controls, each with name, icon and title properties
  */
 OO.ui.BookletLayout = function OoUiBookletLayout( config ) {
        // Initialize configuration
@@ -4230,7 +4338,6 @@ OO.ui.BookletLayout = function OoUiBookletLayout( config ) {
        this.outlined = !!config.outlined;
        if ( this.outlined ) {
                this.editable = !!config.editable;
-               this.adders = config.adders || null;
                this.outlineControlsWidget = null;
                this.outlineWidget = new OO.ui.OutlineWidget( { '$': this.$ } );
                this.outlinePanel = new OO.ui.PanelLayout( { '$': this.$, 'scrollable': true } );
@@ -4241,8 +4348,7 @@ OO.ui.BookletLayout = function OoUiBookletLayout( config ) {
                this.outlineVisible = true;
                if ( this.editable ) {
                        this.outlineControlsWidget = new OO.ui.OutlineControlsWidget(
-                               this.outlineWidget,
-                               { '$': this.$, 'adders': this.adders }
+                               this.outlineWidget, { '$': this.$ }
                        );
                }
        }
@@ -4791,7 +4897,7 @@ OO.mixinClass( OO.ui.StackLayout, OO.ui.GroupElement );
 
 /**
  * @event set
- * @param {OO.ui.Layout|null} [item] Current item
+ * @param {OO.ui.Layout|null} item Current item or null if there is no longer a layout shown
  */
 
 /* Methods */
@@ -4799,12 +4905,29 @@ OO.mixinClass( OO.ui.StackLayout, OO.ui.GroupElement );
 /**
  * Get the current item.
  *
- * @return {OO.ui.Layout|null} [description]
+ * @return {OO.ui.Layout|null}
  */
 OO.ui.StackLayout.prototype.getCurrentItem = function () {
        return this.currentItem;
 };
 
+/**
+ * Unset the current item.
+ *
+ * @private
+ * @param {OO.ui.StackLayout} layout
+ * @fires set
+ */
+OO.ui.StackLayout.prototype.unsetCurrentItem = function () {
+       var prevItem = this.currentItem;
+       if ( prevItem === null ) {
+               return;
+       }
+
+       this.currentItem = null;
+       this.emit( 'set', null );
+};
+
 /**
  * Add items.
  *
@@ -4815,6 +4938,7 @@ OO.ui.StackLayout.prototype.getCurrentItem = function () {
  * @chainable
  */
 OO.ui.StackLayout.prototype.addItems = function ( items, index ) {
+       // Mixin method
        OO.ui.GroupElement.prototype.addItems.call( this, items, index );
 
        if ( !this.currentItem && items.length ) {
@@ -4831,13 +4955,17 @@ OO.ui.StackLayout.prototype.addItems = function ( items, index ) {
  *
  * @param {OO.ui.Layout[]} items Items to remove
  * @chainable
+ * @fires set
  */
 OO.ui.StackLayout.prototype.removeItems = function ( items ) {
+       // Mixin method
        OO.ui.GroupElement.prototype.removeItems.call( this, items );
+
        if ( $.inArray( this.currentItem, items  ) !== -1 ) {
-               this.currentItem = null;
-               if ( !this.currentItem && this.items.length ) {
+               if ( this.items.length ) {
                        this.setItem( this.items[0] );
+               } else {
+                       this.unsetCurrentItem();
                }
        }
 
@@ -4850,9 +4978,10 @@ OO.ui.StackLayout.prototype.removeItems = function ( items ) {
  * Items will be detached, not removed, so they can be used later.
  *
  * @chainable
+ * @fires set
  */
 OO.ui.StackLayout.prototype.clearItems = function () {
-       this.currentItem = null;
+       this.unsetCurrentItem();
        OO.ui.GroupElement.prototype.clearItems.call( this );
 
        return this;
@@ -4863,23 +4992,31 @@ OO.ui.StackLayout.prototype.clearItems = function () {
  *
  * Any currently shown item will be hidden.
  *
+ * FIXME: If the passed item to show has not been added in the items list, then
+ * this method drops it and unsets the current item.
+ *
  * @param {OO.ui.Layout} item Item to show
  * @chainable
+ * @fires set
  */
 OO.ui.StackLayout.prototype.setItem = function ( item ) {
+       var i, len;
+
        if ( item !== this.currentItem ) {
                if ( !this.continuous ) {
-                       this.$items.css( 'display', '' );
+                       for ( i = 0, len = this.items.length; i < len; i++ ) {
+                               this.items[i].$element.css( 'display', '' );
+                       }
                }
                if ( $.inArray( item, this.items ) !== -1 ) {
                        if ( !this.continuous ) {
                                item.$element.css( 'display', 'block' );
                        }
+                       this.currentItem = item;
+                       this.emit( 'set', item );
                } else {
-                       item = null;
+                       this.unsetCurrentItem();
                }
-               this.currentItem = item;
-               this.emit( 'set', item );
        }
 
        return this;
@@ -5021,7 +5158,7 @@ OO.ui.PopupToolGroup.prototype.onMouseUp = function ( e ) {
        if ( !this.isDisabled() && e.which === 1 ) {
                this.setActive( false );
        }
-       return OO.ui.ToolGroup.prototype.onMouseUp.call( this, e );
+       return OO.ui.PopupToolGroup.super.prototype.onMouseUp.call( this, e );
 };
 
 /**
@@ -5241,8 +5378,7 @@ OO.ui.GroupWidget.prototype.setDisabled = function ( disabled ) {
        var i, len;
 
        // Parent method
-       // Note this is calling OO.ui.Widget; we're assuming the class this is mixed into
-       // is a subclass of OO.ui.Widget.
+       // Note: Calling #setDisabled this way assumes this is mixed into an OO.ui.Widget
        OO.ui.Widget.prototype.setDisabled.call( this, disabled );
 
        // During construction, #setDisabled is called before the OO.ui.GroupElement constructor
@@ -5290,6 +5426,7 @@ OO.ui.ItemWidget.prototype.isDisabled = function () {
  */
 OO.ui.ItemWidget.prototype.setElementGroup = function ( group ) {
        // Parent method
+       // Note: Calling #setElementGroup this way assumes this is mixed into an OO.ui.Element
        OO.ui.Element.prototype.setElementGroup.call( this, group );
 
        // Initialize item disabled states
@@ -5677,7 +5814,7 @@ OO.ui.InputWidget.prototype.setReadOnly = function ( state ) {
  * @inheritdoc
  */
 OO.ui.InputWidget.prototype.setDisabled = function ( state ) {
-       OO.ui.Widget.prototype.setDisabled.call( this, state );
+       OO.ui.InputWidget.super.prototype.setDisabled.call( this, state );
        if ( this.$input ) {
                this.$input.prop( 'disabled', this.isDisabled() );
        }
@@ -6176,7 +6313,7 @@ OO.ui.OptionWidget.prototype.isPressed = function () {
  * @chainable
  */
 OO.ui.OptionWidget.prototype.setSelected = function ( state ) {
-       if ( !this.isDisabled() && this.constructor.static.selectable ) {
+       if ( this.constructor.static.selectable ) {
                this.selected = !!state;
                if ( this.selected ) {
                        this.$element.addClass( 'oo-ui-optionWidget-selected' );
@@ -6197,7 +6334,7 @@ OO.ui.OptionWidget.prototype.setSelected = function ( state ) {
  * @chainable
  */
 OO.ui.OptionWidget.prototype.setHighlighted = function ( state ) {
-       if ( !this.isDisabled() && this.constructor.static.highlightable ) {
+       if ( this.constructor.static.highlightable ) {
                this.highlighted = !!state;
                if ( this.highlighted ) {
                        this.$element.addClass( 'oo-ui-optionWidget-highlighted' );
@@ -6215,7 +6352,7 @@ OO.ui.OptionWidget.prototype.setHighlighted = function ( state ) {
  * @chainable
  */
 OO.ui.OptionWidget.prototype.setPressed = function ( state ) {
-       if ( !this.isDisabled() && this.constructor.static.pressable ) {
+       if ( this.constructor.static.pressable ) {
                this.pressed = !!state;
                if ( this.pressed ) {
                        this.$element.addClass( 'oo-ui-optionWidget-pressed' );
@@ -6288,12 +6425,12 @@ OO.ui.SelectWidget = function OoUiSelectWidget( config ) {
        this.pressed = false;
        this.selecting = null;
        this.hashes = {};
+       this.onMouseUpHandler = OO.ui.bind( this.onMouseUp, this );
+       this.onMouseMoveHandler = OO.ui.bind( this.onMouseMove, this );
 
        // Events
        this.$element.on( {
                'mousedown': OO.ui.bind( this.onMouseDown, this ),
-               'mouseup': OO.ui.bind( this.onMouseUp, this ),
-               'mousemove': OO.ui.bind( this.onMouseMove, this ),
                'mouseover': OO.ui.bind( this.onMouseOver, this ),
                'mouseleave': OO.ui.bind( this.onMouseLeave, this )
        } );
@@ -6367,7 +6504,12 @@ OO.ui.SelectWidget.prototype.onMouseDown = function ( e ) {
                if ( item && item.isSelectable() ) {
                        this.pressItem( item );
                        this.selecting = item;
-                       this.$( this.$.context ).one( 'mouseup', OO.ui.bind( this.onMouseUp, this ) );
+                       this.getElementDocument().addEventListener(
+                               'mouseup', this.onMouseUpHandler, true
+                       );
+                       this.getElementDocument().addEventListener(
+                               'mousemove', this.onMouseMoveHandler, true
+                       );
                }
        }
        return false;
@@ -6395,6 +6537,13 @@ OO.ui.SelectWidget.prototype.onMouseUp = function ( e ) {
                this.selecting = null;
        }
 
+       this.getElementDocument().removeEventListener(
+               'mouseup', this.onMouseUpHandler, true
+       );
+       this.getElementDocument().removeEventListener(
+               'mousemove', this.onMouseMoveHandler, true
+       );
+
        return false;
 };
 
@@ -6698,7 +6847,8 @@ OO.ui.SelectWidget.prototype.addItems = function ( items, index ) {
                this.removeItems( remove );
        }
 
-       OO.ui.GroupElement.prototype.addItems.call( this, items, index );
+       // Mixin method
+       OO.ui.GroupWidget.prototype.addItems.call( this, items, index );
 
        // Always provide an index, even if it was omitted
        this.emit( 'add', items, index === undefined ? this.items.length - items.length - 1 : index );
@@ -6729,7 +6879,9 @@ OO.ui.SelectWidget.prototype.removeItems = function ( items ) {
                        this.selectItem( null );
                }
        }
-       OO.ui.GroupElement.prototype.removeItems.call( this, items );
+
+       // Mixin method
+       OO.ui.GroupWidget.prototype.removeItems.call( this, items );
 
        this.emit( 'remove', items );
 
@@ -6749,7 +6901,8 @@ OO.ui.SelectWidget.prototype.clearItems = function () {
 
        // Clear all items
        this.hashes = {};
-       OO.ui.GroupElement.prototype.clearItems.call( this );
+       // Mixin method
+       OO.ui.GroupWidget.prototype.clearItems.call( this );
        this.selectItem( null );
 
        this.emit( 'remove', items );
@@ -6958,7 +7111,7 @@ OO.ui.MenuWidget.prototype.addItems = function ( items, index ) {
        var i, len, item;
 
        // Parent method
-       OO.ui.SelectWidget.prototype.addItems.call( this, items, index );
+       OO.ui.MenuWidget.super.prototype.addItems.call( this, items, index );
 
        // Auto-initialize
        if ( !this.newItems ) {
@@ -7256,7 +7409,7 @@ OO.ui.OutlineControlsWidget = function OoUiOutlineControlsWidget( outline, confi
 
        // Initialization
        this.$element.addClass( 'oo-ui-outlineControlsWidget' );
-       this.$group.addClass( 'oo-ui-outlineControlsWidget-adders' );
+       this.$group.addClass( 'oo-ui-outlineControlsWidget-items' );
        this.$movers
                .addClass( 'oo-ui-outlineControlsWidget-movers' )
                .append( this.removeButton.$element, this.upButton.$element, this.downButton.$element );
@@ -7473,15 +7626,22 @@ OO.inheritClass( OO.ui.ButtonOptionWidget, OO.ui.OptionWidget );
 OO.mixinClass( OO.ui.ButtonOptionWidget, OO.ui.ButtonedElement );
 OO.mixinClass( OO.ui.ButtonOptionWidget, OO.ui.FlaggableElement );
 
+/* Static Properties */
+
+// Allow button mouse down events to pass through so they can be handled by the parent select widget
+OO.ui.ButtonOptionWidget.static.cancelButtonMouseDownEvents = false;
+
 /* Methods */
 
 /**
  * @inheritdoc
  */
 OO.ui.ButtonOptionWidget.prototype.setSelected = function ( state ) {
-       OO.ui.OptionWidget.prototype.setSelected.call( this, state );
+       OO.ui.ButtonOptionWidget.super.prototype.setSelected.call( this, state );
 
-       this.setActive( state );
+       if ( this.constructor.static.selectable ) {
+               this.setActive( state );
+       }
 
        return this;
 };
@@ -7799,7 +7959,7 @@ OO.ui.PopupButtonWidget.prototype.onClick = function ( e ) {
                } else {
                        this.showPopup();
                }
-               OO.ui.ButtonWidget.prototype.onClick.call( this );
+               OO.ui.PopupButtonWidget.super.prototype.onClick.call( this );
        }
        return false;
 };
@@ -8048,7 +8208,7 @@ OO.ui.TextInputWidget.prototype.onEdit = function () {
        this.adjustSize();
 
        // Parent method
-       return OO.ui.InputWidget.prototype.onEdit.call( this );
+       return OO.ui.TextInputWidget.super.prototype.onEdit.call( this );
 };
 
 /**
@@ -8214,7 +8374,7 @@ OO.ui.TextInputMenuWidget.prototype.onWindowResize = function () {
  */
 OO.ui.TextInputMenuWidget.prototype.show = function () {
        // Parent method
-       OO.ui.MenuWidget.prototype.show.call( this );
+       OO.ui.TextInputMenuWidget.super.prototype.show.call( this );
 
        this.position();
        this.$( this.getElementWindow() ).on( 'resize', this.onWindowResizeHandler );
@@ -8228,7 +8388,7 @@ OO.ui.TextInputMenuWidget.prototype.show = function () {
  */
 OO.ui.TextInputMenuWidget.prototype.hide = function () {
        // Parent method
-       OO.ui.MenuWidget.prototype.hide.call( this );
+       OO.ui.TextInputMenuWidget.super.prototype.hide.call( this );
 
        this.$( this.getElementWindow() ).off( 'resize', this.onWindowResizeHandler );
        return this;
@@ -8258,7 +8418,7 @@ OO.ui.TextInputMenuWidget.prototype.position = function () {
                // Fix for RTL (for some reason, no need to fix if the frameoffset is set)
                if ( this.$element.css( 'direction' ) === 'rtl' ) {
                        dimensions.right = this.$element.parent().position().left -
-                               dimensions.width - dimensions.left;
+                               $container.width() - dimensions.left;
                        // Erase the value for 'left':
                        delete dimensions.left;
                }
@@ -8368,7 +8528,7 @@ OO.ui.ToggleButtonWidget.prototype.onClick = function () {
        }
 
        // Parent method
-       return OO.ui.ButtonWidget.prototype.onClick.call( this );
+       return OO.ui.ToggleButtonWidget.super.prototype.onClick.call( this );
 };
 
 /**
@@ -8380,7 +8540,7 @@ OO.ui.ToggleButtonWidget.prototype.setValue = function ( value ) {
                this.setActive( value );
        }
 
-       // Parent method
+       // Parent method (from mixin)
        OO.ui.ToggleWidget.prototype.setValue.call( this, value );
 
        return this;
index 34547cf..76feb5d 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (7b283a9dcc)
+ * OOjs UI v0.1.0-pre (7a0e222a75)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: Tue May 27 2014 15:41:42 GMT-0700 (PDT)
+ * Date: Wed Jun 18 2014 16:19:15 GMT-0700 (PDT)
  */
 
 /* Textures */
   min-width: 8em;
 }
 
+.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
+  padding: 0.25em 0 0.25em 0;
+}
+
 .oo-ui-menuToolGroup .oo-ui-tool {
   display: block;
 }
 
 .oo-ui-menuToolGroup .oo-ui-tool-link {
   display: block;
-  padding: 0.25em 1em 0.25em 0.25em;
+  padding: 0 1em 0 0.25em;
   white-space: nowrap;
   cursor: pointer;
 }
   height: 3em;
 }
 
-.oo-ui-outlineControlsWidget-adders,
+.oo-ui-outlineControlsWidget-items,
 .oo-ui-outlineControlsWidget-movers {
   float: left;
   height: 2em;
   background-repeat: no-repeat;
 }
 
-.oo-ui-outlineControlsWidget-adders {
+.oo-ui-outlineControlsWidget-items {
   float: left;
   margin-left: 0;
 }
 
-.oo-ui-outlineControlsWidget-adders .oo-ui-buttonWidget {
+.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
   float: left;
 }
 
 }
 
 .oo-ui-indicator-down {
-  background-image: /* @embed */ url(images/indicators/down.svg);
+  background-image: /* @embed */ url(images/indicators/arrow-down.svg);
+}
+
+.oo-ui-indicator-next {
+  background-image: /* @embed */ url(images/indicators/arrow-ltr.svg);
+}
+
+.oo-ui-indicator-previous {
+  background-image: /* @embed */ url(images/indicators/arrow-rtl.svg);
 }
 
 .oo-ui-indicator-required {
 }
 
 .oo-ui-indicator-up {
-  background-image: /* @embed */ url(images/indicators/up.svg);
+  background-image: /* @embed */ url(images/indicators/arrow-up.svg);
 }
\ No newline at end of file
index c06fd18..da6de45 100644 (file)
@@ -1,6 +1,6 @@
 /* Autocomplete
 ----------------------------------*/
-.ui-autocomplete { position: absolute; cursor: default; }      
+.ui-autocomplete { position: absolute; cursor: default; }
 .ui-autocomplete-loading { /* @embed */ background: white url('images/ui-anim_basic_16x16.gif') right center no-repeat; }
 
 /* workarounds */
index 1c47feb..d6dfedd 100644 (file)
                        }
                        return keys;
                },
-               extend: function () {
-                       var options, name, src, copy,
-                               target = arguments[0] || {},
-                               i = 1,
-                               length = arguments.length;
-
-                       for ( ; i < length; i++ ) {
-                               options = arguments[ i ];
-                               // Only deal with non-null/undefined values
-                               if ( options !== null && options !== undefined ) {
-                                       // Extend the base object
-                                       for ( name in options ) {
-                                               src = target[ name ];
-                                               copy = options[ name ];
-
-                                               // Prevent never-ending loop
-                                               if ( target === copy ) {
-                                                       continue;
-                                               }
-
-                                               if ( copy !== undefined ) {
-                                                       target[ name ] = copy;
-                                               }
-                                       }
-                               }
-                       }
-
-                       // Return the modified object
-                       return target;
-               },
                each: function ( object, callback ) {
                        var name;
                        for ( name in object ) {
                 * @param action {Number} What is this function supposed to do (ACTION_INJECT or ACTION_CHECK)
                 */
                walkTheObject: function ( currName, currVar, masterVariable, parentPathArray, action ) {
-
-                       var key, value, tmpPathArray,
+                       var key, value, currPathArray,
                                type = util.type( currVar ),
                                that = this;
 
+                       currPathArray = parentPathArray;
+                       if ( currName ) {
+                               currPathArray.push( currName );
+                       }
+
                        // Hard ignores
-                       if ( this.ignoreFn( currVar, that, parentPathArray ) ) {
+                       if ( this.ignoreFn( currVar, that, currPathArray ) ) {
                                return null;
                        }
 
                        // Handle the lazy limit
                        this.lazyCounter++;
                        if ( this.lazyCounter > this.lazyLimit ) {
-                               log( 'CompletenessTest.fn.walkTheObject> Limit reached: ' + this.lazyCounter, parentPathArray );
+                               log( 'CompletenessTest.fn.walkTheObject> Limit reached: ' + this.lazyCounter, currPathArray );
                                return null;
                        }
 
 
                                        if ( action === CompletenessTest.ACTION_INJECT ) {
 
-                                               that.injectionTracker[ parentPathArray.join( '.' ) ] = true;
-                                               that.injectCheck( masterVariable, parentPathArray, function () {
-                                                       that.methodCallTracker[ parentPathArray.join( '.' ) ] = true;
+                                               that.injectionTracker[ currPathArray.join( '.' ) ] = true;
+                                               that.injectCheck( masterVariable, currPathArray, function () {
+                                                       that.methodCallTracker[ currPathArray.join( '.' ) ] = true;
                                                } );
                                        }
 
                                                                        continue;
                                                                }
 
-                                                               // Clone and break reference to parentPathArray
-                                                               tmpPathArray = util.extend( [], parentPathArray );
-                                                               tmpPathArray.push( 'prototype' );
-                                                               tmpPathArray.push( key );
-
-                                                               that.walkTheObject( key, value, masterVariable, tmpPathArray, action );
+                                                               that.walkTheObject( key, value, masterVariable, currPathArray.concat( 'prototype' ), action );
                                                        }
                                                }
 
                                        if ( hasOwn.call( currVar, key ) ) {
                                                value = currVar[key];
 
-                                               // Clone and break reference to parentPathArray
-                                               tmpPathArray = util.extend( [], parentPathArray );
-                                               tmpPathArray.push( key );
-
-                                               that.walkTheObject( key, value, masterVariable, tmpPathArray, action );
+                                               that.walkTheObject( key, value, masterVariable, currPathArray.slice(), action );
                                        }
                                }
                        }
index a20a948..08ed5d9 100644 (file)
  *             Type: Number, Range: 1 - 100, Default: 7
  * delay: Number of ms to wait for the user to stop typing
  *             Type: Number, Range: 0 - 1200, Default: 120
+ * cache: Whether to cache results from a fetch
+ *             Type: Boolean, Default: false
+ * cacheMaxAge: Number of ms to cache results from a fetch
+ *             Type: Number, Range: 1 - Infinity, Default: 60000 (1 minute)
  * submitOnClick: Whether to submit the form containing the textbox when a suggestion is clicked
  *             Type: Boolean, Default: false
  * maxExpandFactor: Maximum suggestions box width relative to the textbox width. If set
@@ -47,6 +51,8 @@
  */
 ( function ( $ ) {
 
+var hasOwn = Object.hasOwnProperty;
+
 $.suggestions = {
        /**
         * Cancel any delayed maybeFetch() call and callback the context so
@@ -90,18 +96,44 @@ $.suggestions = {
         */
        update: function ( context, delayed ) {
                function maybeFetch() {
+                       var val = context.data.$textbox.val(),
+                               cache = context.data.cache,
+                               cacheHit;
+
                        // Only fetch if the value in the textbox changed and is not empty, or if the results were hidden
                        // if the textbox is empty then clear the result div, but leave other settings intouched
-                       if ( context.data.$textbox.val().length === 0 ) {
+                       if ( val.length === 0 ) {
                                $.suggestions.hide( context );
                                context.data.prevText = '';
                        } else if (
-                               context.data.$textbox.val() !== context.data.prevText ||
+                               val !== context.data.prevText ||
                                !context.data.$container.is( ':visible' )
                        ) {
-                               if ( typeof context.config.fetch === 'function' ) {
-                                       context.data.prevText = context.data.$textbox.val();
-                                       context.config.fetch.call( context.data.$textbox, context.data.$textbox.val() );
+                               context.data.prevText = val;
+                               // Try cache first
+                               if ( context.config.cache && hasOwn.call( cache, val ) ) {
+                                       if ( +new Date() - cache[ val ].timestamp < context.config.cacheMaxAge ) {
+                                               context.data.$textbox.suggestions( 'suggestions', cache[ val ].suggestions );
+                                               cacheHit = true;
+                                       } else {
+                                               // Cache expired
+                                               delete cache[ val ];
+                                       }
+                               }
+                               if ( !cacheHit && typeof context.config.fetch === 'function' ) {
+                                       context.config.fetch.call(
+                                               context.data.$textbox,
+                                               val,
+                                               function ( suggestions ) {
+                                                       context.data.$textbox.suggestions( 'suggestions', suggestions );
+                                                       if ( context.config.cache ) {
+                                                               cache[ val ] = {
+                                                                       suggestions: suggestions,
+                                                                       timestamp: +new Date()
+                                                               };
+                                                       }
+                                               }
+                                       );
                                }
                        }
 
@@ -267,10 +299,22 @@ $.suggestions = {
                                                        }
 
                                                        // Widen results box if needed (new width is only calculated here, applied later).
-                                                       // We need this awful hack to calculate the actual pre-ellipsis width.
+
+                                                       // The monstrosity below accomplishes two things:
+                                                       // * Wraps the text contents in a DOM element, so that we can know its width. There is
+                                                       //   no way to directly access the width of a text node, and we can't use the parent
+                                                       //   node width as it has text-overflow: ellipsis; and overflow: hidden; applied to
+                                                       //   it, which trims it to a smaller width.
+                                                       // * Temporarily applies position: absolute; to the wrapper to pull it out of normal
+                                                       //   document flow. Otherwise the CSS text-overflow: ellipsis; and overflow: hidden;
+                                                       //   rules would cause some browsers (at least all versions of IE from 6 to 11) to
+                                                       //   still report the "trimmed" width. This should not be done in regular CSS
+                                                       //   stylesheets as we don't want this rule to apply to other <span> elements, like
+                                                       //   the ones generated by jquery.highlightText.
                                                        $spanForWidth = $result.wrapInner( '<span>' ).children();
-                                                       childrenWidth = $spanForWidth.outerWidth();
+                                                       childrenWidth = $spanForWidth.css( 'position', 'absolute' ).outerWidth();
                                                        $spanForWidth.contents().unwrap();
+
                                                        if ( childrenWidth > $result.width() && childrenWidth > expWidth ) {
                                                                // factor in any padding, margin, or border space on the parent
                                                                expWidth = childrenWidth + ( context.data.$container.width() - $result.width() );
@@ -291,13 +335,17 @@ $.suggestions = {
                        case 'delay':
                                context.config[property] = Math.max( 0, Math.min( 1200, value ) );
                                break;
+                       case 'cacheMaxAge':
+                               context.config[property] = Math.max( 1, value );
+                               break;
                        case 'maxExpandFactor':
                                context.config[property] = Math.max( 1, value );
                                break;
+                       case 'cache':
                        case 'submitOnClick':
                        case 'positionFromLeft':
                        case 'highlightInput':
-                               context.config[property] = value ? true : false;
+                               context.config[property] = !!value;
                                break;
                }
        },
@@ -469,6 +517,8 @@ $.fn.suggestions = function () {
                                        suggestions: [],
                                        maxRows: 7,
                                        delay: 120,
+                                       cache: false,
+                                       cacheMaxAge: 60000,
                                        submitOnClick: false,
                                        maxExpandFactor: 3,
                                        expandFrom: 'auto',
@@ -507,6 +557,9 @@ $.fn.suggestions = function () {
                                // Text in textbox when suggestions were last fetched
                                prevText: null,
 
+                               // Cache of fetched suggestions
+                               cache: {},
+
                                // Number of results visible without scrolling
                                visibleResults: 0,
 
diff --git a/resources/src/mediawiki.action/mediawiki.action.history.css b/resources/src/mediawiki.action/mediawiki.action.history.css
new file mode 100644 (file)
index 0000000..603a965
--- /dev/null
@@ -0,0 +1,4 @@
+#pagehistory li.before input[name="oldid"],
+#pagehistory li.after input[name="diff"] {
+       visibility: hidden;
+}
index 8aa5a1f..ac48c59 100644 (file)
@@ -12,54 +12,39 @@ jQuery( function ( $ ) {
         * @param e {jQuery.Event}
         */
        function updateDiffRadios() {
-               var diffLi = false, // the li where the diff radio is checked
-                       oldLi = false; // the li where the oldid radio is checked
+               var nextState = 'before',
+                       $li,
+                       $inputs,
+                       $oldidRadio,
+                       $diffRadio;
 
                if ( !$lis.length ) {
                        return true;
                }
 
                $lis
-               .removeClass( 'selected' )
                .each( function () {
-                       var     $li = $( this ),
-                               $inputs = $li.find( 'input[type="radio"]' ),
-                               $oldidRadio = $inputs.filter( '[name="oldid"]' ).eq( 0 ),
-                               $diffRadio = $inputs.filter( '[name="diff"]' ).eq( 0 );
+                       $li = $( this );
+                       $inputs = $li.find( 'input[type="radio"]' );
+                       $oldidRadio = $inputs.filter( '[name="oldid"]' ).eq( 0 );
+                       $diffRadio = $inputs.filter( '[name="diff"]' ).eq( 0 );
+
+                       $li.removeClass( 'selected between before after' );
 
                        if ( !$oldidRadio.length || !$diffRadio.length ) {
                                return true;
                        }
 
                        if ( $oldidRadio.prop( 'checked' ) ) {
-                               oldLi = true;
-                               $li.addClass( 'selected' );
-                               $oldidRadio.css( 'visibility', 'visible' );
-                               $diffRadio.css( 'visibility', 'hidden' );
-
+                               $li.addClass( 'selected after' );
+                               nextState = 'after';
                        } else if ( $diffRadio.prop( 'checked' ) ) {
-                               diffLi = true;
-                               $li.addClass( 'selected' );
-                               $oldidRadio.css( 'visibility', 'hidden' );
-                               $diffRadio.css( 'visibility', 'visible' );
-
-                       // This list item has neither checked
+                               $li.addClass( 'selected ' + nextState );
+                               nextState = 'between';
                        } else {
-                               // We're below the selected radios
-                               if ( diffLi && oldLi ) {
-                                       $oldidRadio.css( 'visibility', 'visible' );
-                                       $diffRadio.css( 'visibility', 'hidden' );
-
-                               // We're between the selected radios
-                               } else if ( diffLi ) {
-                                       $diffRadio.css( 'visibility', 'visible' );
-                                       $oldidRadio.css( 'visibility', 'visible' );
-
-                               // We're above the selected radios
-                               } else {
-                                       $diffRadio.css( 'visibility', 'visible' );
-                                       $oldidRadio.css( 'visibility', 'hidden' );
-                               }
+                               // This list item has neither checked
+                               // apply the appropriate class following the previous item.
+                               $li.addClass( nextState );
                        }
                } );
 
index 6556af9..67e2f33 100644 (file)
        list-style-image: url(@url);
 }
 
-.transition(@string) {
-       -webkit-transition: @string;
-       transition: @string;
+.transition(@value) {
+       -webkit-backface-visibility: hidden; // fixes Chrome 1px movement bug
+       -webkit-transition: @value;
+       -moz-transition: @value;
+       -o-transition: @value;
+       transition: @value;
 }
 
 .box-sizing(@value) {
-       -moz-box-sizing: @value;
        -webkit-box-sizing: @value;
+       -moz-box-sizing: @value;
        box-sizing: @value;
 }
+
+.box-shadow(@value) {
+       -webkit-box-shadow: @value; // Android 2.3+, iOS 4.0.2-4.2, Safari 3-4
+       box-shadow: @value; // Chrome 6+, Firefox 4+, IE 9+, iOS 5+, Opera 10.50+
+}
index 4819be0..931e312 100644 (file)
@@ -1,93 +1,92 @@
 /*!
- * Change multi-page image navigation so that the current page display can be changed
- * without a page reload. Currently, the only image formats that can be multi-page images are
- * PDF and DjVu files
+ * Implement AJAX navigation for multi-page images so the user may browse without a full page reload.
  */
 ( function ( mw, $ ) {
+       var jqXhr, $multipageimage, $spinner;
 
-       // Initialize ajax request variable
-       var xhr;
-
-       // Use jQuery's load function to specifically select and replace table.multipageimage's child
-       // tr with the new page's table.multipageimage's tr element.
-       // table.multipageimage always has only one row.
-       function loadPage( page, hist ) {
-               if ( xhr ) {
-                       // Abort previous requests to prevent backlog created by
-                       // repeatedly pressing back/forwards buttons
-                       xhr.abort();
+       /* Fetch the next page and use jQuery to swap the table.multipageimage contents.
+        * @param {string} url
+        * @param {boolean} [hist=false] Whether this is a load triggered by history navigation (if
+        *   true, this function won't push a new history state, for the browser did so already).
+        */
+       function loadPage( url, hist ) {
+               var $tr;
+               if ( jqXhr ) {
+                       // Prevent race conditions and piling up pending requests
+                       jqXhr.abort();
+                       jqXhr = undefined;
                }
 
-               var $multipageimage = $( 'table.multipageimage' ),
-                       $spinner;
-
                // Add a new spinner if one doesn't already exist
-               if ( !$multipageimage.find( '.mw-spinner' ).length ) {
-
+               if ( !$spinner ) {
+                       $tr = $multipageimage.find( 'tr' );
                        $spinner = $.createSpinner( {
                                size: 'large',
                                type: 'block'
                        } )
-                               // Set the spinner's dimensions equal to the table's dimensions so that
-                               // the current scroll position is not lost after the table is emptied prior to
-                               // its contents being updated
+                               // Copy the old content dimensions equal so that the current scroll position is not
+                               // lost between emptying the table is and receiving the new contents.
                                .css( {
-                                       height: $multipageimage.find( 'tr' ).height(),
-                                       width: $multipageimage.find( 'tr' ).width()
+                                       height: $tr.outerHeight(),
+                                       width: $tr.outerWidth()
                                } );
 
                        $multipageimage.empty().append( $spinner );
                }
 
-               xhr = $.ajax( {
-                       url: page,
-                       success: function ( data ) {
-                               // Load the page
-                               $multipageimage.empty().append( $( data ).find( 'table.multipageimage tr' ) );
-                               // Fire hook because the page's content has changed
-                               mw.hook( 'wikipage.content' ).fire( $multipageimage );
-                               // Set up the new page for pagination
-                               ajaxifyPageNavigation();
-                               // Add new page of image to history.  To preserve the back-forwards chain in the browser,
-                               // if the user gets here via the back/forward button, don't update the history.
-                               if ( window.history && history.pushState && !hist ) {
-                                       history.pushState( { url: page }, document.title, page );
-                               }
+               // @todo Don't fetch the entire page. Ideally we'd only fetch the content portion or the data
+               // (thumbnail urls) and update the interface manually.
+               jqXhr = $.ajax( url ).done( function ( data ) {
+                       jqXhr = $spinner = undefined;
+
+                       // Replace table contents
+                       $multipageimage.empty().append( $( data ).find( 'table.multipageimage' ).contents() );
+
+                       bindPageNavigation( $multipageimage );
+
+                       // Fire hook because the page's content has changed
+                       mw.hook( 'wikipage.content' ).fire( $multipageimage );
+
+                       // Update browser history and address bar. But not if we came here from a history
+                       // event, in which case the url is already updated by the browser.
+                       if ( history.pushState && !hist ) {
+                               history.pushState( { tag: 'mw-pagination' }, document.title, url );
                        }
                } );
        }
 
-       function ajaxifyPageNavigation() {
-               // Intercept the default action of the links in the thumbnail navigation
-               $( '.multipageimagenavbox' ).one( 'click', 'a', function ( e ) {
+       function bindPageNavigation( $container ) {
+               $container.find( '.multipageimagenavbox' ).one( 'click', 'a', function ( e ) {
                        loadPage( this.href );
                        e.preventDefault();
                } );
 
-               // Prevent the submission of the page select form and instead call loadPage
-               $( 'form[name="pageselector"]' ).one( 'change submit', function ( e ) {
+               $container.find( 'form[name="pageselector"]' ).one( 'change submit', function ( e ) {
                        loadPage( this.action + '?' + $( this ).serialize() );
                        e.preventDefault();
                } );
        }
 
-       $( document ).ready( function () {
-               // The presence of table.multipageimage signifies that this file is a multi-page image
-               if ( mw.config.get( 'wgNamespaceNumber' ) === 6 && $( 'table.multipageimage' ).length !== 0 ) {
-                       ajaxifyPageNavigation();
+       $( function () {
+               if ( mw.config.get( 'wgNamespaceNumber' ) !== 6 ) {
+                       return;
+               }
+               $multipageimage = $( 'table.multipageimage' );
+               if ( !$multipageimage.length ) {
+                       return;
+               }
 
-                       // Set up history.pushState (if available), so that when the user browses to a new page of
-                       // the same file, the browser's history is updated. If the user clicks the back/forward button
-                       // in the midst of navigating a file's pages, load the page inline.
-                       if ( window.history && history.pushState && history.replaceState ) {
-                               history.replaceState( { url: window.location.href }, '' );
-                               $( window ).on( 'popstate', function ( e ) {
-                                       var state = e.originalEvent.state;
-                                       if ( state ) {
-                                               loadPage( state.url, true );
-                                       }
-                               } );
-                       }
+               bindPageNavigation( $multipageimage );
+
+               // Update the url using the History API (if available)
+               if ( history.pushState && history.replaceState ) {
+                       history.replaceState( { tag: 'mw-pagination' }, '' );
+                       $( window ).on( 'popstate', function ( e ) {
+                               var state = e.originalEvent.state;
+                               if ( state && state.tag === 'mw-pagination' ) {
+                                       loadPage( location.href, true );
+                               }
+                       } );
                }
        } );
 }( mediaWiki, jQuery ) );
index 1fe0e26..cc72e16 100644 (file)
@@ -30,9 +30,8 @@
                        rcid = mw.util.getParamValue( 'rcid', href );
                        apiRequest = new mw.Api();
 
-                       apiRequest.post( {
+                       apiRequest.postWithToken( 'patrol', {
                                action: 'patrol',
-                               token: mw.user.tokens.get( 'patrolToken' ),
                                rcid: rcid
                        } )
                        .done( function ( data ) {
index 7bfb642..775b249 100644 (file)
@@ -2,6 +2,23 @@
  * Style Parsoid HTML+RDFa output consistent with wikitext from PHP parser.
  */
 
+/*csslint regex-selectors:false */
+
+/*
+ * Auto-numbered external links
+ * Parsoid renders those as link without content, and lets CSS do the
+ * counting. This way the counting style can be customized, and counts update
+ * automatically when content is modified.
+ */
+.mw-body-content {
+       counter-reset: mw-NumberedExtLink;
+}
+
+.mw-body-content a[rel~="mw:ExtLink"]:empty:after {
+       content: "[" counter(mw-NumberedExtLink) "]";
+       counter-increment: mw-NumberedExtLink;
+}
+
 /**
  * References
  *
@@ -38,7 +55,6 @@ figure[typeof*='mw:Image'] {
                float: right;
        }
 
-       /* @noflip */
        &.mw-halign-left {
                /* @noflip */
                margin: .5em 1.4em 1.3em 0;
@@ -49,11 +65,13 @@ figure[typeof*='mw:Image'] {
        }
 
        &.mw-halign-center {
-               margin-left: auto;
-               margin-right: auto;
+               margin: 0 auto .5em auto;
+               display: table;
+               clear: none;
+               float: none;
        }
 
-       figcaption {
+       figcaption {
                display: table-caption;
                caption-side: bottom;
                /* In mw-core the font-size is duplicated, 94% in thumbiner
@@ -63,14 +81,49 @@ figure[typeof*='mw:Image'] {
                line-height: 1.4em;
                text-align: left;
 
-               /* taken from .thumbcaption */
-               padding: 3px;
+               border: 1px solid #ccc;
+               border-top: 0;
+
+               /* taken from .thumbcaption, plus .thumbinner */
+               padding: 1px 5px 5px;
+               background-color: #f9f9f9;
        }
 }
 
-figure[typeof~='mw:Image/Thumb'], figure[typeof~='mw:Image/Frame'] {
+figure[typeof~='mw:Image/Thumb'],
+figure[typeof~='mw:Image/Frame'] {
        display: table;
-       overflow: hidden;
+       overflow: auto;
        text-align: center;
        padding: 3px;
+       border: 1px solid #ccc;
+       border-bottom: 0; // No border to caption
+       border-collapse: collapse;
+       background-color: #f9f9f9;
+       // Default to right alignment. This is needed since Parsoid only specifies the
+       // alignment class when the alignment is explicitly set.
+       margin: .5em 0 1.3em 1.4em;
+       clear: right;
+       float: right;
+}
+
+figure[typeof~='mw:Image/Thumb'] > *:first-child > img,
+figure[typeof~='mw:Image/Frame'] > *:first-child > img,
+.mw-image-border > *:first-child > img {
+       border: 1px solid #cccccc;
+       margin: 4px;
+}
+
+/* Hide the caption for frameless and plain floated images */
+figure[typeof~="mw:Image/Frameless"] > figcaption,
+figure[typeof~="mw:Image"] > figcaption { display: none }
+
+/*
+ * Finally, some basic styling for Parsoid render testing.
+ * Only Parsoid directly sets .mw-body-content directly on the body, so this
+ * shouldn't affect anything else.
+ */
+body.mw-body-content {
+       background-color: #fff;
+       padding: 0.8em;
 }
index a2c2228..8d3e86a 100644 (file)
@@ -7,7 +7,7 @@
                        var promise,
                                api = new mw.Api(),
                                $link = $( this ),
-                               $subjectLink = $link.parents( 'li' ).children( 'a' ).eq( 0 ),
+                               $subjectLink = $link.closest( 'li' ).children( 'a' ).eq( 0 ),
                                title = mw.util.getParamValue( 'title', $link.attr( 'href' ) );
                        // nice format
                        title = mw.Title.newFromText( title ).toText();
index 18661de..d456f86 100644 (file)
@@ -1,10 +1,35 @@
+// FIXME: remove @colorProgressiveShadow (shadows should be generated
+// in LESS by dimming the original colors)
+@colorProgressiveShadow: #4091ed;
+
+// White; for background use, and text use on dark backgrounds
 @colorWhite: #fff;
-@colorGrayLight: #ccc;
+// Off-white; for background use on white backgrounds
+@colorOffWhite: #fafafa;
+// Dark gray; for non-text use
 @colorGrayDark: #898989;
+// Light gray; for non-text use
+@colorGrayLight: #ccc;
+// Very light gray; for non-text use
+@colorGrayLighter: #ddd;
+// Lightest gray; for non-text use
+@colorGrayLightest: #eee;
+
+// Dark gray; for body text
 @colorText: #252525;
+// Light gray; for less important body text and links
+@colorTextLight: #696969;
+
+// Blue; for contextual use of a continuing action
 @colorProgressive: #347bff;
-// FIXME: remove @colorProgressiveShadow (shadows should be generated
-// in LESS by dimming the original colors)
-@colorProgressiveShadow: #4091ed;
+// Orange; for contextual use of returning to a past action
+@colorRegressive: #ff7e1e;
+// Green; for contextual use of a positive finalizing action
 @colorConstructive: #00af89;
+// Red; for contextual use of a negative finalizing action
 @colorDestructive: #d11d13;
+
+// Used in mixins to darken contextual colors by the same amount (eg. focus)
+@colorDarkenPercentage: 13.5%;
+// Used in mixins to lighten contextual colors by the same amount (eg. hover)
+@colorLightenPercentage: 13.5%;
\ No newline at end of file
index df51efc..04e88e8 100644 (file)
@@ -20,6 +20,7 @@
 //
 // Styleguide 1.
 
+@import "mediawiki.mixins";
 @import "components/utilities";
 @import "components/vector/forms";
 @import "components/vector/containers";
index c1815a5..c1f1844 100644 (file)
                         * @throws {Error} If any unregistered module or a dependency loop is encountered
                         */
                        function sortDependencies( module, resolved, unresolved ) {
-                               var n, deps, len;
+                               var n, deps, len, skip;
 
                                if ( registry[module] === undefined ) {
                                        throw new Error( 'Unknown dependency: ' + module );
                                }
+
+                               if ( registry[module].skip !== null ) {
+                                       /*jshint evil:true */
+                                       skip = new Function( registry[module].skip );
+                                       registry[module].skip = null;
+                                       if ( skip() ) {
+                                               registry[module].dependencies = [];
+                                               registry[module].state = 'ready';
+                                               handlePending( module );
+                                               return;
+                                       }
+                               }
+
                                // Resolves dynamic loader function and replaces it with its own results
                                if ( $.isFunction( registry[module].dependencies ) ) {
                                        registry[module].dependencies = registry[module].dependencies();
                                 *  names on which this module depends, or a function that returns that array.
                                 * @param {string} [group=null] Group which the module is in
                                 * @param {string} [source='local'] Name of the source
+                                * @param {string} [skip=null] Script body of the skip function
                                 */
-                               register: function ( module, version, dependencies, group, source ) {
+                               register: function ( module, version, dependencies, group, source, skip ) {
                                        var m;
                                        // Allow multiple registration
                                        if ( typeof module === 'object' ) {
                                                dependencies: [],
                                                group: typeof group === 'string' ? group : null,
                                                source: typeof source === 'string' ? source : 'local',
-                                               state: 'registered'
+                                               state: 'registered',
+                                               skip: typeof skip === 'string' ? skip : null
                                        };
                                        if ( typeof dependencies === 'string' ) {
                                                // Allow dependencies to be given as a single module name
index c2c70b0..a314dcb 100644 (file)
@@ -66,6 +66,7 @@
                                .wrap(
                                        $( '<a>' )
                                                .attr( 'href', resultRenderCache.baseHref + $.param( resultRenderCache.linkParams ) )
+                                               .attr( 'title', text )
                                                .addClass( 'mw-searchSuggest-link' )
                                );
                }
                ];
                $( searchboxesSelectors.join( ', ' ) )
                        .suggestions( {
-                               fetch: function ( query ) {
-                                       var $textbox = this,
-                                               node = this[0];
+                               fetch: function ( query, response ) {
+                                       var node = this[0];
 
                                        api = api || new mw.Api();
 
                                                namespace: 0,
                                                suggest: ''
                                        } ).done( function ( data ) {
-                                               $textbox.suggestions( 'suggestions', data[1] );
+                                               response( data[ 1 ] );
                                        } ) );
                                },
                                cancel: function () {
                                                return true;
                                        }
                                },
-                               delay: 120,
+                               cache: true,
                                highlightInput: true
                        } )
                        .bind( 'paste cut drop', function () {
index 3ab8af2..a35670e 100644 (file)
@@ -7,5 +7,3 @@
 !vector/*
 
 *.php
-!MonoBook.php
-!Vector.php
diff --git a/skins/MonoBook.php b/skins/MonoBook.php
deleted file mode 100644 (file)
index 72056b9..0000000
+++ /dev/null
@@ -1,412 +0,0 @@
-<?php
-/**
- * MonoBook nouveau.
- *
- * Translated from gwicke's previous TAL template version to remove
- * dependency on PHPTAL.
- *
- * This 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 document
- * @file
- * @ingroup Skins
- */
-
-if ( !defined( 'MEDIAWIKI' ) ) {
-       die( -1 );
-}
-
-/**
- * Inherit main code from SkinTemplate, set the CSS and template filter.
- * @todo document
- * @ingroup Skins
- */
-class SkinMonoBook extends SkinTemplate {
-       /** Using monobook. */
-       public $skinname = 'monobook';
-       public $stylename = 'monobook';
-       public $template = 'MonoBookTemplate';
-       public $useHeadElement = true;
-
-       /**
-        * @param OutputPage $out
-        */
-       function setupSkinUserCss( OutputPage $out ) {
-               parent::setupSkinUserCss( $out );
-
-               $out->addModuleStyles( array( 'mediawiki.skinning.interface', 'skins.monobook.styles' ) );
-
-               // TODO: Migrate all of these
-               $out->addStyle( 'monobook/IE60Fixes.css', 'screen', 'IE 6' );
-               $out->addStyle( 'monobook/IE70Fixes.css', 'screen', 'IE 7' );
-       }
-}
-
-/**
- * @todo document
- * @ingroup Skins
- */
-class MonoBookTemplate extends BaseTemplate {
-
-       /**
-        * Template filter callback for MonoBook skin.
-        * Takes an associative array of data set from a SkinTemplate-based
-        * class, and a wrapper for MediaWiki's localization database, and
-        * outputs a formatted page.
-        *
-        * @access private
-        */
-       function execute() {
-               // Suppress warnings to prevent notices about missing indexes in $this->data
-               wfSuppressWarnings();
-
-               $this->html( 'headelement' );
-               ?><div id="globalWrapper">
-               <div id="column-content">
-                       <div id="content" class="mw-body-primary" role="main">
-                               <a id="top"></a>
-                               <?php
-                               if ( $this->data['sitenotice'] ) {
-                                       ?>
-                                       <div id="siteNotice"><?php
-                                       $this->html( 'sitenotice' )
-                                       ?></div><?php
-                               }
-                               ?>
-
-                               <h1 id="firstHeading" class="firstHeading" lang="<?php
-                               $this->data['pageLanguage'] =
-                                       $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
-                               $this->text( 'pageLanguage' );
-                               ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
-
-                               <div id="bodyContent" class="mw-body">
-                                       <div id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
-                                       <div id="contentSub"<?php
-                                       $this->html( 'userlangattributes' ) ?>><?php $this->html( 'subtitle' )
-                                               ?></div>
-                                       <?php if ( $this->data['undelete'] ) { ?>
-                                               <div id="contentSub2"><?php $this->html( 'undelete' ) ?></div>
-                                       <?php
-}
-                                       ?><?php
-                                       if ( $this->data['newtalk'] ) {
-                                               ?>
-                                               <div class="usermessage"><?php $this->html( 'newtalk' ) ?></div>
-                                       <?php
-                                       }
-                                       ?>
-                                       <div id="jump-to-nav" class="mw-jump"><?php
-                                               $this->msg( 'jumpto' )
-                                               ?> <a href="#column-one"><?php
-                                                       $this->msg( 'jumptonavigation' )
-                                                       ?></a><?php
-                                               $this->msg( 'comma-separator' )
-                                               ?><a href="#searchInput"><?php
-                                                       $this->msg( 'jumptosearch' )
-                                                       ?></a></div>
-
-                                       <!-- start content -->
-                                       <?php $this->html( 'bodytext' ) ?>
-                                       <?php
-                                       if ( $this->data['catlinks'] ) {
-                                               $this->html( 'catlinks' );
-                                       }
-                                       ?>
-                                       <!-- end content -->
-                                       <?php
-                                       if ( $this->data['dataAfterContent'] ) {
-                                               $this->html( 'dataAfterContent'
-                                               );
-                                       }
-                                       ?>
-                                       <div class="visualClear"></div>
-                               </div>
-                       </div>
-               </div>
-               <div id="column-one"<?php $this->html( 'userlangattributes' ) ?>>
-                       <h2><?php $this->msg( 'navigation-heading' ) ?></h2>
-                       <?php $this->cactions(); ?>
-                       <div class="portlet" id="p-personal" role="navigation">
-                               <h3><?php $this->msg( 'personaltools' ) ?></h3>
-
-                               <div class="pBody">
-                                       <ul<?php $this->html( 'userlangattributes' ) ?>>
-                                               <?php foreach ( $this->getPersonalTools() as $key => $item ) { ?>
-                                                       <?php echo $this->makeListItem( $key, $item ); ?>
-
-                                               <?php
-}
-                                               ?>
-                                       </ul>
-                               </div>
-                       </div>
-                       <div class="portlet" id="p-logo" role="banner">
-                               <?php
-                               echo Html::element( 'a', array(
-                                               'href' => $this->data['nav_urls']['mainpage']['href'],
-                                               'style' => "background-image: url({$this->data['logopath']});" )
-                                       + Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) ); ?>
-
-                       </div>
-                       <?php
-                       $this->renderPortals( $this->data['sidebar'] );
-                       ?>
-               </div><!-- end of the left (by default at least) column -->
-               <div class="visualClear"></div>
-               <?php
-               $validFooterIcons = $this->getFooterIcons( "icononly" );
-               $validFooterLinks = $this->getFooterLinks( "flat" ); // Additional footer links
-
-               if ( count( $validFooterIcons ) + count( $validFooterLinks ) > 0 ) {
-                       ?>
-                       <div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
-                       <?php
-                       $footerEnd = '</div>';
-               } else {
-                       $footerEnd = '';
-               }
-
-               foreach ( $validFooterIcons as $blockName => $footerIcons ) {
-                       ?>
-                       <div id="f-<?php echo htmlspecialchars( $blockName ); ?>ico">
-                               <?php foreach ( $footerIcons as $icon ) { ?>
-                                       <?php echo $this->getSkin()->makeFooterIcon( $icon ); ?>
-
-                               <?php
-}
-                               ?>
-                       </div>
-               <?php
-               }
-
-               if ( count( $validFooterLinks ) > 0 ) {
-                       ?>
-                       <ul id="f-list">
-                               <?php
-                               foreach ( $validFooterLinks as $aLink ) {
-                                       ?>
-                                       <li id="<?php echo $aLink ?>"><?php $this->html( $aLink ) ?></li>
-                               <?php
-                               }
-                               ?>
-                       </ul>
-               <?php
-               }
-
-               echo $footerEnd;
-               ?>
-
-               </div>
-               <?php
-               $this->printTrail();
-               echo Html::closeElement( 'body' );
-               echo Html::closeElement( 'html' );
-               wfRestoreWarnings();
-       } // end of execute() method
-
-       /*************************************************************************************************/
-
-       /**
-        * @param array $sidebar
-        */
-       protected function renderPortals( $sidebar ) {
-               if ( !isset( $sidebar['SEARCH'] ) ) {
-                       $sidebar['SEARCH'] = true;
-               }
-               if ( !isset( $sidebar['TOOLBOX'] ) ) {
-                       $sidebar['TOOLBOX'] = true;
-               }
-               if ( !isset( $sidebar['LANGUAGES'] ) ) {
-                       $sidebar['LANGUAGES'] = true;
-               }
-
-               foreach ( $sidebar as $boxName => $content ) {
-                       if ( $content === false ) {
-                               continue;
-                       }
-
-                       if ( $boxName == 'SEARCH' ) {
-                               $this->searchBox();
-                       } elseif ( $boxName == 'TOOLBOX' ) {
-                               $this->toolbox();
-                       } elseif ( $boxName == 'LANGUAGES' ) {
-                               $this->languageBox();
-                       } else {
-                               $this->customBox( $boxName, $content );
-                       }
-               }
-       }
-
-       function searchBox() {
-               global $wgUseTwoButtonsSearchForm;
-               ?>
-               <div id="p-search" class="portlet" role="search">
-                       <h3><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h3>
-
-                       <div id="searchBody" class="pBody">
-                               <form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
-                                       <input type='hidden' name="title" value="<?php $this->text( 'searchtitle' ) ?>"/>
-                                       <?php echo $this->makeSearchInput( array( "id" => "searchInput" ) ); ?>
-
-                                       <?php
-                                       echo $this->makeSearchButton(
-                                               "go",
-                                               array( "id" => "searchGoButton", "class" => "searchButton" )
-                                       );
-
-                                       if ( $wgUseTwoButtonsSearchForm ) {
-                                               ?>&#160;
-                                               <?php echo $this->makeSearchButton(
-                                                       "fulltext",
-                                                       array( "id" => "mw-searchButton", "class" => "searchButton" )
-                                               );
-                                       } else {
-                                               ?>
-
-                                               <div><a href="<?php
-                                               $this->text( 'searchaction' )
-                                               ?>" rel="search"><?php $this->msg( 'powersearch-legend' ) ?></a></div><?php
-                                       } ?>
-
-                               </form>
-
-                               <?php $this->renderAfterPortlet( 'search' ); ?>
-                       </div>
-               </div>
-       <?php
-       }
-
-       /**
-        * Prints the cactions bar.
-        * Shared between MonoBook and Modern
-        */
-       function cactions() {
-               ?>
-               <div id="p-cactions" class="portlet" role="navigation">
-                       <h3><?php $this->msg( 'views' ) ?></h3>
-
-                       <div class="pBody">
-                               <ul><?php
-                                       foreach ( $this->data['content_actions'] as $key => $tab ) {
-                                               echo '
-                               ' . $this->makeListItem( $key, $tab );
-                                       } ?>
-
-                               </ul>
-                               <?php $this->renderAfterPortlet( 'cactions' ); ?>
-                       </div>
-               </div>
-       <?php
-       }
-
-       /*************************************************************************************************/
-       function toolbox() {
-               ?>
-               <div class="portlet" id="p-tb" role="navigation">
-                       <h3><?php $this->msg( 'toolbox' ) ?></h3>
-
-                       <div class="pBody">
-                               <ul>
-                                       <?php
-                                       foreach ( $this->getToolbox() as $key => $tbitem ) {
-                                               ?>
-                                               <?php echo $this->makeListItem( $key, $tbitem ); ?>
-
-                                       <?php
-                                       }
-                                       wfRunHooks( 'MonoBookTemplateToolboxEnd', array( &$this ) );
-                                       wfRunHooks( 'SkinTemplateToolboxEnd', array( &$this, true ) );
-                                       ?>
-                               </ul>
-                               <?php $this->renderAfterPortlet( 'tb' ); ?>
-                       </div>
-               </div>
-       <?php
-       }
-
-       /*************************************************************************************************/
-       function languageBox() {
-               if ( $this->data['language_urls'] !== false ) {
-                       ?>
-                       <div id="p-lang" class="portlet" role="navigation">
-                               <h3<?php $this->html( 'userlangattributes' ) ?>><?php $this->msg( 'otherlanguages' ) ?></h3>
-
-                               <div class="pBody">
-                                       <ul>
-                                               <?php foreach ( $this->data['language_urls'] as $key => $langlink ) { ?>
-                                                       <?php echo $this->makeListItem( $key, $langlink ); ?>
-
-                                               <?php
-}
-                                               ?>
-                                       </ul>
-
-                                       <?php $this->renderAfterPortlet( 'lang' ); ?>
-                               </div>
-                       </div>
-               <?php
-               }
-       }
-
-       /*************************************************************************************************/
-       /**
-        * @param string $bar
-        * @param array|string $cont
-        */
-       function customBox( $bar, $cont ) {
-               $portletAttribs = array(
-                       'class' => 'generated-sidebar portlet',
-                       'id' => Sanitizer::escapeId( "p-$bar" ),
-                       'role' => 'navigation'
-               );
-
-               $tooltip = Linker::titleAttrib( "p-$bar" );
-               if ( $tooltip !== false ) {
-                       $portletAttribs['title'] = $tooltip;
-               }
-               echo '  ' . Html::openElement( 'div', $portletAttribs );
-               $msgObj = wfMessage( $bar );
-               ?>
-
-               <h3><?php echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $bar ); ?></h3>
-               <div class='pBody'>
-                       <?php
-                       if ( is_array( $cont ) ) {
-                               ?>
-                               <ul>
-                                       <?php
-                                       foreach ( $cont as $key => $val ) {
-                                               ?>
-                                               <?php echo $this->makeListItem( $key, $val ); ?>
-
-                                       <?php
-                                       }
-                                       ?>
-                               </ul>
-                       <?php
-                       } else {
-                               # allow raw HTML block to be defined by extensions
-                               print $cont;
-                       }
-
-                       $this->renderAfterPortlet( $bar );
-                       ?>
-               </div>
-               </div>
-       <?php
-       }
-} // end of class
diff --git a/skins/MonoBook/COPYING b/skins/MonoBook/COPYING
new file mode 100644 (file)
index 0000000..019694a
--- /dev/null
@@ -0,0 +1,342 @@
+== GNU GENERAL PUBLIC LICENSE ==
+
+Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+=== Preamble ===
+
+The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and
+modification follow.
+
+== TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION ==
+
+'''0.''' This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+'''1.''' You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+'''2.''' You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+       '''a)''' You must cause the modified files to carry prominent notices
+       stating that you changed the files and the date of any change.
+
+       '''b)''' You must cause any work that you distribute or publish, that in
+       whole or in part contains or is derived from the Program or any
+       part thereof, to be licensed as a whole at no charge to all third
+       parties under the terms of this License.
+
+       '''c)''' If the modified program normally reads commands interactively
+       when run, you must cause it, when started running for such
+       interactive use in the most ordinary way, to print or display an
+       announcement including an appropriate copyright notice and a
+       notice that there is no warranty (or else, saying that you provide
+       a warranty) and that users may redistribute the program under
+       these conditions, and telling the user how to view a copy of this
+       License.  (Exception: if the Program itself is interactive but
+       does not normally print such an announcement, your work based on
+       the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+'''3.''' You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+       '''a)''' Accompany it with the complete corresponding machine-readable
+       source code, which must be distributed under the terms of Sections
+       1 and 2 above on a medium customarily used for software interchange; or,
+
+       '''b)''' Accompany it with a written offer, valid for at least three
+       years, to give any third party, for a charge no more than your
+       cost of physically performing source distribution, a complete
+       machine-readable copy of the corresponding source code, to be
+       distributed under the terms of Sections 1 and 2 above on a medium
+       customarily used for software interchange; or,
+
+       '''c)''' Accompany it with the information you received as to the offer
+       to distribute corresponding source code.  (This alternative is
+       allowed only for noncommercial distribution and only if you
+       received the program in object code or executable form with such
+       an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+'''4.''' You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+'''5.''' You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+'''6.''' Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+'''7.''' If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+'''8.''' If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+'''9.''' The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+'''10.''' If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+=== NO WARRANTY ===
+
+'''11.''' BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+'''12.''' IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+       '''END OF TERMS AND CONDITIONS'''
+
+== How to Apply These Terms to Your New Programs ==
+
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+       <one line to give the program's name and a brief idea of what it does.>
+
+       Copyright (C) <year>  <name of author>
+
+       This 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
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+       Gnomovision version 69, Copyright (C) year name of author
+       Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+       This is free software, and you are welcome to redistribute it
+       under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+       Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+       `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+       <signature of Ty Coon>, 1 April 1989
+
+       Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/skins/MonoBook/IE60Fixes.css b/skins/MonoBook/IE60Fixes.css
new file mode 100644 (file)
index 0000000..cd9399f
--- /dev/null
@@ -0,0 +1,125 @@
+/* 6.0 - only fixes */
+/* content area */
+/* workaround for various ie float bugs */
+div#column-content {
+       float: none;
+       margin-left: 0;
+       height: 1%;
+}
+
+div#column-content div#content {
+       margin-left: 12.2em;
+       margin-top: 3em;
+       height: 1%;
+}
+
+.rtl div#column-content div#content {
+       margin-right: 12.2em;
+       margin-left: 0;
+}
+
+div#column-one {
+       position: absolute;
+       top: 0;
+       left: 0;
+       z-index: 4;
+}
+
+.rtl div#column-one {
+       left: auto;
+       right: 0;
+}
+
+div#footer {
+       margin-left: 13.6em;
+       border-left: 1px solid #fabd23;
+}
+
+.rtl div#footer {
+       margin-left: 0;
+       margin-right: 13.6em;
+       border-left: none;
+       border-right: 1px solid #fabd23;
+}
+
+/* float/negative margin brokenness */
+* html div#footer {
+       margin-top: 0;
+}
+
+* html div#column-content {
+       display: inline;
+       margin-bottom: 0;
+}
+
+/* the tabs */
+
+#p-cactions {
+       z-index: 3;
+}
+
+#p-cactions li {
+       padding-bottom: 0 !important;
+       border: none;
+       background-color: transparent;
+       cursor: default;
+       float: none !important;
+}
+
+#p-cactions li a {
+       display: inline-block !important;
+       vertical-align: top;
+       padding-bottom: 0;
+       border: solid #aaa;
+       border-width: 1px 1px 0;
+}
+
+#p-cactions li.selected a {
+       border-color: #fabd23;
+       padding-bottom: 0.17em;
+}
+
+#p-cactions li a:hover {
+       padding-bottom: 0.17em;
+}
+
+#p-navigation a {
+       display: inline-block;
+       width: 100%;
+}
+
+#portal-personaltools {
+       padding-bottom: 0.1em;
+}
+
+.rtl a.feedlink {
+       background-position: right;
+       padding-right: 0;
+       padding-left: 16px;
+}
+
+/* show the hand */
+#p-logo a,
+#p-logo a:hover {
+       cursor: pointer;
+}
+
+div.visualClear {
+       width: 100%;
+       line-height: 0;
+}
+
+textarea {
+       width: 96%;
+}
+
+#catlinks,
+div.tright,
+div.tleft {
+       position: relative;
+}
+
+/* bug 12846 */
+body.rtl #preftoc a, body.rtl #preftoc a:active {
+       float: left;
+}
diff --git a/skins/MonoBook/IE70Fixes.css b/skins/MonoBook/IE70Fixes.css
new file mode 100644 (file)
index 0000000..42f9ce6
--- /dev/null
@@ -0,0 +1,96 @@
+/* 7.0 - only fixes */
+/* content area */
+/* workaround for various ie float bugs */
+
+/* This bit is needed to make links clickable... WTF */
+div#column-content div#content {
+       margin-left: 12.2em;
+       margin-top: 3em;
+       height: 1%;
+}
+
+.rtl div#column-content div#content {
+       margin-right: 12.2em;
+       margin-left: 0;
+}
+
+.rtl div#column-one {
+       /* For some reason it tries to inherit the padding-top into every div,
+        * and I can't figure out how to get it back off.
+        * Margin works correctly for this use, though.
+        */
+       padding-top: 0;
+       margin-top: 160px;
+}
+
+/* These elements also have padding-left: 20px; in main.css, but in RTL mode this is flipped.
+ * That's good in normal browsers, but in IE7 it needs to not be flipped for some daft reason.
+ * Also clear the right margin (originally margin-left: 1em)
+ */
+li#pt-userpage, li#pt-anonuserpage, li#pt-login {
+       padding-left: 20px;
+       margin-right: 0;
+}
+
+.rtl a.feedlink {
+       background-position: right;
+       padding-right: 0;
+       padding-left: 16px;
+}
+
+/* the tabs */
+
+#p-cactions {
+       z-index: 3;
+}
+
+#p-cactions li {
+       padding-bottom: 0 !important;
+       border: none;
+       background-color: transparent;
+       cursor: default;
+       float: none !important;
+}
+
+#p-cactions li a {
+       display: inline-block !important;
+       vertical-align: top;
+       padding-bottom: 0;
+       border: solid #aaa;
+       border-width: 1px 1px 0;
+}
+
+#p-cactions li.selected a {
+       border-color: #fabd23;
+       padding-bottom: 0.17em;
+}
+
+#p-cactions li a:hover {
+       padding-bottom: 0.17em;
+}
+
+#p-navigation a {
+       display: inline-block;
+       width: 100%;
+}
+
+#portal-personaltools {
+       padding-bottom: 0.1em;
+}
+
+textarea {
+       width: 96%;
+}
+
+/*
+#catlinks,
+div.tright,
+div.tleft {
+       position: relative;
+}
+*/
+
+div#footer li {
+       /* Work around bug with inline <li> tags with right margins and nowrap */
+       margin-right: 0;
+}
diff --git a/skins/MonoBook/MonoBook.php b/skins/MonoBook/MonoBook.php
new file mode 100644 (file)
index 0000000..97c0cd8
--- /dev/null
@@ -0,0 +1,52 @@
+<?php
+/**
+ * MonoBook nouveau.
+ *
+ * Translated from gwicke's previous TAL template version to remove
+ * dependency on PHPTAL.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Skins
+ */
+
+$wgExtensionCredits['skin'][] = array(
+       'path' => __FILE__,
+       'name' => 'MonoBook',
+       'namemsg' => 'skinname-monobook',
+       'descriptionmsg' => 'monobook-desc',
+       'url' => 'https://www.mediawiki.org/wiki/Skin:MonoBook',
+       'author' => array( 'Gabriel Wicke', '...' ),
+       'license-name' => 'GPLv2+',
+);
+
+// Register files
+$wgAutoloadClasses['SkinMonoBook'] = __DIR__ . '/SkinMonoBook.php';
+$wgAutoloadClasses['MonoBookTemplate'] = __DIR__ . '/MonoBookTemplate.php';
+$wgMessagesDirs['MonoBook'] = __DIR__ . '/i18n';
+
+// Register skin
+$wgValidSkinNames['monobook'] = 'MonoBook';
+
+// Register modules
+$wgResourceModules['skins.monobook.styles'] = array(
+       'styles' => array(
+               'main.css' => array( 'media' => 'screen' ),
+       ),
+       'remoteSkinPath' => 'MonoBook',
+       'localBasePath' => __DIR__,
+);
diff --git a/skins/MonoBook/MonoBookTemplate.php b/skins/MonoBook/MonoBookTemplate.php
new file mode 100644 (file)
index 0000000..373c004
--- /dev/null
@@ -0,0 +1,380 @@
+<?php
+/**
+ * MonoBook nouveau.
+ *
+ * Translated from gwicke's previous TAL template version to remove
+ * dependency on PHPTAL.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Skins
+ */
+
+/**
+ * @ingroup Skins
+ */
+class MonoBookTemplate extends BaseTemplate {
+
+       /**
+        * Template filter callback for MonoBook skin.
+        * Takes an associative array of data set from a SkinTemplate-based
+        * class, and a wrapper for MediaWiki's localization database, and
+        * outputs a formatted page.
+        *
+        * @access private
+        */
+       function execute() {
+               // Suppress warnings to prevent notices about missing indexes in $this->data
+               wfSuppressWarnings();
+
+               $this->html( 'headelement' );
+               ?><div id="globalWrapper">
+               <div id="column-content">
+                       <div id="content" class="mw-body-primary" role="main">
+                               <a id="top"></a>
+                               <?php
+                               if ( $this->data['sitenotice'] ) {
+                                       ?>
+                                       <div id="siteNotice"><?php
+                                       $this->html( 'sitenotice' )
+                                       ?></div><?php
+                               }
+                               ?>
+
+                               <h1 id="firstHeading" class="firstHeading" lang="<?php
+                               $this->data['pageLanguage'] =
+                                       $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
+                               $this->text( 'pageLanguage' );
+                               ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
+
+                               <div id="bodyContent" class="mw-body">
+                                       <div id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
+                                       <div id="contentSub"<?php
+                                       $this->html( 'userlangattributes' ) ?>><?php $this->html( 'subtitle' )
+                                               ?></div>
+                                       <?php if ( $this->data['undelete'] ) { ?>
+                                               <div id="contentSub2"><?php $this->html( 'undelete' ) ?></div>
+                                       <?php
+}
+                                       ?><?php
+                                       if ( $this->data['newtalk'] ) {
+                                               ?>
+                                               <div class="usermessage"><?php $this->html( 'newtalk' ) ?></div>
+                                       <?php
+                                       }
+                                       ?>
+                                       <div id="jump-to-nav" class="mw-jump"><?php
+                                               $this->msg( 'jumpto' )
+                                               ?> <a href="#column-one"><?php
+                                                       $this->msg( 'jumptonavigation' )
+                                                       ?></a><?php
+                                               $this->msg( 'comma-separator' )
+                                               ?><a href="#searchInput"><?php
+                                                       $this->msg( 'jumptosearch' )
+                                                       ?></a></div>
+
+                                       <!-- start content -->
+                                       <?php $this->html( 'bodytext' ) ?>
+                                       <?php
+                                       if ( $this->data['catlinks'] ) {
+                                               $this->html( 'catlinks' );
+                                       }
+                                       ?>
+                                       <!-- end content -->
+                                       <?php
+                                       if ( $this->data['dataAfterContent'] ) {
+                                               $this->html( 'dataAfterContent'
+                                               );
+                                       }
+                                       ?>
+                                       <div class="visualClear"></div>
+                               </div>
+                       </div>
+               </div>
+               <div id="column-one"<?php $this->html( 'userlangattributes' ) ?>>
+                       <h2><?php $this->msg( 'navigation-heading' ) ?></h2>
+                       <?php $this->cactions(); ?>
+                       <div class="portlet" id="p-personal" role="navigation">
+                               <h3><?php $this->msg( 'personaltools' ) ?></h3>
+
+                               <div class="pBody">
+                                       <ul<?php $this->html( 'userlangattributes' ) ?>>
+                                               <?php foreach ( $this->getPersonalTools() as $key => $item ) { ?>
+                                                       <?php echo $this->makeListItem( $key, $item ); ?>
+
+                                               <?php
+}
+                                               ?>
+                                       </ul>
+                               </div>
+                       </div>
+                       <div class="portlet" id="p-logo" role="banner">
+                               <?php
+                               echo Html::element( 'a', array(
+                                               'href' => $this->data['nav_urls']['mainpage']['href'],
+                                               'style' => "background-image: url({$this->data['logopath']});" )
+                                       + Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) ); ?>
+
+                       </div>
+                       <?php
+                       $this->renderPortals( $this->data['sidebar'] );
+                       ?>
+               </div><!-- end of the left (by default at least) column -->
+               <div class="visualClear"></div>
+               <?php
+               $validFooterIcons = $this->getFooterIcons( "icononly" );
+               $validFooterLinks = $this->getFooterLinks( "flat" ); // Additional footer links
+
+               if ( count( $validFooterIcons ) + count( $validFooterLinks ) > 0 ) {
+                       ?>
+                       <div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
+                       <?php
+                       $footerEnd = '</div>';
+               } else {
+                       $footerEnd = '';
+               }
+
+               foreach ( $validFooterIcons as $blockName => $footerIcons ) {
+                       ?>
+                       <div id="f-<?php echo htmlspecialchars( $blockName ); ?>ico">
+                               <?php foreach ( $footerIcons as $icon ) { ?>
+                                       <?php echo $this->getSkin()->makeFooterIcon( $icon ); ?>
+
+                               <?php
+}
+                               ?>
+                       </div>
+               <?php
+               }
+
+               if ( count( $validFooterLinks ) > 0 ) {
+                       ?>
+                       <ul id="f-list">
+                               <?php
+                               foreach ( $validFooterLinks as $aLink ) {
+                                       ?>
+                                       <li id="<?php echo $aLink ?>"><?php $this->html( $aLink ) ?></li>
+                               <?php
+                               }
+                               ?>
+                       </ul>
+               <?php
+               }
+
+               echo $footerEnd;
+               ?>
+
+               </div>
+               <?php
+               $this->printTrail();
+               echo Html::closeElement( 'body' );
+               echo Html::closeElement( 'html' );
+               wfRestoreWarnings();
+       } // end of execute() method
+
+       /*************************************************************************************************/
+
+       /**
+        * @param array $sidebar
+        */
+       protected function renderPortals( $sidebar ) {
+               if ( !isset( $sidebar['SEARCH'] ) ) {
+                       $sidebar['SEARCH'] = true;
+               }
+               if ( !isset( $sidebar['TOOLBOX'] ) ) {
+                       $sidebar['TOOLBOX'] = true;
+               }
+               if ( !isset( $sidebar['LANGUAGES'] ) ) {
+                       $sidebar['LANGUAGES'] = true;
+               }
+
+               foreach ( $sidebar as $boxName => $content ) {
+                       if ( $content === false ) {
+                               continue;
+                       }
+
+                       if ( $boxName == 'SEARCH' ) {
+                               $this->searchBox();
+                       } elseif ( $boxName == 'TOOLBOX' ) {
+                               $this->toolbox();
+                       } elseif ( $boxName == 'LANGUAGES' ) {
+                               $this->languageBox();
+                       } else {
+                               $this->customBox( $boxName, $content );
+                       }
+               }
+       }
+
+       function searchBox() {
+               global $wgUseTwoButtonsSearchForm;
+               ?>
+               <div id="p-search" class="portlet" role="search">
+                       <h3><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h3>
+
+                       <div id="searchBody" class="pBody">
+                               <form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
+                                       <input type='hidden' name="title" value="<?php $this->text( 'searchtitle' ) ?>"/>
+                                       <?php echo $this->makeSearchInput( array( "id" => "searchInput" ) ); ?>
+
+                                       <?php
+                                       echo $this->makeSearchButton(
+                                               "go",
+                                               array( "id" => "searchGoButton", "class" => "searchButton" )
+                                       );
+
+                                       if ( $wgUseTwoButtonsSearchForm ) {
+                                               ?>&#160;
+                                               <?php echo $this->makeSearchButton(
+                                                       "fulltext",
+                                                       array( "id" => "mw-searchButton", "class" => "searchButton" )
+                                               );
+                                       } else {
+                                               ?>
+
+                                               <div><a href="<?php
+                                               $this->text( 'searchaction' )
+                                               ?>" rel="search"><?php $this->msg( 'powersearch-legend' ) ?></a></div><?php
+                                       } ?>
+
+                               </form>
+
+                               <?php $this->renderAfterPortlet( 'search' ); ?>
+                       </div>
+               </div>
+       <?php
+       }
+
+       /**
+        * Prints the cactions bar.
+        * Shared between MonoBook and Modern
+        */
+       function cactions() {
+               ?>
+               <div id="p-cactions" class="portlet" role="navigation">
+                       <h3><?php $this->msg( 'views' ) ?></h3>
+
+                       <div class="pBody">
+                               <ul><?php
+                                       foreach ( $this->data['content_actions'] as $key => $tab ) {
+                                               echo '
+                               ' . $this->makeListItem( $key, $tab );
+                                       } ?>
+
+                               </ul>
+                               <?php $this->renderAfterPortlet( 'cactions' ); ?>
+                       </div>
+               </div>
+       <?php
+       }
+
+       /*************************************************************************************************/
+       function toolbox() {
+               ?>
+               <div class="portlet" id="p-tb" role="navigation">
+                       <h3><?php $this->msg( 'toolbox' ) ?></h3>
+
+                       <div class="pBody">
+                               <ul>
+                                       <?php
+                                       foreach ( $this->getToolbox() as $key => $tbitem ) {
+                                               ?>
+                                               <?php echo $this->makeListItem( $key, $tbitem ); ?>
+
+                                       <?php
+                                       }
+                                       wfRunHooks( 'MonoBookTemplateToolboxEnd', array( &$this ) );
+                                       wfRunHooks( 'SkinTemplateToolboxEnd', array( &$this, true ) );
+                                       ?>
+                               </ul>
+                               <?php $this->renderAfterPortlet( 'tb' ); ?>
+                       </div>
+               </div>
+       <?php
+       }
+
+       /*************************************************************************************************/
+       function languageBox() {
+               if ( $this->data['language_urls'] !== false ) {
+                       ?>
+                       <div id="p-lang" class="portlet" role="navigation">
+                               <h3<?php $this->html( 'userlangattributes' ) ?>><?php $this->msg( 'otherlanguages' ) ?></h3>
+
+                               <div class="pBody">
+                                       <ul>
+                                               <?php foreach ( $this->data['language_urls'] as $key => $langlink ) { ?>
+                                                       <?php echo $this->makeListItem( $key, $langlink ); ?>
+
+                                               <?php
+}
+                                               ?>
+                                       </ul>
+
+                                       <?php $this->renderAfterPortlet( 'lang' ); ?>
+                               </div>
+                       </div>
+               <?php
+               }
+       }
+
+       /*************************************************************************************************/
+       /**
+        * @param string $bar
+        * @param array|string $cont
+        */
+       function customBox( $bar, $cont ) {
+               $portletAttribs = array(
+                       'class' => 'generated-sidebar portlet',
+                       'id' => Sanitizer::escapeId( "p-$bar" ),
+                       'role' => 'navigation'
+               );
+
+               $tooltip = Linker::titleAttrib( "p-$bar" );
+               if ( $tooltip !== false ) {
+                       $portletAttribs['title'] = $tooltip;
+               }
+               echo '  ' . Html::openElement( 'div', $portletAttribs );
+               $msgObj = wfMessage( $bar );
+               ?>
+
+               <h3><?php echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $bar ); ?></h3>
+               <div class='pBody'>
+                       <?php
+                       if ( is_array( $cont ) ) {
+                               ?>
+                               <ul>
+                                       <?php
+                                       foreach ( $cont as $key => $val ) {
+                                               ?>
+                                               <?php echo $this->makeListItem( $key, $val ); ?>
+
+                                       <?php
+                                       }
+                                       ?>
+                               </ul>
+                       <?php
+                       } else {
+                               # allow raw HTML block to be defined by extensions
+                               print $cont;
+                       }
+
+                       $this->renderAfterPortlet( $bar );
+                       ?>
+               </div>
+               </div>
+       <?php
+       }
+} // end of class
diff --git a/skins/MonoBook/SkinMonoBook.php b/skins/MonoBook/SkinMonoBook.php
new file mode 100644 (file)
index 0000000..16fbd00
--- /dev/null
@@ -0,0 +1,49 @@
+<?php
+/**
+ * MonoBook nouveau.
+ *
+ * Translated from gwicke's previous TAL template version to remove
+ * dependency on PHPTAL.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Skins
+ */
+
+/**
+ * Inherit main code from SkinTemplate, set the CSS and template filter.
+ * @ingroup Skins
+ */
+class SkinMonoBook extends SkinTemplate {
+       /** Using MonoBook. */
+       public $skinname = 'monobook';
+       public $stylename = 'MonoBook';
+       public $template = 'MonoBookTemplate';
+
+       /**
+        * @param OutputPage $out
+        */
+       function setupSkinUserCss( OutputPage $out ) {
+               parent::setupSkinUserCss( $out );
+
+               $out->addModuleStyles( array( 'mediawiki.skinning.interface', 'skins.monobook.styles' ) );
+
+               // TODO: Migrate all of these
+               $out->addStyle( $this->stylename . '/IE60Fixes.css', 'screen', 'IE 6' );
+               $out->addStyle( $this->stylename . '/IE70Fixes.css', 'screen', 'IE 7' );
+       }
+}
diff --git a/skins/MonoBook/audio.png b/skins/MonoBook/audio.png
new file mode 100644 (file)
index 0000000..68c8768
Binary files /dev/null and b/skins/MonoBook/audio.png differ
diff --git a/skins/MonoBook/bullet.gif b/skins/MonoBook/bullet.gif
new file mode 100644 (file)
index 0000000..b43de48
Binary files /dev/null and b/skins/MonoBook/bullet.gif differ
diff --git a/skins/MonoBook/discussionitem_icon.gif b/skins/MonoBook/discussionitem_icon.gif
new file mode 100644 (file)
index 0000000..e3ca6d9
Binary files /dev/null and b/skins/MonoBook/discussionitem_icon.gif differ
diff --git a/skins/MonoBook/document.png b/skins/MonoBook/document.png
new file mode 100644 (file)
index 0000000..ee46a50
Binary files /dev/null and b/skins/MonoBook/document.png differ
diff --git a/skins/MonoBook/external-ltr.png b/skins/MonoBook/external-ltr.png
new file mode 100644 (file)
index 0000000..6308383
Binary files /dev/null and b/skins/MonoBook/external-ltr.png differ
diff --git a/skins/MonoBook/external-rtl.png b/skins/MonoBook/external-rtl.png
new file mode 100644 (file)
index 0000000..5313234
Binary files /dev/null and b/skins/MonoBook/external-rtl.png differ
diff --git a/skins/MonoBook/file_icon.gif b/skins/MonoBook/file_icon.gif
new file mode 100644 (file)
index 0000000..69dbeaf
Binary files /dev/null and b/skins/MonoBook/file_icon.gif differ
diff --git a/skins/MonoBook/headbg.jpg b/skins/MonoBook/headbg.jpg
new file mode 100644 (file)
index 0000000..5491c6e
Binary files /dev/null and b/skins/MonoBook/headbg.jpg differ
diff --git a/skins/MonoBook/i18n/en.json b/skins/MonoBook/i18n/en.json
new file mode 100644 (file)
index 0000000..0b27e6b
--- /dev/null
@@ -0,0 +1,9 @@
+{
+       "@metadata": {
+               "authors": []
+       },
+       "skinname-monobook": "MonoBook",
+       "monobook-desc": "The classic MediaWiki skin since 2004, named after the black-and-white photo of a book in the page background",
+       "monobook.css": "/* CSS placed here will affect users of the MonoBook skin */",
+       "monobook.js": "/* Any JavaScript here will be loaded for users using the MonoBook skin */"
+}
diff --git a/skins/MonoBook/i18n/qqq.json b/skins/MonoBook/i18n/qqq.json
new file mode 100644 (file)
index 0000000..d3058f9
--- /dev/null
@@ -0,0 +1,9 @@
+{
+       "@metadata": {
+               "authors": []
+       },
+       "skinname-monobook": "{{optional}}",
+       "monobook-desc": "{{desc|name=MonoBook|url=http://www.mediawiki.org/wiki/Skin:MonoBook}}",
+       "monobook.css": "{{optional}}\nCSS applied to users using MonoBook skin.",
+       "monobook.js": "{{optional}}\nJS for users using MonoBook skin."
+}
diff --git a/skins/MonoBook/link_icon.gif b/skins/MonoBook/link_icon.gif
new file mode 100644 (file)
index 0000000..168c1a2
Binary files /dev/null and b/skins/MonoBook/link_icon.gif differ
diff --git a/skins/MonoBook/lock_icon.gif b/skins/MonoBook/lock_icon.gif
new file mode 100644 (file)
index 0000000..f71cd9b
Binary files /dev/null and b/skins/MonoBook/lock_icon.gif differ
diff --git a/skins/MonoBook/magnify-clip.png b/skins/MonoBook/magnify-clip.png
new file mode 100644 (file)
index 0000000..ffd7637
Binary files /dev/null and b/skins/MonoBook/magnify-clip.png differ
diff --git a/skins/MonoBook/mail_icon.gif b/skins/MonoBook/mail_icon.gif
new file mode 100644 (file)
index 0000000..cf5680d
Binary files /dev/null and b/skins/MonoBook/mail_icon.gif differ
diff --git a/skins/MonoBook/main.css b/skins/MonoBook/main.css
new file mode 100644 (file)
index 0000000..cb76ae3
--- /dev/null
@@ -0,0 +1,913 @@
+/*
+** MediaWiki 'monobook' style sheet for CSS2-capable browsers.
+** Copyright Gabriel Wicke - http://wikidev.net/
+** License: GPL (http://www.gnu.org/copyleft/gpl.html)
+**
+** Loosely based on http://www.positioniseverything.net/ordered-floats.html by Big John
+** and the Plone 2.0 styles, see http://plone.org/ (Alexander Limi,Joe Geldart & Tom Croucher,
+** Michael Zeltner and Geir Bækholt)
+** All you guys rock :)
+*/
+
+div#column-content {
+       width: 100%;
+       float: right;
+       margin: 0 0 .6em -12.2em;
+       padding: 0;
+}
+
+div#content {
+       margin: 2.8em 0 0 12.2em;
+       padding: 1em;
+       position: relative;
+       z-index: 2;
+}
+
+div#column-one {
+       padding-top: 160px;
+}
+
+/* Hide, but keep accessible for screen-readers */
+#column-one h2 {
+       position: absolute;
+       top: -9999px;
+}
+
+div#content {
+       background: white;
+       color: black;
+       border: 1px solid #aaa;
+       border-right: none;
+       line-height: 1.5em;
+}
+
+/* the left column width is specified in class .portlet */
+
+/* Font size:
+** We take advantage of keyword scaling- browsers won't go below 9px
+** More at http://www.w3.org/2003/07/30-font-size
+** http://style.cleverchimp.com/font_size_intervals/altintervals.html
+*/
+
+body {
+       font: x-small sans-serif;
+       /* @embed */
+       background: #f9f9f9 url(headbg.jpg) 0 0 no-repeat;
+       color: black;
+       margin: 0;
+       padding: 0;
+       direction: ltr; /* Needed for RTL flipping */
+       unicode-bidi: embed;
+}
+
+/* scale back up to a sane default */
+div#globalWrapper {
+       font-size: 127%;
+       width: 100%;
+       margin: 0;
+       padding: 0;
+}
+
+/* general styles */
+a {
+       color: #002bb8;
+}
+
+a:visited {
+       color: #5a3696;
+}
+
+a.new,
+#p-personal a.new {
+       color: #cc2200;
+}
+
+ul {
+       list-style-type: square;
+       /* @embed */
+       list-style-image: url(bullet.gif);
+}
+
+input.historysubmit {
+       padding: 0 .3em .3em .3em !important;
+       font-size: 94%;
+       cursor: pointer;
+       height: 1.7em !important;
+       margin-left: 1.6em;
+}
+
+pre, .mw-code {
+       line-height: 1.1em;
+}
+
+#firstHeading {
+       padding-top: 0;
+}
+
+/*
+** the main content area
+*/
+
+#siteNotice {
+       font-size: 95%;
+       padding: 0 0.9em;
+}
+
+#localNotice {
+       margin: 0;
+}
+
+#siteNotice p {
+       margin: 0;
+       padding: 0;
+}
+
+/*
+** classes for special content elements like town boxes
+** intended to be referenced directly from the wiki src
+*/
+
+/*
+** User styles
+*/
+/* table standards */
+table.rimage {
+       float: right;
+       position: relative;
+       margin-left: 1em;
+       margin-bottom: 1em;
+       text-align: center;
+}
+
+/*
+** edit views etc
+*/
+.special li {
+       line-height: 1.4em;
+       margin: 0;
+       padding: 0;
+}
+
+/*
+** keep the whitespace in front of the ^=, hides rule from konqueror
+** this is css3, the validator doesn't like it when validating as css2
+*/
+#bodyContent a.external {
+       /* @embed */
+       background: url(external-ltr.png) center right no-repeat;
+       padding-right: 13px;
+}
+
+#bodyContent a.external[href ^="https://"],
+.link-https {
+       /* @embed */
+       background: url(lock_icon.gif) center right no-repeat;
+       padding-right: 16px;
+}
+
+#bodyContent a.external[href ^="mailto:"],
+.link-mailto {
+       /* @embed */
+       background: url(mail_icon.gif) center right no-repeat;
+       padding-right: 18px;
+}
+
+#bodyContent a.external[href ^="news:"] {
+       /* @embed */
+       background: url(news_icon.png) center right no-repeat;
+       padding-right: 18px;
+}
+
+#bodyContent a.external[href ^="ftp://"],
+.link-ftp {
+       /* @embed */
+       background: url(file_icon.gif) center right no-repeat;
+       padding-right: 18px;
+}
+
+#bodyContent a.external[href ^="irc://"],
+#bodyContent a.external[href ^="ircs://"],
+.link-irc {
+       /* @embed */
+       background: url(discussionitem_icon.gif) center right no-repeat;
+       padding-right: 18px;
+}
+
+#bodyContent a.external[href $=".ogg"], #bodyContent a.external[href $=".OGG"],
+#bodyContent a.external[href $=".mid"], #bodyContent a.external[href $=".MID"],
+#bodyContent a.external[href $=".midi"], #bodyContent a.external[href $=".MIDI"],
+#bodyContent a.external[href $=".mp3"], #bodyContent a.external[href $=".MP3"],
+#bodyContent a.external[href $=".wav"], #bodyContent a.external[href $=".WAV"],
+#bodyContent a.external[href $=".wma"], #bodyContent a.external[href $=".WMA"],
+.link-audio {
+       /* @embed */
+       background: url(audio.png) center right no-repeat;
+       padding-right: 13px;
+}
+
+#bodyContent a.external[href $=".ogm"], #bodyContent a.external[href $=".OGM"],
+#bodyContent a.external[href $=".avi"], #bodyContent a.external[href $=".AVI"],
+#bodyContent a.external[href $=".mpeg"], #bodyContent a.external[href $=".MPEG"],
+#bodyContent a.external[href $=".mpg"], #bodyContent a.external[href $=".MPG"],
+.link-video {
+       /* @embed */
+       background: url(video.png) center right no-repeat;
+       padding-right: 13px;
+}
+
+#bodyContent a.external[href $=".pdf"], #bodyContent a.external[href $=".PDF"],
+#bodyContent a.external[href *=".pdf#"], #bodyContent a.external[href *=".PDF#"],
+#bodyContent a.external[href *=".pdf?"], #bodyContent a.external[href *=".PDF?"],
+.link-document {
+       /* @embed */
+       background: url(document.png) center right no-repeat;
+       padding-right: 12px;
+}
+
+/* Interwiki Styling */
+#bodyContent a.extiw,
+#bodyContent a.extiw:active {
+       color: #36b;
+}
+
+/* External links */
+#bodyContent a.external {
+       color: #36b;
+}
+
+/*
+** Structural Elements
+*/
+
+/*
+** general portlet styles (elements in the quickbar)
+*/
+.portlet {
+       border: none;
+       margin: 0 0 .5em;
+       padding: 0;
+       float: none;
+       width: 11.6em;
+       overflow: hidden;
+}
+
+.portlet h3 {
+       background: transparent;
+       padding: 0 1em 0 .5em;
+       display: inline;
+       height: 1em;
+       text-transform: lowercase;
+       font-size: 91%;
+       font-weight: normal;
+       white-space: nowrap;
+}
+
+.pBody {
+       font-size: 95%;
+       background-color: white;
+       color: black;
+       border-collapse: collapse;
+       border: 1px solid #aaa;
+       padding: 0 .8em .3em .5em;
+}
+
+/* allows .pBody styles to wrap around content added via BaseTemplateAfterPortlet hook */
+.pBody:after {
+       content: '';
+       clear: both;
+       display: block;
+}
+
+.portlet ul {
+       line-height: 1.5em;
+       font-size: 95%;
+}
+
+.portlet li {
+       padding: 0;
+       margin: 0;
+}
+
+/*
+** Logo properties
+*/
+
+#p-logo {
+       top: 0;
+       left: 0;
+       position: absolute; /*needed to use z-index */
+       z-index: 3;
+       height: 155px;
+       width: 12em;
+       overflow: visible;
+}
+
+#p-logo h3 {
+       display: none;
+}
+
+#p-logo a,
+#p-logo a:hover {
+       display: block;
+       height: 155px;
+       width: 12.2em;
+       background-repeat: no-repeat;
+       background-position: 35% 50% !important;
+       text-decoration: none;
+}
+
+/*
+** Search portlet
+*/
+#p-search {
+       position: relative;
+       z-index: 3;
+}
+
+input.searchButton {
+       margin-top: 1px;
+       font-size: 95%;
+}
+
+#searchGoButton {
+       padding-left: .5em;
+       padding-right: .5em;
+       font-weight: bold;
+}
+
+#searchInput {
+       width: 10.9em;
+       margin: 0;
+       font-size: 95%;
+}
+
+#p-search .pBody {
+       padding: .5em .4em .4em .4em;
+       text-align: center;
+}
+
+#p-search #searchform div div {
+       margin-top: .4em;
+       font-size: 95%;
+}
+
+/*
+** the personal toolbar
+*/
+#p-personal {
+       position: absolute;
+       left: 0;
+       top: 0;
+       z-index: 3;
+}
+
+#p-personal {
+       width: 100%;
+       white-space: nowrap;
+       padding: 0;
+       margin: 0;
+       border: none;
+       background: none;
+       overflow: visible;
+       line-height: 1.2em;
+}
+
+#p-personal h3 {
+       display: none;
+}
+
+#p-personal .portlet,
+#p-personal .pBody {
+       z-index: 0;
+       padding: 0;
+       margin: 0;
+       border: none;
+       overflow: visible;
+       background: none;
+}
+
+/* this is the ul contained in the portlet */
+#p-personal ul {
+       border: none;
+       line-height: 1.4em;
+       color: #2f6fab;
+       padding: 0 2em 0 3em;
+       margin: 0;
+       text-align: right;
+       list-style-type: none;
+       list-style-image: none;
+       z-index: 0;
+       background: none;
+       cursor: default;
+}
+
+#p-personal li {
+       z-index: 0;
+       border: none;
+       padding: 0;
+       display: inline;
+       color: #2f6fab;
+       margin-left: 1em;
+       line-height: 1.2em;
+       background: none;
+}
+
+#p-personal li a {
+       text-decoration: none;
+       color: #005896;
+       padding-bottom: .2em;
+       background: none;
+}
+
+#p-personal li a:hover {
+       background-color: white;
+       padding-bottom: .2em;
+       text-decoration: none;
+}
+
+#p-personal li.active a:hover {
+       background-color: transparent;
+}
+
+/* The icon in front of the username / login link */
+li#pt-userpage,
+li#pt-anonuserpage,
+li#pt-login {
+       /* @embed */
+       background: url(user.gif) top left no-repeat;
+       padding-left: 20px;
+}
+
+#p-personal ul {
+       text-transform: lowercase;
+}
+
+/* Don't lowercase username or IP addresses (IPv6) */
+li#pt-userpage,
+li#pt-anonuserpage {
+       text-transform: none;
+}
+
+#p-personal li.active {
+       font-weight: bold;
+}
+
+/*
+** the page-related actions- page/talk, edit etc
+*/
+#p-cactions {
+       position: absolute;
+       top: 1.3em;
+       left: 11.5em;
+       margin: 0;
+       white-space: nowrap;
+       width: 76%;
+       line-height: 1.1em;
+       overflow: visible;
+       background: none;
+       border-collapse: collapse;
+       padding-left: 1em;
+       font-size: 95%;
+}
+
+#p-cactions ul {
+       list-style-type: none;
+       list-style-image: none;
+}
+
+#p-cactions li {
+       display: inline;
+       border: 1px solid #aaa;
+       border-bottom: none;
+       padding: 0 0 1em 0;
+       margin: 0 .3em 0 0;
+       overflow: visible;
+       background: white;
+}
+
+#p-cactions li.selected {
+       border-color: #fabd23;
+       font-weight: bold;
+}
+
+#p-cactions li a {
+       background-color: #fbfbfb;
+       color: #002bb8;
+       border: none;
+       padding: 0 .8em .3em;
+       position: relative;
+       z-index: 0;
+       margin: 0;
+       text-decoration: none;
+}
+
+#p-cactions li.selected a {
+       z-index: 3;
+       background-color: white;
+}
+
+#p-cactions .new a {
+       color: #ba0000;
+}
+
+#p-cactions li a:hover {
+       z-index: 3;
+       text-decoration: none;
+       background-color: white;
+}
+
+#p-cactions h3 {
+       display: none;
+}
+
+#p-cactions li.istalk {
+       margin-right: 0;
+}
+
+#p-cactions li.istalk a {
+       padding-right: .5em;
+}
+
+#p-cactions #ca-addsection a {
+       padding-left: .4em;
+       padding-right: .4em;
+}
+
+/* offsets to distinguish the tab groups */
+li#ca-talk {
+       margin-right: 1.6em;
+}
+
+li#ca-watch,
+li#ca-unwatch,
+li#ca-varlang-0,
+li#ca-print {
+       margin-left: 1.6em;
+}
+
+#p-cactions .pBody {
+       font-size: 1em;
+       background-color: transparent;
+       color: inherit;
+       border-collapse: inherit;
+       border: 0;
+       padding: 0;
+}
+
+#p-cactions li a {
+       text-transform: lowercase;
+}
+
+#p-lang {
+       position: relative;
+       z-index: 3;
+}
+
+/* Override text-transform on languages where capitalization is significant */
+.capitalize-all-nouns .portlet h3,
+.capitalize-all-nouns #p-personal ul,
+.capitalize-all-nouns #p-cactions ul li a {
+       text-transform: none;
+}
+
+/* TODO: #t-iscite is only used by the Cite extension, come up with some
+ * system which allows extensions to add to this file on the fly
+ */
+#t-ispermalink, #t-iscite {
+       color: #999;
+}
+
+/*
+** footer
+*/
+div#footer {
+       background-color: white;
+       border-top: 1px solid #fabd23;
+       border-bottom: 1px solid #fabd23;
+       margin: .6em 0 1em 0;
+       overflow: hidden;
+       padding: .4em 0 .3em 0;
+       text-align: center;
+       font-size: 90%;
+}
+
+div#footer li {
+       display: inline;
+       margin: 0 1.3em;
+}
+
+#f-poweredbyico, #f-copyrightico {
+       margin: 0 8px;
+       position: relative;
+       top: -2px; /* Bump it up just a tad */
+}
+
+#f-poweredbyico {
+       float: right;
+       height: 1%;
+}
+
+#f-copyrightico {
+       float: left;
+       height: 1%;
+}
+
+.mw-htmlform-submit {
+       font-weight: bold;
+       padding-left: .3em;
+       padding-right: .3em;
+       margin-right: 2em;
+}
+
+/* js pref toc */
+#preftoc {
+       margin: 0;
+       padding: 0;
+       width: 100%;
+       clear: both;
+}
+
+#preftoc li {
+       background-color: #f0f0f0;
+       color: #000;
+}
+
+#preftoc li {
+       margin: 1px -2px 1px 2px;
+       float: left;
+       padding: 2px 0 3px 0;
+       border: 1px solid #fff;
+       border-right-color: #716f64;
+       border-bottom: 0;
+       position: relative;
+       white-space: nowrap;
+       list-style-type: none;
+       list-style-image: none;
+       z-index: 3;
+}
+
+#preftoc li.selected {
+       font-weight: bold;
+       background-color: #f9f9f9;
+       border: 1px solid #aaa;
+       border-bottom: none;
+       cursor: default;
+       top: 1px;
+       padding-top: 2px;
+       margin-right: -3px;
+}
+
+#preftoc > li.selected {
+       top: 2px;
+}
+
+#preftoc a,
+#preftoc a:active {
+       display: block;
+       color: #000;
+       padding: 0 .7em;
+       position: relative;
+       text-decoration: none;
+}
+
+#preftoc li.selected a {
+       cursor: default;
+       text-decoration: none;
+}
+
+#preferences {
+       margin: 0;
+       border: 1px solid #aaa;
+       clear: both;
+       padding: 1.5em;
+       background-color: #F9F9F9;
+}
+
+.prefsection {
+       border: none;
+       padding: 0;
+       margin: 0;
+}
+
+.prefsection legend {
+       font-weight: bold;
+}
+
+.prefsection table, .prefsection legend {
+       background-color: #F9F9F9;
+}
+
+.mainLegend {
+       display: none;
+}
+
+td.htmlform-tip {
+       font-size: x-small;
+       padding: .2em 2em;
+       color: #666;
+}
+
+.preferences-login {
+       clear: both;
+       margin-bottom: 1.5em;
+}
+
+.prefcache {
+       font-size: 90%;
+       margin-top: 2em;
+}
+
+#userloginprompt, #languagelinks {
+       font-size: 85%;
+}
+
+#login-sectiontip {
+       font-size: 85%;
+       line-height: 1.2;
+       padding-top: 2em;
+}
+
+#userloginlink a, #wpLoginattempt, #wpCreateaccount {
+       font-weight: bold;
+}
+
+/**
+ * This was originally added by Gabriel Wicke in r3681 (committed on 25 May 2004)
+ * with the commit message "tweaks to page history".
+ * Unlike the other IE/Mac fixes that used to be present here, this seems to get
+ * applied on more modern browsers, so let's keep it here until someone has the
+ * time to properly test it out.
+ */
+#pagehistory li.selected {
+       position: relative;
+}
+
+.redirectText {
+       font-size: 150%;
+       margin: 5px;
+}
+
+div.patrollink {
+       clear: both;
+}
+
+.sharedUploadNotice {
+       font-style: italic;
+}
+
+span.updatedmarker {
+       color: black;
+       background-color: #0f0;
+}
+
+.editExternally {
+       border: 1px solid gray;
+       background-color: #ffffff;
+       padding: 3px;
+       margin-top: 0.5em;
+       float: left;
+       font-size: small;
+       text-align: center;
+}
+
+.editExternallyHelp {
+       font-style: italic;
+       color: gray;
+}
+
+.toggle {
+       margin-left: 2em;
+       text-indent: -2em;
+}
+
+/* @bug 1714 */
+input#wpSave,
+input#wpDiff {
+       margin-right: 0.33em;
+}
+
+#wpSave {
+       font-weight: bold;
+}
+
+/* noarticletext */
+div.noarticletext {
+       border: 1px solid #ccc;
+       background: #fff;
+       padding: .2em 1em;
+       color: #000;
+}
+
+div#searchTargetContainer {
+       left: 10px;
+       top: 10px;
+       width: 90%;
+       background: white;
+}
+
+div#searchTarget {
+       padding: 3px;
+       margin: 5px;
+       background: #F0F0F0;
+       border: solid 1px blue;
+}
+
+div#searchTarget ul li {
+       list-style-type: none;
+       list-style-image: none;
+}
+
+div#searchTarget ul li:before {
+       color: orange;
+       content: "\00BB \0020";
+}
+
+div#searchTargetHide {
+       float: right;
+       border: solid 1px black;
+       background: #DCDCDC;
+       padding: 2px;
+}
+
+#powersearch p {
+       margin-top: 0;
+}
+
+div.multipageimagenavbox {
+       border: solid 1px silver;
+       padding: 4px;
+       margin: 1em;
+       background: #f0f0f0;
+}
+
+div.multipageimagenavbox div.thumb {
+       border: none;
+       margin-left: 2em;
+       margin-right: 2em;
+}
+
+div.multipageimagenavbox hr {
+       margin: 6px;
+}
+
+table.multipageimage td {
+       text-align: center;
+}
+
+.templatesUsed {
+       margin-top: 1.5em;
+}
+
+.mw-summary-preview {
+       margin: 0.1em 0;
+}
+
+/* Friendlier slave lag warnings */
+div.mw-lag-warn-normal,
+div.mw-lag-warn-high {
+       padding: 3px;
+       text-align: center;
+       margin: 3px auto;
+}
+
+div.mw-lag-warn-normal {
+       border: 1px solid #FFCC66;
+       background-color: #FFFFCC;
+}
+
+div.mw-lag-warn-high {
+       font-weight: bold;
+       border: 2px solid #FF0033;
+       background-color: #FFCCCC;
+}
+
+.MediaTransformError {
+       background-color: #ccc;
+       padding: 0.1em;
+}
+
+.MediaTransformError td {
+       text-align: center;
+       vertical-align: middle;
+       font-size: 90%;
+}
+
+/* God-damned hack for the crappy layout */
+.os-suggest {
+       font-size: 127%;
+}
+
+/* Sometimes people don't want personal tools to be lowercase! */
+.no-text-transform {
+       text-transform: none;
+}
+
+/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
+.tipsy {
+       font-size: 127%;
+}
+
+/* mediawiki.notification */
+.skin-monobook .mw-notification {
+       box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.125);
+}
diff --git a/skins/MonoBook/news_icon.png b/skins/MonoBook/news_icon.png
new file mode 100644 (file)
index 0000000..4d3cb47
Binary files /dev/null and b/skins/MonoBook/news_icon.png differ
diff --git a/skins/MonoBook/required.gif b/skins/MonoBook/required.gif
new file mode 100644 (file)
index 0000000..bd71976
Binary files /dev/null and b/skins/MonoBook/required.gif differ
diff --git a/skins/MonoBook/user.gif b/skins/MonoBook/user.gif
new file mode 100644 (file)
index 0000000..34b4839
Binary files /dev/null and b/skins/MonoBook/user.gif differ
diff --git a/skins/MonoBook/video.png b/skins/MonoBook/video.png
new file mode 100644 (file)
index 0000000..d86dbe0
Binary files /dev/null and b/skins/MonoBook/video.png differ
diff --git a/skins/MonoBook/wiki-indexed.png b/skins/MonoBook/wiki-indexed.png
new file mode 100644 (file)
index 0000000..799ebac
Binary files /dev/null and b/skins/MonoBook/wiki-indexed.png differ
diff --git a/skins/MonoBook/wiki.png b/skins/MonoBook/wiki.png
new file mode 100644 (file)
index 0000000..8c42118
Binary files /dev/null and b/skins/MonoBook/wiki.png differ
diff --git a/skins/Vector.php b/skins/Vector.php
deleted file mode 100644 (file)
index 35861c2..0000000
+++ /dev/null
@@ -1,662 +0,0 @@
-<?php
-/**
- * Vector - Modern version of MonoBook with fresh look and many usability
- * improvements.
- *
- * This 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 document
- * @file
- * @ingroup Skins
- */
-
-if ( !defined( 'MEDIAWIKI' ) ) {
-       die( -1 );
-}
-
-/**
- * SkinTemplate class for Vector skin
- * @ingroup Skins
- */
-class SkinVector extends SkinTemplate {
-       public $useHeadElement = true;
-       public $skinname = 'vector';
-       public $stylename = 'vector';
-       public $template = 'VectorTemplate';
-
-       protected static $bodyClasses = array( 'vector-animateLayout' );
-
-       /**
-        * Initializes output page and sets up skin-specific parameters
-        * @param OutputPage $out Object to initialize
-        */
-       public function initPage( OutputPage $out ) {
-               global $wgLocalStylePath;
-
-               parent::initPage( $out );
-
-               // Append CSS which includes IE only behavior fixes for hover support -
-               // this is better than including this in a CSS file since it doesn't
-               // wait for the CSS file to load before fetching the HTC file.
-               $min = $this->getRequest()->getFuzzyBool( 'debug' ) ? '' : '.min';
-               $out->addHeadItem( 'csshover',
-                       '<!--[if lt IE 7]><style type="text/css">body{behavior:url("' .
-                               htmlspecialchars( $wgLocalStylePath ) .
-                               "/{$this->stylename}/csshover{$min}.htc\")}</style><![endif]-->"
-               );
-
-               $out->addModules( array( 'skins.vector.js' ) );
-       }
-
-       /**
-        * Loads skin and user CSS files.
-        * @param OutputPage $out
-        */
-       function setupSkinUserCss( OutputPage $out ) {
-               parent::setupSkinUserCss( $out );
-
-               $styles = array( 'mediawiki.skinning.interface', 'skins.vector.styles' );
-               wfRunHooks( 'SkinVectorStyleModules', array( $this, &$styles ) );
-               $out->addModuleStyles( $styles );
-       }
-
-       /**
-        * Adds classes to the body element.
-        *
-        * @param OutputPage $out
-        * @param array &$bodyAttrs Array of attributes that will be set on the body element
-        */
-       function addToBodyAttributes( $out, &$bodyAttrs ) {
-               if ( isset( $bodyAttrs['class'] ) && strlen( $bodyAttrs['class'] ) > 0 ) {
-                       $bodyAttrs['class'] .= ' ' . implode( ' ', static::$bodyClasses );
-               } else {
-                       $bodyAttrs['class'] = implode( ' ', static::$bodyClasses );
-               }
-       }
-}
-
-/**
- * QuickTemplate class for Vector skin
- * @ingroup Skins
- */
-class VectorTemplate extends BaseTemplate {
-       /* Functions */
-
-       /**
-        * Outputs the entire contents of the (X)HTML page
-        */
-       public function execute() {
-               global $wgVectorUseIconWatch;
-
-               // Build additional attributes for navigation urls
-               $nav = $this->data['content_navigation'];
-
-               if ( $wgVectorUseIconWatch ) {
-                       $mode = $this->getSkin()->getUser()->isWatched( $this->getSkin()->getRelevantTitle() )
-                               ? 'unwatch'
-                               : 'watch';
-
-                       if ( isset( $nav['actions'][$mode] ) ) {
-                               $nav['views'][$mode] = $nav['actions'][$mode];
-                               $nav['views'][$mode]['class'] = rtrim( 'icon ' . $nav['views'][$mode]['class'], ' ' );
-                               $nav['views'][$mode]['primary'] = true;
-                               unset( $nav['actions'][$mode] );
-                       }
-               }
-
-               $xmlID = '';
-               foreach ( $nav as $section => $links ) {
-                       foreach ( $links as $key => $link ) {
-                               if ( $section == 'views' && !( isset( $link['primary'] ) && $link['primary'] ) ) {
-                                       $link['class'] = rtrim( 'collapsible ' . $link['class'], ' ' );
-                               }
-
-                               $xmlID = isset( $link['id'] ) ? $link['id'] : 'ca-' . $xmlID;
-                               $nav[$section][$key]['attributes'] =
-                                       ' id="' . Sanitizer::escapeId( $xmlID ) . '"';
-                               if ( $link['class'] ) {
-                                       $nav[$section][$key]['attributes'] .=
-                                               ' class="' . htmlspecialchars( $link['class'] ) . '"';
-                                       unset( $nav[$section][$key]['class'] );
-                               }
-                               if ( isset( $link['tooltiponly'] ) && $link['tooltiponly'] ) {
-                                       $nav[$section][$key]['key'] =
-                                               Linker::tooltip( $xmlID );
-                               } else {
-                                       $nav[$section][$key]['key'] =
-                                               Xml::expandAttributes( Linker::tooltipAndAccesskeyAttribs( $xmlID ) );
-                               }
-                       }
-               }
-               $this->data['namespace_urls'] = $nav['namespaces'];
-               $this->data['view_urls'] = $nav['views'];
-               $this->data['action_urls'] = $nav['actions'];
-               $this->data['variant_urls'] = $nav['variants'];
-
-               // Reverse horizontally rendered navigation elements
-               if ( $this->data['rtl'] ) {
-                       $this->data['view_urls'] =
-                               array_reverse( $this->data['view_urls'] );
-                       $this->data['namespace_urls'] =
-                               array_reverse( $this->data['namespace_urls'] );
-                       $this->data['personal_urls'] =
-                               array_reverse( $this->data['personal_urls'] );
-               }
-               // Output HTML Page
-               $this->html( 'headelement' );
-               ?>
-               <div id="mw-page-base" class="noprint"></div>
-               <div id="mw-head-base" class="noprint"></div>
-               <div id="content" class="mw-body" role="main">
-                       <a id="top"></a>
-
-                       <div id="mw-js-message" style="display:none;"<?php $this->html( 'userlangattributes' ) ?>></div>
-                       <?php
-                       if ( $this->data['sitenotice'] ) {
-                               ?>
-                               <div id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div>
-                       <?php
-                       }
-                       ?>
-                       <h1 id="firstHeading" class="firstHeading" lang="<?php
-                       $this->data['pageLanguage'] =
-                               $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
-                       $this->text( 'pageLanguage' );
-                       ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
-                       <?php $this->html( 'prebodyhtml' ) ?>
-                       <div id="bodyContent" class="mw-body-content">
-                               <?php
-                               if ( $this->data['isarticle'] ) {
-                                       ?>
-                                       <div id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
-                               <?php
-                               }
-                               ?>
-                               <div id="contentSub"<?php
-                               $this->html( 'userlangattributes' )
-                               ?>><?php $this->html( 'subtitle' ) ?></div>
-                               <?php
-                               if ( $this->data['undelete'] ) {
-                                       ?>
-                                       <div id="contentSub2"><?php $this->html( 'undelete' ) ?></div>
-                               <?php
-                               }
-                               ?>
-                               <?php
-                               if ( $this->data['newtalk'] ) {
-                                       ?>
-                                       <div class="usermessage"><?php $this->html( 'newtalk' ) ?></div>
-                               <?php
-                               }
-                               ?>
-                               <div id="jump-to-nav" class="mw-jump">
-                                       <?php $this->msg( 'jumpto' ) ?>
-                                       <a href="#mw-navigation"><?php
-                                               $this->msg( 'jumptonavigation' )
-                                               ?></a><?php
-                                       $this->msg( 'comma-separator' )
-                                       ?>
-                                       <a href="#p-search"><?php $this->msg( 'jumptosearch' ) ?></a>
-                               </div>
-                               <?php $this->html( 'bodycontent' ) ?>
-                               <?php
-                               if ( $this->data['printfooter'] ) {
-                                       ?>
-                                       <div class="printfooter">
-                                               <?php $this->html( 'printfooter' ); ?>
-                                       </div>
-                               <?php
-                               }
-                               ?>
-                               <?php
-                               if ( $this->data['catlinks'] ) {
-                                       ?>
-                                       <?php
-                                       $this->html( 'catlinks' );
-                                       ?>
-                               <?php
-                               }
-                               ?>
-                               <?php
-                               if ( $this->data['dataAfterContent'] ) {
-                                       ?>
-                                       <?php
-                                       $this->html( 'dataAfterContent' );
-                                       ?>
-                               <?php
-                               }
-                               ?>
-                               <div class="visualClear"></div>
-                               <?php $this->html( 'debughtml' ); ?>
-                       </div>
-               </div>
-               <div id="mw-navigation">
-                       <h2><?php $this->msg( 'navigation-heading' ) ?></h2>
-
-                       <div id="mw-head">
-                               <?php $this->renderNavigation( 'PERSONAL' ); ?>
-                               <div id="left-navigation">
-                                       <?php $this->renderNavigation( array( 'NAMESPACES', 'VARIANTS' ) ); ?>
-                               </div>
-                               <div id="right-navigation">
-                                       <?php $this->renderNavigation( array( 'VIEWS', 'ACTIONS', 'SEARCH' ) ); ?>
-                               </div>
-                       </div>
-                       <div id="mw-panel">
-                               <div id="p-logo" role="banner"><a style="background-image: url(<?php
-                                       $this->text( 'logopath' )
-                                       ?>);" href="<?php
-                                       echo htmlspecialchars( $this->data['nav_urls']['mainpage']['href'] )
-                                       ?>" <?php
-                                       echo Xml::expandAttributes( Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) )
-                                       ?>></a></div>
-                               <?php $this->renderPortals( $this->data['sidebar'] ); ?>
-                       </div>
-               </div>
-               <div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
-                       <?php
-                       foreach ( $this->getFooterLinks() as $category => $links ) {
-                               ?>
-                               <ul id="footer-<?php
-                               echo $category
-                               ?>">
-                                       <?php
-                                       foreach ( $links as $link ) {
-                                               ?>
-                                               <li id="footer-<?php
-                                               echo $category
-                                               ?>-<?php
-                                               echo $link
-                                               ?>"><?php
-                                                       $this->html( $link )
-                                                       ?></li>
-                                       <?php
-                                       }
-                                       ?>
-                               </ul>
-                       <?php
-                       }
-                       ?>
-                       <?php $footericons = $this->getFooterIcons( "icononly" );
-                       if ( count( $footericons ) > 0 ) {
-                               ?>
-                               <ul id="footer-icons" class="noprint">
-                                       <?php
-                                       foreach ( $footericons as $blockName => $footerIcons ) {
-                                               ?>
-                                               <li id="footer-<?php
-                                               echo htmlspecialchars( $blockName ); ?>ico">
-                                                       <?php
-                                                       foreach ( $footerIcons as $icon ) {
-                                                               ?>
-                                                               <?php
-                                                               echo $this->getSkin()->makeFooterIcon( $icon );
-                                                               ?>
-
-                                                       <?php
-                                                       }
-                                                       ?>
-                                               </li>
-                                       <?php
-                                       }
-                                       ?>
-                               </ul>
-                       <?php
-                       }
-                       ?>
-                       <div style="clear:both"></div>
-               </div>
-               <?php $this->printTrail(); ?>
-
-       </body>
-</html>
-       <?php
-       }
-
-       /**
-        * Render a series of portals
-        *
-        * @param array $portals
-        */
-       protected function renderPortals( $portals ) {
-               // Force the rendering of the following portals
-               if ( !isset( $portals['SEARCH'] ) ) {
-                       $portals['SEARCH'] = true;
-               }
-               if ( !isset( $portals['TOOLBOX'] ) ) {
-                       $portals['TOOLBOX'] = true;
-               }
-               if ( !isset( $portals['LANGUAGES'] ) ) {
-                       $portals['LANGUAGES'] = true;
-               }
-               // Render portals
-               foreach ( $portals as $name => $content ) {
-                       if ( $content === false ) {
-                               continue;
-                       }
-
-                       switch ( $name ) {
-                               case 'SEARCH':
-                                       break;
-                               case 'TOOLBOX':
-                                       $this->renderPortal( 'tb', $this->getToolbox(), 'toolbox', 'SkinTemplateToolboxEnd' );
-                                       break;
-                               case 'LANGUAGES':
-                                       if ( $this->data['language_urls'] !== false ) {
-                                               $this->renderPortal( 'lang', $this->data['language_urls'], 'otherlanguages' );
-                                       }
-                                       break;
-                               default:
-                                       $this->renderPortal( $name, $content );
-                                       break;
-                       }
-               }
-       }
-
-       /**
-        * @param string $name
-        * @param array $content
-        * @param null|string $msg
-        * @param null|string|array $hook
-        */
-       protected function renderPortal( $name, $content, $msg = null, $hook = null ) {
-               if ( $msg === null ) {
-                       $msg = $name;
-               }
-               $msgObj = wfMessage( $msg );
-               ?>
-               <div class="portal" role="navigation" id='<?php
-               echo Sanitizer::escapeId( "p-$name" )
-               ?>'<?php
-               echo Linker::tooltip( 'p-' . $name )
-               ?> aria-labelledby='<?php echo Sanitizer::escapeId( "p-$name-label" ) ?>'>
-                       <h3<?php
-                       $this->html( 'userlangattributes' )
-                       ?> id='<?php
-                       echo Sanitizer::escapeId( "p-$name-label" )
-                       ?>'><?php
-                               echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $msg );
-                               ?></h3>
-
-                       <div class="body">
-                               <?php
-                               if ( is_array( $content ) ) {
-                                       ?>
-                                       <ul>
-                                               <?php
-                                               foreach ( $content as $key => $val ) {
-                                                       ?>
-                                                       <?php echo $this->makeListItem( $key, $val ); ?>
-
-                                               <?php
-                                               }
-                                               if ( $hook !== null ) {
-                                                       wfRunHooks( $hook, array( &$this, true ) );
-                                               }
-                                               ?>
-                                       </ul>
-                               <?php
-                               } else {
-                                       ?>
-                                       <?php
-                                       echo $content; /* Allow raw HTML block to be defined by extensions */
-                               }
-
-                               $this->renderAfterPortlet( $name );
-                               ?>
-                       </div>
-               </div>
-       <?php
-       }
-
-       /**
-        * Render one or more navigations elements by name, automatically reveresed
-        * when UI is in RTL mode
-        *
-        * @param array $elements
-        */
-       protected function renderNavigation( $elements ) {
-               global $wgVectorUseSimpleSearch;
-
-               // If only one element was given, wrap it in an array, allowing more
-               // flexible arguments
-               if ( !is_array( $elements ) ) {
-                       $elements = array( $elements );
-                       // If there's a series of elements, reverse them when in RTL mode
-               } elseif ( $this->data['rtl'] ) {
-                       $elements = array_reverse( $elements );
-               }
-               // Render elements
-               foreach ( $elements as $name => $element ) {
-                       switch ( $element ) {
-                               case 'NAMESPACES':
-                                       ?>
-                                       <div id="p-namespaces" role="navigation" class="vectorTabs<?php
-                                       if ( count( $this->data['namespace_urls'] ) == 0 ) {
-                                               echo ' emptyPortlet';
-                                       }
-                                       ?>" aria-labelledby="p-namespaces-label">
-                                               <h3 id="p-namespaces-label"><?php $this->msg( 'namespaces' ) ?></h3>
-                                               <ul<?php $this->html( 'userlangattributes' ) ?>>
-                                                       <?php
-                                                       foreach ( $this->data['namespace_urls'] as $link ) {
-                                                               ?>
-                                                               <li <?php
-                                                               echo $link['attributes']
-                                                               ?>><span><a href="<?php
-                                                                               echo htmlspecialchars( $link['href'] )
-                                                                               ?>" <?php
-                                                                               echo $link['key']
-                                                                               ?>><?php
-                                                                                       echo htmlspecialchars( $link['text'] )
-                                                                                       ?></a></span></li>
-                                                       <?php
-                                                       }
-                                                       ?>
-                                               </ul>
-                                       </div>
-                                       <?php
-                                       break;
-                               case 'VARIANTS':
-                                       ?>
-                                       <div id="p-variants" role="navigation" class="vectorMenu<?php
-                                       if ( count( $this->data['variant_urls'] ) == 0 ) {
-                                               echo ' emptyPortlet';
-                                       }
-                                       ?>" aria-labelledby="p-variants-label">
-                                               <h3 id="mw-vector-current-variant">
-                                                       <?php
-                                                       foreach ( $this->data['variant_urls'] as $link ) {
-                                                               ?>
-                                                               <?php
-                                                               if ( stripos( $link['attributes'], 'selected' ) !== false ) {
-                                                                       ?>
-                                                                       <?php
-                                                                       echo htmlspecialchars( $link['text'] )
-                                                                       ?>
-                                                               <?php
-                                                               }
-                                                               ?>
-                                                       <?php
-                                                       }
-                                                       ?>
-                                               </h3>
-
-                                               <h3 id="p-variants-label"><span><?php $this->msg( 'variants' ) ?></span><a href="#"></a></h3>
-
-                                               <div class="menu">
-                                                       <ul>
-                                                               <?php
-                                                               foreach ( $this->data['variant_urls'] as $link ) {
-                                                                       ?>
-                                                                       <li<?php
-                                                                       echo $link['attributes']
-                                                                       ?>><a href="<?php
-                                                                               echo htmlspecialchars( $link['href'] )
-                                                                               ?>" lang="<?php
-                                                                               echo htmlspecialchars( $link['lang'] )
-                                                                               ?>" hreflang="<?php
-                                                                               echo htmlspecialchars( $link['hreflang'] )
-                                                                               ?>" <?php
-                                                                               echo $link['key']
-                                                                               ?>><?php
-                                                                                       echo htmlspecialchars( $link['text'] )
-                                                                                       ?></a></li>
-                                                               <?php
-                                                               }
-                                                               ?>
-                                                       </ul>
-                                               </div>
-                                       </div>
-                                       <?php
-                                       break;
-                               case 'VIEWS':
-                                       ?>
-                                       <div id="p-views" role="navigation" class="vectorTabs<?php
-                                       if ( count( $this->data['view_urls'] ) == 0 ) {
-                                               echo ' emptyPortlet';
-                                       }
-                                       ?>" aria-labelledby="p-views-label">
-                                               <h3 id="p-views-label"><?php $this->msg( 'views' ) ?></h3>
-                                               <ul<?php
-                                               $this->html( 'userlangattributes' )
-                                               ?>>
-                                                       <?php
-                                                       foreach ( $this->data['view_urls'] as $link ) {
-                                                               ?>
-                                                               <li<?php
-                                                               echo $link['attributes']
-                                                               ?>><span><a href="<?php
-                                                                               echo htmlspecialchars( $link['href'] )
-                                                                               ?>" <?php
-                                                                               echo $link['key']
-                                                                               ?>><?php
-                                                                                       // $link['text'] can be undefined - bug 27764
-                                                                                       if ( array_key_exists( 'text', $link ) ) {
-                                                                                               echo array_key_exists( 'img', $link )
-                                                                                                       ? '<img src="' . $link['img'] . '" alt="' . $link['text'] . '" />'
-                                                                                                       : htmlspecialchars( $link['text'] );
-                                                                                       }
-                                                                                       ?></a></span></li>
-                                                       <?php
-                                                       }
-                                                       ?>
-                                               </ul>
-                                       </div>
-                                       <?php
-                                       break;
-                               case 'ACTIONS':
-                                       ?>
-                                       <div id="p-cactions" role="navigation" class="vectorMenu<?php
-                                       if ( count( $this->data['action_urls'] ) == 0 ) {
-                                               echo ' emptyPortlet';
-                                       }
-                                       ?>" aria-labelledby="p-cactions-label">
-                                               <h3 id="p-cactions-label"><span><?php $this->msg( 'actions' ) ?></span><a href="#"></a></h3>
-
-                                               <div class="menu">
-                                                       <ul<?php $this->html( 'userlangattributes' ) ?>>
-                                                               <?php
-                                                               foreach ( $this->data['action_urls'] as $link ) {
-                                                                       ?>
-                                                                       <li<?php
-                                                                       echo $link['attributes']
-                                                                       ?>>
-                                                                               <a href="<?php
-                                                                               echo htmlspecialchars( $link['href'] )
-                                                                               ?>" <?php
-                                                                               echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] )
-                                                                                       ?></a>
-                                                                       </li>
-                                                               <?php
-                                                               }
-                                                               ?>
-                                                       </ul>
-                                               </div>
-                                       </div>
-                                       <?php
-                                       break;
-                               case 'PERSONAL':
-                                       ?>
-                                       <div id="p-personal" role="navigation" class="<?php
-                                       if ( count( $this->data['personal_urls'] ) == 0 ) {
-                                               echo ' emptyPortlet';
-                                       }
-                                       ?>" aria-labelledby="p-personal-label">
-                                               <h3 id="p-personal-label"><?php $this->msg( 'personaltools' ) ?></h3>
-                                               <ul<?php $this->html( 'userlangattributes' ) ?>>
-                                                       <?php
-                                                       $personalTools = $this->getPersonalTools();
-                                                       foreach ( $personalTools as $key => $item ) {
-                                                               echo $this->makeListItem( $key, $item );
-                                                       }
-                                                       ?>
-                                               </ul>
-                                       </div>
-                                       <?php
-                                       break;
-                               case 'SEARCH':
-                                       ?>
-                                       <div id="p-search" role="search">
-                                               <h3<?php $this->html( 'userlangattributes' ) ?>>
-                                                       <label for="searchInput"><?php $this->msg( 'search' ) ?></label>
-                                               </h3>
-
-                                               <form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
-                                                       <?php
-                                                       if ($wgVectorUseSimpleSearch) {
-                                                       ?>
-                                                       <div id="simpleSearch">
-                                                               <?php
-                                                       } else {
-                                                       ?>
-                                                               <div>
-                                                                       <?php
-                                                       }
-                                                       ?>
-                                                       <?php
-                                                       echo $this->makeSearchInput( array( 'id' => 'searchInput' ) );
-                                                       echo Html::hidden( 'title', $this->get( 'searchtitle' ) );
-                                                       // We construct two buttons (for 'go' and 'fulltext' search modes),
-                                                       // but only one will be visible and actionable at a time (they are
-                                                       // overlaid on top of each other in CSS).
-                                                       // * Browsers will use the 'fulltext' one by default (as it's the
-                                                       //   first in tree-order), which is desirable when they are unable
-                                                       //   to show search suggestions (either due to being broken or
-                                                       //   having JavaScript turned off).
-                                                       // * The mediawiki.searchSuggest module, after doing tests for the
-                                                       //   broken browsers, removes the 'fulltext' button and handles
-                                                       //   'fulltext' search itself; this will reveal the 'go' button and
-                                                       //   cause it to be used.
-                                                       echo $this->makeSearchButton(
-                                                               'fulltext',
-                                                               array( 'id' => 'mw-searchButton', 'class' => 'searchButton mw-fallbackSearchButton' )
-                                                       );
-                                                       echo $this->makeSearchButton(
-                                                               'go',
-                                                               array( 'id' => 'searchButton', 'class' => 'searchButton' )
-                                                       );
-                                                       ?>
-                                                               </div>
-                                               </form>
-                                       </div>
-                                       <?php
-
-                                       break;
-                       }
-               }
-       }
-}
diff --git a/skins/Vector/COPYING b/skins/Vector/COPYING
new file mode 100644 (file)
index 0000000..019694a
--- /dev/null
@@ -0,0 +1,342 @@
+== GNU GENERAL PUBLIC LICENSE ==
+
+Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+=== Preamble ===
+
+The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and
+modification follow.
+
+== TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION ==
+
+'''0.''' This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+'''1.''' You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+'''2.''' You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+       '''a)''' You must cause the modified files to carry prominent notices
+       stating that you changed the files and the date of any change.
+
+       '''b)''' You must cause any work that you distribute or publish, that in
+       whole or in part contains or is derived from the Program or any
+       part thereof, to be licensed as a whole at no charge to all third
+       parties under the terms of this License.
+
+       '''c)''' If the modified program normally reads commands interactively
+       when run, you must cause it, when started running for such
+       interactive use in the most ordinary way, to print or display an
+       announcement including an appropriate copyright notice and a
+       notice that there is no warranty (or else, saying that you provide
+       a warranty) and that users may redistribute the program under
+       these conditions, and telling the user how to view a copy of this
+       License.  (Exception: if the Program itself is interactive but
+       does not normally print such an announcement, your work based on
+       the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+'''3.''' You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+       '''a)''' Accompany it with the complete corresponding machine-readable
+       source code, which must be distributed under the terms of Sections
+       1 and 2 above on a medium customarily used for software interchange; or,
+
+       '''b)''' Accompany it with a written offer, valid for at least three
+       years, to give any third party, for a charge no more than your
+       cost of physically performing source distribution, a complete
+       machine-readable copy of the corresponding source code, to be
+       distributed under the terms of Sections 1 and 2 above on a medium
+       customarily used for software interchange; or,
+
+       '''c)''' Accompany it with the information you received as to the offer
+       to distribute corresponding source code.  (This alternative is
+       allowed only for noncommercial distribution and only if you
+       received the program in object code or executable form with such
+       an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+'''4.''' You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+'''5.''' You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+'''6.''' Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+'''7.''' If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+'''8.''' If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+'''9.''' The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+'''10.''' If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+=== NO WARRANTY ===
+
+'''11.''' BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+'''12.''' IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+       '''END OF TERMS AND CONDITIONS'''
+
+== How to Apply These Terms to Your New Programs ==
+
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+       <one line to give the program's name and a brief idea of what it does.>
+
+       Copyright (C) <year>  <name of author>
+
+       This 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
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+       Gnomovision version 69, Copyright (C) year name of author
+       Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+       This is free software, and you are welcome to redistribute it
+       under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+       Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+       `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+       <signature of Ty Coon>, 1 April 1989
+
+       Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/skins/Vector/SkinVector.php b/skins/Vector/SkinVector.php
new file mode 100644 (file)
index 0000000..237a241
--- /dev/null
@@ -0,0 +1,83 @@
+<?php
+/**
+ * Vector - Modern version of MonoBook with fresh look and many usability
+ * improvements.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Skins
+ */
+
+/**
+ * SkinTemplate class for Vector skin
+ * @ingroup Skins
+ */
+class SkinVector extends SkinTemplate {
+       public $skinname = 'vector';
+       public $stylename = 'Vector';
+       public $template = 'VectorTemplate';
+
+       protected static $bodyClasses = array( 'vector-animateLayout' );
+
+       /**
+        * Initializes output page and sets up skin-specific parameters
+        * @param OutputPage $out Object to initialize
+        */
+       public function initPage( OutputPage $out ) {
+               global $wgLocalStylePath;
+
+               parent::initPage( $out );
+
+               // Append CSS which includes IE only behavior fixes for hover support -
+               // this is better than including this in a CSS file since it doesn't
+               // wait for the CSS file to load before fetching the HTC file.
+               $min = $this->getRequest()->getFuzzyBool( 'debug' ) ? '' : '.min';
+               $out->addHeadItem( 'csshover',
+                       '<!--[if lt IE 7]><style type="text/css">body{behavior:url("' .
+                               htmlspecialchars( $wgLocalStylePath ) .
+                               "/{$this->stylename}/csshover{$min}.htc\")}</style><![endif]-->"
+               );
+
+               $out->addModules( array( 'skins.vector.js' ) );
+       }
+
+       /**
+        * Loads skin and user CSS files.
+        * @param OutputPage $out
+        */
+       function setupSkinUserCss( OutputPage $out ) {
+               parent::setupSkinUserCss( $out );
+
+               $styles = array( 'mediawiki.skinning.interface', 'skins.vector.styles' );
+               wfRunHooks( 'SkinVectorStyleModules', array( $this, &$styles ) );
+               $out->addModuleStyles( $styles );
+       }
+
+       /**
+        * Adds classes to the body element.
+        *
+        * @param OutputPage $out
+        * @param array &$bodyAttrs Array of attributes that will be set on the body element
+        */
+       function addToBodyAttributes( $out, &$bodyAttrs ) {
+               if ( isset( $bodyAttrs['class'] ) && strlen( $bodyAttrs['class'] ) > 0 ) {
+                       $bodyAttrs['class'] .= ' ' . implode( ' ', static::$bodyClasses );
+               } else {
+                       $bodyAttrs['class'] = implode( ' ', static::$bodyClasses );
+               }
+       }
+}
diff --git a/skins/Vector/Vector.php b/skins/Vector/Vector.php
new file mode 100644 (file)
index 0000000..fae4663
--- /dev/null
@@ -0,0 +1,64 @@
+<?php
+/**
+ * Vector - Modern version of MonoBook with fresh look and many usability
+ * improvements.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Skins
+ */
+
+$wgExtensionCredits['skin'][] = array(
+       'path' => __FILE__,
+       'name' => 'Vector',
+       'namemsg' => 'skinname-vector',
+       'descriptionmsg' => 'vector-desc',
+       'url' => 'https://www.mediawiki.org/wiki/Skin:Vector',
+       'author' => array( 'Trevor Parscal', 'Roan Kattouw', '...' ),
+       'license-name' => 'GPLv2+',
+);
+
+// Register files
+$wgAutoloadClasses['SkinVector'] = __DIR__ . '/SkinVector.php';
+$wgAutoloadClasses['VectorTemplate'] = __DIR__ . '/VectorTemplate.php';
+$wgMessagesDirs['Vector'] = __DIR__ . '/i18n';
+
+// Register skin
+$wgValidSkinNames['vector'] = 'Vector';
+
+// Register modules
+$wgResourceModules['skins.vector.styles'] = array(
+       'styles' => array(
+               'screen.less' => array( 'media' => 'screen' ),
+               'screen-hd.less' => array( 'media' => 'screen and (min-width: 982px)' ),
+       ),
+       'remoteSkinPath' => 'Vector',
+       'localBasePath' => __DIR__,
+);
+$wgResourceModules['skins.vector.js'] = array(
+       'scripts' => array(
+               'collapsibleTabs.js',
+               'vector.js',
+       ),
+       'position' => 'top',
+       'dependencies' => array(
+               'jquery.throttle-debounce',
+               'jquery.tabIndex',
+       ),
+       'remoteSkinPath' => 'Vector',
+       'localBasePath' => __DIR__,
+);
diff --git a/skins/Vector/VectorTemplate.php b/skins/Vector/VectorTemplate.php
new file mode 100644 (file)
index 0000000..7dc376a
--- /dev/null
@@ -0,0 +1,596 @@
+<?php
+/**
+ * Vector - Modern version of MonoBook with fresh look and many usability
+ * improvements.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Skins
+ */
+
+/**
+ * QuickTemplate class for Vector skin
+ * @ingroup Skins
+ */
+class VectorTemplate extends BaseTemplate {
+       /* Functions */
+
+       /**
+        * Outputs the entire contents of the (X)HTML page
+        */
+       public function execute() {
+               global $wgVectorUseIconWatch;
+
+               // Build additional attributes for navigation urls
+               $nav = $this->data['content_navigation'];
+
+               if ( $wgVectorUseIconWatch ) {
+                       $mode = $this->getSkin()->getUser()->isWatched( $this->getSkin()->getRelevantTitle() )
+                               ? 'unwatch'
+                               : 'watch';
+
+                       if ( isset( $nav['actions'][$mode] ) ) {
+                               $nav['views'][$mode] = $nav['actions'][$mode];
+                               $nav['views'][$mode]['class'] = rtrim( 'icon ' . $nav['views'][$mode]['class'], ' ' );
+                               $nav['views'][$mode]['primary'] = true;
+                               unset( $nav['actions'][$mode] );
+                       }
+               }
+
+               $xmlID = '';
+               foreach ( $nav as $section => $links ) {
+                       foreach ( $links as $key => $link ) {
+                               if ( $section == 'views' && !( isset( $link['primary'] ) && $link['primary'] ) ) {
+                                       $link['class'] = rtrim( 'collapsible ' . $link['class'], ' ' );
+                               }
+
+                               $xmlID = isset( $link['id'] ) ? $link['id'] : 'ca-' . $xmlID;
+                               $nav[$section][$key]['attributes'] =
+                                       ' id="' . Sanitizer::escapeId( $xmlID ) . '"';
+                               if ( $link['class'] ) {
+                                       $nav[$section][$key]['attributes'] .=
+                                               ' class="' . htmlspecialchars( $link['class'] ) . '"';
+                                       unset( $nav[$section][$key]['class'] );
+                               }
+                               if ( isset( $link['tooltiponly'] ) && $link['tooltiponly'] ) {
+                                       $nav[$section][$key]['key'] =
+                                               Linker::tooltip( $xmlID );
+                               } else {
+                                       $nav[$section][$key]['key'] =
+                                               Xml::expandAttributes( Linker::tooltipAndAccesskeyAttribs( $xmlID ) );
+                               }
+                       }
+               }
+               $this->data['namespace_urls'] = $nav['namespaces'];
+               $this->data['view_urls'] = $nav['views'];
+               $this->data['action_urls'] = $nav['actions'];
+               $this->data['variant_urls'] = $nav['variants'];
+
+               // Reverse horizontally rendered navigation elements
+               if ( $this->data['rtl'] ) {
+                       $this->data['view_urls'] =
+                               array_reverse( $this->data['view_urls'] );
+                       $this->data['namespace_urls'] =
+                               array_reverse( $this->data['namespace_urls'] );
+                       $this->data['personal_urls'] =
+                               array_reverse( $this->data['personal_urls'] );
+               }
+               // Output HTML Page
+               $this->html( 'headelement' );
+               ?>
+               <div id="mw-page-base" class="noprint"></div>
+               <div id="mw-head-base" class="noprint"></div>
+               <div id="content" class="mw-body" role="main">
+                       <a id="top"></a>
+
+                       <div id="mw-js-message" style="display:none;"<?php $this->html( 'userlangattributes' ) ?>></div>
+                       <?php
+                       if ( $this->data['sitenotice'] ) {
+                               ?>
+                               <div id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div>
+                       <?php
+                       }
+                       ?>
+                       <h1 id="firstHeading" class="firstHeading" lang="<?php
+                       $this->data['pageLanguage'] =
+                               $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
+                       $this->text( 'pageLanguage' );
+                       ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
+                       <?php $this->html( 'prebodyhtml' ) ?>
+                       <div id="bodyContent" class="mw-body-content">
+                               <?php
+                               if ( $this->data['isarticle'] ) {
+                                       ?>
+                                       <div id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
+                               <?php
+                               }
+                               ?>
+                               <div id="contentSub"<?php
+                               $this->html( 'userlangattributes' )
+                               ?>><?php $this->html( 'subtitle' ) ?></div>
+                               <?php
+                               if ( $this->data['undelete'] ) {
+                                       ?>
+                                       <div id="contentSub2"><?php $this->html( 'undelete' ) ?></div>
+                               <?php
+                               }
+                               ?>
+                               <?php
+                               if ( $this->data['newtalk'] ) {
+                                       ?>
+                                       <div class="usermessage"><?php $this->html( 'newtalk' ) ?></div>
+                               <?php
+                               }
+                               ?>
+                               <div id="jump-to-nav" class="mw-jump">
+                                       <?php $this->msg( 'jumpto' ) ?>
+                                       <a href="#mw-navigation"><?php
+                                               $this->msg( 'jumptonavigation' )
+                                               ?></a><?php
+                                       $this->msg( 'comma-separator' )
+                                       ?>
+                                       <a href="#p-search"><?php $this->msg( 'jumptosearch' ) ?></a>
+                               </div>
+                               <?php $this->html( 'bodycontent' ) ?>
+                               <?php
+                               if ( $this->data['printfooter'] ) {
+                                       ?>
+                                       <div class="printfooter">
+                                               <?php $this->html( 'printfooter' ); ?>
+                                       </div>
+                               <?php
+                               }
+                               ?>
+                               <?php
+                               if ( $this->data['catlinks'] ) {
+                                       ?>
+                                       <?php
+                                       $this->html( 'catlinks' );
+                                       ?>
+                               <?php
+                               }
+                               ?>
+                               <?php
+                               if ( $this->data['dataAfterContent'] ) {
+                                       ?>
+                                       <?php
+                                       $this->html( 'dataAfterContent' );
+                                       ?>
+                               <?php
+                               }
+                               ?>
+                               <div class="visualClear"></div>
+                               <?php $this->html( 'debughtml' ); ?>
+                       </div>
+               </div>
+               <div id="mw-navigation">
+                       <h2><?php $this->msg( 'navigation-heading' ) ?></h2>
+
+                       <div id="mw-head">
+                               <?php $this->renderNavigation( 'PERSONAL' ); ?>
+                               <div id="left-navigation">
+                                       <?php $this->renderNavigation( array( 'NAMESPACES', 'VARIANTS' ) ); ?>
+                               </div>
+                               <div id="right-navigation">
+                                       <?php $this->renderNavigation( array( 'VIEWS', 'ACTIONS', 'SEARCH' ) ); ?>
+                               </div>
+                       </div>
+                       <div id="mw-panel">
+                               <div id="p-logo" role="banner"><a style="background-image: url(<?php
+                                       $this->text( 'logopath' )
+                                       ?>);" href="<?php
+                                       echo htmlspecialchars( $this->data['nav_urls']['mainpage']['href'] )
+                                       ?>" <?php
+                                       echo Xml::expandAttributes( Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) )
+                                       ?>></a></div>
+                               <?php $this->renderPortals( $this->data['sidebar'] ); ?>
+                       </div>
+               </div>
+               <div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
+                       <?php
+                       foreach ( $this->getFooterLinks() as $category => $links ) {
+                               ?>
+                               <ul id="footer-<?php
+                               echo $category
+                               ?>">
+                                       <?php
+                                       foreach ( $links as $link ) {
+                                               ?>
+                                               <li id="footer-<?php
+                                               echo $category
+                                               ?>-<?php
+                                               echo $link
+                                               ?>"><?php
+                                                       $this->html( $link )
+                                                       ?></li>
+                                       <?php
+                                       }
+                                       ?>
+                               </ul>
+                       <?php
+                       }
+                       ?>
+                       <?php $footericons = $this->getFooterIcons( "icononly" );
+                       if ( count( $footericons ) > 0 ) {
+                               ?>
+                               <ul id="footer-icons" class="noprint">
+                                       <?php
+                                       foreach ( $footericons as $blockName => $footerIcons ) {
+                                               ?>
+                                               <li id="footer-<?php
+                                               echo htmlspecialchars( $blockName ); ?>ico">
+                                                       <?php
+                                                       foreach ( $footerIcons as $icon ) {
+                                                               ?>
+                                                               <?php
+                                                               echo $this->getSkin()->makeFooterIcon( $icon );
+                                                               ?>
+
+                                                       <?php
+                                                       }
+                                                       ?>
+                                               </li>
+                                       <?php
+                                       }
+                                       ?>
+                               </ul>
+                       <?php
+                       }
+                       ?>
+                       <div style="clear:both"></div>
+               </div>
+               <?php $this->printTrail(); ?>
+
+       </body>
+</html>
+       <?php
+       }
+
+       /**
+        * Render a series of portals
+        *
+        * @param array $portals
+        */
+       protected function renderPortals( $portals ) {
+               // Force the rendering of the following portals
+               if ( !isset( $portals['SEARCH'] ) ) {
+                       $portals['SEARCH'] = true;
+               }
+               if ( !isset( $portals['TOOLBOX'] ) ) {
+                       $portals['TOOLBOX'] = true;
+               }
+               if ( !isset( $portals['LANGUAGES'] ) ) {
+                       $portals['LANGUAGES'] = true;
+               }
+               // Render portals
+               foreach ( $portals as $name => $content ) {
+                       if ( $content === false ) {
+                               continue;
+                       }
+
+                       switch ( $name ) {
+                               case 'SEARCH':
+                                       break;
+                               case 'TOOLBOX':
+                                       $this->renderPortal( 'tb', $this->getToolbox(), 'toolbox', 'SkinTemplateToolboxEnd' );
+                                       break;
+                               case 'LANGUAGES':
+                                       if ( $this->data['language_urls'] !== false ) {
+                                               $this->renderPortal( 'lang', $this->data['language_urls'], 'otherlanguages' );
+                                       }
+                                       break;
+                               default:
+                                       $this->renderPortal( $name, $content );
+                                       break;
+                       }
+               }
+       }
+
+       /**
+        * @param string $name
+        * @param array $content
+        * @param null|string $msg
+        * @param null|string|array $hook
+        */
+       protected function renderPortal( $name, $content, $msg = null, $hook = null ) {
+               if ( $msg === null ) {
+                       $msg = $name;
+               }
+               $msgObj = wfMessage( $msg );
+               ?>
+               <div class="portal" role="navigation" id='<?php
+               echo Sanitizer::escapeId( "p-$name" )
+               ?>'<?php
+               echo Linker::tooltip( 'p-' . $name )
+               ?> aria-labelledby='<?php echo Sanitizer::escapeId( "p-$name-label" ) ?>'>
+                       <h3<?php
+                       $this->html( 'userlangattributes' )
+                       ?> id='<?php
+                       echo Sanitizer::escapeId( "p-$name-label" )
+                       ?>'><?php
+                               echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $msg );
+                               ?></h3>
+
+                       <div class="body">
+                               <?php
+                               if ( is_array( $content ) ) {
+                                       ?>
+                                       <ul>
+                                               <?php
+                                               foreach ( $content as $key => $val ) {
+                                                       ?>
+                                                       <?php echo $this->makeListItem( $key, $val ); ?>
+
+                                               <?php
+                                               }
+                                               if ( $hook !== null ) {
+                                                       wfRunHooks( $hook, array( &$this, true ) );
+                                               }
+                                               ?>
+                                       </ul>
+                               <?php
+                               } else {
+                                       ?>
+                                       <?php
+                                       echo $content; /* Allow raw HTML block to be defined by extensions */
+                               }
+
+                               $this->renderAfterPortlet( $name );
+                               ?>
+                       </div>
+               </div>
+       <?php
+       }
+
+       /**
+        * Render one or more navigations elements by name, automatically reveresed
+        * when UI is in RTL mode
+        *
+        * @param array $elements
+        */
+       protected function renderNavigation( $elements ) {
+               global $wgVectorUseSimpleSearch;
+
+               // If only one element was given, wrap it in an array, allowing more
+               // flexible arguments
+               if ( !is_array( $elements ) ) {
+                       $elements = array( $elements );
+                       // If there's a series of elements, reverse them when in RTL mode
+               } elseif ( $this->data['rtl'] ) {
+                       $elements = array_reverse( $elements );
+               }
+               // Render elements
+               foreach ( $elements as $name => $element ) {
+                       switch ( $element ) {
+                               case 'NAMESPACES':
+                                       ?>
+                                       <div id="p-namespaces" role="navigation" class="vectorTabs<?php
+                                       if ( count( $this->data['namespace_urls'] ) == 0 ) {
+                                               echo ' emptyPortlet';
+                                       }
+                                       ?>" aria-labelledby="p-namespaces-label">
+                                               <h3 id="p-namespaces-label"><?php $this->msg( 'namespaces' ) ?></h3>
+                                               <ul<?php $this->html( 'userlangattributes' ) ?>>
+                                                       <?php
+                                                       foreach ( $this->data['namespace_urls'] as $link ) {
+                                                               ?>
+                                                               <li <?php
+                                                               echo $link['attributes']
+                                                               ?>><span><a href="<?php
+                                                                               echo htmlspecialchars( $link['href'] )
+                                                                               ?>" <?php
+                                                                               echo $link['key']
+                                                                               ?>><?php
+                                                                                       echo htmlspecialchars( $link['text'] )
+                                                                                       ?></a></span></li>
+                                                       <?php
+                                                       }
+                                                       ?>
+                                               </ul>
+                                       </div>
+                                       <?php
+                                       break;
+                               case 'VARIANTS':
+                                       ?>
+                                       <div id="p-variants" role="navigation" class="vectorMenu<?php
+                                       if ( count( $this->data['variant_urls'] ) == 0 ) {
+                                               echo ' emptyPortlet';
+                                       }
+                                       ?>" aria-labelledby="p-variants-label">
+                                               <h3 id="mw-vector-current-variant">
+                                                       <?php
+                                                       foreach ( $this->data['variant_urls'] as $link ) {
+                                                               ?>
+                                                               <?php
+                                                               if ( stripos( $link['attributes'], 'selected' ) !== false ) {
+                                                                       ?>
+                                                                       <?php
+                                                                       echo htmlspecialchars( $link['text'] )
+                                                                       ?>
+                                                               <?php
+                                                               }
+                                                               ?>
+                                                       <?php
+                                                       }
+                                                       ?>
+                                               </h3>
+
+                                               <h3 id="p-variants-label"><span><?php $this->msg( 'variants' ) ?></span><a href="#"></a></h3>
+
+                                               <div class="menu">
+                                                       <ul>
+                                                               <?php
+                                                               foreach ( $this->data['variant_urls'] as $link ) {
+                                                                       ?>
+                                                                       <li<?php
+                                                                       echo $link['attributes']
+                                                                       ?>><a href="<?php
+                                                                               echo htmlspecialchars( $link['href'] )
+                                                                               ?>" lang="<?php
+                                                                               echo htmlspecialchars( $link['lang'] )
+                                                                               ?>" hreflang="<?php
+                                                                               echo htmlspecialchars( $link['hreflang'] )
+                                                                               ?>" <?php
+                                                                               echo $link['key']
+                                                                               ?>><?php
+                                                                                       echo htmlspecialchars( $link['text'] )
+                                                                                       ?></a></li>
+                                                               <?php
+                                                               }
+                                                               ?>
+                                                       </ul>
+                                               </div>
+                                       </div>
+                                       <?php
+                                       break;
+                               case 'VIEWS':
+                                       ?>
+                                       <div id="p-views" role="navigation" class="vectorTabs<?php
+                                       if ( count( $this->data['view_urls'] ) == 0 ) {
+                                               echo ' emptyPortlet';
+                                       }
+                                       ?>" aria-labelledby="p-views-label">
+                                               <h3 id="p-views-label"><?php $this->msg( 'views' ) ?></h3>
+                                               <ul<?php
+                                               $this->html( 'userlangattributes' )
+                                               ?>>
+                                                       <?php
+                                                       foreach ( $this->data['view_urls'] as $link ) {
+                                                               ?>
+                                                               <li<?php
+                                                               echo $link['attributes']
+                                                               ?>><span><a href="<?php
+                                                                               echo htmlspecialchars( $link['href'] )
+                                                                               ?>" <?php
+                                                                               echo $link['key']
+                                                                               ?>><?php
+                                                                                       // $link['text'] can be undefined - bug 27764
+                                                                                       if ( array_key_exists( 'text', $link ) ) {
+                                                                                               echo array_key_exists( 'img', $link )
+                                                                                                       ? '<img src="' . $link['img'] . '" alt="' . $link['text'] . '" />'
+                                                                                                       : htmlspecialchars( $link['text'] );
+                                                                                       }
+                                                                                       ?></a></span></li>
+                                                       <?php
+                                                       }
+                                                       ?>
+                                               </ul>
+                                       </div>
+                                       <?php
+                                       break;
+                               case 'ACTIONS':
+                                       ?>
+                                       <div id="p-cactions" role="navigation" class="vectorMenu<?php
+                                       if ( count( $this->data['action_urls'] ) == 0 ) {
+                                               echo ' emptyPortlet';
+                                       }
+                                       ?>" aria-labelledby="p-cactions-label">
+                                               <h3 id="p-cactions-label"><span><?php $this->msg( 'vector-more-actions' ) ?></span><a href="#"></a></h3>
+
+                                               <div class="menu">
+                                                       <ul<?php $this->html( 'userlangattributes' ) ?>>
+                                                               <?php
+                                                               foreach ( $this->data['action_urls'] as $link ) {
+                                                                       ?>
+                                                                       <li<?php
+                                                                       echo $link['attributes']
+                                                                       ?>>
+                                                                               <a href="<?php
+                                                                               echo htmlspecialchars( $link['href'] )
+                                                                               ?>" <?php
+                                                                               echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] )
+                                                                                       ?></a>
+                                                                       </li>
+                                                               <?php
+                                                               }
+                                                               ?>
+                                                       </ul>
+                                               </div>
+                                       </div>
+                                       <?php
+                                       break;
+                               case 'PERSONAL':
+                                       ?>
+                                       <div id="p-personal" role="navigation" class="<?php
+                                       if ( count( $this->data['personal_urls'] ) == 0 ) {
+                                               echo ' emptyPortlet';
+                                       }
+                                       ?>" aria-labelledby="p-personal-label">
+                                               <h3 id="p-personal-label"><?php $this->msg( 'personaltools' ) ?></h3>
+                                               <ul<?php $this->html( 'userlangattributes' ) ?>>
+                                                       <?php
+                                                       $personalTools = $this->getPersonalTools();
+                                                       foreach ( $personalTools as $key => $item ) {
+                                                               echo $this->makeListItem( $key, $item );
+                                                       }
+                                                       ?>
+                                               </ul>
+                                       </div>
+                                       <?php
+                                       break;
+                               case 'SEARCH':
+                                       ?>
+                                       <div id="p-search" role="search">
+                                               <h3<?php $this->html( 'userlangattributes' ) ?>>
+                                                       <label for="searchInput"><?php $this->msg( 'search' ) ?></label>
+                                               </h3>
+
+                                               <form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
+                                                       <?php
+                                                       if ($wgVectorUseSimpleSearch) {
+                                                       ?>
+                                                       <div id="simpleSearch">
+                                                               <?php
+                                                       } else {
+                                                       ?>
+                                                               <div>
+                                                                       <?php
+                                                       }
+                                                       ?>
+                                                       <?php
+                                                       echo $this->makeSearchInput( array( 'id' => 'searchInput' ) );
+                                                       echo Html::hidden( 'title', $this->get( 'searchtitle' ) );
+                                                       // We construct two buttons (for 'go' and 'fulltext' search modes),
+                                                       // but only one will be visible and actionable at a time (they are
+                                                       // overlaid on top of each other in CSS).
+                                                       // * Browsers will use the 'fulltext' one by default (as it's the
+                                                       //   first in tree-order), which is desirable when they are unable
+                                                       //   to show search suggestions (either due to being broken or
+                                                       //   having JavaScript turned off).
+                                                       // * The mediawiki.searchSuggest module, after doing tests for the
+                                                       //   broken browsers, removes the 'fulltext' button and handles
+                                                       //   'fulltext' search itself; this will reveal the 'go' button and
+                                                       //   cause it to be used.
+                                                       echo $this->makeSearchButton(
+                                                               'fulltext',
+                                                               array( 'id' => 'mw-searchButton', 'class' => 'searchButton mw-fallbackSearchButton' )
+                                                       );
+                                                       echo $this->makeSearchButton(
+                                                               'go',
+                                                               array( 'id' => 'searchButton', 'class' => 'searchButton' )
+                                                       );
+                                                       ?>
+                                                               </div>
+                                               </form>
+                                       </div>
+                                       <?php
+
+                                       break;
+                       }
+               }
+       }
+}
diff --git a/skins/Vector/collapsibleTabs.js b/skins/Vector/collapsibleTabs.js
new file mode 100644 (file)
index 0000000..e24bea9
--- /dev/null
@@ -0,0 +1,207 @@
+/**
+ * Collapsible tabs jQuery Plugin
+ */
+( function ( $ ) {
+       var rtl = $( 'html' ).attr( 'dir' ) === 'rtl';
+       $.fn.collapsibleTabs = function ( options ) {
+               // return if the function is called on an empty jquery object
+               if ( !this.length ) {
+                       return this;
+               }
+               // Merge options into the defaults
+               var settings = $.extend( {}, $.collapsibleTabs.defaults, options );
+
+               this.each( function () {
+                       var $el = $( this );
+                       // add the element to our array of collapsible managers
+                       $.collapsibleTabs.instances = ( $.collapsibleTabs.instances.length === 0 ?
+                               $el : $.collapsibleTabs.instances.add( $el ) );
+                       // attach the settings to the elements
+                       $el.data( 'collapsibleTabsSettings', settings );
+                       // attach data to our collapsible elements
+                       $el.children( settings.collapsible ).each( function () {
+                               $.collapsibleTabs.addData( $( this ) );
+                       } );
+               } );
+
+               // if we haven't already bound our resize handler, bind it now
+               if ( !$.collapsibleTabs.boundEvent ) {
+                       $( window ).on( 'resize', $.debounce( 500, function () {
+                               $.collapsibleTabs.handleResize();
+                       } ) );
+                       $.collapsibleTabs.boundEvent = true;
+               }
+
+               // call our resize handler to setup the page
+               $.collapsibleTabs.handleResize();
+               return this;
+       };
+       $.collapsibleTabs = {
+               instances: [],
+               boundEvent: null,
+               defaults: {
+                       expandedContainer: '#p-views ul',
+                       collapsedContainer: '#p-cactions ul',
+                       collapsible: 'li.collapsible',
+                       shifting: false,
+                       expandCondition: function ( eleWidth ) {
+                               // If there are at least eleWidth + 1 pixels of free space, expand.
+                               // We add 1 because .width() will truncate fractional values but .offset() will not.
+                               return $.collapsibleTabs.calculateTabDistance() >= eleWidth + 1;
+                       },
+                       collapseCondition: function () {
+                               // If there's an overlap, collapse.
+                               return $.collapsibleTabs.calculateTabDistance() < 0;
+                       }
+               },
+               addData: function ( $collapsible ) {
+                       var settings = $collapsible.parent().data( 'collapsibleTabsSettings' );
+                       if ( settings ) {
+                               $collapsible.data( 'collapsibleTabsSettings', {
+                                       expandedContainer: settings.expandedContainer,
+                                       collapsedContainer: settings.collapsedContainer,
+                                       expandedWidth: $collapsible.width(),
+                                       prevElement: $collapsible.prev()
+                               } );
+                       }
+               },
+               getSettings: function ( $collapsible ) {
+                       var settings = $collapsible.data( 'collapsibleTabsSettings' );
+                       if ( !settings ) {
+                               $.collapsibleTabs.addData( $collapsible );
+                               settings = $collapsible.data( 'collapsibleTabsSettings' );
+                       }
+                       return settings;
+               },
+               handleResize: function () {
+                       $.collapsibleTabs.instances.each( function () {
+                               var $el = $( this ),
+                                       data = $.collapsibleTabs.getSettings( $el );
+
+                               if ( data.shifting ) {
+                                       return;
+                               }
+
+                               // if the two navigations are colliding
+                               if ( $el.children( data.collapsible ).length > 0 && data.collapseCondition() ) {
+
+                                       $el.trigger( 'beforeTabCollapse' );
+                                       // move the element to the dropdown menu
+                                       $.collapsibleTabs.moveToCollapsed( $el.children( data.collapsible + ':last' ) );
+                               }
+
+                               // if there are still moveable items in the dropdown menu,
+                               // and there is sufficient space to place them in the tab container
+                               if ( $( data.collapsedContainer + ' ' + data.collapsible ).length > 0 &&
+                                               data.expandCondition( $.collapsibleTabs.getSettings( $( data.collapsedContainer ).children(
+                                                               data.collapsible + ':first' ) ).expandedWidth ) ) {
+                                       //move the element from the dropdown to the tab
+                                       $el.trigger( 'beforeTabExpand' );
+                                       $.collapsibleTabs
+                                               .moveToExpanded( data.collapsedContainer + ' ' + data.collapsible + ':first' );
+                               }
+                       } );
+               },
+               moveToCollapsed: function ( ele ) {
+                       var outerData, expContainerSettings, target,
+                               $moving = $( ele );
+
+                       outerData = $.collapsibleTabs.getSettings( $moving );
+                       if ( !outerData ) {
+                               return;
+                       }
+                       expContainerSettings = $.collapsibleTabs.getSettings( $( outerData.expandedContainer ) );
+                       if ( !expContainerSettings ) {
+                               return;
+                       }
+                       expContainerSettings.shifting = true;
+
+                       // Remove the element from where it's at and put it in the dropdown menu
+                       target = outerData.collapsedContainer;
+                       $moving.css( 'position', 'relative' )
+                               .css( ( rtl ? 'left' : 'right' ), 0 )
+                               .animate( { width: '1px' }, 'normal', function () {
+                                       var data, expContainerSettings;
+                                       $( this ).hide();
+                                       // add the placeholder
+                                       $( '<span class="placeholder" style="display: none;"></span>' ).insertAfter( this );
+                                       $( this ).detach().prependTo( target ).data( 'collapsibleTabsSettings', outerData );
+                                       $( this ).attr( 'style', 'display: list-item;' );
+                                       data = $.collapsibleTabs.getSettings( $( ele ) );
+                                       if ( data ) {
+                                               expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
+                                               if ( expContainerSettings ) {
+                                                       expContainerSettings.shifting = false;
+                                                       $.collapsibleTabs.handleResize();
+                                               }
+                                       }
+                               } );
+               },
+               moveToExpanded: function ( ele ) {
+                       var data, expContainerSettings, $target, expandedWidth,
+                               $moving = $( ele );
+
+                       data = $.collapsibleTabs.getSettings( $moving );
+                       if ( !data ) {
+                               return;
+                       }
+                       expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
+                       if ( !expContainerSettings ) {
+                               return;
+                       }
+                       expContainerSettings.shifting = true;
+
+                       // grab the next appearing placeholder so we can use it for replacing
+                       $target = $( data.expandedContainer ).find( 'span.placeholder:first' );
+                       expandedWidth = data.expandedWidth;
+                       $moving.css( 'position', 'relative' ).css( ( rtl ? 'right' : 'left' ), 0 ).css( 'width', '1px' );
+                       $target.replaceWith(
+                               $moving
+                               .detach()
+                               .css( 'width', '1px' )
+                               .data( 'collapsibleTabsSettings', data )
+                               .animate( { width: expandedWidth + 'px' }, 'normal', function () {
+                                       $( this ).attr( 'style', 'display: block;' );
+                                       var data, expContainerSettings;
+                                       data = $.collapsibleTabs.getSettings( $( this ) );
+                                       if ( data ) {
+                                               expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
+                                               if ( expContainerSettings ) {
+                                                       expContainerSettings.shifting = false;
+                                                       $.collapsibleTabs.handleResize();
+                                               }
+                                       }
+                               } )
+                       );
+               },
+               /**
+                * Returns the amount of horizontal distance between the two tabs groups
+                * (#left-navigation and #right-navigation), in pixels. If negative, this
+                * means that the tabs overlap, and the value is the width of overlapping
+                * parts.
+                *
+                * Used in default expandCondition and collapseCondition.
+                *
+                * @return {Numeric} distance/overlap in pixels
+                */
+               calculateTabDistance: function () {
+                       var $leftTab, $rightTab, leftEnd, rightStart;
+
+                       // In RTL, #right-navigation is actually on the left and vice versa.
+                       // Hooray for descriptive naming.
+                       if ( !rtl ) {
+                               $leftTab = $( '#left-navigation' );
+                               $rightTab = $( '#right-navigation' );
+                       } else {
+                               $leftTab = $( '#right-navigation' );
+                               $rightTab = $( '#left-navigation' );
+                       }
+
+                       leftEnd = $leftTab.offset().left + $leftTab.width();
+                       rightStart = $rightTab.offset().left;
+
+                       return rightStart - leftEnd;
+               }
+       };
+
+}( jQuery ) );
diff --git a/skins/Vector/components/animations.less b/skins/Vector/components/animations.less
new file mode 100644 (file)
index 0000000..9163779
--- /dev/null
@@ -0,0 +1,28 @@
+/* Animate between standard and high definition layouts */
+body.vector-animateLayout {
+       div#content,
+       div#footer,
+       #left-navigation {
+               .transition(margin-left 250ms, padding 250ms;);
+       }
+
+       #p-logo {
+               .transition(left 250ms);
+       }
+
+       #mw-panel {
+               .transition(padding-right 250ms);
+       }
+
+       #p-search {
+               .transition(margin-right 250ms);
+       }
+
+       #p-personal {
+               .transition(right 250ms);
+       }
+
+       #mw-head-base {
+               .transition(margin-left 250ms);
+       }
+}
diff --git a/skins/Vector/components/common.less b/skins/Vector/components/common.less
new file mode 100644 (file)
index 0000000..f70c7a4
--- /dev/null
@@ -0,0 +1,142 @@
+/*
+ * Any rules which should not be flipped automatically in right-to-left situations should be
+ * prepended with @noflip in a comment block.
+ *
+ * This stylesheet employs a few CSS trick to accomplish compatibility with a wide range of web
+ * browsers. The most common trick is to use some styles in IE6 only. This is accomplished by using
+ * a rule that makes things work in IE6, and then following it with a rule that begins with
+ * "html > body" or use a child selector ">", which is ignored by IE6 because it does not support
+ * the child selector. You can spot this by looking for the "OVERRIDDEN BY COMPLIANT BROWSERS" and
+ * "IGNORED BY IE6" comments.
+ */
+@import "mediawiki.mixins";
+
+/* Framework */
+html {
+       font-size: @html-font-size;
+}
+html,
+body {
+       height: 100%;
+       margin: 0;
+       padding: 0;
+       font-family: @content-font-family;
+}
+body {
+       background-color: @menu-background-color;
+}
+
+/* Content */
+div#content {
+       margin-left: 10em;
+       padding: @content-padding;
+       /* Border on top, left, and bottom side */
+       border: 1px solid @content-border-color;
+       border-right-width: 0;
+       /* Merge the border with tabs' one (in their background image) */
+       margin-top: -1px;
+       background-color: @body-background-color;
+       color: @content-font-color;
+       direction: ltr;
+
+       .mw-editsection,
+       .mw-editsection-like {
+               font-family: @content-font-family;
+       }
+
+       p {
+               line-height: inherit;
+               margin: 0.5em 0;
+       }
+
+       h1,
+       h2,
+       #firstHeading {
+               font-family: @content-heading-font-family;
+               line-height: @heading-line-height;
+               margin-bottom: 0.25em;
+               padding: 0;
+       }
+
+       h1,
+       #firstHeading {
+               font-size: @content-heading-font-size;
+       }
+
+       h2 {
+               font-size: 1.5em;
+               margin-top: 1em;
+       }
+
+       h3,
+       h4,
+       h5,
+       h6 {
+               line-height: @content-line-height;
+               margin-top: 0.3em;
+               margin-bottom: 0;
+               padding-bottom: 0;
+       }
+
+       h3 {
+               font-size: 1.17em;
+       }
+
+       h3,
+       h4 {
+               font-weight: bold;
+       }
+
+       h4,
+       h5,
+       h6 {
+               font-size: 100%; /* (reset) */
+       }
+
+       #toc h2,
+       .toc h2 {
+               font-size: 100%; /* (reset) */
+               font-family: @content-font-family;
+       }
+}
+
+/* Hide empty portlets */
+div.emptyPortlet {
+               display: none;
+}
+
+ul {
+       list-style-type: disc;
+       .list-style-image('images/bullet-icon.png');
+}
+
+pre, .mw-code {
+       line-height: 1.3em;
+}
+
+/* Site Notice (includes notices from CentralNotice extension) */
+#siteNotice {
+       font-size: 0.8em;
+}
+
+.redirectText {
+       font-size: 140%;
+}
+
+.redirectMsg img {
+       vertical-align: text-bottom;
+}
+
+/* TODO: Remove #bodyContent selector (kept for backwards compatibility with cached html) */
+#bodyContent,
+.mw-body-content {
+       position: relative;
+       line-height: @content-line-height;
+       font-size: @content-font-size;
+}
+
+/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
+// FIXME: Should be part of jquery.tipsy.css
+.tipsy {
+       font-size: 0.8em;
+}
diff --git a/skins/Vector/components/externalLinks.less b/skins/Vector/components/externalLinks.less
new file mode 100644 (file)
index 0000000..91388c6
--- /dev/null
@@ -0,0 +1,10 @@
+@import "mediawiki.mixins.less";
+// External links
+#content {
+       .external {
+               background-position: center right;
+               background-repeat: no-repeat;
+               .background-image-svg('images/external-link-ltr-icon.svg', 'images/external-link-ltr-icon.png');
+               padding-right: 13px;
+       }
+}
diff --git a/skins/Vector/components/footer.less b/skins/Vector/components/footer.less
new file mode 100644 (file)
index 0000000..3d61b66
--- /dev/null
@@ -0,0 +1,57 @@
+/* Footer */
+div#footer {
+       margin-left: 10em;
+       margin-top: 0;
+       padding: 0.75em;
+       direction: ltr;
+
+       ul {
+               list-style-type: none;
+               list-style-image: none;
+               margin: 0;
+               padding: 0;
+
+               li {
+                       margin: 0;
+                       padding: 0;
+                       padding-top: 0.5em;
+                       padding-bottom: 0.5em;
+                       color: #333;
+                       font-size: 0.7em;
+               }
+       }
+
+       #footer-icons {
+               float: right;
+
+               li {
+                       float: left;
+                       margin-left: 0.5em;
+                       line-height: 2em;
+                       text-align: right;
+               }
+       }
+
+       #footer-info {
+               li {
+                       line-height: 1.4em;
+               }
+       }
+
+       #footer-places {
+               li {
+                       float: left;
+                       margin-right: 1em;
+                       line-height: 2em;
+               }
+       }
+}
+
+body.ltr {
+       div#footer {
+               #footer-places {
+                       /* @noflip */
+                       float: left;
+               }
+       }
+}
diff --git a/skins/Vector/components/navigation.less b/skins/Vector/components/navigation.less
new file mode 100644 (file)
index 0000000..8b384ac
--- /dev/null
@@ -0,0 +1,144 @@
+@import "mediawiki.mixins";
+@import "personalMenu";
+@import "search";
+@import "tabs";
+
+/* Hide, but keep accessible for screen-readers */
+#mw-navigation h2 {
+       position: absolute;
+       top: -9999px;
+}
+
+/* Head */
+#mw-page-base {
+       height: 5em;
+       background-position: bottom left;
+       background-repeat: repeat-x;
+       /* This image is only a fallback (for IE 6-9), so we do not @embed it. */
+       background-image: url('images/page-fade.png');
+       .vertical-gradient(@body-background-color, @menu-background-color, 50%, 100%);
+       background-color: @body-background-color;
+}
+
+#mw-head-base {
+       margin-top: -5em;
+       margin-left: 10em;
+       height: 5em;
+}
+
+div#mw-head {
+       position: absolute;
+       top: 0;
+       right: 0;
+       width: 100%;
+
+       h3 {
+               margin: 0;
+               padding: 0;
+       }
+}
+
+/* Navigation Containers */
+#left-navigation {
+       float: left;
+       margin-left: 10em;
+       margin-top: 2.5em;
+       /* When right nav would overlap left nav, it's placed below it
+          (normal CSS floats behavior). This rule ensures that no empty space
+          is shown between them due to right nav's margin-top. Page layout
+          is still broken, but at least the nav overlaps only the page title
+          instead of half the content. */
+       margin-bottom: -2.5em;
+       /* IE 6 double-margin bug fix */
+       display: inline;
+}
+
+#right-navigation {
+       float: right;
+       margin-top: 2.5em;
+}
+
+/* Logo */
+#p-logo {
+       position: absolute;
+       top: -160px;
+       left: 0;
+       width: 10em;
+       height: 160px;
+
+       a {
+               display: block;
+               width: 10em;
+               height: 160px;
+               background-repeat: no-repeat;
+               background-position: center center;
+               text-decoration: none;
+       }
+}
+
+/* Panel */
+div#mw-panel {
+       font-size: @menu-main-font-size;
+       position: absolute;
+       top: 160px;
+       padding-top: 1em;
+       width: 10em;
+       left: 0;
+
+       div.portal {
+               margin: 0 0.6em 0 0.7em;
+               padding: 0.25em 0;
+               direction: ltr;
+               background-position: top left;
+               background-repeat: no-repeat;
+               .background-image('images/portal-break.png');
+
+               h3 {
+                       font-size: @menu-main-heading-font-size;
+                       color: @menu-main-heading-color;
+                       font-weight: normal;
+                       margin: 0;
+                       padding: @menu-main-heading-padding;
+                       cursor: default;
+                       border: none;
+               }
+
+               div.body {
+                       margin: @menu-main-body-margin;
+                       padding-top: 0;
+
+                       ul {
+                               list-style-type: none;
+                               list-style-image: none;
+                               margin: 0;
+                               padding: @menu-main-body-padding;
+
+                               li {
+                                       line-height: 1.125em;
+                                       margin: 0;
+                                       padding: 0.25em 0;
+                                       font-size: @menu-main-body-font-size;
+                                       word-wrap: break-word;
+
+                                       a {
+                                               color: @menu-main-body-link-color;
+                                               &:visited {
+                                                       color: @menu-main-body-link-visited-color;
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               &.first {
+                       background-image: none;
+                       margin-top: 0;
+                       h3 {
+                               display: none;
+                       }
+                       div.body {
+                               margin-left: 0.5em;
+                       }
+               }
+       }
+}
diff --git a/skins/Vector/components/notifications.less b/skins/Vector/components/notifications.less
new file mode 100644 (file)
index 0000000..05a1e61
--- /dev/null
@@ -0,0 +1,19 @@
+/* mediawiki.notification */
+.skin-vector {
+       .mw-notification-area {
+               font-size: 0.8em;
+       }
+
+       .mw-notification-area-layout {
+               top: 7em;
+       }
+
+       .mw-notification {
+               background-color: #fff;
+               background-color: rgba(255, 255, 255, 0.93);
+               padding: 0.75em 1.5em;
+               border: solid 1px @content-border-color;
+               border-radius: 0.75em;
+               box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125);
+       }
+}
diff --git a/skins/Vector/components/personalMenu.less b/skins/Vector/components/personalMenu.less
new file mode 100644 (file)
index 0000000..7256929
--- /dev/null
@@ -0,0 +1,41 @@
+/* Personal */
+#p-personal {
+       position: absolute;
+       top: 0.33em;
+       right: 0.75em;
+       /* Display on top of page tabs - bugs 37158, 48078 */
+       z-index: 100;
+
+       h3 {
+               display: none;
+       }
+
+       ul {
+               list-style-type: none;
+               list-style-image: none;
+               margin: 0;
+               padding-left: 10em; /* Keep from overlapping logo */
+       }
+
+       li {
+               line-height: 1.125em;
+               /* @noflip */
+               float: left;
+               margin-left: 0.75em;
+               margin-top: 0.5em;
+               font-size: @menu-personal-font-size;
+               white-space: nowrap;
+       }
+}
+
+/* Icon for Usernames */
+#pt-userpage,
+#pt-anonuserpage,
+#pt-login {
+       background-position: left top;
+       background-repeat: no-repeat;
+       /* SVG support using a transparent gradient to guarantee cross-browser
+        * compatibility (browsers able to understand gradient syntax support also SVG) */
+       .background-image-svg('images/user-icon.svg', 'images/user-icon.png');
+       padding-left: 15px !important;
+}
diff --git a/skins/Vector/components/search.less b/skins/Vector/components/search.less
new file mode 100644 (file)
index 0000000..46c3030
--- /dev/null
@@ -0,0 +1,113 @@
+/* Search */
+#p-search {
+       /* @noflip */
+       float: left;
+       margin-right: 0.5em;
+       margin-left: 0.5em;
+
+       h3 {
+               display: none;
+       }
+
+       form,
+       input {
+               margin: 0;
+               margin-top: 0.4em;
+       }
+}
+
+div#simpleSearch {
+       display: block;
+       width: 14em;
+       height: 1.4em;
+       margin-top: 0.65em;
+       position: relative;
+       min-height: 1px; /* Gotta trigger hasLayout for IE7 */
+       border: solid 1px #aaa;
+       color: black;
+       background-color: white;
+       .background-image('images/search-fade.png');
+       background-position: top left;
+       background-repeat: repeat-x;
+
+       // Styles for both the search input and the button
+       input {
+               position: absolute;
+               margin: 0;
+               padding: 0;
+               border: 0;
+               background-color: transparent;
+               color: black;
+       }
+
+       // The search input
+       #searchInput {
+               top: 0;
+               left: 0;
+               width: 90%;
+               padding: 0.2em 0 0.2em 0.2em;
+               font-size: 13px;
+               direction: ltr;
+
+               &:focus {
+                       outline: none;
+               }
+
+               // These rules MAY NOT be merged because of how CSS requires browsers
+               // to parse unrecognized selectors!
+               // Note these rules ensure that placeholder text can be distinguished from
+               // standard text. In browsers which make this distinction clear these rules
+               // are not necessary.
+               // For inputs that use jquery.placeholder.js e.g. IE9-
+               &.placeholder {
+                       color: #999;
+               }
+               // Distinguish placeholder text in IE10+
+               &:-ms-input-placeholder {
+                       color: #999;
+               }
+               // Distinguish placeholder text in Firefox 18-
+               &:-moz-placeholder {
+                       color: #999;
+               }
+
+               // Undo the styles Webkit browsers apply to type=search fields,
+               // we provide our own
+               -webkit-appearance: textfield;
+
+               &::-webkit-search-decoration,
+               &::-webkit-search-cancel-button,
+               &::-webkit-search-results-button,
+               &::-webkit-search-results-decoration {
+                       -webkit-appearance: textfield;
+               }
+       }
+
+       // The buttons. They are displayed in the same position, and if both are
+       // present the fulltext search one obscures the 'Go' one.
+       #searchButton,
+       #mw-searchButton {
+               top: 0;
+               right: 0;
+               width: 10%;
+               height: 100%;
+               cursor: pointer;
+               /* Hide button text and replace it with the image. */
+               /* This would be 100% if not for Firefox shenanigans (bug 60900). */
+               text-indent: 200%;
+               /* Needed to make IE6 respect the text-indent. */
+               line-height: 1;
+               /* Opera 12 on RTL flips the text in a funny way without this. */
+               /* @noflip */
+               direction: ltr;
+               white-space: nowrap;
+               overflow: hidden;
+               .background-image-svg('images/search-ltr.svg', 'images/search-ltr.png');
+               background-position: center center;
+               background-repeat: no-repeat;
+       }
+
+       #mw-searchButton {
+               z-index: 1;
+       }
+}
diff --git a/skins/Vector/components/tabs.less b/skins/Vector/components/tabs.less
new file mode 100644 (file)
index 0000000..9e39fbb
--- /dev/null
@@ -0,0 +1,264 @@
+/*
+Styling for namespace tabs (page, discussion) and views (read, edit, view history, watch and other actions)
+*/
+
+/* Navigation Labels */
+div.vectorTabs h3 {
+       display: none;
+}
+
+/* Namespaces and Views */
+div.vectorTabs {
+       /* @noflip */
+       float: left;
+       height: 2.5em;
+       .background-image('images/tab-break.png');
+       background-position: bottom left;
+       background-repeat: no-repeat;
+       padding-left: 1px;
+
+       ul {
+               /* @noflip */
+               float: left;
+               height: 100%;
+               list-style-type: none;
+               list-style-image: none;
+               margin: 0;
+               padding: 0;
+               .background-image('images/tab-break.png');
+               background-position: right bottom;
+               background-repeat: no-repeat;
+
+               li {
+                       /* @noflip */
+                       float: left;
+                       line-height: 1.125em;
+                       /* For IE6, overridden later to display:block by modern browsers */
+                       display: inline-block;
+                       height: 100%;
+                       margin: 0;
+                       padding: 0;
+                       background-color: #f3f3f3;
+                       .background-image('images/tab-normal-fade.png');
+                       background-position: bottom left;
+                       background-repeat: repeat-x;
+                       white-space: nowrap;
+               }
+
+               /* IGNORED BY IE6 which doesn't support child selector */
+               > li {
+                       display: block;
+               }
+       }
+
+       li {
+               &.new {
+                       a,
+                       a:visited{
+                               color: #a55858;
+                       }
+               }
+
+               &.selected {
+                       .background-image('images/tab-current-fade.png');
+                       a,
+                       a:visited{
+                               color: #333;
+                               text-decoration: none;
+                       }
+               }
+
+               &.icon {
+                       a {
+                               background-position: bottom right;
+                               background-repeat: no-repeat;
+                       }
+               }
+
+               a {
+                       /* For IE6, overridden later to display:block by modern browsers */
+                       display: inline-block;
+                       height: 1.9em;
+                       padding-left: 0.5em;
+                       padding-right: 0.5em;
+                       color: @menu-link-color;
+                       cursor: pointer;
+                       font-size: 0.8em;
+               }
+
+               /* Ignored by IE6 which doesn't support child selector */
+               > a {
+                       display: block;
+               }
+       }
+
+       span {
+               display: inline-block;
+               .background-image('images/tab-break.png');
+               background-position: bottom right;
+               background-repeat: no-repeat;
+
+               a  {
+                       /* For IE6, overridden later to display:block by modern browsers */
+                       display: inline-block;
+                       padding-top: 1.25em;
+               }
+
+               /* Ignored by IE6 which doesn't support child selector */
+               > a {
+                       /* @noflip */
+                       float: left;
+                       display: block;
+               }
+       }
+}
+
+/* Variants and Actions */
+div.vectorMenu {
+       /* @noflip */
+       direction: ltr;
+       /* @noflip */
+       float: left;
+       cursor: pointer;
+       position: relative;
+}
+
+body.rtl div.vectorMenu {
+       /* @noflip */
+       direction: rtl;
+}
+
+div#mw-head div.vectorMenu h3 {
+       /* @noflip */
+       float: left;
+       .background-image('images/tab-break.png');
+       background-repeat: no-repeat;
+       background-position: bottom right;
+       margin-left: -1px;
+       font-size: 1em;
+       height: 2.5em;
+       // This effectively moves the "background border" outside of the element to act like a real
+       // border. It is necessary for the dropdown (div.vectorMenu div.menu) to align well.
+       padding-right: 1px;
+       margin-right: -1px;
+}
+
+// The "Variants" menu has a really funny structure
+div#mw-head div.vectorMenu#p-variants {
+       #p-variants-label span {
+               display: none;
+       }
+
+       #mw-vector-current-variant {
+               display: inline-block;
+               float: left;
+               padding-right: 20px;
+               font-size: 0.8em;
+               padding-left: 0.5em;
+               padding-top: 1.375em;
+               font-weight: normal;
+               border: none;
+               background-image: none;
+       }
+}
+
+div.vectorMenu h3 span {
+       display: block;
+       font-size: 0.8em;
+       padding-left: 0.7em;
+       padding-top: 1.375em;
+       margin-right: 20px;
+       font-weight: normal;
+       color: @menu-main-heading-color;
+}
+
+div.vectorMenu h3 a {
+       position: absolute;
+       top: 0;
+       right: 0;
+       width: 20px;
+       height: 2.5em;
+       .background-image-svg('images/arrow-down-icon.svg', 'images/arrow-down-icon.png');
+       background-position: 100% 70%;
+       background-repeat: no-repeat;
+       .transition(background-position 250ms);
+}
+
+div.vectorMenu.menuForceShow h3 a {
+       background-position: 100% 100%;
+}
+
+div.vectorMenuFocus h3 a {
+       .background-image-svg('images/arrow-down-focus-icon.svg', 'images/arrow-down-focus-icon.png');
+}
+
+div.vectorMenu div.menu {
+       // Match the width of the dropdown "heading" (the tab)
+       min-width: 100%;
+       position: absolute;
+       top: 2.5em;
+       left: -1px;
+       background-color: white;
+       border: solid 1px silver;
+       border-top-width: 0;
+       clear: both;
+       text-align: left;
+       display: none;
+}
+
+/* Enable forcing showing of the menu for accessibility */
+div.vectorMenu:hover div.menu,
+div.vectorMenu.menuForceShow div.menu {
+       display: block;
+}
+
+div.vectorMenu ul {
+       list-style-type: none;
+       list-style-image: none;
+       padding: 0;
+       margin: 0;
+       text-align: left;
+}
+
+/* Fixes old versions of FireFox */
+div.vectorMenu ul,
+x:-moz-any-link {
+       min-width: 5em;
+}
+
+/* Returns things back to normal in modern versions of FireFox */
+div.vectorMenu ul,
+x:-moz-any-link,
+x:default {
+       min-width: 0;
+}
+
+div.vectorMenu li {
+       padding: 0;
+       margin: 0;
+       text-align: left;
+       line-height: 1em;
+}
+
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+div.vectorMenu li a {
+       display: inline-block;
+       padding: 0.5em;
+       white-space: nowrap;
+       color: @menu-link-color;
+       cursor: pointer;
+       font-size: 0.8em;
+}
+
+/* IGNORED BY IE6 */
+div.vectorMenu li > a {
+       display: block;
+}
+
+div.vectorMenu li.selected a,
+div.vectorMenu li.selected a:visited {
+       color: #333;
+       text-decoration: none;
+}
+
+@import 'watchstar.less';
diff --git a/skins/Vector/components/watchstar.less b/skins/Vector/components/watchstar.less
new file mode 100644 (file)
index 0000000..a389ed6
--- /dev/null
@@ -0,0 +1,48 @@
+@import "mediawiki.mixins.rotation"
+
+/* Watch/Unwatch Icon Styling */
+#ca-unwatch.icon a,
+#ca-watch.icon a {
+       margin: 0;
+       padding: 0;
+       display: block;
+       width: 26px;
+       /* This hides the text but shows the background image */
+       padding-top: 3.1em;
+       margin-top: 0;
+       /* Only applied in IE6 */
+       margin-top: -0.8em !ie;
+       height: 0;
+       overflow: hidden;
+       background-position: 5px 60%;
+}
+#ca-unwatch.icon a {
+       .background-image-svg('images/unwatch-icon.svg', 'images/unwatch-icon.png');
+}
+#ca-watch.icon a {
+       .background-image-svg('images/watch-icon.svg', 'images/watch-icon.png');
+}
+#ca-unwatch.icon a:hover,
+#ca-unwatch.icon a:focus {
+       .background-image-svg('images/unwatch-icon-hl.svg', 'images/unwatch-icon-hl.png');
+}
+#ca-watch.icon a:hover,
+#ca-watch.icon a:focus {
+       .background-image-svg('images/watch-icon-hl.svg', 'images/watch-icon-hl.png');
+}
+#ca-unwatch.icon a.loading,
+#ca-watch.icon a.loading {
+       .background-image-svg('images/watch-icon-loading.svg', 'images/watch-icon-loading.png');
+       .rotation(700ms);
+       /* Suppress the hilarious rotating focus outline on Firefox */
+       outline: none;
+       cursor: default;
+       pointer-events: none;
+       background-position: 50% 60%;
+       -webkit-transform-origin: 50% 57%;
+       transform-origin: 50% 57%;
+}
+#ca-unwatch.icon a span,
+#ca-watch.icon a span {
+       display: none;
+}
diff --git a/skins/Vector/csshover.htc b/skins/Vector/csshover.htc
new file mode 100644 (file)
index 0000000..a13ea68
--- /dev/null
@@ -0,0 +1,284 @@
+<public:attach event="ondocumentready" onevent="CSSHover()" />
+<script>
+/**
+ *     Whatever:hover - V3.11
+ *     ------------------------------------------------------------
+ *     Author  - Peter Nederlof, http://www.xs4all.nl/~peterned
+ *     License - http://creativecommons.org/licenses/LGPL/2.1
+ *
+ *     Special thanks to Sergiu Dumitriu, http://purl.org/net/sergiu,
+ *     for fixing the expression loop.
+ *
+ *     Whatever:hover is free software; you can redistribute it and/or
+ *     modify it under the terms of the GNU Lesser General Public
+ *     License as published by the Free Software Foundation; either
+ *     version 2.1 of the License, or (at your option) any later version.
+ *
+ *     Whatever:hover 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
+ *     Lesser General Public License for more details.
+ *
+ *     howto: body { behavior:url("csshover3.htc"); }
+ *     ------------------------------------------------------------
+ */
+
+window.CSSHover = (function(){
+
+       // regular expressions, used and explained later on.
+       var REG_INTERACTIVE = /(^|\s)((([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active|focus))/i;
+       var REG_AFFECTED = /(.*?)\:(hover|active|focus)/i;
+       var REG_PSEUDO = /[^:]+:([a-z\-]+).*/i;
+       var REG_SELECT = /(\.([a-z0-9_\-]+):[a-z]+)|(:[a-z]+)/gi;
+       var REG_CLASS = /\.([a-z0-9_\-]*on(hover|active|focus))/i;
+       var REG_MSIE = /msie (5|6|7)/i;
+       var REG_COMPAT = /backcompat/i;
+
+       // property mapping, real css properties must be used in order to clear expressions later on...
+       // Uses obscure css properties that no-one is likely to use. The properties are borrowed to
+       // set an expression, and are then restored to the most likely correct value.
+       var Properties = {
+               index: 0,
+               list: ['text-kashida', 'text-kashida-space', 'text-justify'],
+               get: function() {
+                       return this.list[(this.index++)%this.list.length];
+               }
+       };
+
+       // camelize is used to convert css properties from (eg) text-kashida to textKashida
+       var camelize = function(str) {
+               return str.replace(/-(.)/mg, function(result, match){
+                       return match.toUpperCase();
+               });
+       };
+       
+       /**
+        *      Local CSSHover object
+        *      --------------------------
+        */
+       
+       var CSSHover = {
+               
+               // array of CSSHoverElements, used to unload created events
+               elements: [], 
+               
+               // buffer used for checking on duplicate expressions
+               callbacks: {}, 
+               
+               // init, called once ondomcontentready via the exposed window.CSSHover function
+               init:function() {
+                       // don't run in IE8 standards; expressions don't work in standards mode anyway, 
+                       // and the stuff we're trying to fix should already work properly
+                       if(!REG_MSIE.test(navigator.userAgent) && !REG_COMPAT.test(window.document.compatMode)) {
+                               return;
+                       }
+
+                       // start parsing the existing stylesheets
+                       var sheets = window.document.styleSheets, l = sheets.length;
+                       for(var i=0; i<l; i++) {
+                               this.parseStylesheet(sheets[i]);
+                       }
+               },
+
+               // called from init, parses individual stylesheets
+               parseStylesheet:function(sheet) {
+                       // check sheet imports and parse those recursively
+                       if(sheet.imports) {
+                               try {
+                                       var imports = sheet.imports;
+                                       var l = imports.length;
+                                       for(var i=0; i<l; i++) {
+                                               this.parseStylesheet(sheet.imports[i]);
+                                       }
+                               } catch(securityException){
+                                       // trycatch for various possible errors
+                               }
+                       }
+                       
+                       // interate the sheet's rules and send them to the parser
+                       try {
+                               var rules = sheet.rules;
+                               var r = rules.length;
+                               for(var j=0; j<r; j++) {
+                                       this.parseCSSRule(rules[j], sheet);
+                               }
+                       } catch(someException){
+                               // trycatch for various errors, most likely accessing the sheet's rules.
+                       }
+               },
+
+               // magic starts here ...
+               parseCSSRule:function(rule, sheet) {
+                       
+                       // The sheet is used to insert new rules into, this must be the same sheet the rule 
+                       // came from, to ensure that relative paths keep pointing to the right location.
+
+                       // only parse a rule if it contains an interactive pseudo.
+                       var select = rule.selectorText;
+                       if(REG_INTERACTIVE.test(select)) {
+                               var style = rule.style.cssText;
+                                       
+                               // affected elements are found by truncating the selector after the interactive pseudo,
+                               // eg: "div li:hover" >>  "div li"
+                               var affected = REG_AFFECTED.exec(select)[1];
+                                       
+                               // that pseudo is needed for a classname, and defines the type of interaction (focus, hover, active)
+                               // eg: "li:hover" >> "onhover"
+                               var pseudo = select.replace(REG_PSEUDO, 'on$1');
+                                       
+                               // the new selector is going to use that classname in a new css rule,
+                               // since IE6 doesn't support multiple classnames, this is merged into one classname
+                               // eg: "li:hover" >> "li.onhover",  "li.folder:hover" >> "li.folderonhover"
+                               var newSelect = select.replace(REG_SELECT, '.$2' + pseudo);
+                                       
+                               // the classname is needed for the events that are going to be set on affected nodes
+                               // eg: "li.folder:hover" >> "folderonhover"
+                               var className = REG_CLASS.exec(newSelect)[1];
+
+                               // no need to set the same callback more than once when the same selector uses the same classname
+                               var hash = affected + className;
+                               if(!this.callbacks[hash]) {
+                                       
+                                       // affected elements are given an expression under a borrowed css property, because fake properties
+                                       // can't have their expressions cleared. Different properties are used per pseudo, to avoid
+                                       // expressions from overwriting eachother. The expression does a callback to CSSHover.patch, 
+                                       // rerouted via the exposed window.CSSHover function.
+                                       var property = Properties.get();
+                                       var atRuntime = camelize(property);
+
+                                       // because the expression is added to the stylesheet, and styles are always applied to html that is
+                                       // dynamically added to the dom, the expression will also trigger for those new elements (provided
+                                       // they are selected by the affected selector). 
+                                       sheet.addRule(affected, property + ':expression(CSSHover(this, "'+pseudo+'", "'+className+'", "'+atRuntime+'"))');
+                                       
+                                       // hash it, so an identical selector/class combo does not duplicate the expression
+                                       this.callbacks[hash] = true;
+                               }
+                               
+                               // duplicate expressions need not be set, but the style could differ
+                               sheet.addRule(newSelect, style);
+                       }
+               },
+
+               // called via the expression, patches individual nodes
+               patch:function(node, type, className, property) {
+
+                       // restores the borrowed css property to the value of its immediate parent, clearing
+                       // the expression so that it's not repeatedly called. 
+                       try {
+                               var value = node.parentNode.currentStyle[property];
+                               node.style[property] = value;   
+                       } catch(e) {
+                               // the above reset should never fail, but just in case, clear the runtimeStyle if it does.
+                               // this will also stop the expression.
+                               node.runtimeStyle[property] = '';
+                       }                       
+               
+                       // just to make sure, also keep track of patched classnames locally on the node
+                       if(!node.csshover) {
+                               node.csshover = [];
+                       }
+
+                       // and check for it to prevent duplicate events with the same classname from being set
+                       if(!node.csshover[className]) {
+                               node.csshover[className] = true;
+
+                               // create an instance for the given type and class
+                               var element = new CSSHoverElement(node, type, className);
+                               
+                               // and store that instance for unloading later on
+                               this.elements.push(element);
+                       }
+
+                       // returns a dummy value to the expression
+                       return type;
+               },
+
+               // unload stuff onbeforeunload
+               unload:function() {
+                       try {
+                               
+                               // remove events
+                               var l = this.elements.length;
+                               for(var i=0; i<l; i++) {
+                                       this.elements[i].unload();
+                               }
+
+                               // and set properties to null 
+                               this.elements = [];
+                               this.callbacks = {};
+
+                       } catch (e) {
+                       }
+               }
+       };
+
+       /**
+        *      CSSHoverElement
+        *      --------------------------
+        */
+
+       // the event types associated with the interactive pseudos
+       var CSSEvents = {
+               onhover:  { activator: 'onmouseenter', deactivator: 'onmouseleave' },
+               onactive: { activator: 'onmousedown',  deactivator: 'onmouseup' },
+               onfocus:  { activator: 'onfocus',      deactivator: 'onblur' }
+       };
+       
+       // CSSHoverElement constructor, called via CSSHover.patch
+       function CSSHoverElement(node, type, className) {
+
+               // the CSSHoverElement patches individual nodes by manually applying the events that should 
+               // have fired by the css pseudoclasses, eg mouseenter and mouseleave for :hover. 
+
+               this.node = node;
+               this.type = type;
+               var replacer = new RegExp('(^|\\s)'+className+'(\\s|$)', 'g');
+
+               // store event handlers for removal onunload
+               this.activator =   function(){ node.className += ' ' + className; };
+               this.deactivator = function(){ node.className = node.className.replace(replacer, ' '); };
+               
+               // add the events
+               node.attachEvent(CSSEvents[type].activator, this.activator);
+               node.attachEvent(CSSEvents[type].deactivator, this.deactivator);
+       }
+       
+       CSSHoverElement.prototype = {
+               // onbeforeunload, called via CSSHover.unload
+               unload:function() {
+
+                       // remove events 
+                       this.node.detachEvent(CSSEvents[this.type].activator, this.activator);
+                       this.node.detachEvent(CSSEvents[this.type].deactivator, this.deactivator);
+
+                       // and set properties to null 
+                       this.activator = null;
+                       this.deactivator = null;
+                       this.node = null;
+                       this.type = null;
+               }
+       };
+
+       // add the unload to the onbeforeunload event
+       window.attachEvent('onbeforeunload', function(){
+               CSSHover.unload();
+       });
+
+       /**
+        *      Public hook
+        *      --------------------------
+        */
+       
+       return function(node, type, className, property) {
+               if(node) {
+                       // called via the css expression; patches individual nodes
+                       return CSSHover.patch(node, type, className, property);
+               } else {
+                       // called ondomcontentready via the public:attach node
+                       CSSHover.init();
+               }
+       };
+
+})();
+</script>
\ No newline at end of file
diff --git a/skins/Vector/csshover.min.htc b/skins/Vector/csshover.min.htc
new file mode 100644 (file)
index 0000000..7e5c57b
--- /dev/null
@@ -0,0 +1,12 @@
+<public:attach event="ondocumentready" onevent="CSSHover()" />
+<script>
+/**
+ * Whatever:hover - V3.11
+ * http://www.xs4all.nl/~peterned/
+ *     
+ * Copyright (c) 2009 Peter Nederlof
+ * Licensed under the LGPL license
+ * http://creativecommons.org/licenses/LGPL/2.1
+ */
+window.CSSHover=(function(){var m=/(^|\s)((([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active|focus))/i;var n=/(.*?)\:(hover|active|focus)/i;var o=/[^:]+:([a-z\-]+).*/i;var p=/(\.([a-z0-9_\-]+):[a-z]+)|(:[a-z]+)/gi;var q=/\.([a-z0-9_\-]*on(hover|active|focus))/i;var s=/msie (5|6|7)/i;var t=/backcompat/i;var u={index:0,list:['text-kashida','text-kashida-space','text-justify'],get:function(){return this.list[(this.index++)%this.list.length]}};var v=function(c){return c.replace(/-(.)/mg,function(a,b){return b.toUpperCase()})};var w={elements:[],callbacks:{},init:function(){if(!s.test(navigator.userAgent)&&!t.test(window.document.compatMode)){return}var a=window.document.styleSheets,l=a.length;for(var i=0;i<l;i++){this.parseStylesheet(a[i])}},parseStylesheet:function(a){if(a.imports){try{var b=a.imports;var l=b.length;for(var i=0;i<l;i++){this.parseStylesheet(a.imports[i])}}catch(securityException){}}try{var c=a.rules;var r=c.length;for(var j=0;j<r;j++){this.parseCSSRule(c[j],a)}}catch(someException){}},parseCSSRule:function(a,b){var c=a.selectorText;if(m.test(c)){var d=a.style.cssText;var e=n.exec(c)[1];var f=c.replace(o,'on$1');var g=c.replace(p,'.$2'+f);var h=q.exec(g)[1];var i=e+h;if(!this.callbacks[i]){var j=u.get();var k=v(j);b.addRule(e,j+':expression(CSSHover(this, "'+f+'", "'+h+'", "'+k+'"))');this.callbacks[i]=true}b.addRule(g,d)}},patch:function(a,b,c,d){try{var f=a.parentNode.currentStyle[d];a.style[d]=f}catch(e){a.runtimeStyle[d]=''}if(!a.csshover){a.csshover=[]}if(!a.csshover[c]){a.csshover[c]=true;var g=new CSSHoverElement(a,b,c);this.elements.push(g)}return b},unload:function(){try{var l=this.elements.length;for(var i=0;i<l;i++){this.elements[i].unload()}this.elements=[];this.callbacks={}}catch(e){}}};var x={onhover:{activator:'onmouseenter',deactivator:'onmouseleave'},onactive:{activator:'onmousedown',deactivator:'onmouseup'},onfocus:{activator:'onfocus',deactivator:'onblur'}};function CSSHoverElement(a,b,c){this.node=a;this.type=b;var d=new RegExp('(^|\\s)'+c+'(\\s|$)','g');this.activator=function(){a.className+=' '+c};this.deactivator=function(){a.className=a.className.replace(d,' ')};a.attachEvent(x[b].activator,this.activator);a.attachEvent(x[b].deactivator,this.deactivator)}CSSHoverElement.prototype={unload:function(){this.node.detachEvent(x[this.type].activator,this.activator);this.node.detachEvent(x[this.type].deactivator,this.deactivator);this.activator=null;this.deactivator=null;this.node=null;this.type=null}};window.attachEvent('onbeforeunload',function(){w.unload()});return function(a,b,c,d){if(a){return w.patch(a,b,c,d)}else{w.init()}}})();
+</script>
diff --git a/skins/Vector/i18n/en.json b/skins/Vector/i18n/en.json
new file mode 100644 (file)
index 0000000..6742f2a
--- /dev/null
@@ -0,0 +1,21 @@
+{
+       "@metadata": {
+               "authors": []
+       },
+       "skinname-vector": "Vector",
+       "vector-desc": "Modern version of MonoBook with fresh look and many usability improvements",
+       "vector.css": "/* CSS placed here will affect users of the Vector skin */",
+       "vector.js": "/* Any JavaScript here will be loaded for users using the Vector skin */",
+       "vector-action-addsection": "Add topic",
+       "vector-action-delete": "Delete",
+       "vector-action-move": "Move",
+       "vector-action-protect": "Protect",
+       "vector-action-undelete": "Undelete",
+       "vector-action-unprotect": "Change protection",
+       "vector-view-create": "Create",
+       "vector-view-edit": "Edit",
+       "vector-view-history": "View history",
+       "vector-view-view": "Read",
+       "vector-view-viewsource": "View source",
+       "vector-more-actions": "More"
+}
diff --git a/skins/Vector/i18n/qqq.json b/skins/Vector/i18n/qqq.json
new file mode 100644 (file)
index 0000000..89d1cf0
--- /dev/null
@@ -0,0 +1,21 @@
+{
+       "@metadata": {
+               "authors": []
+       },
+       "skinname-vector": "{{optional}}",
+       "vector-desc": "{{desc|name=Vector|url=http://www.mediawiki.org/wiki/Skin:Vector}}",
+       "vector.css": "{{optional}}",
+       "vector.js": "{{optional}}",
+       "vector-action-addsection": "Used in the Vector skin. See for example {{canonicalurl:Talk:Main_Page|useskin=vector}}",
+       "vector-action-delete": "Used in the Vector skin, as the name of a tab at the top of the page. See for example {{canonicalurl:Main_Page|useskin=vector}}\n\n{{Identical|Delete}}",
+       "vector-action-move": "Used in the Vector skin, on the tabs at the top of the page. See for example {{canonicalurl:Talk:Main_Page|useskin=vector}}\n\n{{Identical|Move}}",
+       "vector-action-protect": "Tab at top of page, in vector skin\n\n{{Identical|Protect}}",
+       "vector-action-undelete": "Tab at top of page, in vector skin.\n{{Identical|Undelete}}",
+       "vector-action-unprotect": "Tab at top of page, in vector skin.\n{{Identical|Change protection}}",
+       "vector-view-create": "Tab label in the Vector skin. See for example {{canonicalurl:Foo|useskin=vector}}\n{{Identical|Create}}",
+       "vector-view-edit": "Tab label in the Vector skin. See for example {{canonicalurl:Main_Page|useskin=vector}}\n{{Identical|Edit}}",
+       "vector-view-history": "Tab label in the Vector skin. See for example {{canonicalurl:Main_Page|useskin=vector}}\n{{Identical|View history}}",
+       "vector-view-view": "Tab label in the Vector skin (verb). See for example {{canonicalurl:Main_Page|useskin=vector}}.\n{{Identical|Read}}",
+       "vector-view-viewsource": "Tab label in the Vector skin.\n{{Identical|View source}}",
+       "vector-more-actions": "Label in the Vector skin's menu for the less-important or rarer actions which are not shown as tabs (like moving the page, or for sysops deleting or protecting the page), as well as (for users with a narrow viewing window in their browser) the less-important tab actions which the user's browser is unable to fit in. {{Identical|More}}"
+}
diff --git a/skins/Vector/images/arrow-collapsed-ltr.png b/skins/Vector/images/arrow-collapsed-ltr.png
new file mode 100644 (file)
index 0000000..063ac6f
Binary files /dev/null and b/skins/Vector/images/arrow-collapsed-ltr.png differ
diff --git a/skins/Vector/images/arrow-collapsed-ltr.svg b/skins/Vector/images/arrow-collapsed-ltr.svg
new file mode 100644 (file)
index 0000000..b943caa
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M6.001 2.998l5.001 5-5.001 5z" fill="#797979"/></svg>
\ No newline at end of file
diff --git a/skins/Vector/images/arrow-collapsed-rtl.png b/skins/Vector/images/arrow-collapsed-rtl.png
new file mode 100644 (file)
index 0000000..c346218
Binary files /dev/null and b/skins/Vector/images/arrow-collapsed-rtl.png differ
diff --git a/skins/Vector/images/arrow-collapsed-rtl.svg b/skins/Vector/images/arrow-collapsed-rtl.svg
new file mode 100644 (file)
index 0000000..5faf356
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M9.999 13.002l-5.001-5 5.001-5z" fill="#797979"/></svg>
\ No newline at end of file
diff --git a/skins/Vector/images/arrow-down-focus-icon.png b/skins/Vector/images/arrow-down-focus-icon.png
new file mode 100644 (file)
index 0000000..7640bd1
Binary files /dev/null and b/skins/Vector/images/arrow-down-focus-icon.png differ
diff --git a/skins/Vector/images/arrow-down-focus-icon.svg b/skins/Vector/images/arrow-down-focus-icon.svg
new file mode 100644 (file)
index 0000000..826c280
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="22" height="16"><path d="M15.502 6.001l-5 5.001-5-5.001z" fill="#929292"/></svg>
\ No newline at end of file
diff --git a/skins/Vector/images/arrow-down-icon.png b/skins/Vector/images/arrow-down-icon.png
new file mode 100644 (file)
index 0000000..12e3b93
Binary files /dev/null and b/skins/Vector/images/arrow-down-icon.png differ
diff --git a/skins/Vector/images/arrow-down-icon.svg b/skins/Vector/images/arrow-down-icon.svg
new file mode 100644 (file)
index 0000000..8e31b2f
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="22" height="16"><path d="M15.502 6.001l-5 5.001-5-5.001z" fill="#797979"/></svg>
\ No newline at end of file
diff --git a/skins/Vector/images/arrow-expanded.png b/skins/Vector/images/arrow-expanded.png
new file mode 100644 (file)
index 0000000..0221028
Binary files /dev/null and b/skins/Vector/images/arrow-expanded.png differ
diff --git a/skins/Vector/images/arrow-expanded.svg b/skins/Vector/images/arrow-expanded.svg
new file mode 100644 (file)
index 0000000..e744ec3
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M13.002 6.001l-5 5.001-5-5.001z" fill="#797979"/></svg>
\ No newline at end of file
diff --git a/skins/Vector/images/bullet-icon.png b/skins/Vector/images/bullet-icon.png
new file mode 100644 (file)
index 0000000..7bae98f
Binary files /dev/null and b/skins/Vector/images/bullet-icon.png differ
diff --git a/skins/Vector/images/external-link-ltr-icon.png b/skins/Vector/images/external-link-ltr-icon.png
new file mode 100644 (file)
index 0000000..6308383
Binary files /dev/null and b/skins/Vector/images/external-link-ltr-icon.png differ
diff --git a/skins/Vector/images/external-link-ltr-icon.svg b/skins/Vector/images/external-link-ltr-icon.svg
new file mode 100644 (file)
index 0000000..5969d03
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="10" height="10"><g transform="translate(-826.429 -698.791)"><rect width="5.982" height="5.982" x="826.929" y="702.309" fill="#fff" stroke="#06c"/><g><path d="M831.194 698.791h5.234v5.391l-1.571 1.545-1.31-1.31-2.725 2.725-2.689-2.689 2.808-2.808-1.311-1.311z" fill="#06f"/><path d="M835.424 699.795l.022 4.885-1.817-1.817-2.881 2.881-1.228-1.228 2.881-2.881-1.851-1.851z" fill="#fff"/></g></g></svg>
\ No newline at end of file
diff --git a/skins/Vector/images/external-link-rtl-icon.png b/skins/Vector/images/external-link-rtl-icon.png
new file mode 100644 (file)
index 0000000..5313234
Binary files /dev/null and b/skins/Vector/images/external-link-rtl-icon.png differ
diff --git a/skins/Vector/images/external-link-rtl-icon.svg b/skins/Vector/images/external-link-rtl-icon.svg
new file mode 100644 (file)
index 0000000..75a7025
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="10" height="10"><g transform="translate(-826.429 -698.791)"><rect width="5.982" height="5.982" x="-835.929" y="702.309" transform="scale(-1 1)" fill="#fff" stroke="#06c"/><g><path d="M831.663 698.791h-5.234v5.391l1.571 1.545 1.31-1.31 2.725 2.725 2.689-2.689-2.808-2.808 1.311-1.311z" fill="#06f"/><path d="M827.433 699.795l-.022 4.885 1.817-1.817 2.881 2.881 1.228-1.228-2.881-2.881 1.851-1.851z" fill="#fff"/></g></g></svg>
\ No newline at end of file
diff --git a/skins/Vector/images/link-icon.png b/skins/Vector/images/link-icon.png
new file mode 100644 (file)
index 0000000..b70efaa
Binary files /dev/null and b/skins/Vector/images/link-icon.png differ
diff --git a/skins/Vector/images/magnify-clip.png b/skins/Vector/images/magnify-clip.png
new file mode 100644 (file)
index 0000000..00a9cee
Binary files /dev/null and b/skins/Vector/images/magnify-clip.png differ
diff --git a/skins/Vector/images/page-fade.png b/skins/Vector/images/page-fade.png
new file mode 100644 (file)
index 0000000..b4a6034
Binary files /dev/null and b/skins/Vector/images/page-fade.png differ
diff --git a/skins/Vector/images/portal-break-ltr.png b/skins/Vector/images/portal-break-ltr.png
new file mode 100644 (file)
index 0000000..20bf366
Binary files /dev/null and b/skins/Vector/images/portal-break-ltr.png differ
diff --git a/skins/Vector/images/portal-break-rtl.png b/skins/Vector/images/portal-break-rtl.png
new file mode 100644 (file)
index 0000000..e5f6223
Binary files /dev/null and b/skins/Vector/images/portal-break-rtl.png differ
diff --git a/skins/Vector/images/portal-break.png b/skins/Vector/images/portal-break.png
new file mode 100644 (file)
index 0000000..90c3918
Binary files /dev/null and b/skins/Vector/images/portal-break.png differ
diff --git a/skins/Vector/images/preferences/break.png b/skins/Vector/images/preferences/break.png
new file mode 100644 (file)
index 0000000..b529308
Binary files /dev/null and b/skins/Vector/images/preferences/break.png differ
diff --git a/skins/Vector/images/preferences/fade.png b/skins/Vector/images/preferences/fade.png
new file mode 100644 (file)
index 0000000..638084d
Binary files /dev/null and b/skins/Vector/images/preferences/fade.png differ
diff --git a/skins/Vector/images/search-fade.png b/skins/Vector/images/search-fade.png
new file mode 100644 (file)
index 0000000..6cb7d28
Binary files /dev/null and b/skins/Vector/images/search-fade.png differ
diff --git a/skins/Vector/images/search-ltr.png b/skins/Vector/images/search-ltr.png
new file mode 100644 (file)
index 0000000..1db2eb2
Binary files /dev/null and b/skins/Vector/images/search-ltr.png differ
diff --git a/skins/Vector/images/search-ltr.svg b/skins/Vector/images/search-ltr.svg
new file mode 100644 (file)
index 0000000..0720f20
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="12" height="13"><g stroke-width="2" stroke="#6c6c6c" fill="none"><path d="M11.29 11.71l-4-4"/><circle cx="5" cy="5" r="4"/></g></svg>
\ No newline at end of file
diff --git a/skins/Vector/images/search-rtl.png b/skins/Vector/images/search-rtl.png
new file mode 100644 (file)
index 0000000..c26c8d0
Binary files /dev/null and b/skins/Vector/images/search-rtl.png differ
diff --git a/skins/Vector/images/search-rtl.svg b/skins/Vector/images/search-rtl.svg
new file mode 100644 (file)
index 0000000..622d5f9
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="12" height="13"><g stroke-width="2" stroke="#6c6c6c" fill="none"><path d="M.71 11.71l4-4"/><circle cx="7" cy="5" r="4"/></g></svg>
\ No newline at end of file
diff --git a/skins/Vector/images/tab-break.png b/skins/Vector/images/tab-break.png
new file mode 100644 (file)
index 0000000..6d37af5
Binary files /dev/null and b/skins/Vector/images/tab-break.png differ
diff --git a/skins/Vector/images/tab-current-fade.png b/skins/Vector/images/tab-current-fade.png
new file mode 100644 (file)
index 0000000..b8f772f
Binary files /dev/null and b/skins/Vector/images/tab-current-fade.png differ
diff --git a/skins/Vector/images/tab-normal-fade.png b/skins/Vector/images/tab-normal-fade.png
new file mode 100644 (file)
index 0000000..f719a88
Binary files /dev/null and b/skins/Vector/images/tab-normal-fade.png differ
diff --git a/skins/Vector/images/unwatch-icon-hl.png b/skins/Vector/images/unwatch-icon-hl.png
new file mode 100644 (file)
index 0000000..6b2b502
Binary files /dev/null and b/skins/Vector/images/unwatch-icon-hl.png differ
diff --git a/skins/Vector/images/unwatch-icon-hl.svg b/skins/Vector/images/unwatch-icon-hl.svg
new file mode 100644 (file)
index 0000000..d52d547
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><defs><linearGradient id="a"><stop offset="0" stop-color="#c2edff"/><stop offset=".5" stop-color="#68bdff"/><stop offset="1" stop-color="#fff"/></linearGradient><linearGradient x1="13.47" y1="14.363" x2="4.596" y2="3.397" id="b" xlink:href="#a" gradientUnits="userSpaceOnUse"/></defs><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="url(#b)" stroke="#c8b250" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
diff --git a/skins/Vector/images/unwatch-icon.png b/skins/Vector/images/unwatch-icon.png
new file mode 100644 (file)
index 0000000..9fd9436
Binary files /dev/null and b/skins/Vector/images/unwatch-icon.png differ
diff --git a/skins/Vector/images/unwatch-icon.svg b/skins/Vector/images/unwatch-icon.svg
new file mode 100644 (file)
index 0000000..cde7bc5
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><defs><linearGradient id="a"><stop offset="0" stop-color="#c2edff"/><stop offset=".5" stop-color="#68bdff"/><stop offset="1" stop-color="#fff"/></linearGradient><linearGradient x1="13.47" y1="14.363" x2="4.596" y2="3.397" id="b" xlink:href="#a" gradientUnits="userSpaceOnUse"/></defs><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="url(#b)" stroke="#7cb5d1" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
diff --git a/skins/Vector/images/user-icon.png b/skins/Vector/images/user-icon.png
new file mode 100644 (file)
index 0000000..57f9f8d
Binary files /dev/null and b/skins/Vector/images/user-icon.png differ
diff --git a/skins/Vector/images/user-icon.svg b/skins/Vector/images/user-icon.svg
new file mode 100644 (file)
index 0000000..4335bcf
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="12" height="13.837"><defs><linearGradient id="e"><stop offset="0"/><stop offset="1" stop-opacity="0"/></linearGradient><linearGradient id="b"><stop offset="0" stop-color="#3b74bc"/><stop offset="1" stop-color="#2d5990"/></linearGradient><linearGradient id="c"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#c9c9c9"/></linearGradient><linearGradient id="a"><stop offset="0"/><stop offset="1" stop-opacity="0"/></linearGradient><linearGradient id="d"><stop offset="0" stop-color="#f4d9b1"/><stop offset="1" stop-color="#df9725"/></linearGradient><radialGradient cx="31.113" cy="19.009" r="8.662" fx="31.113" fy="19.009" id="f" xlink:href="#a" gradientUnits="userSpaceOnUse"/><radialGradient cx="28.09" cy="27.203" r="13.565" fx="28.09" fy="27.203" id="g" xlink:href="#b" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.298 0 0 .885 -8.359 4.94)"/><linearGradient x1="30.936" y1="29.553" x2="30.936" y2="35.803" id="h" xlink:href="#c" gradientUnits="userSpaceOnUse"/><radialGradient cx="31.113" cy="19.009" r="8.662" fx="31.113" fy="19.009" id="i" xlink:href="#a" gradientUnits="userSpaceOnUse"/><radialGradient cx="29.345" cy="17.064" r="9.162" fx="29.345" fy="17.064" id="j" xlink:href="#d" gradientUnits="userSpaceOnUse" gradientTransform="matrix(.788 0 0 .788 6.221 3.618)"/><linearGradient x1="20.662" y1="35.818" x2="22.627" y2="36.218" id="k" xlink:href="#e" gradientUnits="userSpaceOnUse" gradientTransform="matrix(.983 .182 -.182 .983 6.232 -2.651)"/><linearGradient x1="22.687" y1="36.39" x2="21.408" y2="35.74" id="l" xlink:href="#e" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-.978 .21 .21 .978 55.11 -3.945)"/></defs><g color="#000"><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" transform="matrix(.693 0 0 .374 -15.548 3.481)" fill="url(#f)" fill-rule="evenodd" overflow="visible"/><path d="M4.046 12.398h4.137c1.172 0 2.332-.43 2.758-1.655.404-1.163.069-3.378-2.551-5.171h-4.895c-2.62 1.655-2.947 3.917-2.344 5.24.614 1.347 1.655 1.586 2.896 1.586z" fill="url(#g)" fill-rule="evenodd" stroke="#204a87" stroke-linecap="round" stroke-linejoin="round" overflow="visible" stroke-width="0.39"/><path d="M4.321 6.193c1.241 1.103 1.793 5.102 1.793 5.102s.552-3.999 1.517-5.171l-3.309.069z" fill="url(#h)" fill-rule="evenodd" overflow="visible"/><path d="M5.21 6.607s-.839.648-.767 1.428c-.796-.702-.819-2.048-.819-2.048l1.586.62z" fill="#729fcf" fill-rule="evenodd" overflow="visible"/><path d="M4.018 11.992l4.092-.009c1.029 0 2.049-.377 2.422-1.453.355-1.022-.037-2.967-2.338-4.542l-4.495-.095c-2.301 1.453-2.747 3.441-2.208 4.697.538 1.256 1.324 1.393 2.526 1.401z" opacity=".215" stroke="#fff" stroke-linecap="round" stroke-linejoin="round" overflow="visible" fill="none" stroke-width="0.39"/><path d="M6.941 6.607s.839.648.767 1.428c.796-.702.819-2.048.819-2.048l-1.586.62z" fill="#729fcf" fill-rule="evenodd" overflow="visible"/><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" transform="matrix(.39 0 0 .39 -6.138 -2.475)" fill="url(#i)" fill-rule="evenodd" overflow="visible"/><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" fill="url(#j)" fill-rule="evenodd" stroke="#c17d11" stroke-linecap="round" stroke-linejoin="round" overflow="visible" transform="matrix(.39 0 0 .39 -6.089 -3.84)"/><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" transform="matrix(.342 0 0 .342 -4.598 -2.929)" opacity=".196" stroke="#fff" stroke-width="1.14" stroke-linecap="round" stroke-linejoin="round" overflow="visible" fill="none"/><path d="M2.433 12.062c-.487-.213-.704-.725-.704-.725.328-1.587 1.451-2.748 1.451-2.748s-.889 2.5-.746 3.473z" opacity=".228" fill="url(#k)" fill-rule="evenodd" overflow="visible"/><path d="M9.806 11.728c.48-.227.704-.781.704-.781-.374-1.577-1.551-2.669-1.551-2.669s.961 2.474.847 3.45z" opacity=".228" fill="url(#l)" fill-rule="evenodd" overflow="visible"/></g></svg>
\ No newline at end of file
diff --git a/skins/Vector/images/watch-icon-hl.png b/skins/Vector/images/watch-icon-hl.png
new file mode 100644 (file)
index 0000000..4cb87cd
Binary files /dev/null and b/skins/Vector/images/watch-icon-hl.png differ
diff --git a/skins/Vector/images/watch-icon-hl.svg b/skins/Vector/images/watch-icon-hl.svg
new file mode 100644 (file)
index 0000000..664c671
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="#fff" stroke="#c8b250" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
diff --git a/skins/Vector/images/watch-icon-loading.png b/skins/Vector/images/watch-icon-loading.png
new file mode 100644 (file)
index 0000000..5f0c490
Binary files /dev/null and b/skins/Vector/images/watch-icon-loading.png differ
diff --git a/skins/Vector/images/watch-icon-loading.svg b/skins/Vector/images/watch-icon-loading.svg
new file mode 100644 (file)
index 0000000..751eb14
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="#fff" stroke="#d1d1d1" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
diff --git a/skins/Vector/images/watch-icon.png b/skins/Vector/images/watch-icon.png
new file mode 100644 (file)
index 0000000..39daff2
Binary files /dev/null and b/skins/Vector/images/watch-icon.png differ
diff --git a/skins/Vector/images/watch-icon.svg b/skins/Vector/images/watch-icon.svg
new file mode 100644 (file)
index 0000000..907b05b
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="#fff" stroke="#7cb5d1" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
diff --git a/skins/Vector/screen-hd.less b/skins/Vector/screen-hd.less
new file mode 100644 (file)
index 0000000..8b286f4
--- /dev/null
@@ -0,0 +1,30 @@
+/* Vector screen styles for high definition displays */
+
+@import "variables.less";
+
+div#content {
+       margin-left: 11em;
+       padding: 1.25em 1.5em 1.5em 1.5em;
+}
+#p-logo {
+       left: @menu-main-logo-left;
+}
+div#footer {
+       margin-left: 11em;
+       padding: 1.25em;
+}
+#mw-panel {
+       padding-left: 0.5em;
+}
+#p-search {
+       margin-right: 1em;
+}
+#left-navigation {
+       margin-left: 11em;
+}
+#p-personal {
+       right: 1em;
+}
+#mw-head-base {
+       margin-left: 11em;
+}
diff --git a/skins/Vector/screen.less b/skins/Vector/screen.less
new file mode 100644 (file)
index 0000000..f7b374f
--- /dev/null
@@ -0,0 +1,10 @@
+/* Vector screen styles */
+
+@import "variables.less";
+
+@import "components/common.less";
+@import "components/animations.less";
+@import "components/navigation.less";
+@import "components/footer.less";
+@import 'components/notifications.less';
+@import "components/externalLinks.less";
diff --git a/skins/Vector/special.less b/skins/Vector/special.less
new file mode 100644 (file)
index 0000000..6af4b1e
--- /dev/null
@@ -0,0 +1,7 @@
+/**
+ * Adjusts for decreased margin-bottom for h2 elements inside #content div
+ * introduced in March / April 2014 typography update.
+ */
+table.mw-specialpages-table {
+       margin-top: 0;
+}
diff --git a/skins/Vector/special.preferences.less b/skins/Vector/special.preferences.less
new file mode 100644 (file)
index 0000000..a9b1006
--- /dev/null
@@ -0,0 +1,114 @@
+@import "mediawiki.mixins";
+@import "variables";
+
+/**
+ * The following code is highly modified from monobook. It would be nice if the
+ * preftoc id was more human readable like preferences-toc for instance,
+ * howerver this would require backporting the other skins.
+ */
+
+#preftoc {
+       /* Tabs */
+       width: 100%;
+       float: left;
+       clear: both;
+       margin: 0 !important;
+       padding: 0 !important;
+       .background-image('images/preferences/break.png');
+       background-position: bottom left;
+       background-repeat: no-repeat;
+
+       li {
+               /* Tab */
+               float: left;
+               margin: 0;
+               padding: 0;
+               padding-right: 1px;
+               height: 2.25em;
+               white-space: nowrap;
+               list-style-type: none;
+               list-style-image: none;
+               .background-image('images/preferences/break.png');
+               background-position: bottom right;
+               background-repeat: no-repeat;
+
+               /* Sadly, IE6 won't understand this */
+               &:first-child {
+                       margin-left: 1px;
+               }
+
+               &.selected {
+                       a {
+                               .background-image('images/preferences/fade.png');
+                               background-position: bottom;
+                               background-repeat: repeat-x;
+                               color: #333;
+                               text-decoration: none;
+                       }
+               }
+       }
+
+       a,
+       a:active {
+               display: inline-block;
+               position: relative;
+               color: @menu-link-color;
+               padding: 0.5em;
+               text-decoration: none;
+               background-image: none;
+               font-size: 0.9em;
+       }
+
+       a:hover,
+       a:focus {
+               text-decoration: underline;
+       }
+}
+
+#preferences {
+       float: left;
+       width: 100%;
+       margin: 0;
+       margin-top: -2px;
+       clear: both;
+       border: solid 1px #ccc;
+       background-color: #fafafa;
+
+       fieldset {
+               border: none;
+               border-top: solid 1px #ccc;
+
+               &.prefsection {
+                       border: none;
+                       padding: 0;
+                       margin: 1em;
+
+                       legend.mainLegend {
+                               display: none;
+                       }
+               }
+       }
+
+       legend {
+               color: #666;
+       }
+
+       td {
+               padding-left: 0.5em;
+               padding-right: 0.5em;
+       }
+
+       div.mw-prefs-buttons {
+               padding: 1em;
+
+               input {
+                       margin-right: 0.25em;
+               }
+       }
+}
+
+.htmlform-tip {
+       font-size: x-small;
+       padding: .2em 2em;
+       color: #666;
+}
diff --git a/skins/Vector/variables.less b/skins/Vector/variables.less
new file mode 100644 (file)
index 0000000..b17d15c
--- /dev/null
@@ -0,0 +1,39 @@
+@html-font-size: 100%;
+
+// Page content
+// FIXME: Use global variable since Echo and CentralNotice use this variable
+@content-border-color: #a7d7f9;
+// FIXME: Find an open font that works with this stack and is readable by Windows users
+@content-font-family: sans-serif;
+@content-font-color: #252525;
+@content-font-size: 0.875em;
+@content-line-height: 1.6;
+@content-padding: 1em;
+@content-heading-font-size: 1.8em;
+@content-heading-font-family: "Linux Libertine", Georgia, Times, serif;
+@body-background-color: #fff;
+@heading-line-height: 1.3;
+
+// Navigation
+@menu-background-color: #f6f6f6;
+
+// Common menu
+@menu-link-color: #0645ad;
+
+// Main menu
+@menu-main-font-size: inherit;
+
+@menu-main-heading-font-size: 0.75em;
+@menu-main-heading-padding: 0.25em 0 0.25em 0.25em;
+@menu-main-heading-color: #4d4d4d;
+
+@menu-main-body-font-size: 0.75em;
+@menu-main-body-link-color: #0645ad;
+@menu-main-body-link-visited-color: #0b0080;
+@menu-main-body-margin: 0 0 0 1.25em;
+@menu-main-body-padding: 0;
+
+@menu-main-logo-left: 0.5em;
+
+// Personal menu
+@menu-personal-font-size: 0.75em;
diff --git a/skins/Vector/vector.js b/skins/Vector/vector.js
new file mode 100644 (file)
index 0000000..7be3535
--- /dev/null
@@ -0,0 +1,107 @@
+/**
+ * Vector-specific scripts
+ */
+jQuery( function ( $ ) {
+       /**
+        * Focus search input at the very end
+        */
+       $( '#searchInput' ).attr( 'tabindex', $( document ).lastTabIndex() + 1 );
+
+       /**
+        * Dropdown menu accessibility
+        */
+       $( 'div.vectorMenu' ).each( function () {
+               var $el = $( this );
+               $el.find( '> h3 > a' ).parent()
+                       .attr( 'tabindex', '0' )
+                       // For accessibility, show the menu when the h3 is clicked (bug 24298/46486)
+                       .on( 'click keypress', function ( e ) {
+                               if ( e.type === 'click' || e.which === 13 ) {
+                                       $el.toggleClass( 'menuForceShow' );
+                                       e.preventDefault();
+                               }
+                       } )
+                       // When the heading has focus, also set a class that will change the arrow icon
+                       .focus( function () {
+                               $el.find( '> a' ).addClass( 'vectorMenuFocus' );
+                       } )
+                       .blur( function () {
+                               $el.find( '> a' ).removeClass( 'vectorMenuFocus' );
+                       } )
+                       .find( '> a:first' )
+                       // As the h3 can already be focused there's no need for the link to be focusable
+                       .attr( 'tabindex', '-1' );
+       } );
+
+       /**
+        * Sidebar
+        */
+       $( '#mw-panel > .portal:first' ).addClass( 'first' );
+
+       /**
+        * Collapsible tabs
+        */
+       var $cactions = $( '#p-cactions' ),
+               $tabContainer = $( '#p-views ul' ),
+               originalDropdownWidth = $cactions.width();
+
+       // Bind callback functions to animate our drop down menu in and out
+       // and then call the collapsibleTabs function on the menu
+       $tabContainer
+               .bind( 'beforeTabCollapse', function () {
+                       // If the dropdown was hidden, show it
+                       if ( $cactions.hasClass( 'emptyPortlet' ) ) {
+                               $cactions
+                                       .removeClass( 'emptyPortlet' )
+                                       .find( 'h3' )
+                                               .css( 'width', '1px' ).animate( { 'width': originalDropdownWidth }, 'normal' );
+                       }
+               } )
+               .bind( 'beforeTabExpand', function () {
+                       // If we're removing the last child node right now, hide the dropdown
+                       if ( $cactions.find( 'li' ).length === 1 ) {
+                               $cactions.find( 'h3' ).animate( { 'width': '1px' }, 'normal', function () {
+                                       $( this ).attr( 'style', '' )
+                                               .parent().addClass( 'emptyPortlet' );
+                               });
+                       }
+               } )
+               .collapsibleTabs( {
+                       expandCondition: function ( eleWidth ) {
+                               // (This looks a bit awkward because we're doing expensive queries as late as possible.)
+
+                               var distance = $.collapsibleTabs.calculateTabDistance();
+                               // If there are at least eleWidth + 1 pixels of free space, expand.
+                               // We add 1 because .width() will truncate fractional values but .offset() will not.
+                               if ( distance >= eleWidth + 1 ) {
+                                       return true;
+                               } else {
+                                       // Maybe we can still expand? Account for the width of the "Actions" dropdown if the
+                                       // expansion would hide it.
+                                       if ( $cactions.find( 'li' ).length === 1 ) {
+                                               return distance >= eleWidth + 1 - originalDropdownWidth;
+                                       } else {
+                                               return false;
+                                       }
+                               }
+                       },
+                       collapseCondition: function () {
+                               // (This looks a bit awkward because we're doing expensive queries as late as possible.)
+                               // TODO The dropdown itself should probably "fold" to just the down-arrow (hiding the text)
+                               // if it can't fit on the line?
+
+                               // If there's an overlap, collapse.
+                               if ( $.collapsibleTabs.calculateTabDistance() < 0 ) {
+                                       // But only if the width of the tab to collapse is smaller than the width of the dropdown
+                                       // we would have to insert. An example language where this happens is Lithuanian (lt).
+                                       if ( $cactions.hasClass( 'emptyPortlet' ) ) {
+                                               return $tabContainer.children( 'li.collapsible:last' ).width() > originalDropdownWidth;
+                                       } else {
+                                               return true;
+                                       }
+                               } else {
+                                       return false;
+                               }
+                       }
+               } );
+} );
index a6d3b55..dda17fb 100644 (file)
  */
 
 /* Thanks to A List Apart (http://alistapart.com/) for useful extras */
-a.stub,
-a.new {
-       color: #ba0000;
-       text-decoration: none;
-}
-
-#toc {
-       border: 1px solid #aaaaaa;
-       background-color: #f9f9f9;
-       padding: 5px;
-       display: -moz-inline-block;
-       display: inline-block;
-       display: table;
-       /* IE7 and earlier */
-       zoom: 1;
-       *display: inline;
-}
-
-/* images */
-div.floatright {
-       float: right;
-       clear: right;
-       position: relative;
-       margin: 0.5em 0 0.8em 1.4em;
-}
-
-div.floatright p {
-       font-style: italic;
-}
-
-div.floatleft {
-       float: left;
-       clear: left;
-       position: relative;
-       margin: 0.5em 1.4em 0.8em 0;
-}
-
-div.floatleft p {
-       font-style: italic;
-}
-
-div.center {
-       text-align: center;
-}
-
-/* thumbnails */
-div.thumb {
-       border: none;
-       width: auto;
-       margin-top: 0.5em;
-       margin-bottom: 0.8em;
-       background-color: transparent;
-}
-
-div.thumbinner {
-       border: 1px solid #cccccc;
-       padding: 3px !important;
-       background-color: White;
-       font-size: 94%;
-       text-align: center;
-       overflow: hidden;
-}
-
-html .thumbimage {
-       border: 1px solid #cccccc;
-}
-
-html .thumbcaption {
-       border: none;
-       text-align: left;
-       line-height: 1.4em;
-       padding: 3px !important;
-       font-size: 94%;
-}
-
-div.magnify {
-       display: none;
-}
-
-/* @noflip */
-div.tright {
-       float: right;
-       clear: right;
-       margin: 0.5em 0 0.8em 1.4em;
-}
-
-/* @noflip */
-div.tleft {
-       float: left;
-       clear: left;
-       margin: 0.5em 1.4em 0.8em 0;
-}
-
-img.thumbborder {
-       border: 1px solid #dddddd;
-}
-
-body {
-       background: white;
-       color: black;
-       margin: 0;
-       padding: 0;
-}
 
+/**
+ * Hide all the elements irrelevant for printing
+ */
 .noprint,
 div#jump-to-nav,
 .mw-jump,
@@ -120,7 +20,7 @@ div#column-one,
 .mw-editsection,
 .mw-editsection-like,
 .toctoggle,
-.tochidden,
+#toc.tochidden,
 div#f-poweredbyico,
 div#f-copyrightico,
 li#viewcount,
@@ -135,29 +35,39 @@ span.mw-filepage-other-resolutions,
 #filetoc,
 .usermessage,
 .patrollink,
-#mw-navigation {
-       /* Hides all the elements irrelevant for printing */
+#mw-navigation,
+#siteNotice {
        display: none;
 }
 
-ul {
-       list-style-type: square;
+/**
+ * Pagination
+ */
+.wikitable, .thumb, img {
+       page-break-inside: avoid;
 }
 
-#content {
-       background: none;
-       border: none !important;
-       padding: 0 !important;
-       margin: 0 !important;
-       direction: ltr;
+h2, h3, h4, h5, h6 {
+       page-break-after: avoid;
 }
 
-#footer {
+p {
+       widows: 3;
+       orphans: 3;
+}
+
+/**
+ * Generic HTML elements
+ */
+body {
        background: white;
        color: black;
-       margin-top: 1em;
-       border-top: 1px solid #AAA;
-       direction: ltr;
+       margin: 0;
+       padding: 0;
+}
+
+ul {
+       list-style-type: square;
 }
 
 h1, h2, h3, h4, h5, h6 {
@@ -183,10 +93,69 @@ pre, .mw-code {
        color: black;
 }
 
-table.listing,
-table.listing td {
-       border: 1pt solid black;
-       border-collapse: collapse;
+/**
+ * MediaWiki-specific elements
+ */
+#globalWrapper {
+       width: 100% !important;
+       min-width: 0 !important;
+}
+
+#content {
+       background: white;
+       border: none !important;
+       padding: 0 !important;
+       margin: 0 !important;
+       direction: ltr;
+       color: black;
+}
+
+#column-content {
+       margin: 0 !important;
+}
+
+#column-content #content {
+       padding: 1em;
+       margin: 0 !important;
+}
+
+#toc {
+       border: 1px solid #aaaaaa;
+       background-color: #f9f9f9;
+       padding: 5px;
+       display: -moz-inline-block;
+       display: inline-block;
+       display: table;
+       /* IE7 and earlier */
+       zoom: 1;
+       *display: inline;
+}
+
+#footer {
+       background: white;
+       color: black;
+       margin-top: 1em;
+       border-top: 1px solid #AAA;
+       direction: ltr;
+}
+
+img {
+       border: none;
+       vertical-align: middle;
+}
+
+/* math */
+span.texhtml {
+       font-family: serif;
+}
+
+/**
+ * Links
+ */
+a.stub,
+a.new {
+       color: #ba0000;
+       text-decoration: none;
 }
 
 a {
@@ -201,37 +170,18 @@ a:link, a:visited {
        text-decoration: underline;
 }
 
+/* Expand URLs for printing */
 #content a.external.text:after,
 #content a.external.autonumber:after {
-       /* Expand URLs for printing */
        content: " (" attr(href) ")";
 }
 
+/* Expand protocol-relative URLs for printing */
 #content a.external.text[href^='//']:after,
 #content a.external.autonumber[href^='//']:after {
-       /* Expand protocol-relative URLs for printing */
        content: " (https:" attr(href) ")";
 }
 
-#globalWrapper {
-       width: 100% !important;
-       min-width: 0 !important;
-}
-
-#content {
-       background: white;
-       color: black;
-}
-
-#column-content {
-       margin: 0 !important;
-}
-
-#column-content #content {
-       padding: 1em;
-       margin: 0 !important;
-}
-
 /* MSIE/Win doesn't understand 'inherit' */
 a,
 a.external,
@@ -250,21 +200,92 @@ a.stub {
        text-decoration: inherit !important;
 }
 
-img {
+/**
+ * Floating divs
+ */
+div.floatright {
+       float: right;
+       clear: right;
+       position: relative;
+       margin: 0.5em 0 0.8em 1.4em;
+}
+
+div.floatright p {
+       font-style: italic;
+}
+
+div.floatleft {
+       float: left;
+       clear: left;
+       position: relative;
+       margin: 0.5em 1.4em 0.8em 0;
+}
+
+div.floatleft p {
+       font-style: italic;
+}
+
+div.center {
+       text-align: center;
+}
+
+/**
+ * Thumbnails
+ */
+div.thumb {
        border: none;
-       vertical-align: middle;
+       width: auto;
+       margin-top: 0.5em;
+       margin-bottom: 0.8em;
+       background-color: transparent;
 }
 
-/* math */
-span.texhtml {
-       font-family: serif;
+div.thumbinner {
+       border: 1px solid #cccccc;
+       padding: 3px !important;
+       background-color: White;
+       font-size: 94%;
+       text-align: center;
+       overflow: hidden;
 }
 
-#siteNotice {
+html .thumbimage {
+       border: 1px solid #cccccc;
+}
+
+html .thumbcaption {
+       border: none;
+       text-align: left;
+       line-height: 1.4em;
+       padding: 3px !important;
+       font-size: 94%;
+}
+
+div.magnify {
        display: none;
 }
 
-/* Galleries (see shared.css for more info) */
+/* @noflip */
+div.tright {
+       float: right;
+       clear: right;
+       margin: 0.5em 0 0.8em 1.4em;
+}
+
+/* @noflip */
+div.tleft {
+       float: left;
+       clear: left;
+       margin: 0.5em 1.4em 0.8em 0;
+}
+
+img.thumbborder {
+       border: 1px solid #dddddd;
+}
+
+/**
+ * Galleries (see shared.css for more info)
+ */
 li.gallerybox {
        vertical-align: top;
        display: inline-block;
@@ -371,22 +392,14 @@ table.wikitable > caption,
        font-weight: bold;
 }
 
-a.sortheader {
-       margin: 0 0.3em;
-}
-
-/* Some pagination options */
-.wikitable, .thumb, img {
-       page-break-inside: avoid;
-}
-
-h2, h3, h4, h5, h6 {
-       page-break-after: avoid;
+table.listing,
+table.listing td {
+       border: 1pt solid black;
+       border-collapse: collapse;
 }
 
-p {
-       widows: 3;
-       orphans: 3;
+a.sortheader {
+       margin: 0 0.3em;
 }
 
 /**
diff --git a/skins/monobook/IE60Fixes.css b/skins/monobook/IE60Fixes.css
deleted file mode 100644 (file)
index cd9399f..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-/* 6.0 - only fixes */
-/* content area */
-/* workaround for various ie float bugs */
-div#column-content {
-       float: none;
-       margin-left: 0;
-       height: 1%;
-}
-
-div#column-content div#content {
-       margin-left: 12.2em;
-       margin-top: 3em;
-       height: 1%;
-}
-
-.rtl div#column-content div#content {
-       margin-right: 12.2em;
-       margin-left: 0;
-}
-
-div#column-one {
-       position: absolute;
-       top: 0;
-       left: 0;
-       z-index: 4;
-}
-
-.rtl div#column-one {
-       left: auto;
-       right: 0;
-}
-
-div#footer {
-       margin-left: 13.6em;
-       border-left: 1px solid #fabd23;
-}
-
-.rtl div#footer {
-       margin-left: 0;
-       margin-right: 13.6em;
-       border-left: none;
-       border-right: 1px solid #fabd23;
-}
-
-/* float/negative margin brokenness */
-* html div#footer {
-       margin-top: 0;
-}
-
-* html div#column-content {
-       display: inline;
-       margin-bottom: 0;
-}
-
-/* the tabs */
-
-#p-cactions {
-       z-index: 3;
-}
-
-#p-cactions li {
-       padding-bottom: 0 !important;
-       border: none;
-       background-color: transparent;
-       cursor: default;
-       float: none !important;
-}
-
-#p-cactions li a {
-       display: inline-block !important;
-       vertical-align: top;
-       padding-bottom: 0;
-       border: solid #aaa;
-       border-width: 1px 1px 0;
-}
-
-#p-cactions li.selected a {
-       border-color: #fabd23;
-       padding-bottom: 0.17em;
-}
-
-#p-cactions li a:hover {
-       padding-bottom: 0.17em;
-}
-
-#p-navigation a {
-       display: inline-block;
-       width: 100%;
-}
-
-#portal-personaltools {
-       padding-bottom: 0.1em;
-}
-
-.rtl a.feedlink {
-       background-position: right;
-       padding-right: 0;
-       padding-left: 16px;
-}
-
-/* show the hand */
-#p-logo a,
-#p-logo a:hover {
-       cursor: pointer;
-}
-
-div.visualClear {
-       width: 100%;
-       line-height: 0;
-}
-
-textarea {
-       width: 96%;
-}
-
-#catlinks,
-div.tright,
-div.tleft {
-       position: relative;
-}
-
-/* bug 12846 */
-body.rtl #preftoc a, body.rtl #preftoc a:active {
-       float: left;
-}
diff --git a/skins/monobook/IE70Fixes.css b/skins/monobook/IE70Fixes.css
deleted file mode 100644 (file)
index 42f9ce6..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-/* 7.0 - only fixes */
-/* content area */
-/* workaround for various ie float bugs */
-
-/* This bit is needed to make links clickable... WTF */
-div#column-content div#content {
-       margin-left: 12.2em;
-       margin-top: 3em;
-       height: 1%;
-}
-
-.rtl div#column-content div#content {
-       margin-right: 12.2em;
-       margin-left: 0;
-}
-
-.rtl div#column-one {
-       /* For some reason it tries to inherit the padding-top into every div,
-        * and I can't figure out how to get it back off.
-        * Margin works correctly for this use, though.
-        */
-       padding-top: 0;
-       margin-top: 160px;
-}
-
-/* These elements also have padding-left: 20px; in main.css, but in RTL mode this is flipped.
- * That's good in normal browsers, but in IE7 it needs to not be flipped for some daft reason.
- * Also clear the right margin (originally margin-left: 1em)
- */
-li#pt-userpage, li#pt-anonuserpage, li#pt-login {
-       padding-left: 20px;
-       margin-right: 0;
-}
-
-.rtl a.feedlink {
-       background-position: right;
-       padding-right: 0;
-       padding-left: 16px;
-}
-
-/* the tabs */
-
-#p-cactions {
-       z-index: 3;
-}
-
-#p-cactions li {
-       padding-bottom: 0 !important;
-       border: none;
-       background-color: transparent;
-       cursor: default;
-       float: none !important;
-}
-
-#p-cactions li a {
-       display: inline-block !important;
-       vertical-align: top;
-       padding-bottom: 0;
-       border: solid #aaa;
-       border-width: 1px 1px 0;
-}
-
-#p-cactions li.selected a {
-       border-color: #fabd23;
-       padding-bottom: 0.17em;
-}
-
-#p-cactions li a:hover {
-       padding-bottom: 0.17em;
-}
-
-#p-navigation a {
-       display: inline-block;
-       width: 100%;
-}
-
-#portal-personaltools {
-       padding-bottom: 0.1em;
-}
-
-textarea {
-       width: 96%;
-}
-
-/*
-#catlinks,
-div.tright,
-div.tleft {
-       position: relative;
-}
-*/
-
-div#footer li {
-       /* Work around bug with inline <li> tags with right margins and nowrap */
-       margin-right: 0;
-}
diff --git a/skins/monobook/audio.png b/skins/monobook/audio.png
deleted file mode 100644 (file)
index 68c8768..0000000
Binary files a/skins/monobook/audio.png and /dev/null differ
diff --git a/skins/monobook/bullet.gif b/skins/monobook/bullet.gif
deleted file mode 100644 (file)
index b43de48..0000000
Binary files a/skins/monobook/bullet.gif and /dev/null differ
diff --git a/skins/monobook/discussionitem_icon.gif b/skins/monobook/discussionitem_icon.gif
deleted file mode 100644 (file)
index e3ca6d9..0000000
Binary files a/skins/monobook/discussionitem_icon.gif and /dev/null differ
diff --git a/skins/monobook/document.png b/skins/monobook/document.png
deleted file mode 100644 (file)
index ee46a50..0000000
Binary files a/skins/monobook/document.png and /dev/null differ
diff --git a/skins/monobook/external-ltr.png b/skins/monobook/external-ltr.png
deleted file mode 100644 (file)
index 6308383..0000000
Binary files a/skins/monobook/external-ltr.png and /dev/null differ
diff --git a/skins/monobook/external-rtl.png b/skins/monobook/external-rtl.png
deleted file mode 100644 (file)
index 5313234..0000000
Binary files a/skins/monobook/external-rtl.png and /dev/null differ
diff --git a/skins/monobook/file_icon.gif b/skins/monobook/file_icon.gif
deleted file mode 100644 (file)
index 69dbeaf..0000000
Binary files a/skins/monobook/file_icon.gif and /dev/null differ
diff --git a/skins/monobook/headbg.jpg b/skins/monobook/headbg.jpg
deleted file mode 100644 (file)
index 5491c6e..0000000
Binary files a/skins/monobook/headbg.jpg and /dev/null differ
diff --git a/skins/monobook/link_icon.gif b/skins/monobook/link_icon.gif
deleted file mode 100644 (file)
index 168c1a2..0000000
Binary files a/skins/monobook/link_icon.gif and /dev/null differ
diff --git a/skins/monobook/lock_icon.gif b/skins/monobook/lock_icon.gif
deleted file mode 100644 (file)
index f71cd9b..0000000
Binary files a/skins/monobook/lock_icon.gif and /dev/null differ
diff --git a/skins/monobook/magnify-clip.png b/skins/monobook/magnify-clip.png
deleted file mode 100644 (file)
index ffd7637..0000000
Binary files a/skins/monobook/magnify-clip.png and /dev/null differ
diff --git a/skins/monobook/mail_icon.gif b/skins/monobook/mail_icon.gif
deleted file mode 100644 (file)
index cf5680d..0000000
Binary files a/skins/monobook/mail_icon.gif and /dev/null differ
diff --git a/skins/monobook/main.css b/skins/monobook/main.css
deleted file mode 100644 (file)
index cb76ae3..0000000
+++ /dev/null
@@ -1,913 +0,0 @@
-/*
-** MediaWiki 'monobook' style sheet for CSS2-capable browsers.
-** Copyright Gabriel Wicke - http://wikidev.net/
-** License: GPL (http://www.gnu.org/copyleft/gpl.html)
-**
-** Loosely based on http://www.positioniseverything.net/ordered-floats.html by Big John
-** and the Plone 2.0 styles, see http://plone.org/ (Alexander Limi,Joe Geldart & Tom Croucher,
-** Michael Zeltner and Geir Bækholt)
-** All you guys rock :)
-*/
-
-div#column-content {
-       width: 100%;
-       float: right;
-       margin: 0 0 .6em -12.2em;
-       padding: 0;
-}
-
-div#content {
-       margin: 2.8em 0 0 12.2em;
-       padding: 1em;
-       position: relative;
-       z-index: 2;
-}
-
-div#column-one {
-       padding-top: 160px;
-}
-
-/* Hide, but keep accessible for screen-readers */
-#column-one h2 {
-       position: absolute;
-       top: -9999px;
-}
-
-div#content {
-       background: white;
-       color: black;
-       border: 1px solid #aaa;
-       border-right: none;
-       line-height: 1.5em;
-}
-
-/* the left column width is specified in class .portlet */
-
-/* Font size:
-** We take advantage of keyword scaling- browsers won't go below 9px
-** More at http://www.w3.org/2003/07/30-font-size
-** http://style.cleverchimp.com/font_size_intervals/altintervals.html
-*/
-
-body {
-       font: x-small sans-serif;
-       /* @embed */
-       background: #f9f9f9 url(headbg.jpg) 0 0 no-repeat;
-       color: black;
-       margin: 0;
-       padding: 0;
-       direction: ltr; /* Needed for RTL flipping */
-       unicode-bidi: embed;
-}
-
-/* scale back up to a sane default */
-div#globalWrapper {
-       font-size: 127%;
-       width: 100%;
-       margin: 0;
-       padding: 0;
-}
-
-/* general styles */
-a {
-       color: #002bb8;
-}
-
-a:visited {
-       color: #5a3696;
-}
-
-a.new,
-#p-personal a.new {
-       color: #cc2200;
-}
-
-ul {
-       list-style-type: square;
-       /* @embed */
-       list-style-image: url(bullet.gif);
-}
-
-input.historysubmit {
-       padding: 0 .3em .3em .3em !important;
-       font-size: 94%;
-       cursor: pointer;
-       height: 1.7em !important;
-       margin-left: 1.6em;
-}
-
-pre, .mw-code {
-       line-height: 1.1em;
-}
-
-#firstHeading {
-       padding-top: 0;
-}
-
-/*
-** the main content area
-*/
-
-#siteNotice {
-       font-size: 95%;
-       padding: 0 0.9em;
-}
-
-#localNotice {
-       margin: 0;
-}
-
-#siteNotice p {
-       margin: 0;
-       padding: 0;
-}
-
-/*
-** classes for special content elements like town boxes
-** intended to be referenced directly from the wiki src
-*/
-
-/*
-** User styles
-*/
-/* table standards */
-table.rimage {
-       float: right;
-       position: relative;
-       margin-left: 1em;
-       margin-bottom: 1em;
-       text-align: center;
-}
-
-/*
-** edit views etc
-*/
-.special li {
-       line-height: 1.4em;
-       margin: 0;
-       padding: 0;
-}
-
-/*
-** keep the whitespace in front of the ^=, hides rule from konqueror
-** this is css3, the validator doesn't like it when validating as css2
-*/
-#bodyContent a.external {
-       /* @embed */
-       background: url(external-ltr.png) center right no-repeat;
-       padding-right: 13px;
-}
-
-#bodyContent a.external[href ^="https://"],
-.link-https {
-       /* @embed */
-       background: url(lock_icon.gif) center right no-repeat;
-       padding-right: 16px;
-}
-
-#bodyContent a.external[href ^="mailto:"],
-.link-mailto {
-       /* @embed */
-       background: url(mail_icon.gif) center right no-repeat;
-       padding-right: 18px;
-}
-
-#bodyContent a.external[href ^="news:"] {
-       /* @embed */
-       background: url(news_icon.png) center right no-repeat;
-       padding-right: 18px;
-}
-
-#bodyContent a.external[href ^="ftp://"],
-.link-ftp {
-       /* @embed */
-       background: url(file_icon.gif) center right no-repeat;
-       padding-right: 18px;
-}
-
-#bodyContent a.external[href ^="irc://"],
-#bodyContent a.external[href ^="ircs://"],
-.link-irc {
-       /* @embed */
-       background: url(discussionitem_icon.gif) center right no-repeat;
-       padding-right: 18px;
-}
-
-#bodyContent a.external[href $=".ogg"], #bodyContent a.external[href $=".OGG"],
-#bodyContent a.external[href $=".mid"], #bodyContent a.external[href $=".MID"],
-#bodyContent a.external[href $=".midi"], #bodyContent a.external[href $=".MIDI"],
-#bodyContent a.external[href $=".mp3"], #bodyContent a.external[href $=".MP3"],
-#bodyContent a.external[href $=".wav"], #bodyContent a.external[href $=".WAV"],
-#bodyContent a.external[href $=".wma"], #bodyContent a.external[href $=".WMA"],
-.link-audio {
-       /* @embed */
-       background: url(audio.png) center right no-repeat;
-       padding-right: 13px;
-}
-
-#bodyContent a.external[href $=".ogm"], #bodyContent a.external[href $=".OGM"],
-#bodyContent a.external[href $=".avi"], #bodyContent a.external[href $=".AVI"],
-#bodyContent a.external[href $=".mpeg"], #bodyContent a.external[href $=".MPEG"],
-#bodyContent a.external[href $=".mpg"], #bodyContent a.external[href $=".MPG"],
-.link-video {
-       /* @embed */
-       background: url(video.png) center right no-repeat;
-       padding-right: 13px;
-}
-
-#bodyContent a.external[href $=".pdf"], #bodyContent a.external[href $=".PDF"],
-#bodyContent a.external[href *=".pdf#"], #bodyContent a.external[href *=".PDF#"],
-#bodyContent a.external[href *=".pdf?"], #bodyContent a.external[href *=".PDF?"],
-.link-document {
-       /* @embed */
-       background: url(document.png) center right no-repeat;
-       padding-right: 12px;
-}
-
-/* Interwiki Styling */
-#bodyContent a.extiw,
-#bodyContent a.extiw:active {
-       color: #36b;
-}
-
-/* External links */
-#bodyContent a.external {
-       color: #36b;
-}
-
-/*
-** Structural Elements
-*/
-
-/*
-** general portlet styles (elements in the quickbar)
-*/
-.portlet {
-       border: none;
-       margin: 0 0 .5em;
-       padding: 0;
-       float: none;
-       width: 11.6em;
-       overflow: hidden;
-}
-
-.portlet h3 {
-       background: transparent;
-       padding: 0 1em 0 .5em;
-       display: inline;
-       height: 1em;
-       text-transform: lowercase;
-       font-size: 91%;
-       font-weight: normal;
-       white-space: nowrap;
-}
-
-.pBody {
-       font-size: 95%;
-       background-color: white;
-       color: black;
-       border-collapse: collapse;
-       border: 1px solid #aaa;
-       padding: 0 .8em .3em .5em;
-}
-
-/* allows .pBody styles to wrap around content added via BaseTemplateAfterPortlet hook */
-.pBody:after {
-       content: '';
-       clear: both;
-       display: block;
-}
-
-.portlet ul {
-       line-height: 1.5em;
-       font-size: 95%;
-}
-
-.portlet li {
-       padding: 0;
-       margin: 0;
-}
-
-/*
-** Logo properties
-*/
-
-#p-logo {
-       top: 0;
-       left: 0;
-       position: absolute; /*needed to use z-index */
-       z-index: 3;
-       height: 155px;
-       width: 12em;
-       overflow: visible;
-}
-
-#p-logo h3 {
-       display: none;
-}
-
-#p-logo a,
-#p-logo a:hover {
-       display: block;
-       height: 155px;
-       width: 12.2em;
-       background-repeat: no-repeat;
-       background-position: 35% 50% !important;
-       text-decoration: none;
-}
-
-/*
-** Search portlet
-*/
-#p-search {
-       position: relative;
-       z-index: 3;
-}
-
-input.searchButton {
-       margin-top: 1px;
-       font-size: 95%;
-}
-
-#searchGoButton {
-       padding-left: .5em;
-       padding-right: .5em;
-       font-weight: bold;
-}
-
-#searchInput {
-       width: 10.9em;
-       margin: 0;
-       font-size: 95%;
-}
-
-#p-search .pBody {
-       padding: .5em .4em .4em .4em;
-       text-align: center;
-}
-
-#p-search #searchform div div {
-       margin-top: .4em;
-       font-size: 95%;
-}
-
-/*
-** the personal toolbar
-*/
-#p-personal {
-       position: absolute;
-       left: 0;
-       top: 0;
-       z-index: 3;
-}
-
-#p-personal {
-       width: 100%;
-       white-space: nowrap;
-       padding: 0;
-       margin: 0;
-       border: none;
-       background: none;
-       overflow: visible;
-       line-height: 1.2em;
-}
-
-#p-personal h3 {
-       display: none;
-}
-
-#p-personal .portlet,
-#p-personal .pBody {
-       z-index: 0;
-       padding: 0;
-       margin: 0;
-       border: none;
-       overflow: visible;
-       background: none;
-}
-
-/* this is the ul contained in the portlet */
-#p-personal ul {
-       border: none;
-       line-height: 1.4em;
-       color: #2f6fab;
-       padding: 0 2em 0 3em;
-       margin: 0;
-       text-align: right;
-       list-style-type: none;
-       list-style-image: none;
-       z-index: 0;
-       background: none;
-       cursor: default;
-}
-
-#p-personal li {
-       z-index: 0;
-       border: none;
-       padding: 0;
-       display: inline;
-       color: #2f6fab;
-       margin-left: 1em;
-       line-height: 1.2em;
-       background: none;
-}
-
-#p-personal li a {
-       text-decoration: none;
-       color: #005896;
-       padding-bottom: .2em;
-       background: none;
-}
-
-#p-personal li a:hover {
-       background-color: white;
-       padding-bottom: .2em;
-       text-decoration: none;
-}
-
-#p-personal li.active a:hover {
-       background-color: transparent;
-}
-
-/* The icon in front of the username / login link */
-li#pt-userpage,
-li#pt-anonuserpage,
-li#pt-login {
-       /* @embed */
-       background: url(user.gif) top left no-repeat;
-       padding-left: 20px;
-}
-
-#p-personal ul {
-       text-transform: lowercase;
-}
-
-/* Don't lowercase username or IP addresses (IPv6) */
-li#pt-userpage,
-li#pt-anonuserpage {
-       text-transform: none;
-}
-
-#p-personal li.active {
-       font-weight: bold;
-}
-
-/*
-** the page-related actions- page/talk, edit etc
-*/
-#p-cactions {
-       position: absolute;
-       top: 1.3em;
-       left: 11.5em;
-       margin: 0;
-       white-space: nowrap;
-       width: 76%;
-       line-height: 1.1em;
-       overflow: visible;
-       background: none;
-       border-collapse: collapse;
-       padding-left: 1em;
-       font-size: 95%;
-}
-
-#p-cactions ul {
-       list-style-type: none;
-       list-style-image: none;
-}
-
-#p-cactions li {
-       display: inline;
-       border: 1px solid #aaa;
-       border-bottom: none;
-       padding: 0 0 1em 0;
-       margin: 0 .3em 0 0;
-       overflow: visible;
-       background: white;
-}
-
-#p-cactions li.selected {
-       border-color: #fabd23;
-       font-weight: bold;
-}
-
-#p-cactions li a {
-       background-color: #fbfbfb;
-       color: #002bb8;
-       border: none;
-       padding: 0 .8em .3em;
-       position: relative;
-       z-index: 0;
-       margin: 0;
-       text-decoration: none;
-}
-
-#p-cactions li.selected a {
-       z-index: 3;
-       background-color: white;
-}
-
-#p-cactions .new a {
-       color: #ba0000;
-}
-
-#p-cactions li a:hover {
-       z-index: 3;
-       text-decoration: none;
-       background-color: white;
-}
-
-#p-cactions h3 {
-       display: none;
-}
-
-#p-cactions li.istalk {
-       margin-right: 0;
-}
-
-#p-cactions li.istalk a {
-       padding-right: .5em;
-}
-
-#p-cactions #ca-addsection a {
-       padding-left: .4em;
-       padding-right: .4em;
-}
-
-/* offsets to distinguish the tab groups */
-li#ca-talk {
-       margin-right: 1.6em;
-}
-
-li#ca-watch,
-li#ca-unwatch,
-li#ca-varlang-0,
-li#ca-print {
-       margin-left: 1.6em;
-}
-
-#p-cactions .pBody {
-       font-size: 1em;
-       background-color: transparent;
-       color: inherit;
-       border-collapse: inherit;
-       border: 0;
-       padding: 0;
-}
-
-#p-cactions li a {
-       text-transform: lowercase;
-}
-
-#p-lang {
-       position: relative;
-       z-index: 3;
-}
-
-/* Override text-transform on languages where capitalization is significant */
-.capitalize-all-nouns .portlet h3,
-.capitalize-all-nouns #p-personal ul,
-.capitalize-all-nouns #p-cactions ul li a {
-       text-transform: none;
-}
-
-/* TODO: #t-iscite is only used by the Cite extension, come up with some
- * system which allows extensions to add to this file on the fly
- */
-#t-ispermalink, #t-iscite {
-       color: #999;
-}
-
-/*
-** footer
-*/
-div#footer {
-       background-color: white;
-       border-top: 1px solid #fabd23;
-       border-bottom: 1px solid #fabd23;
-       margin: .6em 0 1em 0;
-       overflow: hidden;
-       padding: .4em 0 .3em 0;
-       text-align: center;
-       font-size: 90%;
-}
-
-div#footer li {
-       display: inline;
-       margin: 0 1.3em;
-}
-
-#f-poweredbyico, #f-copyrightico {
-       margin: 0 8px;
-       position: relative;
-       top: -2px; /* Bump it up just a tad */
-}
-
-#f-poweredbyico {
-       float: right;
-       height: 1%;
-}
-
-#f-copyrightico {
-       float: left;
-       height: 1%;
-}
-
-.mw-htmlform-submit {
-       font-weight: bold;
-       padding-left: .3em;
-       padding-right: .3em;
-       margin-right: 2em;
-}
-
-/* js pref toc */
-#preftoc {
-       margin: 0;
-       padding: 0;
-       width: 100%;
-       clear: both;
-}
-
-#preftoc li {
-       background-color: #f0f0f0;
-       color: #000;
-}
-
-#preftoc li {
-       margin: 1px -2px 1px 2px;
-       float: left;
-       padding: 2px 0 3px 0;
-       border: 1px solid #fff;
-       border-right-color: #716f64;
-       border-bottom: 0;
-       position: relative;
-       white-space: nowrap;
-       list-style-type: none;
-       list-style-image: none;
-       z-index: 3;
-}
-
-#preftoc li.selected {
-       font-weight: bold;
-       background-color: #f9f9f9;
-       border: 1px solid #aaa;
-       border-bottom: none;
-       cursor: default;
-       top: 1px;
-       padding-top: 2px;
-       margin-right: -3px;
-}
-
-#preftoc > li.selected {
-       top: 2px;
-}
-
-#preftoc a,
-#preftoc a:active {
-       display: block;
-       color: #000;
-       padding: 0 .7em;
-       position: relative;
-       text-decoration: none;
-}
-
-#preftoc li.selected a {
-       cursor: default;
-       text-decoration: none;
-}
-
-#preferences {
-       margin: 0;
-       border: 1px solid #aaa;
-       clear: both;
-       padding: 1.5em;
-       background-color: #F9F9F9;
-}
-
-.prefsection {
-       border: none;
-       padding: 0;
-       margin: 0;
-}
-
-.prefsection legend {
-       font-weight: bold;
-}
-
-.prefsection table, .prefsection legend {
-       background-color: #F9F9F9;
-}
-
-.mainLegend {
-       display: none;
-}
-
-td.htmlform-tip {
-       font-size: x-small;
-       padding: .2em 2em;
-       color: #666;
-}
-
-.preferences-login {
-       clear: both;
-       margin-bottom: 1.5em;
-}
-
-.prefcache {
-       font-size: 90%;
-       margin-top: 2em;
-}
-
-#userloginprompt, #languagelinks {
-       font-size: 85%;
-}
-
-#login-sectiontip {
-       font-size: 85%;
-       line-height: 1.2;
-       padding-top: 2em;
-}
-
-#userloginlink a, #wpLoginattempt, #wpCreateaccount {
-       font-weight: bold;
-}
-
-/**
- * This was originally added by Gabriel Wicke in r3681 (committed on 25 May 2004)
- * with the commit message "tweaks to page history".
- * Unlike the other IE/Mac fixes that used to be present here, this seems to get
- * applied on more modern browsers, so let's keep it here until someone has the
- * time to properly test it out.
- */
-#pagehistory li.selected {
-       position: relative;
-}
-
-.redirectText {
-       font-size: 150%;
-       margin: 5px;
-}
-
-div.patrollink {
-       clear: both;
-}
-
-.sharedUploadNotice {
-       font-style: italic;
-}
-
-span.updatedmarker {
-       color: black;
-       background-color: #0f0;
-}
-
-.editExternally {
-       border: 1px solid gray;
-       background-color: #ffffff;
-       padding: 3px;
-       margin-top: 0.5em;
-       float: left;
-       font-size: small;
-       text-align: center;
-}
-
-.editExternallyHelp {
-       font-style: italic;
-       color: gray;
-}
-
-.toggle {
-       margin-left: 2em;
-       text-indent: -2em;
-}
-
-/* @bug 1714 */
-input#wpSave,
-input#wpDiff {
-       margin-right: 0.33em;
-}
-
-#wpSave {
-       font-weight: bold;
-}
-
-/* noarticletext */
-div.noarticletext {
-       border: 1px solid #ccc;
-       background: #fff;
-       padding: .2em 1em;
-       color: #000;
-}
-
-div#searchTargetContainer {
-       left: 10px;
-       top: 10px;
-       width: 90%;
-       background: white;
-}
-
-div#searchTarget {
-       padding: 3px;
-       margin: 5px;
-       background: #F0F0F0;
-       border: solid 1px blue;
-}
-
-div#searchTarget ul li {
-       list-style-type: none;
-       list-style-image: none;
-}
-
-div#searchTarget ul li:before {
-       color: orange;
-       content: "\00BB \0020";
-}
-
-div#searchTargetHide {
-       float: right;
-       border: solid 1px black;
-       background: #DCDCDC;
-       padding: 2px;
-}
-
-#powersearch p {
-       margin-top: 0;
-}
-
-div.multipageimagenavbox {
-       border: solid 1px silver;
-       padding: 4px;
-       margin: 1em;
-       background: #f0f0f0;
-}
-
-div.multipageimagenavbox div.thumb {
-       border: none;
-       margin-left: 2em;
-       margin-right: 2em;
-}
-
-div.multipageimagenavbox hr {
-       margin: 6px;
-}
-
-table.multipageimage td {
-       text-align: center;
-}
-
-.templatesUsed {
-       margin-top: 1.5em;
-}
-
-.mw-summary-preview {
-       margin: 0.1em 0;
-}
-
-/* Friendlier slave lag warnings */
-div.mw-lag-warn-normal,
-div.mw-lag-warn-high {
-       padding: 3px;
-       text-align: center;
-       margin: 3px auto;
-}
-
-div.mw-lag-warn-normal {
-       border: 1px solid #FFCC66;
-       background-color: #FFFFCC;
-}
-
-div.mw-lag-warn-high {
-       font-weight: bold;
-       border: 2px solid #FF0033;
-       background-color: #FFCCCC;
-}
-
-.MediaTransformError {
-       background-color: #ccc;
-       padding: 0.1em;
-}
-
-.MediaTransformError td {
-       text-align: center;
-       vertical-align: middle;
-       font-size: 90%;
-}
-
-/* God-damned hack for the crappy layout */
-.os-suggest {
-       font-size: 127%;
-}
-
-/* Sometimes people don't want personal tools to be lowercase! */
-.no-text-transform {
-       text-transform: none;
-}
-
-/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
-.tipsy {
-       font-size: 127%;
-}
-
-/* mediawiki.notification */
-.skin-monobook .mw-notification {
-       box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.125);
-}
diff --git a/skins/monobook/news_icon.png b/skins/monobook/news_icon.png
deleted file mode 100644 (file)
index 4d3cb47..0000000
Binary files a/skins/monobook/news_icon.png and /dev/null differ
diff --git a/skins/monobook/required.gif b/skins/monobook/required.gif
deleted file mode 100644 (file)
index bd71976..0000000
Binary files a/skins/monobook/required.gif and /dev/null differ
diff --git a/skins/monobook/user.gif b/skins/monobook/user.gif
deleted file mode 100644 (file)
index 34b4839..0000000
Binary files a/skins/monobook/user.gif and /dev/null differ
diff --git a/skins/monobook/video.png b/skins/monobook/video.png
deleted file mode 100644 (file)
index d86dbe0..0000000
Binary files a/skins/monobook/video.png and /dev/null differ
diff --git a/skins/monobook/wiki-indexed.png b/skins/monobook/wiki-indexed.png
deleted file mode 100644 (file)
index 799ebac..0000000
Binary files a/skins/monobook/wiki-indexed.png and /dev/null differ
diff --git a/skins/monobook/wiki.png b/skins/monobook/wiki.png
deleted file mode 100644 (file)
index 8c42118..0000000
Binary files a/skins/monobook/wiki.png and /dev/null differ
diff --git a/skins/vector/collapsibleTabs.js b/skins/vector/collapsibleTabs.js
deleted file mode 100644 (file)
index 9344433..0000000
+++ /dev/null
@@ -1,208 +0,0 @@
-/**
- * Collapsible tabs jQuery Plugin
- */
-( function ( $ ) {
-       var rtl = $( 'html' ).attr( 'dir' ) === 'rtl';
-       $.fn.collapsibleTabs = function ( options ) {
-               // return if the function is called on an empty jquery object
-               if ( !this.length ) {
-                       return this;
-               }
-               // Merge options into the defaults
-               var settings = $.extend( {}, $.collapsibleTabs.defaults, options );
-
-               this.each( function () {
-                       var $el = $( this );
-                       // add the element to our array of collapsible managers
-                       $.collapsibleTabs.instances = ( $.collapsibleTabs.instances.length === 0 ?
-                               $el : $.collapsibleTabs.instances.add( $el ) );
-                       // attach the settings to the elements
-                       $el.data( 'collapsibleTabsSettings', settings );
-                       // attach data to our collapsible elements
-                       $el.children( settings.collapsible ).each( function () {
-                               $.collapsibleTabs.addData( $( this ) );
-                       } );
-               } );
-
-               // if we haven't already bound our resize handler, bind it now
-               if ( !$.collapsibleTabs.boundEvent ) {
-                       $( window ).on( 'resize', $.debounce( 500, function () {
-                               $.collapsibleTabs.handleResize();
-                       } ) );
-                       $.collapsibleTabs.boundEvent = true;
-               }
-
-               // call our resize handler to setup the page
-               $.collapsibleTabs.handleResize();
-               return this;
-       };
-       /**
-        * Returns the amount of horizontal distance between the two tabs groups
-        * (#left-navigation and #right-navigation), in pixels. If negative, this
-        * means that the tabs overlap, and the value is the width of overlapping
-        * parts.
-        *
-        * Used in default expandCondition and collapseCondition.
-        *
-        * @return {Numeric} distance/overlap in pixels
-        */
-       function calculateTabDistance() {
-               var $leftTab, $rightTab, leftEnd, rightStart;
-
-               // In RTL, #right-navigation is actually on the left and vice versa.
-               // Hooray for descriptive naming.
-               if ( !rtl ) {
-                       $leftTab = $( '#left-navigation' );
-                       $rightTab = $( '#right-navigation' );
-               } else {
-                       $leftTab = $( '#right-navigation' );
-                       $rightTab = $( '#left-navigation' );
-               }
-
-               leftEnd = $leftTab.offset().left + $leftTab.width();
-               rightStart = $rightTab.offset().left;
-
-               return rightStart - leftEnd;
-       }
-       $.collapsibleTabs = {
-               instances: [],
-               boundEvent: null,
-               defaults: {
-                       expandedContainer: '#p-views ul',
-                       collapsedContainer: '#p-cactions ul',
-                       collapsible: 'li.collapsible',
-                       shifting: false,
-                       expandCondition: function ( eleWidth ) {
-                               // If there are at least eleWidth + 1 pixels of free space, expand.
-                               // We add 1 because .width() will truncate fractional values
-                               // but .offset() will not.
-                               return calculateTabDistance() >= (eleWidth + 1);
-                       },
-                       collapseCondition: function () {
-                               // If there's an overlap, collapse.
-                               return calculateTabDistance() < 0;
-                       }
-               },
-               addData: function ( $collapsible ) {
-                       var settings = $collapsible.parent().data( 'collapsibleTabsSettings' );
-                       if ( settings ) {
-                               $collapsible.data( 'collapsibleTabsSettings', {
-                                       expandedContainer: settings.expandedContainer,
-                                       collapsedContainer: settings.collapsedContainer,
-                                       expandedWidth: $collapsible.width(),
-                                       prevElement: $collapsible.prev()
-                               } );
-                       }
-               },
-               getSettings: function ( $collapsible ) {
-                       var settings = $collapsible.data( 'collapsibleTabsSettings' );
-                       if ( !settings ) {
-                               $.collapsibleTabs.addData( $collapsible );
-                               settings = $collapsible.data( 'collapsibleTabsSettings' );
-                       }
-                       return settings;
-               },
-               handleResize: function () {
-                       $.collapsibleTabs.instances.each( function () {
-                               var $el = $( this ),
-                                       data = $.collapsibleTabs.getSettings( $el );
-
-                               if ( data.shifting ) {
-                                       return;
-                               }
-
-                               // if the two navigations are colliding
-                               if ( $el.children( data.collapsible ).length > 0 && data.collapseCondition() ) {
-
-                                       $el.trigger( 'beforeTabCollapse' );
-                                       // move the element to the dropdown menu
-                                       $.collapsibleTabs.moveToCollapsed( $el.children( data.collapsible + ':last' ) );
-                               }
-
-                               // if there are still moveable items in the dropdown menu,
-                               // and there is sufficient space to place them in the tab container
-                               if ( $( data.collapsedContainer + ' ' + data.collapsible ).length > 0 &&
-                                               data.expandCondition( $.collapsibleTabs.getSettings( $( data.collapsedContainer ).children(
-                                                               data.collapsible + ':first' ) ).expandedWidth ) ) {
-                                       //move the element from the dropdown to the tab
-                                       $el.trigger( 'beforeTabExpand' );
-                                       $.collapsibleTabs
-                                               .moveToExpanded( data.collapsedContainer + ' ' + data.collapsible + ':first' );
-                               }
-                       } );
-               },
-               moveToCollapsed: function ( ele ) {
-                       var outerData, expContainerSettings, target,
-                               $moving = $( ele );
-
-                       outerData = $.collapsibleTabs.getSettings( $moving );
-                       if ( !outerData ) {
-                               return;
-                       }
-                       expContainerSettings = $.collapsibleTabs.getSettings( $( outerData.expandedContainer ) );
-                       if ( !expContainerSettings ) {
-                               return;
-                       }
-                       expContainerSettings.shifting = true;
-
-                       // Remove the element from where it's at and put it in the dropdown menu
-                       target = outerData.collapsedContainer;
-                       $moving.css( 'position', 'relative' )
-                               .css( ( rtl ? 'left' : 'right' ), 0 )
-                               .animate( { width: '1px' }, 'normal', function () {
-                                       var data, expContainerSettings;
-                                       $( this ).hide();
-                                       // add the placeholder
-                                       $( '<span class="placeholder" style="display: none;"></span>' ).insertAfter( this );
-                                       $( this ).detach().prependTo( target ).data( 'collapsibleTabsSettings', outerData );
-                                       $( this ).attr( 'style', 'display: list-item;' );
-                                       data = $.collapsibleTabs.getSettings( $( ele ) );
-                                       if ( data ) {
-                                               expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
-                                               if ( expContainerSettings ) {
-                                                       expContainerSettings.shifting = false;
-                                                       $.collapsibleTabs.handleResize();
-                                               }
-                                       }
-                               } );
-               },
-               moveToExpanded: function ( ele ) {
-                       var data, expContainerSettings, $target, expandedWidth,
-                               $moving = $( ele );
-
-                       data = $.collapsibleTabs.getSettings( $moving );
-                       if ( !data ) {
-                               return;
-                       }
-                       expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
-                       if ( !expContainerSettings ) {
-                               return;
-                       }
-                       expContainerSettings.shifting = true;
-
-                       // grab the next appearing placeholder so we can use it for replacing
-                       $target = $( data.expandedContainer ).find( 'span.placeholder:first' );
-                       expandedWidth = data.expandedWidth;
-                       $moving.css( 'position', 'relative' ).css( ( rtl ? 'right' : 'left' ), 0 ).css( 'width', '1px' );
-                       $target.replaceWith(
-                               $moving
-                               .detach()
-                               .css( 'width', '1px' )
-                               .data( 'collapsibleTabsSettings', data )
-                               .animate( { width: expandedWidth + 'px' }, 'normal', function () {
-                                       $( this ).attr( 'style', 'display: block;' );
-                                       var data, expContainerSettings;
-                                       data = $.collapsibleTabs.getSettings( $( this ) );
-                                       if ( data ) {
-                                               expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
-                                               if ( expContainerSettings ) {
-                                                       expContainerSettings.shifting = false;
-                                                       $.collapsibleTabs.handleResize();
-                                               }
-                                       }
-                               } )
-                       );
-               }
-       };
-
-}( jQuery ) );
diff --git a/skins/vector/components/animations.less b/skins/vector/components/animations.less
deleted file mode 100644 (file)
index 9163779..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Animate between standard and high definition layouts */
-body.vector-animateLayout {
-       div#content,
-       div#footer,
-       #left-navigation {
-               .transition(margin-left 250ms, padding 250ms;);
-       }
-
-       #p-logo {
-               .transition(left 250ms);
-       }
-
-       #mw-panel {
-               .transition(padding-right 250ms);
-       }
-
-       #p-search {
-               .transition(margin-right 250ms);
-       }
-
-       #p-personal {
-               .transition(right 250ms);
-       }
-
-       #mw-head-base {
-               .transition(margin-left 250ms);
-       }
-}
diff --git a/skins/vector/components/common.less b/skins/vector/components/common.less
deleted file mode 100644 (file)
index f70c7a4..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Any rules which should not be flipped automatically in right-to-left situations should be
- * prepended with @noflip in a comment block.
- *
- * This stylesheet employs a few CSS trick to accomplish compatibility with a wide range of web
- * browsers. The most common trick is to use some styles in IE6 only. This is accomplished by using
- * a rule that makes things work in IE6, and then following it with a rule that begins with
- * "html > body" or use a child selector ">", which is ignored by IE6 because it does not support
- * the child selector. You can spot this by looking for the "OVERRIDDEN BY COMPLIANT BROWSERS" and
- * "IGNORED BY IE6" comments.
- */
-@import "mediawiki.mixins";
-
-/* Framework */
-html {
-       font-size: @html-font-size;
-}
-html,
-body {
-       height: 100%;
-       margin: 0;
-       padding: 0;
-       font-family: @content-font-family;
-}
-body {
-       background-color: @menu-background-color;
-}
-
-/* Content */
-div#content {
-       margin-left: 10em;
-       padding: @content-padding;
-       /* Border on top, left, and bottom side */
-       border: 1px solid @content-border-color;
-       border-right-width: 0;
-       /* Merge the border with tabs' one (in their background image) */
-       margin-top: -1px;
-       background-color: @body-background-color;
-       color: @content-font-color;
-       direction: ltr;
-
-       .mw-editsection,
-       .mw-editsection-like {
-               font-family: @content-font-family;
-       }
-
-       p {
-               line-height: inherit;
-               margin: 0.5em 0;
-       }
-
-       h1,
-       h2,
-       #firstHeading {
-               font-family: @content-heading-font-family;
-               line-height: @heading-line-height;
-               margin-bottom: 0.25em;
-               padding: 0;
-       }
-
-       h1,
-       #firstHeading {
-               font-size: @content-heading-font-size;
-       }
-
-       h2 {
-               font-size: 1.5em;
-               margin-top: 1em;
-       }
-
-       h3,
-       h4,
-       h5,
-       h6 {
-               line-height: @content-line-height;
-               margin-top: 0.3em;
-               margin-bottom: 0;
-               padding-bottom: 0;
-       }
-
-       h3 {
-               font-size: 1.17em;
-       }
-
-       h3,
-       h4 {
-               font-weight: bold;
-       }
-
-       h4,
-       h5,
-       h6 {
-               font-size: 100%; /* (reset) */
-       }
-
-       #toc h2,
-       .toc h2 {
-               font-size: 100%; /* (reset) */
-               font-family: @content-font-family;
-       }
-}
-
-/* Hide empty portlets */
-div.emptyPortlet {
-               display: none;
-}
-
-ul {
-       list-style-type: disc;
-       .list-style-image('images/bullet-icon.png');
-}
-
-pre, .mw-code {
-       line-height: 1.3em;
-}
-
-/* Site Notice (includes notices from CentralNotice extension) */
-#siteNotice {
-       font-size: 0.8em;
-}
-
-.redirectText {
-       font-size: 140%;
-}
-
-.redirectMsg img {
-       vertical-align: text-bottom;
-}
-
-/* TODO: Remove #bodyContent selector (kept for backwards compatibility with cached html) */
-#bodyContent,
-.mw-body-content {
-       position: relative;
-       line-height: @content-line-height;
-       font-size: @content-font-size;
-}
-
-/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
-// FIXME: Should be part of jquery.tipsy.css
-.tipsy {
-       font-size: 0.8em;
-}
diff --git a/skins/vector/components/externalLinks.less b/skins/vector/components/externalLinks.less
deleted file mode 100644 (file)
index 91388c6..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-@import "mediawiki.mixins.less";
-// External links
-#content {
-       .external {
-               background-position: center right;
-               background-repeat: no-repeat;
-               .background-image-svg('images/external-link-ltr-icon.svg', 'images/external-link-ltr-icon.png');
-               padding-right: 13px;
-       }
-}
diff --git a/skins/vector/components/footer.less b/skins/vector/components/footer.less
deleted file mode 100644 (file)
index 3d61b66..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Footer */
-div#footer {
-       margin-left: 10em;
-       margin-top: 0;
-       padding: 0.75em;
-       direction: ltr;
-
-       ul {
-               list-style-type: none;
-               list-style-image: none;
-               margin: 0;
-               padding: 0;
-
-               li {
-                       margin: 0;
-                       padding: 0;
-                       padding-top: 0.5em;
-                       padding-bottom: 0.5em;
-                       color: #333;
-                       font-size: 0.7em;
-               }
-       }
-
-       #footer-icons {
-               float: right;
-
-               li {
-                       float: left;
-                       margin-left: 0.5em;
-                       line-height: 2em;
-                       text-align: right;
-               }
-       }
-
-       #footer-info {
-               li {
-                       line-height: 1.4em;
-               }
-       }
-
-       #footer-places {
-               li {
-                       float: left;
-                       margin-right: 1em;
-                       line-height: 2em;
-               }
-       }
-}
-
-body.ltr {
-       div#footer {
-               #footer-places {
-                       /* @noflip */
-                       float: left;
-               }
-       }
-}
diff --git a/skins/vector/components/navigation.less b/skins/vector/components/navigation.less
deleted file mode 100644 (file)
index 8b384ac..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-@import "mediawiki.mixins";
-@import "personalMenu";
-@import "search";
-@import "tabs";
-
-/* Hide, but keep accessible for screen-readers */
-#mw-navigation h2 {
-       position: absolute;
-       top: -9999px;
-}
-
-/* Head */
-#mw-page-base {
-       height: 5em;
-       background-position: bottom left;
-       background-repeat: repeat-x;
-       /* This image is only a fallback (for IE 6-9), so we do not @embed it. */
-       background-image: url('images/page-fade.png');
-       .vertical-gradient(@body-background-color, @menu-background-color, 50%, 100%);
-       background-color: @body-background-color;
-}
-
-#mw-head-base {
-       margin-top: -5em;
-       margin-left: 10em;
-       height: 5em;
-}
-
-div#mw-head {
-       position: absolute;
-       top: 0;
-       right: 0;
-       width: 100%;
-
-       h3 {
-               margin: 0;
-               padding: 0;
-       }
-}
-
-/* Navigation Containers */
-#left-navigation {
-       float: left;
-       margin-left: 10em;
-       margin-top: 2.5em;
-       /* When right nav would overlap left nav, it's placed below it
-          (normal CSS floats behavior). This rule ensures that no empty space
-          is shown between them due to right nav's margin-top. Page layout
-          is still broken, but at least the nav overlaps only the page title
-          instead of half the content. */
-       margin-bottom: -2.5em;
-       /* IE 6 double-margin bug fix */
-       display: inline;
-}
-
-#right-navigation {
-       float: right;
-       margin-top: 2.5em;
-}
-
-/* Logo */
-#p-logo {
-       position: absolute;
-       top: -160px;
-       left: 0;
-       width: 10em;
-       height: 160px;
-
-       a {
-               display: block;
-               width: 10em;
-               height: 160px;
-               background-repeat: no-repeat;
-               background-position: center center;
-               text-decoration: none;
-       }
-}
-
-/* Panel */
-div#mw-panel {
-       font-size: @menu-main-font-size;
-       position: absolute;
-       top: 160px;
-       padding-top: 1em;
-       width: 10em;
-       left: 0;
-
-       div.portal {
-               margin: 0 0.6em 0 0.7em;
-               padding: 0.25em 0;
-               direction: ltr;
-               background-position: top left;
-               background-repeat: no-repeat;
-               .background-image('images/portal-break.png');
-
-               h3 {
-                       font-size: @menu-main-heading-font-size;
-                       color: @menu-main-heading-color;
-                       font-weight: normal;
-                       margin: 0;
-                       padding: @menu-main-heading-padding;
-                       cursor: default;
-                       border: none;
-               }
-
-               div.body {
-                       margin: @menu-main-body-margin;
-                       padding-top: 0;
-
-                       ul {
-                               list-style-type: none;
-                               list-style-image: none;
-                               margin: 0;
-                               padding: @menu-main-body-padding;
-
-                               li {
-                                       line-height: 1.125em;
-                                       margin: 0;
-                                       padding: 0.25em 0;
-                                       font-size: @menu-main-body-font-size;
-                                       word-wrap: break-word;
-
-                                       a {
-                                               color: @menu-main-body-link-color;
-                                               &:visited {
-                                                       color: @menu-main-body-link-visited-color;
-                                               }
-                                       }
-                               }
-                       }
-               }
-
-               &.first {
-                       background-image: none;
-                       margin-top: 0;
-                       h3 {
-                               display: none;
-                       }
-                       div.body {
-                               margin-left: 0.5em;
-                       }
-               }
-       }
-}
diff --git a/skins/vector/components/notifications.less b/skins/vector/components/notifications.less
deleted file mode 100644 (file)
index 05a1e61..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/* mediawiki.notification */
-.skin-vector {
-       .mw-notification-area {
-               font-size: 0.8em;
-       }
-
-       .mw-notification-area-layout {
-               top: 7em;
-       }
-
-       .mw-notification {
-               background-color: #fff;
-               background-color: rgba(255, 255, 255, 0.93);
-               padding: 0.75em 1.5em;
-               border: solid 1px @content-border-color;
-               border-radius: 0.75em;
-               box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125);
-       }
-}
diff --git a/skins/vector/components/personalMenu.less b/skins/vector/components/personalMenu.less
deleted file mode 100644 (file)
index 7256929..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Personal */
-#p-personal {
-       position: absolute;
-       top: 0.33em;
-       right: 0.75em;
-       /* Display on top of page tabs - bugs 37158, 48078 */
-       z-index: 100;
-
-       h3 {
-               display: none;
-       }
-
-       ul {
-               list-style-type: none;
-               list-style-image: none;
-               margin: 0;
-               padding-left: 10em; /* Keep from overlapping logo */
-       }
-
-       li {
-               line-height: 1.125em;
-               /* @noflip */
-               float: left;
-               margin-left: 0.75em;
-               margin-top: 0.5em;
-               font-size: @menu-personal-font-size;
-               white-space: nowrap;
-       }
-}
-
-/* Icon for Usernames */
-#pt-userpage,
-#pt-anonuserpage,
-#pt-login {
-       background-position: left top;
-       background-repeat: no-repeat;
-       /* SVG support using a transparent gradient to guarantee cross-browser
-        * compatibility (browsers able to understand gradient syntax support also SVG) */
-       .background-image-svg('images/user-icon.svg', 'images/user-icon.png');
-       padding-left: 15px !important;
-}
diff --git a/skins/vector/components/search.less b/skins/vector/components/search.less
deleted file mode 100644 (file)
index 46c3030..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-/* Search */
-#p-search {
-       /* @noflip */
-       float: left;
-       margin-right: 0.5em;
-       margin-left: 0.5em;
-
-       h3 {
-               display: none;
-       }
-
-       form,
-       input {
-               margin: 0;
-               margin-top: 0.4em;
-       }
-}
-
-div#simpleSearch {
-       display: block;
-       width: 14em;
-       height: 1.4em;
-       margin-top: 0.65em;
-       position: relative;
-       min-height: 1px; /* Gotta trigger hasLayout for IE7 */
-       border: solid 1px #aaa;
-       color: black;
-       background-color: white;
-       .background-image('images/search-fade.png');
-       background-position: top left;
-       background-repeat: repeat-x;
-
-       // Styles for both the search input and the button
-       input {
-               position: absolute;
-               margin: 0;
-               padding: 0;
-               border: 0;
-               background-color: transparent;
-               color: black;
-       }
-
-       // The search input
-       #searchInput {
-               top: 0;
-               left: 0;
-               width: 90%;
-               padding: 0.2em 0 0.2em 0.2em;
-               font-size: 13px;
-               direction: ltr;
-
-               &:focus {
-                       outline: none;
-               }
-
-               // These rules MAY NOT be merged because of how CSS requires browsers
-               // to parse unrecognized selectors!
-               // Note these rules ensure that placeholder text can be distinguished from
-               // standard text. In browsers which make this distinction clear these rules
-               // are not necessary.
-               // For inputs that use jquery.placeholder.js e.g. IE9-
-               &.placeholder {
-                       color: #999;
-               }
-               // Distinguish placeholder text in IE10+
-               &:-ms-input-placeholder {
-                       color: #999;
-               }
-               // Distinguish placeholder text in Firefox 18-
-               &:-moz-placeholder {
-                       color: #999;
-               }
-
-               // Undo the styles Webkit browsers apply to type=search fields,
-               // we provide our own
-               -webkit-appearance: textfield;
-
-               &::-webkit-search-decoration,
-               &::-webkit-search-cancel-button,
-               &::-webkit-search-results-button,
-               &::-webkit-search-results-decoration {
-                       -webkit-appearance: textfield;
-               }
-       }
-
-       // The buttons. They are displayed in the same position, and if both are
-       // present the fulltext search one obscures the 'Go' one.
-       #searchButton,
-       #mw-searchButton {
-               top: 0;
-               right: 0;
-               width: 10%;
-               height: 100%;
-               cursor: pointer;
-               /* Hide button text and replace it with the image. */
-               /* This would be 100% if not for Firefox shenanigans (bug 60900). */
-               text-indent: 200%;
-               /* Needed to make IE6 respect the text-indent. */
-               line-height: 1;
-               /* Opera 12 on RTL flips the text in a funny way without this. */
-               /* @noflip */
-               direction: ltr;
-               white-space: nowrap;
-               overflow: hidden;
-               .background-image-svg('images/search-ltr.svg', 'images/search-ltr.png');
-               background-position: center center;
-               background-repeat: no-repeat;
-       }
-
-       #mw-searchButton {
-               z-index: 1;
-       }
-}
diff --git a/skins/vector/components/tabs.less b/skins/vector/components/tabs.less
deleted file mode 100644 (file)
index 7e24ae7..0000000
+++ /dev/null
@@ -1,274 +0,0 @@
-/*
-Styling for namespace tabs (page, discussion) and views (read, edit, view history, watch and other actions)
-*/
-
-/* Navigation Labels */
-div.vectorTabs h3,
-div.vectorMenu h3 span {
-       display: none;
-}
-
-/* Namespaces and Views */
-div.vectorTabs {
-       /* @noflip */
-       float: left;
-       height: 2.5em;
-       .background-image('images/tab-break.png');
-       background-position: bottom left;
-       background-repeat: no-repeat;
-       padding-left: 1px;
-
-       ul {
-               /* @noflip */
-               float: left;
-               height: 100%;
-               list-style-type: none;
-               list-style-image: none;
-               margin: 0;
-               padding: 0;
-               .background-image('images/tab-break.png');
-               background-position: right bottom;
-               background-repeat: no-repeat;
-
-               li {
-                       /* @noflip */
-                       float: left;
-                       line-height: 1.125em;
-                       /* For IE6, overridden later to display:block by modern browsers */
-                       display: inline-block;
-                       height: 100%;
-                       margin: 0;
-                       padding: 0;
-                       background-color: #f3f3f3;
-                       .background-image('images/tab-normal-fade.png');
-                       background-position: bottom left;
-                       background-repeat: repeat-x;
-                       white-space: nowrap;
-               }
-
-               /* IGNORED BY IE6 which doesn't support child selector */
-               > li {
-                       display: block;
-               }
-       }
-
-       li {
-               &.new {
-                       a,
-                       a:visited{
-                               color: #a55858;
-                       }
-               }
-
-               &.selected {
-                       .background-image('images/tab-current-fade.png');
-                       a,
-                       a:visited{
-                               color: #333;
-                               text-decoration: none;
-                       }
-               }
-
-               &.icon {
-                       a {
-                               background-position: bottom right;
-                               background-repeat: no-repeat;
-                       }
-               }
-
-               a {
-                       /* For IE6, overridden later to display:block by modern browsers */
-                       display: inline-block;
-                       height: 1.9em;
-                       padding-left: 0.5em;
-                       padding-right: 0.5em;
-                       color: @menu-link-color;
-                       cursor: pointer;
-                       font-size: 0.8em;
-               }
-
-               /* Ignored by IE6 which doesn't support child selector */
-               > a {
-                       display: block;
-               }
-       }
-
-       span {
-               display: inline-block;
-               .background-image('images/tab-break.png');
-               background-position: bottom right;
-               background-repeat: no-repeat;
-
-               a  {
-                       /* For IE6, overridden later to display:block by modern browsers */
-                       display: inline-block;
-                       padding-top: 1.25em;
-               }
-
-               /* Ignored by IE6 which doesn't support child selector */
-               > a {
-                       /* @noflip */
-                       float: left;
-                       display: block;
-               }
-       }
-}
-
-/* Variants and Actions */
-div.vectorMenu {
-       /* @noflip */
-       direction: ltr;
-       /* @noflip */
-       float: left;
-       .background-image-svg('images/arrow-down-icon.svg', 'images/arrow-down-icon.png');
-       /* @noflip */
-       background-position: 100% 60%;
-       background-repeat: no-repeat;
-       cursor: pointer;
-       .transition(background-position 250ms);
-}
-
-div.vectorMenu.menuForceShow {
-       background-position: 100% 100%;
-}
-
-div.vectorMenuFocus {
-       .background-image-svg('images/arrow-down-focus-icon.svg', 'images/arrow-down-focus-icon.png');
-       background-position: 100% 60%;
-}
-
-body.rtl div.vectorMenu {
-       /* @noflip */
-       direction: rtl;
-}
-
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div#mw-head div.vectorMenu h3 {
-       /* @noflip */
-       float: left;
-       .background-image('images/tab-break.png');
-       background-repeat: no-repeat;
-       background-position: bottom left;
-       margin-left: -1px;
-}
-
-/* IGNORED BY IE6 */
-div#mw-head div.vectorMenu > h3 {
-       background-image: none;
-}
-
-div#mw-head div.vectorMenu h4,
-div.vectorMenu#p-variants #mw-vector-current-variant {
-       display: inline-block;
-       float: left;
-       font-size: 0.8em;
-       padding-left: 0.5em;
-       padding-top: 1.375em;
-       font-weight: normal;
-       border: none;
-}
-
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div.vectorMenu h3 a {
-       display: inline-block;
-       width: 24px;
-       height: 1.9em;
-       text-decoration: none;
-       .background-image('images/tab-break.png');
-       background-repeat: no-repeat;
-       background-position: bottom right;
-}
-
-/* IGNORED BY IE6 */
-div.vectorMenu h3 > a {
-       display: block;
-}
-
-div.vectorMenu div.menu {
-       position: relative;
-       display: none;
-       clear: both;
-       text-align: left;
-}
-
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-body.rtl div.vectorMenu div.menu {
-       /* @noflip */
-       margin-left: 24px;
-}
-
-/* IGNORED BY IE6 */
-body.rtl div.vectorMenu > div.menu {
-       /* @noflip */
-       margin-left: auto;
-}
-
-/* IGNORED BY IE6 */
-/* Also fixes old versions of FireFox */
-body.rtl div.vectorMenu > div.menu,
-x:-moz-any-link {
-       /* @noflip */
-       margin-left: 23px;
-}
-
-/* Enable forcing showing of the menu for accessibility */
-div.vectorMenu:hover div.menu,
-div.vectorMenu.menuForceShow div.menu {
-       display: block;
-}
-
-div.vectorMenu ul {
-       position: absolute;
-       background-color: white;
-       border: solid 1px silver;
-       border-top-width: 0;
-       list-style-type: none;
-       list-style-image: none;
-       padding: 0;
-       margin: 0;
-       margin-left: -1px;
-       text-align: left;
-}
-
-/* Fixes old versions of FireFox */
-div.vectorMenu ul,
-x:-moz-any-link {
-       min-width: 5em;
-}
-
-/* Returns things back to normal in modern versions of FireFox */
-div.vectorMenu ul,
-x:-moz-any-link,
-x:default {
-       min-width: 0;
-}
-
-div.vectorMenu li {
-       padding: 0;
-       margin: 0;
-       text-align: left;
-       line-height: 1em;
-}
-
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div.vectorMenu li a {
-       display: inline-block;
-       padding: 0.5em;
-       white-space: nowrap;
-       color: @menu-link-color;
-       cursor: pointer;
-       font-size: 0.8em;
-}
-
-/* IGNORED BY IE6 */
-div.vectorMenu li > a {
-       display: block;
-}
-
-div.vectorMenu li.selected a,
-div.vectorMenu li.selected a:visited {
-       color: #333;
-       text-decoration: none;
-}
-
-@import 'watchstar.less';
diff --git a/skins/vector/components/watchstar.less b/skins/vector/components/watchstar.less
deleted file mode 100644 (file)
index a389ed6..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-@import "mediawiki.mixins.rotation"
-
-/* Watch/Unwatch Icon Styling */
-#ca-unwatch.icon a,
-#ca-watch.icon a {
-       margin: 0;
-       padding: 0;
-       display: block;
-       width: 26px;
-       /* This hides the text but shows the background image */
-       padding-top: 3.1em;
-       margin-top: 0;
-       /* Only applied in IE6 */
-       margin-top: -0.8em !ie;
-       height: 0;
-       overflow: hidden;
-       background-position: 5px 60%;
-}
-#ca-unwatch.icon a {
-       .background-image-svg('images/unwatch-icon.svg', 'images/unwatch-icon.png');
-}
-#ca-watch.icon a {
-       .background-image-svg('images/watch-icon.svg', 'images/watch-icon.png');
-}
-#ca-unwatch.icon a:hover,
-#ca-unwatch.icon a:focus {
-       .background-image-svg('images/unwatch-icon-hl.svg', 'images/unwatch-icon-hl.png');
-}
-#ca-watch.icon a:hover,
-#ca-watch.icon a:focus {
-       .background-image-svg('images/watch-icon-hl.svg', 'images/watch-icon-hl.png');
-}
-#ca-unwatch.icon a.loading,
-#ca-watch.icon a.loading {
-       .background-image-svg('images/watch-icon-loading.svg', 'images/watch-icon-loading.png');
-       .rotation(700ms);
-       /* Suppress the hilarious rotating focus outline on Firefox */
-       outline: none;
-       cursor: default;
-       pointer-events: none;
-       background-position: 50% 60%;
-       -webkit-transform-origin: 50% 57%;
-       transform-origin: 50% 57%;
-}
-#ca-unwatch.icon a span,
-#ca-watch.icon a span {
-       display: none;
-}
diff --git a/skins/vector/csshover.htc b/skins/vector/csshover.htc
deleted file mode 100644 (file)
index a13ea68..0000000
+++ /dev/null
@@ -1,284 +0,0 @@
-<public:attach event="ondocumentready" onevent="CSSHover()" />
-<script>
-/**
- *     Whatever:hover - V3.11
- *     ------------------------------------------------------------
- *     Author  - Peter Nederlof, http://www.xs4all.nl/~peterned
- *     License - http://creativecommons.org/licenses/LGPL/2.1
- *
- *     Special thanks to Sergiu Dumitriu, http://purl.org/net/sergiu,
- *     for fixing the expression loop.
- *
- *     Whatever:hover is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU Lesser General Public
- *     License as published by the Free Software Foundation; either
- *     version 2.1 of the License, or (at your option) any later version.
- *
- *     Whatever:hover 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
- *     Lesser General Public License for more details.
- *
- *     howto: body { behavior:url("csshover3.htc"); }
- *     ------------------------------------------------------------
- */
-
-window.CSSHover = (function(){
-
-       // regular expressions, used and explained later on.
-       var REG_INTERACTIVE = /(^|\s)((([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active|focus))/i;
-       var REG_AFFECTED = /(.*?)\:(hover|active|focus)/i;
-       var REG_PSEUDO = /[^:]+:([a-z\-]+).*/i;
-       var REG_SELECT = /(\.([a-z0-9_\-]+):[a-z]+)|(:[a-z]+)/gi;
-       var REG_CLASS = /\.([a-z0-9_\-]*on(hover|active|focus))/i;
-       var REG_MSIE = /msie (5|6|7)/i;
-       var REG_COMPAT = /backcompat/i;
-
-       // property mapping, real css properties must be used in order to clear expressions later on...
-       // Uses obscure css properties that no-one is likely to use. The properties are borrowed to
-       // set an expression, and are then restored to the most likely correct value.
-       var Properties = {
-               index: 0,
-               list: ['text-kashida', 'text-kashida-space', 'text-justify'],
-               get: function() {
-                       return this.list[(this.index++)%this.list.length];
-               }
-       };
-
-       // camelize is used to convert css properties from (eg) text-kashida to textKashida
-       var camelize = function(str) {
-               return str.replace(/-(.)/mg, function(result, match){
-                       return match.toUpperCase();
-               });
-       };
-       
-       /**
-        *      Local CSSHover object
-        *      --------------------------
-        */
-       
-       var CSSHover = {
-               
-               // array of CSSHoverElements, used to unload created events
-               elements: [], 
-               
-               // buffer used for checking on duplicate expressions
-               callbacks: {}, 
-               
-               // init, called once ondomcontentready via the exposed window.CSSHover function
-               init:function() {
-                       // don't run in IE8 standards; expressions don't work in standards mode anyway, 
-                       // and the stuff we're trying to fix should already work properly
-                       if(!REG_MSIE.test(navigator.userAgent) && !REG_COMPAT.test(window.document.compatMode)) {
-                               return;
-                       }
-
-                       // start parsing the existing stylesheets
-                       var sheets = window.document.styleSheets, l = sheets.length;
-                       for(var i=0; i<l; i++) {
-                               this.parseStylesheet(sheets[i]);
-                       }
-               },
-
-               // called from init, parses individual stylesheets
-               parseStylesheet:function(sheet) {
-                       // check sheet imports and parse those recursively
-                       if(sheet.imports) {
-                               try {
-                                       var imports = sheet.imports;
-                                       var l = imports.length;
-                                       for(var i=0; i<l; i++) {
-                                               this.parseStylesheet(sheet.imports[i]);
-                                       }
-                               } catch(securityException){
-                                       // trycatch for various possible errors
-                               }
-                       }
-                       
-                       // interate the sheet's rules and send them to the parser
-                       try {
-                               var rules = sheet.rules;
-                               var r = rules.length;
-                               for(var j=0; j<r; j++) {
-                                       this.parseCSSRule(rules[j], sheet);
-                               }
-                       } catch(someException){
-                               // trycatch for various errors, most likely accessing the sheet's rules.
-                       }
-               },
-
-               // magic starts here ...
-               parseCSSRule:function(rule, sheet) {
-                       
-                       // The sheet is used to insert new rules into, this must be the same sheet the rule 
-                       // came from, to ensure that relative paths keep pointing to the right location.
-
-                       // only parse a rule if it contains an interactive pseudo.
-                       var select = rule.selectorText;
-                       if(REG_INTERACTIVE.test(select)) {
-                               var style = rule.style.cssText;
-                                       
-                               // affected elements are found by truncating the selector after the interactive pseudo,
-                               // eg: "div li:hover" >>  "div li"
-                               var affected = REG_AFFECTED.exec(select)[1];
-                                       
-                               // that pseudo is needed for a classname, and defines the type of interaction (focus, hover, active)
-                               // eg: "li:hover" >> "onhover"
-                               var pseudo = select.replace(REG_PSEUDO, 'on$1');
-                                       
-                               // the new selector is going to use that classname in a new css rule,
-                               // since IE6 doesn't support multiple classnames, this is merged into one classname
-                               // eg: "li:hover" >> "li.onhover",  "li.folder:hover" >> "li.folderonhover"
-                               var newSelect = select.replace(REG_SELECT, '.$2' + pseudo);
-                                       
-                               // the classname is needed for the events that are going to be set on affected nodes
-                               // eg: "li.folder:hover" >> "folderonhover"
-                               var className = REG_CLASS.exec(newSelect)[1];
-
-                               // no need to set the same callback more than once when the same selector uses the same classname
-                               var hash = affected + className;
-                               if(!this.callbacks[hash]) {
-                                       
-                                       // affected elements are given an expression under a borrowed css property, because fake properties
-                                       // can't have their expressions cleared. Different properties are used per pseudo, to avoid
-                                       // expressions from overwriting eachother. The expression does a callback to CSSHover.patch, 
-                                       // rerouted via the exposed window.CSSHover function.
-                                       var property = Properties.get();
-                                       var atRuntime = camelize(property);
-
-                                       // because the expression is added to the stylesheet, and styles are always applied to html that is
-                                       // dynamically added to the dom, the expression will also trigger for those new elements (provided
-                                       // they are selected by the affected selector). 
-                                       sheet.addRule(affected, property + ':expression(CSSHover(this, "'+pseudo+'", "'+className+'", "'+atRuntime+'"))');
-                                       
-                                       // hash it, so an identical selector/class combo does not duplicate the expression
-                                       this.callbacks[hash] = true;
-                               }
-                               
-                               // duplicate expressions need not be set, but the style could differ
-                               sheet.addRule(newSelect, style);
-                       }
-               },
-
-               // called via the expression, patches individual nodes
-               patch:function(node, type, className, property) {
-
-                       // restores the borrowed css property to the value of its immediate parent, clearing
-                       // the expression so that it's not repeatedly called. 
-                       try {
-                               var value = node.parentNode.currentStyle[property];
-                               node.style[property] = value;   
-                       } catch(e) {
-                               // the above reset should never fail, but just in case, clear the runtimeStyle if it does.
-                               // this will also stop the expression.
-                               node.runtimeStyle[property] = '';
-                       }                       
-               
-                       // just to make sure, also keep track of patched classnames locally on the node
-                       if(!node.csshover) {
-                               node.csshover = [];
-                       }
-
-                       // and check for it to prevent duplicate events with the same classname from being set
-                       if(!node.csshover[className]) {
-                               node.csshover[className] = true;
-
-                               // create an instance for the given type and class
-                               var element = new CSSHoverElement(node, type, className);
-                               
-                               // and store that instance for unloading later on
-                               this.elements.push(element);
-                       }
-
-                       // returns a dummy value to the expression
-                       return type;
-               },
-
-               // unload stuff onbeforeunload
-               unload:function() {
-                       try {
-                               
-                               // remove events
-                               var l = this.elements.length;
-                               for(var i=0; i<l; i++) {
-                                       this.elements[i].unload();
-                               }
-
-                               // and set properties to null 
-                               this.elements = [];
-                               this.callbacks = {};
-
-                       } catch (e) {
-                       }
-               }
-       };
-
-       /**
-        *      CSSHoverElement
-        *      --------------------------
-        */
-
-       // the event types associated with the interactive pseudos
-       var CSSEvents = {
-               onhover:  { activator: 'onmouseenter', deactivator: 'onmouseleave' },
-               onactive: { activator: 'onmousedown',  deactivator: 'onmouseup' },
-               onfocus:  { activator: 'onfocus',      deactivator: 'onblur' }
-       };
-       
-       // CSSHoverElement constructor, called via CSSHover.patch
-       function CSSHoverElement(node, type, className) {
-
-               // the CSSHoverElement patches individual nodes by manually applying the events that should 
-               // have fired by the css pseudoclasses, eg mouseenter and mouseleave for :hover. 
-
-               this.node = node;
-               this.type = type;
-               var replacer = new RegExp('(^|\\s)'+className+'(\\s|$)', 'g');
-
-               // store event handlers for removal onunload
-               this.activator =   function(){ node.className += ' ' + className; };
-               this.deactivator = function(){ node.className = node.className.replace(replacer, ' '); };
-               
-               // add the events
-               node.attachEvent(CSSEvents[type].activator, this.activator);
-               node.attachEvent(CSSEvents[type].deactivator, this.deactivator);
-       }
-       
-       CSSHoverElement.prototype = {
-               // onbeforeunload, called via CSSHover.unload
-               unload:function() {
-
-                       // remove events 
-                       this.node.detachEvent(CSSEvents[this.type].activator, this.activator);
-                       this.node.detachEvent(CSSEvents[this.type].deactivator, this.deactivator);
-
-                       // and set properties to null 
-                       this.activator = null;
-                       this.deactivator = null;
-                       this.node = null;
-                       this.type = null;
-               }
-       };
-
-       // add the unload to the onbeforeunload event
-       window.attachEvent('onbeforeunload', function(){
-               CSSHover.unload();
-       });
-
-       /**
-        *      Public hook
-        *      --------------------------
-        */
-       
-       return function(node, type, className, property) {
-               if(node) {
-                       // called via the css expression; patches individual nodes
-                       return CSSHover.patch(node, type, className, property);
-               } else {
-                       // called ondomcontentready via the public:attach node
-                       CSSHover.init();
-               }
-       };
-
-})();
-</script>
\ No newline at end of file
diff --git a/skins/vector/csshover.min.htc b/skins/vector/csshover.min.htc
deleted file mode 100644 (file)
index 7e5c57b..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<public:attach event="ondocumentready" onevent="CSSHover()" />
-<script>
-/**
- * Whatever:hover - V3.11
- * http://www.xs4all.nl/~peterned/
- *     
- * Copyright (c) 2009 Peter Nederlof
- * Licensed under the LGPL license
- * http://creativecommons.org/licenses/LGPL/2.1
- */
-window.CSSHover=(function(){var m=/(^|\s)((([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active|focus))/i;var n=/(.*?)\:(hover|active|focus)/i;var o=/[^:]+:([a-z\-]+).*/i;var p=/(\.([a-z0-9_\-]+):[a-z]+)|(:[a-z]+)/gi;var q=/\.([a-z0-9_\-]*on(hover|active|focus))/i;var s=/msie (5|6|7)/i;var t=/backcompat/i;var u={index:0,list:['text-kashida','text-kashida-space','text-justify'],get:function(){return this.list[(this.index++)%this.list.length]}};var v=function(c){return c.replace(/-(.)/mg,function(a,b){return b.toUpperCase()})};var w={elements:[],callbacks:{},init:function(){if(!s.test(navigator.userAgent)&&!t.test(window.document.compatMode)){return}var a=window.document.styleSheets,l=a.length;for(var i=0;i<l;i++){this.parseStylesheet(a[i])}},parseStylesheet:function(a){if(a.imports){try{var b=a.imports;var l=b.length;for(var i=0;i<l;i++){this.parseStylesheet(a.imports[i])}}catch(securityException){}}try{var c=a.rules;var r=c.length;for(var j=0;j<r;j++){this.parseCSSRule(c[j],a)}}catch(someException){}},parseCSSRule:function(a,b){var c=a.selectorText;if(m.test(c)){var d=a.style.cssText;var e=n.exec(c)[1];var f=c.replace(o,'on$1');var g=c.replace(p,'.$2'+f);var h=q.exec(g)[1];var i=e+h;if(!this.callbacks[i]){var j=u.get();var k=v(j);b.addRule(e,j+':expression(CSSHover(this, "'+f+'", "'+h+'", "'+k+'"))');this.callbacks[i]=true}b.addRule(g,d)}},patch:function(a,b,c,d){try{var f=a.parentNode.currentStyle[d];a.style[d]=f}catch(e){a.runtimeStyle[d]=''}if(!a.csshover){a.csshover=[]}if(!a.csshover[c]){a.csshover[c]=true;var g=new CSSHoverElement(a,b,c);this.elements.push(g)}return b},unload:function(){try{var l=this.elements.length;for(var i=0;i<l;i++){this.elements[i].unload()}this.elements=[];this.callbacks={}}catch(e){}}};var x={onhover:{activator:'onmouseenter',deactivator:'onmouseleave'},onactive:{activator:'onmousedown',deactivator:'onmouseup'},onfocus:{activator:'onfocus',deactivator:'onblur'}};function CSSHoverElement(a,b,c){this.node=a;this.type=b;var d=new RegExp('(^|\\s)'+c+'(\\s|$)','g');this.activator=function(){a.className+=' '+c};this.deactivator=function(){a.className=a.className.replace(d,' ')};a.attachEvent(x[b].activator,this.activator);a.attachEvent(x[b].deactivator,this.deactivator)}CSSHoverElement.prototype={unload:function(){this.node.detachEvent(x[this.type].activator,this.activator);this.node.detachEvent(x[this.type].deactivator,this.deactivator);this.activator=null;this.deactivator=null;this.node=null;this.type=null}};window.attachEvent('onbeforeunload',function(){w.unload()});return function(a,b,c,d){if(a){return w.patch(a,b,c,d)}else{w.init()}}})();
-</script>
diff --git a/skins/vector/images/arrow-collapsed-ltr.png b/skins/vector/images/arrow-collapsed-ltr.png
deleted file mode 100644 (file)
index 063ac6f..0000000
Binary files a/skins/vector/images/arrow-collapsed-ltr.png and /dev/null differ
diff --git a/skins/vector/images/arrow-collapsed-ltr.svg b/skins/vector/images/arrow-collapsed-ltr.svg
deleted file mode 100644 (file)
index b943caa..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M6.001 2.998l5.001 5-5.001 5z" fill="#797979"/></svg>
\ No newline at end of file
diff --git a/skins/vector/images/arrow-collapsed-rtl.png b/skins/vector/images/arrow-collapsed-rtl.png
deleted file mode 100644 (file)
index c346218..0000000
Binary files a/skins/vector/images/arrow-collapsed-rtl.png and /dev/null differ
diff --git a/skins/vector/images/arrow-collapsed-rtl.svg b/skins/vector/images/arrow-collapsed-rtl.svg
deleted file mode 100644 (file)
index 5faf356..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M9.999 13.002l-5.001-5 5.001-5z" fill="#797979"/></svg>
\ No newline at end of file
diff --git a/skins/vector/images/arrow-down-focus-icon.png b/skins/vector/images/arrow-down-focus-icon.png
deleted file mode 100644 (file)
index 7640bd1..0000000
Binary files a/skins/vector/images/arrow-down-focus-icon.png and /dev/null differ
diff --git a/skins/vector/images/arrow-down-focus-icon.svg b/skins/vector/images/arrow-down-focus-icon.svg
deleted file mode 100644 (file)
index 826c280..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="22" height="16"><path d="M15.502 6.001l-5 5.001-5-5.001z" fill="#929292"/></svg>
\ No newline at end of file
diff --git a/skins/vector/images/arrow-down-icon.png b/skins/vector/images/arrow-down-icon.png
deleted file mode 100644 (file)
index 12e3b93..0000000
Binary files a/skins/vector/images/arrow-down-icon.png and /dev/null differ
diff --git a/skins/vector/images/arrow-down-icon.svg b/skins/vector/images/arrow-down-icon.svg
deleted file mode 100644 (file)
index 8e31b2f..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="22" height="16"><path d="M15.502 6.001l-5 5.001-5-5.001z" fill="#797979"/></svg>
\ No newline at end of file
diff --git a/skins/vector/images/arrow-expanded.png b/skins/vector/images/arrow-expanded.png
deleted file mode 100644 (file)
index 0221028..0000000
Binary files a/skins/vector/images/arrow-expanded.png and /dev/null differ
diff --git a/skins/vector/images/arrow-expanded.svg b/skins/vector/images/arrow-expanded.svg
deleted file mode 100644 (file)
index e744ec3..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M13.002 6.001l-5 5.001-5-5.001z" fill="#797979"/></svg>
\ No newline at end of file
diff --git a/skins/vector/images/bullet-icon.png b/skins/vector/images/bullet-icon.png
deleted file mode 100644 (file)
index 7bae98f..0000000
Binary files a/skins/vector/images/bullet-icon.png and /dev/null differ
diff --git a/skins/vector/images/external-link-ltr-icon.png b/skins/vector/images/external-link-ltr-icon.png
deleted file mode 100644 (file)
index 6308383..0000000
Binary files a/skins/vector/images/external-link-ltr-icon.png and /dev/null differ
diff --git a/skins/vector/images/external-link-ltr-icon.svg b/skins/vector/images/external-link-ltr-icon.svg
deleted file mode 100644 (file)
index 5969d03..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="10" height="10"><g transform="translate(-826.429 -698.791)"><rect width="5.982" height="5.982" x="826.929" y="702.309" fill="#fff" stroke="#06c"/><g><path d="M831.194 698.791h5.234v5.391l-1.571 1.545-1.31-1.31-2.725 2.725-2.689-2.689 2.808-2.808-1.311-1.311z" fill="#06f"/><path d="M835.424 699.795l.022 4.885-1.817-1.817-2.881 2.881-1.228-1.228 2.881-2.881-1.851-1.851z" fill="#fff"/></g></g></svg>
\ No newline at end of file
diff --git a/skins/vector/images/external-link-rtl-icon.png b/skins/vector/images/external-link-rtl-icon.png
deleted file mode 100644 (file)
index 5313234..0000000
Binary files a/skins/vector/images/external-link-rtl-icon.png and /dev/null differ
diff --git a/skins/vector/images/external-link-rtl-icon.svg b/skins/vector/images/external-link-rtl-icon.svg
deleted file mode 100644 (file)
index 75a7025..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="10" height="10"><g transform="translate(-826.429 -698.791)"><rect width="5.982" height="5.982" x="-835.929" y="702.309" transform="scale(-1 1)" fill="#fff" stroke="#06c"/><g><path d="M831.663 698.791h-5.234v5.391l1.571 1.545 1.31-1.31 2.725 2.725 2.689-2.689-2.808-2.808 1.311-1.311z" fill="#06f"/><path d="M827.433 699.795l-.022 4.885 1.817-1.817 2.881 2.881 1.228-1.228-2.881-2.881 1.851-1.851z" fill="#fff"/></g></g></svg>
\ No newline at end of file
diff --git a/skins/vector/images/link-icon.png b/skins/vector/images/link-icon.png
deleted file mode 100644 (file)
index b70efaa..0000000
Binary files a/skins/vector/images/link-icon.png and /dev/null differ
diff --git a/skins/vector/images/magnify-clip.png b/skins/vector/images/magnify-clip.png
deleted file mode 100644 (file)
index 00a9cee..0000000
Binary files a/skins/vector/images/magnify-clip.png and /dev/null differ
diff --git a/skins/vector/images/page-fade.png b/skins/vector/images/page-fade.png
deleted file mode 100644 (file)
index b4a6034..0000000
Binary files a/skins/vector/images/page-fade.png and /dev/null differ
diff --git a/skins/vector/images/portal-break-ltr.png b/skins/vector/images/portal-break-ltr.png
deleted file mode 100644 (file)
index 20bf366..0000000
Binary files a/skins/vector/images/portal-break-ltr.png and /dev/null differ
diff --git a/skins/vector/images/portal-break-rtl.png b/skins/vector/images/portal-break-rtl.png
deleted file mode 100644 (file)
index e5f6223..0000000
Binary files a/skins/vector/images/portal-break-rtl.png and /dev/null differ
diff --git a/skins/vector/images/portal-break.png b/skins/vector/images/portal-break.png
deleted file mode 100644 (file)
index 90c3918..0000000
Binary files a/skins/vector/images/portal-break.png and /dev/null differ
diff --git a/skins/vector/images/preferences/break.png b/skins/vector/images/preferences/break.png
deleted file mode 100644 (file)
index b529308..0000000
Binary files a/skins/vector/images/preferences/break.png and /dev/null differ
diff --git a/skins/vector/images/preferences/fade.png b/skins/vector/images/preferences/fade.png
deleted file mode 100644 (file)
index 638084d..0000000
Binary files a/skins/vector/images/preferences/fade.png and /dev/null differ
diff --git a/skins/vector/images/search-fade.png b/skins/vector/images/search-fade.png
deleted file mode 100644 (file)
index 6cb7d28..0000000
Binary files a/skins/vector/images/search-fade.png and /dev/null differ
diff --git a/skins/vector/images/search-ltr.png b/skins/vector/images/search-ltr.png
deleted file mode 100644 (file)
index 1db2eb2..0000000
Binary files a/skins/vector/images/search-ltr.png and /dev/null differ
diff --git a/skins/vector/images/search-ltr.svg b/skins/vector/images/search-ltr.svg
deleted file mode 100644 (file)
index 0720f20..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="12" height="13"><g stroke-width="2" stroke="#6c6c6c" fill="none"><path d="M11.29 11.71l-4-4"/><circle cx="5" cy="5" r="4"/></g></svg>
\ No newline at end of file
diff --git a/skins/vector/images/search-rtl.png b/skins/vector/images/search-rtl.png
deleted file mode 100644 (file)
index c26c8d0..0000000
Binary files a/skins/vector/images/search-rtl.png and /dev/null differ
diff --git a/skins/vector/images/search-rtl.svg b/skins/vector/images/search-rtl.svg
deleted file mode 100644 (file)
index 622d5f9..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="12" height="13"><g stroke-width="2" stroke="#6c6c6c" fill="none"><path d="M.71 11.71l4-4"/><circle cx="7" cy="5" r="4"/></g></svg>
\ No newline at end of file
diff --git a/skins/vector/images/tab-break.png b/skins/vector/images/tab-break.png
deleted file mode 100644 (file)
index 6d37af5..0000000
Binary files a/skins/vector/images/tab-break.png and /dev/null differ
diff --git a/skins/vector/images/tab-current-fade.png b/skins/vector/images/tab-current-fade.png
deleted file mode 100644 (file)
index b8f772f..0000000
Binary files a/skins/vector/images/tab-current-fade.png and /dev/null differ
diff --git a/skins/vector/images/tab-normal-fade.png b/skins/vector/images/tab-normal-fade.png
deleted file mode 100644 (file)
index f719a88..0000000
Binary files a/skins/vector/images/tab-normal-fade.png and /dev/null differ
diff --git a/skins/vector/images/unwatch-icon-hl.png b/skins/vector/images/unwatch-icon-hl.png
deleted file mode 100644 (file)
index 6b2b502..0000000
Binary files a/skins/vector/images/unwatch-icon-hl.png and /dev/null differ
diff --git a/skins/vector/images/unwatch-icon-hl.svg b/skins/vector/images/unwatch-icon-hl.svg
deleted file mode 100644 (file)
index d52d547..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><defs><linearGradient id="a"><stop offset="0" stop-color="#c2edff"/><stop offset=".5" stop-color="#68bdff"/><stop offset="1" stop-color="#fff"/></linearGradient><linearGradient x1="13.47" y1="14.363" x2="4.596" y2="3.397" id="b" xlink:href="#a" gradientUnits="userSpaceOnUse"/></defs><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="url(#b)" stroke="#c8b250" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
diff --git a/skins/vector/images/unwatch-icon.png b/skins/vector/images/unwatch-icon.png
deleted file mode 100644 (file)
index 9fd9436..0000000
Binary files a/skins/vector/images/unwatch-icon.png and /dev/null differ
diff --git a/skins/vector/images/unwatch-icon.svg b/skins/vector/images/unwatch-icon.svg
deleted file mode 100644 (file)
index cde7bc5..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><defs><linearGradient id="a"><stop offset="0" stop-color="#c2edff"/><stop offset=".5" stop-color="#68bdff"/><stop offset="1" stop-color="#fff"/></linearGradient><linearGradient x1="13.47" y1="14.363" x2="4.596" y2="3.397" id="b" xlink:href="#a" gradientUnits="userSpaceOnUse"/></defs><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="url(#b)" stroke="#7cb5d1" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
diff --git a/skins/vector/images/user-icon.png b/skins/vector/images/user-icon.png
deleted file mode 100644 (file)
index 57f9f8d..0000000
Binary files a/skins/vector/images/user-icon.png and /dev/null differ
diff --git a/skins/vector/images/user-icon.svg b/skins/vector/images/user-icon.svg
deleted file mode 100644 (file)
index 4335bcf..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="12" height="13.837"><defs><linearGradient id="e"><stop offset="0"/><stop offset="1" stop-opacity="0"/></linearGradient><linearGradient id="b"><stop offset="0" stop-color="#3b74bc"/><stop offset="1" stop-color="#2d5990"/></linearGradient><linearGradient id="c"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#c9c9c9"/></linearGradient><linearGradient id="a"><stop offset="0"/><stop offset="1" stop-opacity="0"/></linearGradient><linearGradient id="d"><stop offset="0" stop-color="#f4d9b1"/><stop offset="1" stop-color="#df9725"/></linearGradient><radialGradient cx="31.113" cy="19.009" r="8.662" fx="31.113" fy="19.009" id="f" xlink:href="#a" gradientUnits="userSpaceOnUse"/><radialGradient cx="28.09" cy="27.203" r="13.565" fx="28.09" fy="27.203" id="g" xlink:href="#b" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.298 0 0 .885 -8.359 4.94)"/><linearGradient x1="30.936" y1="29.553" x2="30.936" y2="35.803" id="h" xlink:href="#c" gradientUnits="userSpaceOnUse"/><radialGradient cx="31.113" cy="19.009" r="8.662" fx="31.113" fy="19.009" id="i" xlink:href="#a" gradientUnits="userSpaceOnUse"/><radialGradient cx="29.345" cy="17.064" r="9.162" fx="29.345" fy="17.064" id="j" xlink:href="#d" gradientUnits="userSpaceOnUse" gradientTransform="matrix(.788 0 0 .788 6.221 3.618)"/><linearGradient x1="20.662" y1="35.818" x2="22.627" y2="36.218" id="k" xlink:href="#e" gradientUnits="userSpaceOnUse" gradientTransform="matrix(.983 .182 -.182 .983 6.232 -2.651)"/><linearGradient x1="22.687" y1="36.39" x2="21.408" y2="35.74" id="l" xlink:href="#e" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-.978 .21 .21 .978 55.11 -3.945)"/></defs><g color="#000"><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" transform="matrix(.693 0 0 .374 -15.548 3.481)" fill="url(#f)" fill-rule="evenodd" overflow="visible"/><path d="M4.046 12.398h4.137c1.172 0 2.332-.43 2.758-1.655.404-1.163.069-3.378-2.551-5.171h-4.895c-2.62 1.655-2.947 3.917-2.344 5.24.614 1.347 1.655 1.586 2.896 1.586z" fill="url(#g)" fill-rule="evenodd" stroke="#204a87" stroke-linecap="round" stroke-linejoin="round" overflow="visible" stroke-width="0.39"/><path d="M4.321 6.193c1.241 1.103 1.793 5.102 1.793 5.102s.552-3.999 1.517-5.171l-3.309.069z" fill="url(#h)" fill-rule="evenodd" overflow="visible"/><path d="M5.21 6.607s-.839.648-.767 1.428c-.796-.702-.819-2.048-.819-2.048l1.586.62z" fill="#729fcf" fill-rule="evenodd" overflow="visible"/><path d="M4.018 11.992l4.092-.009c1.029 0 2.049-.377 2.422-1.453.355-1.022-.037-2.967-2.338-4.542l-4.495-.095c-2.301 1.453-2.747 3.441-2.208 4.697.538 1.256 1.324 1.393 2.526 1.401z" opacity=".215" stroke="#fff" stroke-linecap="round" stroke-linejoin="round" overflow="visible" fill="none" stroke-width="0.39"/><path d="M6.941 6.607s.839.648.767 1.428c.796-.702.819-2.048.819-2.048l-1.586.62z" fill="#729fcf" fill-rule="evenodd" overflow="visible"/><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" transform="matrix(.39 0 0 .39 -6.138 -2.475)" fill="url(#i)" fill-rule="evenodd" overflow="visible"/><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" fill="url(#j)" fill-rule="evenodd" stroke="#c17d11" stroke-linecap="round" stroke-linejoin="round" overflow="visible" transform="matrix(.39 0 0 .39 -6.089 -3.84)"/><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" transform="matrix(.342 0 0 .342 -4.598 -2.929)" opacity=".196" stroke="#fff" stroke-width="1.14" stroke-linecap="round" stroke-linejoin="round" overflow="visible" fill="none"/><path d="M2.433 12.062c-.487-.213-.704-.725-.704-.725.328-1.587 1.451-2.748 1.451-2.748s-.889 2.5-.746 3.473z" opacity=".228" fill="url(#k)" fill-rule="evenodd" overflow="visible"/><path d="M9.806 11.728c.48-.227.704-.781.704-.781-.374-1.577-1.551-2.669-1.551-2.669s.961 2.474.847 3.45z" opacity=".228" fill="url(#l)" fill-rule="evenodd" overflow="visible"/></g></svg>
\ No newline at end of file
diff --git a/skins/vector/images/watch-icon-hl.png b/skins/vector/images/watch-icon-hl.png
deleted file mode 100644 (file)
index 4cb87cd..0000000
Binary files a/skins/vector/images/watch-icon-hl.png and /dev/null differ
diff --git a/skins/vector/images/watch-icon-hl.svg b/skins/vector/images/watch-icon-hl.svg
deleted file mode 100644 (file)
index 664c671..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="#fff" stroke="#c8b250" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
diff --git a/skins/vector/images/watch-icon-loading.png b/skins/vector/images/watch-icon-loading.png
deleted file mode 100644 (file)
index 5f0c490..0000000
Binary files a/skins/vector/images/watch-icon-loading.png and /dev/null differ
diff --git a/skins/vector/images/watch-icon-loading.svg b/skins/vector/images/watch-icon-loading.svg
deleted file mode 100644 (file)
index 751eb14..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="#fff" stroke="#d1d1d1" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
diff --git a/skins/vector/images/watch-icon.png b/skins/vector/images/watch-icon.png
deleted file mode 100644 (file)
index 39daff2..0000000
Binary files a/skins/vector/images/watch-icon.png and /dev/null differ
diff --git a/skins/vector/images/watch-icon.svg b/skins/vector/images/watch-icon.svg
deleted file mode 100644 (file)
index 907b05b..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="#fff" stroke="#7cb5d1" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
diff --git a/skins/vector/screen-hd.less b/skins/vector/screen-hd.less
deleted file mode 100644 (file)
index 8b286f4..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Vector screen styles for high definition displays */
-
-@import "variables.less";
-
-div#content {
-       margin-left: 11em;
-       padding: 1.25em 1.5em 1.5em 1.5em;
-}
-#p-logo {
-       left: @menu-main-logo-left;
-}
-div#footer {
-       margin-left: 11em;
-       padding: 1.25em;
-}
-#mw-panel {
-       padding-left: 0.5em;
-}
-#p-search {
-       margin-right: 1em;
-}
-#left-navigation {
-       margin-left: 11em;
-}
-#p-personal {
-       right: 1em;
-}
-#mw-head-base {
-       margin-left: 11em;
-}
diff --git a/skins/vector/screen.less b/skins/vector/screen.less
deleted file mode 100644 (file)
index f7b374f..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Vector screen styles */
-
-@import "variables.less";
-
-@import "components/common.less";
-@import "components/animations.less";
-@import "components/navigation.less";
-@import "components/footer.less";
-@import 'components/notifications.less';
-@import "components/externalLinks.less";
diff --git a/skins/vector/special.less b/skins/vector/special.less
deleted file mode 100644 (file)
index 6af4b1e..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-/**
- * Adjusts for decreased margin-bottom for h2 elements inside #content div
- * introduced in March / April 2014 typography update.
- */
-table.mw-specialpages-table {
-       margin-top: 0;
-}
diff --git a/skins/vector/special.preferences.less b/skins/vector/special.preferences.less
deleted file mode 100644 (file)
index a9b1006..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-@import "mediawiki.mixins";
-@import "variables";
-
-/**
- * The following code is highly modified from monobook. It would be nice if the
- * preftoc id was more human readable like preferences-toc for instance,
- * howerver this would require backporting the other skins.
- */
-
-#preftoc {
-       /* Tabs */
-       width: 100%;
-       float: left;
-       clear: both;
-       margin: 0 !important;
-       padding: 0 !important;
-       .background-image('images/preferences/break.png');
-       background-position: bottom left;
-       background-repeat: no-repeat;
-
-       li {
-               /* Tab */
-               float: left;
-               margin: 0;
-               padding: 0;
-               padding-right: 1px;
-               height: 2.25em;
-               white-space: nowrap;
-               list-style-type: none;
-               list-style-image: none;
-               .background-image('images/preferences/break.png');
-               background-position: bottom right;
-               background-repeat: no-repeat;
-
-               /* Sadly, IE6 won't understand this */
-               &:first-child {
-                       margin-left: 1px;
-               }
-
-               &.selected {
-                       a {
-                               .background-image('images/preferences/fade.png');
-                               background-position: bottom;
-                               background-repeat: repeat-x;
-                               color: #333;
-                               text-decoration: none;
-                       }
-               }
-       }
-
-       a,
-       a:active {
-               display: inline-block;
-               position: relative;
-               color: @menu-link-color;
-               padding: 0.5em;
-               text-decoration: none;
-               background-image: none;
-               font-size: 0.9em;
-       }
-
-       a:hover,
-       a:focus {
-               text-decoration: underline;
-       }
-}
-
-#preferences {
-       float: left;
-       width: 100%;
-       margin: 0;
-       margin-top: -2px;
-       clear: both;
-       border: solid 1px #ccc;
-       background-color: #fafafa;
-
-       fieldset {
-               border: none;
-               border-top: solid 1px #ccc;
-
-               &.prefsection {
-                       border: none;
-                       padding: 0;
-                       margin: 1em;
-
-                       legend.mainLegend {
-                               display: none;
-                       }
-               }
-       }
-
-       legend {
-               color: #666;
-       }
-
-       td {
-               padding-left: 0.5em;
-               padding-right: 0.5em;
-       }
-
-       div.mw-prefs-buttons {
-               padding: 1em;
-
-               input {
-                       margin-right: 0.25em;
-               }
-       }
-}
-
-.htmlform-tip {
-       font-size: x-small;
-       padding: .2em 2em;
-       color: #666;
-}
diff --git a/skins/vector/variables.less b/skins/vector/variables.less
deleted file mode 100644 (file)
index 41cb1da..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-@html-font-size: 1em;
-
-// Page content
-// FIXME: Use global variable since Echo and CentralNotice use this variable
-@content-border-color: #a7d7f9;
-// FIXME: Find an open font that works with this stack and is readable by Windows users
-@content-font-family: sans-serif;
-@content-font-color: #252525;
-@content-font-size: 0.875em;
-@content-line-height: 1.6;
-@content-padding: 1em;
-@content-heading-font-size: 1.8em;
-@content-heading-font-family: "Linux Libertine", Georgia, Times, serif;
-@body-background-color: #fff;
-@heading-line-height: 1.3;
-
-// Navigation
-@menu-background-color: #f6f6f6;
-
-// Common menu
-@menu-link-color: #0645ad;
-
-// Main menu
-@menu-main-font-size: inherit;
-
-@menu-main-heading-font-size: 0.75em;
-@menu-main-heading-padding: 0.25em 0 0.25em 0.25em;
-@menu-main-heading-color: #4d4d4d;
-
-@menu-main-body-font-size: 0.75em;
-@menu-main-body-link-color: #0645ad;
-@menu-main-body-link-visited-color: #0b0080;
-@menu-main-body-margin: 0 0 0 1.25em;
-@menu-main-body-padding: 0;
-
-@menu-main-logo-left: 0.5em;
-
-// Personal menu
-@menu-personal-font-size: 0.75em;
diff --git a/skins/vector/vector.js b/skins/vector/vector.js
deleted file mode 100644 (file)
index d8ac3c8..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-/**
- * Vector-specific scripts
- */
-jQuery( function ( $ ) {
-       $( 'div.vectorMenu' ).each( function () {
-               var $el = $( this );
-               $el.find( '> h3 > a' ).parent()
-                       .attr( 'tabindex', '0' )
-                       // For accessibility, show the menu when the h3 is clicked (bug 24298/46486)
-                       .on( 'click keypress', function ( e ) {
-                               if ( e.type === 'click' || e.which === 13 ) {
-                                       $el.toggleClass( 'menuForceShow' );
-                                       e.preventDefault();
-                               }
-                       } )
-                       // When the heading has focus, also set a class that will change the arrow icon
-                       .focus( function () {
-                               $el.find( '> a' ).addClass( 'vectorMenuFocus' );
-                       } )
-                       .blur( function () {
-                               $el.find( '> a' ).removeClass( 'vectorMenuFocus' );
-                       } )
-                       .find( '> a:first' )
-                       // As the h3 can already be focused there's no need for the link to be focusable
-                       .attr( 'tabindex', '-1' );
-       } );
-
-       /**
-        * Sidebar
-        */
-       $( '#mw-panel > .portal:first' ).addClass( 'first' );
-
-       /**
-        * Collapsible tabs for Vector
-        */
-       var $cactions = $( '#p-cactions' );
-
-       // Bind callback functions to animate our drop down menu in and out
-       // and then call the collapsibleTabs function on the menu
-       $( '#p-views ul' )
-               .bind( 'beforeTabCollapse', function () {
-                       // If the dropdown was hidden, show it
-                       if ( $cactions.hasClass( 'emptyPortlet' ) ) {
-                               $cactions
-                                       .removeClass( 'emptyPortlet' )
-                                       .find( 'h3' )
-                                               .css( 'width', '1px' ).animate( { 'width': '24px' }, 390 );
-                       }
-               } )
-               .bind( 'beforeTabExpand', function () {
-                       // If we're removing the last child node right now, hide the dropdown
-                       if ( $cactions.find( 'li' ).length === 1 ) {
-                               $cactions.find( 'h3' ).animate( { 'width': '1px' }, 390, function () {
-                                       $( this ).attr( 'style', '' )
-                                               .parent().addClass( 'emptyPortlet' );
-                               });
-                       }
-               } )
-               .collapsibleTabs();
-} );
index f18903b..63c3d01 100644 (file)
@@ -5,8 +5,8 @@
 /*jshint node:true */
 module.exports = function ( grunt ) {
        grunt.loadNpmTasks( 'grunt-contrib-jshint' );
-       grunt.loadNpmTasks( 'grunt-banana-checker' );
        grunt.loadNpmTasks( 'grunt-contrib-watch' );
+       grunt.loadNpmTasks( 'grunt-banana-checker' );
        grunt.loadNpmTasks( 'grunt-jscs-checker' );
        grunt.loadNpmTasks( 'grunt-jsonlint' );
 
@@ -16,14 +16,14 @@ module.exports = function ( grunt ) {
                pkg: grunt.file.readJSON( __dirname + '/package.json' ),
                jshint: {
                        options: {
-                               jshintrc: '.jshintrc'
+                               jshintrc: true
                        },
-                       all: [ '*.js', '{includes,languages,resources,skins,tests}/**/*.js' ]
+                       all: [
+                               '*.js',
+                               '{includes,languages,resources,skins,tests}/**/*.js'
+                       ]
                },
                jscs: {
-                       // Known issues:
-                       // - https://github.com/mdevils/node-jscs/issues/277
-                       // - https://github.com/mdevils/node-jscs/issues/278
                        all: [
                                '<%= jshint.all %>',
                                // Auto-generated file with JSON (double quotes)
@@ -56,7 +56,7 @@ module.exports = function ( grunt ) {
                                '.jshintignore',
                                '.jshintrc'
                        ],
-                       tasks: ['test']
+                       tasks: 'test'
                }
        } );
 
index 0bbee17..5d52160 100644 (file)
@@ -145,6 +145,7 @@ class ParserTest {
 
                $this->hooks = array();
                $this->functionHooks = array();
+               $this->transparentHooks = array();
                self::setUp();
        }
 
@@ -528,6 +529,10 @@ class ParserTest {
                        $parser->setFunctionHook( $tag, $callback, $flags );
                }
 
+               foreach ( $this->transparentHooks as $tag => $callback ) {
+                       $parser->setTransparentTagHook( $tag, $callback );
+               }
+
                wfRunHooks( 'ParserTestParser', array( &$parser ) );
 
                return $parser;
@@ -1007,7 +1012,7 @@ class ParserTest {
                                'size'        => 12345,
                                'width'       => 240,
                                'height'      => 180,
-                               'bits'        => 24,
+                               'bits'        => 0,
                                'media_type'  => MEDIATYPE_DRAWING,
                                'mime'        => 'image/svg+xml',
                                'metadata'    => serialize( array() ),
@@ -1015,34 +1020,6 @@ class ParserTest {
                                'fileExists'  => true
                ), $this->db->timestamp( '20010115123500' ), $user );
 
-               $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Portrait.png' ) );
-               # again, note that size/width/height below are ignored; see above.
-               $image->recordUpload2( '', 'Upload of tall bitmap', 'Some tall bitmap', array(
-                       'size'        => 12345,
-                       'width'       => 180,
-                       'height'      => 240,
-                       'bits'        => 8,
-                       'media_type'  => MEDIATYPE_BITMAP,
-                       'mime'        => 'image/png',
-                       'metadata'    => serialize( array() ),
-                       'sha1'        => wfBaseConvert( '', 16, 36, 31 ),
-                       'fileExists'  => true
-               ), $this->db->timestamp( '20140515134200' ), $user );
-
-               $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Portrait.svg' ) );
-               # again, note that size/width/height below are ignored; see above.
-               $image->recordUpload2( '', 'Upload of tall SVG', 'Some tall SVG', array(
-                       'size'        => 12345,
-                       'width'       => 180,
-                       'height'      => 240,
-                       'bits'        => 24,
-                       'media_type'  => MEDIATYPE_DRAWING,
-                       'mime'        => 'image/svg+xml',
-                       'metadata'    => serialize( array() ),
-                       'sha1'        => wfBaseConvert( '', 16, 36, 31 ),
-                       'fileExists'  => true
-               ), $this->db->timestamp( '20140325124200' ), $user );
-
                # This image will be blacklisted in [[MediaWiki:Bad image list]]
                $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Bad.jpg' ) );
                $image->recordUpload2( '', 'zomgnotcensored', 'Borderline image', array(
@@ -1063,6 +1040,7 @@ class ParserTest {
                        'size' => 3249,
                        'width' => 2480,
                        'height' => 3508,
+                       'bits' => 0,
                        'media_type' => MEDIATYPE_BITMAP,
                        'mime' => 'image/vnd.djvu',
                        'metadata' => '<?xml version="1.0" ?>
@@ -1162,25 +1140,18 @@ class ParserTest {
                }
 
                wfMkdirParents( $dir . '/3/3a', null, __METHOD__ );
-               copy( "$IP/skins/monobook/headbg.jpg", "$dir/3/3a/Foobar.jpg" );
+               copy( "$IP/tests/phpunit/data/parser/headbg.jpg", "$dir/3/3a/Foobar.jpg" );
                wfMkdirParents( $dir . '/e/ea', null, __METHOD__ );
-               copy( "$IP/skins/monobook/wiki.png", "$dir/e/ea/Thumb.png" );
+               copy( "$IP/tests/phpunit/data/parser/wiki.png", "$dir/e/ea/Thumb.png" );
                wfMkdirParents( $dir . '/0/09', null, __METHOD__ );
-               copy( "$IP/skins/monobook/headbg.jpg", "$dir/0/09/Bad.jpg" );
+               copy( "$IP/tests/phpunit/data/parser/headbg.jpg", "$dir/0/09/Bad.jpg" );
                wfMkdirParents( $dir . '/f/ff', null, __METHOD__ );
                file_put_contents( "$dir/f/ff/Foobar.svg",
                        '<?xml version="1.0" encoding="utf-8"?>' .
                        '<svg xmlns="http://www.w3.org/2000/svg"' .
                        ' version="1.1" width="240" height="180"/>' );
-               wfMkdirParents( $dir . '/9/93', null, __METHOD__ );
-               copy( "$IP/tests/phpunit/data/media/Portrait.png", "$dir/9/93/Portrait.png" );
-               wfMkdirParents( $dir . '/f/fc', null, __METHOD__ );
-               file_put_contents( "$dir/f/fc/Portrait.svg",
-                       '<?xml version="1.0" encoding="utf-8"?>' .
-                       '<svg xmlns="http://www.w3.org/2000/svg"' .
-                       ' version="1.1" width="180" height="240"/>' );
                wfMkdirParents( $dir . '/5/5f', null, __METHOD__ );
-               copy( "$IP/tests/phpunit/data/media/LoremIpsum.djvu", "$dir/5/5f/LoremIpsum.djvu" );
+               copy( "$IP/tests/phpunit/data/parser/LoremIpsum.djvu", "$dir/5/5f/LoremIpsum.djvu" );
 
                return $dir;
        }
@@ -1265,17 +1236,6 @@ class ParserTest {
                                "$dir/thumb/f/ff/Foobar.svg/langde-270px-Foobar.svg.png",
                                "$dir/thumb/f/ff/Foobar.svg/langde-360px-Foobar.svg.png",
 
-                               "$dir/9/93/Portrait.png",
-                               "$dir/thumb/9/93/Portrait.png/165px-Portrait.png",
-
-                               "$dir/f/fc/Portrait.svg",
-                               "$dir/thumb/f/fc/Portrait.svg/165px-Portrait.svg.png",
-                               "$dir/thumb/f/fc/Portrait.svg/225px-Portrait.svg.png",
-                               "$dir/thumb/f/fc/Portrait.svg/247px-Portrait.svg.png",
-                               "$dir/thumb/f/fc/Portrait.svg/330px-Portrait.svg.png",
-                               "$dir/thumb/f/fc/Portrait.svg/337px-Portrait.svg.png",
-                               "$dir/thumb/f/fc/Portrait.svg/450px-Portrait.svg.png",
-
                                "$dir/math/f/a/5/fa50b8b616463173474302ca3e63586b.png",
                        )
                );
@@ -1287,18 +1247,10 @@ class ParserTest {
                                "$dir/thumb/3/3a/Foobar.jpg",
                                "$dir/thumb/3/3a",
                                "$dir/thumb/3",
-                               "$dir/9/93",
-                               "$dir/9",
-                               "$dir/thumb/9/93/Portrait.png",
-                               "$dir/thumb/9/93/",
-                               "$dir/thumb/9/",
                                "$dir/e/ea",
                                "$dir/e",
-                               "$dir/f/fc/",
                                "$dir/f/ff/",
                                "$dir/f/",
-                               "$dir/thumb/f/fc/Portrait.svg",
-                               "$dir/thumb/f/fc/",
                                "$dir/thumb/f/ff/Foobar.svg",
                                "$dir/thumb/f/ff/",
                                "$dir/thumb/f/",
@@ -1576,6 +1528,29 @@ class ParserTest {
                return true;
        }
 
+       /**
+        * Steal a callback function from the primary parser, save it for
+        * application to our scary parser. If the hook is not installed,
+        * abort processing of this file.
+        *
+        * @param string $name
+        * @return bool True if function hook is present
+        */
+       public function requireTransparentHook( $name ) {
+               global $wgParser;
+
+               $wgParser->firstCallInit(); // make sure hooks are loaded.
+
+               if ( isset( $wgParser->mTransparentTagHooks[$name] ) ) {
+                       $this->transparentHooks[$name] = $wgParser->mTransparentTagHooks[$name];
+               } else {
+                       echo "   This test suite requires the '$name' transparent hook extension, skipping.\n";
+                       return false;
+               }
+
+               return true;
+       }
+
        /**
         * Run the "tidy" command on text if the $wgUseTidy
         * global is true
index 55801aa..03e4959 100644 (file)
@@ -413,12 +413,8 @@ Simple list
 * Item 1
 * Item 2
 !! html
-<ul>
-<li> Item 1
-</li>
-<li> Item 2
-</li>
-</ul>
+<ul><li> Item 1</li>
+<li> Item 2</li></ul>
 
 !! end
 
@@ -441,38 +437,21 @@ Italics and bold
 * plain l'''italic''plain
 * plain l''''bold''' plain
 !! html
-<ul>
-<li> plain
-</li>
-<li> plain<i>italic</i>plain
-</li>
-<li> plain<i>italic</i>plain<i>italic</i>plain
-</li>
-<li> plain<b>bold</b>plain
-</li>
-<li> plain<b>bold</b>plain<b>bold</b>plain
-</li>
-<li> plain<i>italic</i>plain<b>bold</b>plain
-</li>
-<li> plain<b>bold</b>plain<i>italic</i>plain
-</li>
-<li> plain<i>italic<b>bold-italic</b>italic</i>plain
-</li>
-<li> plain<b>bold<i>bold-italic</i>bold</b>plain
-</li>
-<li> plain<i><b>bold-italic</b>italic</i>plain
-</li>
-<li> plain<b><i>bold-italic</i>bold</b>plain
-</li>
-<li> plain<i>italic<b>bold-italic</b></i>plain
-</li>
-<li> plain<b>bold<i>bold-italic</i></b>plain
-</li>
-<li> plain l'<i>italic</i>plain
-</li>
-<li> plain l'<b>bold</b> plain
-</li>
-</ul>
+<ul><li> plain</li>
+<li> plain<i>italic</i>plain</li>
+<li> plain<i>italic</i>plain<i>italic</i>plain</li>
+<li> plain<b>bold</b>plain</li>
+<li> plain<b>bold</b>plain<b>bold</b>plain</li>
+<li> plain<i>italic</i>plain<b>bold</b>plain</li>
+<li> plain<b>bold</b>plain<i>italic</i>plain</li>
+<li> plain<i>italic<b>bold-italic</b>italic</i>plain</li>
+<li> plain<b>bold<i>bold-italic</i>bold</b>plain</li>
+<li> plain<i><b>bold-italic</b>italic</i>plain</li>
+<li> plain<b><i>bold-italic</i>bold</b>plain</li>
+<li> plain<i>italic<b>bold-italic</b></i>plain</li>
+<li> plain<b>bold<i>bold-italic</i></b>plain</li>
+<li> plain l'<i>italic</i>plain</li>
+<li> plain l'<b>bold</b> plain</li></ul>
 
 !! end
 
@@ -1114,6 +1093,59 @@ Non-html5 tags should be accepted
 </p>
 !! end
 
+## a,rtc not permitted
+## i,b,br omitted
+!! test
+Text-level semantic html elements in wikitext
+!! wikitext
+<em>text</em>
+<strong>text</strong>
+<small>text</small>
+<s>text</s>
+<cite>text</cite>
+<q>text</q>
+<dfn>text</dfn>
+<abbr>text</abbr>
+<data>text</data>
+<time>text</time>
+<code>text</code>
+<var>text</var>
+<samp>text</samp>
+<kbd>text</kbd>
+<sub>text</sub>
+<u>text</u>
+<mark>text</mark>
+<ruby><rb>明日<rp>(</rp><rt>Ashita</rt><rp>)</rp></rb></ruby>
+<bdi>text</bdi>
+<bdo>text</bdo>
+<span>text</span>
+<wbr />
+!! html
+<p><em>text</em>
+<strong>text</strong>
+<small>text</small>
+<s>text</s>
+<cite>text</cite>
+<q>text</q>
+<dfn>text</dfn>
+<abbr>text</abbr>
+<data>text</data>
+<time>text</time>
+<code>text</code>
+<var>text</var>
+<samp>text</samp>
+<kbd>text</kbd>
+<sub>text</sub>
+<u>text</u>
+<mark>text</mark>
+<ruby><rb>明日<rp>(</rp><rt>Ashita</rt><rp>)</rp></rb></ruby>
+<bdi>text</bdi>
+<bdo>text</bdo>
+<span>text</span>
+<wbr />
+</p>
+!! end
+
 !! test
 Non-word characters don't terminate tag names (bug 17663, 40670, 52022)
 !! wikitext
@@ -1215,24 +1247,12 @@ nowiki 3
 *There is not nowiki.
 *There is <nowiki>nowiki</nowiki>.
 !! html
-<dl>
-<dd>There is not nowiki.
-</dd>
-<dd>There is nowiki.
-</dd>
-</dl>
-<ol>
-<li>There is not nowiki.
-</li>
-<li>There is nowiki.
-</li>
-</ol>
-<ul>
-<li>There is not nowiki.
-</li>
-<li>There is nowiki.
-</li>
-</ul>
+<dl><dd>There is not nowiki.</dd>
+<dd>There is nowiki.</dd></dl>
+<ol><li>There is not nowiki.</li>
+<li>There is nowiki.</li></ol>
+<ul><li>There is not nowiki.</li>
+<li>There is nowiki.</li></ul>
 
 !! end
 
@@ -1256,6 +1276,16 @@ parsoid
 </p>
 !! end
 
+!! test
+Properly escape nowiki when combined with other wiki markup
+!! options
+parsoid=html2wt
+!! wikitext
+<nowiki>* &lt;/nowiki&gt;</nowiki> tag
+!! html
+<p>* &lt;/nowiki&gt; tag</p>
+!! end
+
 ###
 ### Comments
 ###
@@ -1992,11 +2022,34 @@ Templates: Indent-Pre: 1f: Wrapping should be based on expanded content
 Things that look like <pre> tags aren't treated as such
 !! wikitext
 Barack Obama <President> of the United States
+<President></President>
 !! html
 <p>Barack Obama &lt;President&gt; of the United States
+&lt;President&gt;&lt;/President&gt;
 </p>
 !! end
 
+## PHP parser discards the "<pre " string
+!! test
+Handle broken pre-like tags (bug 64025)
+!! options
+parsoid=wt2html
+!! wikitext
+{{echo|<pre <pre>x</pre>}}
+
+<table><pre </table>
+!! html/php
+<pre>x</pre>
+<table><pre></pre></table>
+
+!! html/parsoid
+<span typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;pre &lt;pre>x&lt;/pre>"}},"i":0}}]}'>&lt;pre </span>
+<pre>x</pre>
+
+<span>&lt;pre </span>
+<table></table>
+!! end
+
 !! test
 Parsoid: handle pre with space after attribute
 !! options
@@ -2085,10 +2138,7 @@ Templates: Strip leading and trailing whitespace from named-param values
 </p><p>b
 </p><p>c
 </p>
-<ul>
-<li> d
-</li>
-</ul>
+<ul><li> d</li></ul>
 
 !! end
 
@@ -2129,10 +2179,7 @@ Templates: Don't strip whitespace from positional-param values
 </pre>
 <p><br />
 </p>
-<ul>
-<li> f
-</li>
-</ul>
+<ul><li> f</li></ul>
 <p><br />
 </p>
 <pre>g
@@ -2224,6 +2271,16 @@ data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},
 "params":{"1":{"wt":"[http://foo.com/a|b a|b]"}},"i":0}}]}'>a|b</a></p>
 !! end
 
+!! test
+Parsoid: Pipe in template with nested template in external link target in template parameter (seriously)
+!! options
+parsoid
+!! wikitext
+{{echo|[{{fullurl:{{FULLPAGENAME}}|action=edit}} bar]}}
+!! html
+<p typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[{{fullurl:{{FULLPAGENAME}}|action=edit}} bar]"}},"i":0}}]}'>[Main Page bar]</p>
+!! end
+
 !! test
 Templates: Don't escape already nowiki-escaped text in template parameters
 !! options
@@ -2372,6 +2429,57 @@ c
 
 !!end
 
+!!test
+2d. Indent-Pre and tables
+!! wikitext
+ a
+ {|
+ | b
+ |}
+!! html/php
+<pre>a
+</pre>
+<table>
+<tr>
+<td> b
+</td></tr></table>
+
+!! html/parsoid
+<pre>a</pre>
+<table>
+<tbody>
+<tr>
+<td> b</td></tr>
+ </tbody></table>
+!!end
+
+!!test
+2e. Indent-Pre and table-line syntax
+!! wikitext
+ a
+ | b
+ | c
+!! html/parsoid
+<pre>a
+| b
+| c</pre>
+!!end
+
+!!test
+2f. Indent-pre started by table-line syntax
+!! wikitext
+a
+ | b
+ | c
+!! html/parsoid
+<p>a</p>
+<pre>
+| b
+| c</pre>
+!!end
+
 !!test
 3a. Indent-Pre and block tags (single-line html)
 !! wikitext
@@ -2689,8 +2797,81 @@ foo
 foo
 </pre>
 
+!! html/parsoid
+<pre data-parsoid='{"stx":"html"}'>foo</pre>
+
+<pre data-parsoid='{"stx":"html","strippedNL":"\n"}'>
+foo
+</pre>
+
+<pre data-parsoid='{"stx":"html"}'>
+
+foo
+</pre>
+
+<pre data-parsoid='{"stx":"html"}'>
+
+
+foo
+</pre>
 !!end
 
+!! test
+HTML-pre: big spaces
+!! wikitext
+<pre>
+
+
+
+
+haha
+
+
+
+
+haha
+
+
+
+
+</pre>
+!! html
+<pre>
+
+
+
+
+haha
+
+
+
+
+haha
+
+
+
+
+</pre>
+
+!! html/parsoid
+<pre data-parsoid='{"stx":"html"}'>
+
+
+
+
+haha
+
+
+
+
+haha
+
+
+
+
+</pre>
+!! end
+
 !!test
 HTML-pre: 2: indented text
 !! wikitext
@@ -2733,11 +2914,8 @@ Simple definition
 !! wikitext
 ; name : Definition
 !! html
-<dl>
-<dt> name&#160;</dt>
-<dd> Definition
-</dd>
-</dl>
+<dl><dt> name&#160;</dt>
+<dd> Definition</dd></dl>
 
 !! end
 
@@ -2746,10 +2924,7 @@ Definition list for indentation only
 !! wikitext
 : Indented text
 !! html
-<dl>
-<dd> Indented text
-</dd>
-</dl>
+<dl><dd> Indented text</dd></dl>
 
 !! end
 
@@ -2758,11 +2933,8 @@ Definition list with no space
 !! wikitext
 ;name:Definition
 !! html
-<dl>
-<dt>name</dt>
-<dd>Definition
-</dd>
-</dl>
+<dl><dt>name</dt>
+<dd>Definition</dd></dl>
 
 !!end
 
@@ -2771,11 +2943,8 @@ Definition list with URL link
 !! wikitext
 ; http://example.com/ : definition
 !! html
-<dl>
-<dt> <a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a>&#160;</dt>
-<dd> definition
-</dd>
-</dl>
+<dl><dt> <a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a>&#160;</dt>
+<dd> definition</dd></dl>
 
 !! end
 
@@ -2784,11 +2953,8 @@ Definition list with bracketed URL link
 !! wikitext
 ;[http://www.example.com/ Example]:Something about it
 !! html
-<dl>
-<dt><a rel="nofollow" class="external text" href="http://www.example.com/">Example</a></dt>
-<dd>Something about it
-</dd>
-</dl>
+<dl><dt><a rel="nofollow" class="external text" href="http://www.example.com/">Example</a></dt>
+<dd>Something about it</dd></dl>
 
 !! end
 
@@ -2797,11 +2963,8 @@ Definition list with wikilink containing colon
 !! wikitext
 ; [[Help:FAQ]]: The least-read page on Wikipedia
 !! html
-<dl>
-<dt> <a href="/index.php?title=Help:FAQ&amp;action=edit&amp;redlink=1" class="new" title="Help:FAQ (page does not exist)">Help:FAQ</a></dt>
-<dd> The least-read page on Wikipedia
-</dd>
-</dl>
+<dl><dt> <a href="/index.php?title=Help:FAQ&amp;action=edit&amp;redlink=1" class="new" title="Help:FAQ (page does not exist)">Help:FAQ</a></dt>
+<dd> The least-read page on Wikipedia</dd></dl>
 
 !! end
 
@@ -2811,11 +2974,8 @@ Definition list with news link containing colon
 !! wikitext
 ;  news:alt.wikipedia.rox: This isn't even a real newsgroup!
 !! html
-<dl>
-<dt>  <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a></dt>
-<dd> This isn't even a real newsgroup!
-</dd>
-</dl>
+<dl><dt>  <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a></dt>
+<dd> This isn't even a real newsgroup!</dd></dl>
 
 !! end
 
@@ -2824,10 +2984,7 @@ Malformed definition list with colon
 !! wikitext
 ;  news:alt.wikipedia.rox -- don't crash or enter an infinite loop
 !! html
-<dl>
-<dt>  <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a> -- don't crash or enter an infinite loop
-</dt>
-</dl>
+<dl><dt>  <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a> -- don't crash or enter an infinite loop</dt></dl>
 
 !! end
 
@@ -2836,11 +2993,8 @@ Definition lists: colon in external link text
 !! wikitext
 ; [http://www.wikipedia2.org/ Wikipedia : The Next Generation]: OK, I made that up
 !! html
-<dl>
-<dt> <a rel="nofollow" class="external text" href="http://www.wikipedia2.org/">Wikipedia&#160;: The Next Generation</a></dt>
-<dd> OK, I made that up
-</dd>
-</dl>
+<dl><dt> <a rel="nofollow" class="external text" href="http://www.wikipedia2.org/">Wikipedia&#160;: The Next Generation</a></dt>
+<dd> OK, I made that up</dd></dl>
 
 !! end
 
@@ -2849,10 +3003,7 @@ Definition lists: colon in HTML attribute
 !! wikitext
 ;<b style="display: inline">bold</b>
 !! html
-<dl>
-<dt><b style="display: inline">bold</b>
-</dt>
-</dl>
+<dl><dt><b style="display: inline">bold</b></dt></dl>
 
 !! end
 
@@ -2861,11 +3012,8 @@ Definition lists: self-closed tag
 !! wikitext
 ;one<br/>two : two-line fun
 !! html
-<dl>
-<dt>one<br />two&#160;</dt>
-<dd> two-line fun
-</dd>
-</dl>
+<dl><dt>one<br />two&#160;</dt>
+<dd> two-line fun</dd></dl>
 
 !! end
 
@@ -2897,15 +3045,9 @@ Definition and unordered list using wiki syntax nested in unordered list using h
 </li></ul>
 !! html
 <ul><li>
-<dl>
-<dt> term&#160;</dt>
-<dd> description
-</dd>
-</dl>
-<ul>
-<li> unordered
-</li>
-</ul>
+<dl><dt> term&#160;</dt>
+<dd> description</dd></dl>
+<ul><li> unordered</li></ul>
 </li></ul>
 
 !! end
@@ -2917,11 +3059,8 @@ Definition list with empty definition and following paragraph
 ; term:
 Paragraph text
 !! html
-<dl>
-<dt> term</dt>
-<dd>
-</dd>
-</dl>
+<dl><dt> term</dt>
+<dd></dd></dl>
 <p>Paragraph text
 </p>
 !! end
@@ -2929,17 +3068,9 @@ Paragraph text
 !! test
 Nested definition lists using html syntax
 !! wikitext
-<dl><dd>
-<dl>
-<dd>Foo</dd>
-</dl>
-</dd></dl>
-!! html
-<dl><dd>
-<dl>
-<dd>Foo</dd>
-</dl>
-</dd></dl>
+<dl><dt>x</dt>
+<dd>a</dd>
+<dd>b</dd></dl>
 
 !! end
 
@@ -2950,14 +3081,9 @@ Definition Lists: No nesting: Multiple dd's
 :a
 :b
 !! html
-<dl>
-<dt>x
-</dt>
-<dd>a
-</dd>
-<dd>b
-</dd>
-</dl>
+<dl><dt>x</dt>
+<dd>a</dd>
+<dd>b</dd></dl>
 
 !! end
 
@@ -2968,18 +3094,9 @@ Definition Lists: Indentation: Regular
 ::i2
 :::i3
 !! html
-<dl>
-<dd>i1
-<dl>
-<dd>i2
-<dl>
-<dd>i3
-</dd>
-</dl>
-</dd>
-</dl>
-</dd>
-</dl>
+<dl><dd>i1
+<dl><dd>i2
+<dl><dd>i3</dd></dl></dd></dl></dd></dl>
 
 !! end
 
@@ -2989,17 +3106,8 @@ Definition Lists: Indentation: Missing 1st level
 ::i2
 :::i3
 !! html
-<dl>
-<dd><dl>
-<dd>i2
-<dl>
-<dd>i3
-</dd>
-</dl>
-</dd>
-</dl>
-</dd>
-</dl>
+<dl><dd><dl><dd>i2
+<dl><dd>i3</dd></dl></dd></dl></dd></dl>
 
 !! end
 
@@ -3008,16 +3116,7 @@ Definition Lists: Indentation: Multi-level indent
 !! wikitext
 :::i3
 !! html
-<dl>
-<dd><dl>
-<dd><dl>
-<dd>i3
-</dd>
-</dl>
-</dd>
-</dl>
-</dd>
-</dl>
+<dl><dd><dl><dd><dl><dd>i3</dd></dl></dd></dl></dd></dl>
 
 !! end
 
@@ -3139,17 +3238,11 @@ Table / list interaction: indented table with lists in table contents
 
 <tr>
 <td> a
-<ul>
-<li> b
-</li>
-</ul>
+<ul><li> b</li></ul>
 </td></tr>
 <tr>
 <td> c
-<ul>
-<li> d
-</li>
-</ul>
+<ul><li> d</li></ul>
 </td></tr></table></dd></dl>
 
 !! end
@@ -3172,27 +3265,15 @@ Table / list interaction: lists nested in tables nested in indented lists
 <dl><dd><table>
 <tr>
 <td>
-<dl>
-<dd>a
-</dd>
-<dd>b
-</dd>
-</dl>
+<dl><dd>a</dd>
+<dd>b</dd></dl>
 </td>
 <td>
-<ul>
-<li>c
-</li>
-<li>d
-</li>
-</ul>
+<ul><li>c</li>
+<li>d</li></ul>
 </td></tr></table></dd></dl>
-<ul>
-<li>e
-</li>
-<li>f
-</li>
-</ul>
+<ul><li>e</li>
+<li>f</li></ul>
 
 !!end
 
@@ -3280,18 +3361,8 @@ Definition Lists: Nesting: Test 4
 ::;t3
 :::d3
 !! html
-<dl>
-<dd><dl>
-<dd><dl>
-<dt>t3
-</dt>
-<dd>d3
-</dd>
-</dl>
-</dd>
-</dl>
-</dd>
-</dl>
+<dl><dd><dl><dd><dl><dt>t3</dt>
+<dd>d3</dd></dl></dd></dl></dd></dl>
 
 !! end
 
@@ -3306,22 +3377,9 @@ Definition Lists: Mixed Lists: Test 1
 ::* bar
 :; baz
 !! html/php
-<dl>
-<dd><dl>
-<dt><ul>
-<li> foo
-</li>
-<li> bar
-</li>
-</ul>
-</dt>
-</dl>
-<dl>
-<dt> baz
-</dt>
-</dl>
-</dd>
-</dl>
+<dl><dd><dl><dt><ul><li> foo</li>
+<li> bar</li></ul></dt></dl>
+<dl><dt> baz</dt></dl></dd></dl>
 
 !! html/parsoid
 <dl>
@@ -3345,15 +3403,8 @@ Definition Lists: Mixed Lists: Test 2
 *: d1
 *: d2
 !! html
-<ul>
-<li><dl>
-<dd> d1
-</dd>
-<dd> d2
-</dd>
-</dl>
-</li>
-</ul>
+<ul><li><dl><dd> d1</dd>
+<dd> d2</dd></dl></li></ul>
 
 !! end
 
@@ -3364,21 +3415,8 @@ Definition Lists: Mixed Lists: Test 3
 *::: d1
 *::: d2
 !! html
-<ul>
-<li><dl>
-<dd><dl>
-<dd><dl>
-<dd> d1
-</dd>
-<dd> d2
-</dd>
-</dl>
-</dd>
-</dl>
-</dd>
-</dl>
-</li>
-</ul>
+<ul><li><dl><dd><dl><dd><dl><dd> d1</dd>
+<dd> d2</dd></dl></dd></dl></dd></dl></li></ul>
 
 !! end
 
@@ -3389,17 +3427,10 @@ Definition Lists: Mixed Lists: Test 4
 *;d1 :d2
 *;d3 :d4
 !! html
-<ul>
-<li><dl>
-<dt>d1&#160;</dt>
-<dd>d2
-</dd>
+<ul><li><dl><dt>d1&#160;</dt>
+<dd>d2</dd>
 <dt>d3&#160;</dt>
-<dd>d4
-</dd>
-</dl>
-</li>
-</ul>
+<dd>d4</dd></dl></li></ul>
 
 !! end
 
@@ -3410,17 +3441,8 @@ Definition Lists: Mixed Lists: Test 5
 *:d1
 *:: d2
 !! html
-<ul>
-<li><dl>
-<dd>d1
-<dl>
-<dd> d2
-</dd>
-</dl>
-</dd>
-</dl>
-</li>
-</ul>
+<ul><li><dl><dd>d1
+<dl><dd> d2</dd></dl></dd></dl></li></ul>
 
 !! end
 
@@ -3431,23 +3453,8 @@ Definition Lists: Mixed Lists: Test 6
 #*:d1
 #*::: d3
 !! html
-<ol>
-<li><ul>
-<li><dl>
-<dd>d1
-<dl>
-<dd><dl>
-<dd> d3
-</dd>
-</dl>
-</dd>
-</dl>
-</dd>
-</dl>
-</li>
-</ul>
-</li>
-</ol>
+<ol><li><ul><li><dl><dd>d1
+<dl><dd><dl><dd> d3</dd></dl></dd></dl></dd></dl></li></ul></li></ol>
 
 !! end
 
@@ -3458,15 +3465,8 @@ Definition Lists: Mixed Lists: Test 7
 :* d1
 :* d2
 !! html
-<dl>
-<dd><ul>
-<li> d1
-</li>
-<li> d2
-</li>
-</ul>
-</dd>
-</dl>
+<dl><dd><ul><li> d1</li>
+<li> d2</li></ul></dd></dl>
 
 !! end
 
@@ -3477,20 +3477,8 @@ Definition Lists: Mixed Lists: Test 8
 :* d1
 ::* d2
 !! html
-<dl>
-<dd><ul>
-<li> d1
-</li>
-</ul>
-<dl>
-<dd><ul>
-<li> d2
-</li>
-</ul>
-</dd>
-</dl>
-</dd>
-</dl>
+<dl><dd><ul><li> d1</li></ul>
+<dl><dd><ul><li> d2</li></ul></dd></dl></dd></dl>
 
 !! end
 
@@ -3500,35 +3488,20 @@ Definition Lists: Mixed Lists: Test 9
 !! wikitext
 *;foo :bar
 !! html
-<ul>
-<li><dl>
-<dt>foo&#160;</dt>
-<dd>bar
-</dd>
-</dl>
-</li>
-</ul>
+<ul><li><dl><dt>foo&#160;</dt>
+<dd>bar</dd></dl></li></ul>
 
 !! end
 
 
-!! test
-Definition Lists: Mixed Lists: Test 10
-!! wikitext
-*#;foo :bar
-!! html
-<ul>
-<li><ol>
-<li><dl>
-<dt>foo&#160;</dt>
-<dd>bar
-</dd>
-</dl>
-</li>
-</ol>
-</li>
-</ul>
-
+!! test
+Definition Lists: Mixed Lists: Test 10
+!! wikitext
+*#;foo :bar
+!! html
+<ul><li><ol><li><dl><dt>foo&#160;</dt>
+<dd>bar</dd></dl></li></ol></li></ul>
+
 !! end
 
 # The Parsoid team disagrees with the PHP parser's seemingly-random
@@ -3542,37 +3515,10 @@ Definition Lists: Mixed Lists: Test 11
 *#*#;*;;foo :bar
 *#*#;boo :baz
 !! html/php
-<ul>
-<li><ol>
-<li><ul>
-<li><ol>
-<li><dl>
-<dt>foo&#160;</dt>
-<dd><ul>
-<li><dl>
-<dt><dl>
-<dt>bar
-</dt>
-</dl>
-</dd>
-</dl>
-</li>
-</ul>
-</dd>
-</dl>
-<dl>
-<dt>boo&#160;</dt>
-<dd>baz
-</dd>
-</dl>
-</li>
-</ol>
-</li>
-</ul>
-</li>
-</ol>
-</li>
-</ul>
+<ul><li><ol><li><ul><li><ol><li><dl><dt>foo&#160;</dt>
+<dd><ul><li><dl><dt><dl><dt>bar</dt></dl></dd></dl></li></ul></dd></dl>
+<dl><dt>boo&#160;</dt>
+<dd>baz</dd></dl></li></ol></li></ul></li></ol></li></ul>
 
 !! html/parsoid
 <ul>
@@ -3610,32 +3556,8 @@ Definition Lists: Weird Ones: Test 1
 !! wikitext
 *#;*::;; foo : bar (who uses this?)
 !! html/php
-<ul>
-<li><ol>
-<li><dl>
-<dt> foo&#160;</dt>
-<dd><ul>
-<li><dl>
-<dd><dl>
-<dd><dl>
-<dt><dl>
-<dt> bar (who uses this?)
-</dt>
-</dl>
-</dd>
-</dl>
-</dd>
-</dl>
-</dd>
-</dl>
-</li>
-</ul>
-</dd>
-</dl>
-</li>
-</ol>
-</li>
-</ul>
+<ul><li><ol><li><dl><dt> foo&#160;</dt>
+<dd><ul><li><dl><dd><dl><dd><dl><dt><dl><dt> bar (who uses this?)</dt></dl></dd></dl></dd></dl></dd></dl></li></ul></dd></dl></li></ol></li></ul>
 
 !! html/parsoid
 <ul>
@@ -3839,6 +3761,20 @@ foo//example.com/Foo
 </p>
 !! end
 
+!! test
+External links: with no contents
+!! wikitext
+[http://en.wikipedia.org/wiki/Foo]
+
+[[wikipedia:Foo|Bar]]
+
+[[wikipedia:Foo|<span>Bar</span>]]
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://en.wikipedia.org/wiki/Foo"></a></p>
+<p><a rel="mw:ExtLink" href="http://en.wikipedia.org/wiki/Foo">Bar</a></p>
+<p><a rel="mw:ExtLink" href="http://en.wikipedia.org/wiki/Foo"><span>Bar</span></a></p>
+!! end
+
 !! test
 External image
 !! wikitext
@@ -4331,19 +4267,37 @@ Bug 4781, 5267: %28, %29 in bracketed URL
 <p><a rel="mw:ExtLink" href="http://www.example.com/?title=Ben-Hur_%281959_film%29">link</a></p>
 !! end
 
-# Note that parsoid does not munge anchor text; all non-space
-# characters are valid in HTML5 ids.
 !! test
-Anchor containing a #. (bug 63430)
+External link containing a period in the anchor. (bug 63947)
 !! wikitext
-[[Main Page#And#Link]]
+[//foo.org/bar#baz. bang]
+
+[//foo.org/bar. bang]
 !! html/php
-<p><a href="/wiki/Main_Page#And.23Link" title="Main Page">Main Page#And#Link</a>
+<p><a rel="nofollow" class="external text" href="//foo.org/bar#baz.">bang</a>
+</p><p><a rel="nofollow" class="external text" href="//foo.org/bar.">bang</a>
 </p>
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="./Main_Page#And%23Link">Main Page#And#Link</a></p>
+<p><a rel="mw:ExtLink" href="//foo.org/bar#baz.">bang</a></p>
+<p><a rel="mw:ExtLink" href="//foo.org/bar.">bang</a></p>
+!! end
+
+!! test
+External link containing a single quote. (bug 63947)
+!! wikitext
+[//foo.org/bar'baz]
+
+[//foo.org/bar'baz bang]
+!! html/php
+<p><a rel="nofollow" class="external autonumber" href="//foo.org/bar'baz">[1]</a>
+</p><p><a rel="nofollow" class="external text" href="//foo.org/bar'baz">bang</a>
+</p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="//foo.org/bar'baz"></a></p>
+<p><a rel="mw:ExtLink" href="//foo.org/bar'baz">bang</a></p>
 !! end
 
+
 !! test
 External link containing a period in the anchor. (bug 63947)
 !! wikitext
@@ -4562,11 +4516,21 @@ Parenthesis in external links, w/ transclusion or comment
 </p><p>(<a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>)
 </p>
 !! html/parsoid
-<p>(<a data-mw='{"attribs":[[{"txt":"href"},{"html":"http://example.com/&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-mw=\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;hi&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\" data-parsoid=\"{&amp;quot;dsr&amp;quot;:[20,31,null,null],&amp;quot;pi&amp;quot;:[[{&amp;quot;k&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;spc&amp;quot;:[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]}]]}\">hi&lt;/span>"}]]}' typeof="mw:ExpandedAttrs" about="#mwt2" rel="mw:ExtLink" href="http://example.com/hi" data-parsoid='{"stx":"url","a":{"href":"http://example.com/hi"},"sa":{"href":"http://example.com/{{echo|hi}}"}}'>http://example.com/hi</a>)</p>
+<p>(<a data-mw='{"attribs":[[{"txt":"href"},{"html":"http://example.com/&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-mw=\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;hi&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\" data-parsoid=\"{&amp;quot;pi&amp;quot;:[[{&amp;quot;k&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;spc&amp;quot;:[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]}]],&amp;quot;dsr&amp;quot;:[20,31,null,null]}\">hi&lt;/span>"}]]}' typeof="mw:ExpandedAttrs" about="#mwt2" rel="mw:ExtLink" href="http://example.com/hi" data-parsoid='{"stx":"url","a":{"href":"http://example.com/hi"},"sa":{"href":"http://example.com/{{echo|hi}}"}}'>http://example.com/hi</a>)</p>
 
 <p>(<a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url","a":{"href":"http://example.com"},"sa":{"href":"http://example.com&lt;!-- hi -->"}}'>http://example.com</a>)</p>
 !! end
 
+!! test
+Replace invalid link targets when serializing
+!! options
+parsoid=html2wt
+!! html
+<a rel="mw:WikiLink" href="./]] foo [[bar">Manual</a>
+!! wikitext
+[[MediaWiki:Badtitletext|Manual]]
+!! end
+
 ###
 ### Quotes
 ###
@@ -4916,6 +4880,18 @@ Accept "||" in table headings
 
 !! end
 
+!! test
+Accept "!!" in table data
+!! wikitext
+{|
+| Foo!! ||
+|}
+!! html/parsoid
+<table data-parsoid='{}'>
+<tbody data-parsoid='{}'><tr data-parsoid='{"autoInsertedEnd":true,"autoInsertedStart":true}'><td data-parsoid='{"autoInsertedEnd":true}'> Foo!! </td><td data-parsoid='{"stx_v":"row","autoInsertedEnd":true}'></td></tr>
+</tbody></table>
+!! end
+
 !! test
 Accept "||" in indented table headings
 !! wikitext
@@ -5282,6 +5258,23 @@ Table cell with a single comment
 
 !! end
 
+!! test
+Table-cell after a comment-only-empty-line
+!! wikitext
+{|
+|a
+<!--c1-->
+<!--c2-->| b
+|}
+!! html/parsoid
+<table>
+<tbody><tr data-parsoid='{"autoInsertedEnd":true,"autoInsertedStart":true}'><td data-parsoid='{"autoInsertedEnd":true}'>a</td>
+<!--c1-->
+<!--c2--><td data-parsoid='{"autoInsertedEnd":true}'> b</td></tr>
+</tbody></table>
+
+!! end
+
 # The expected HTML structure in this test is debatable. The PHP parser does
 # not parse this kind of table at all. The main focus for Parsoid is on
 # round-tripping, so this output is ok for now. TODO: revisit!
@@ -5411,6 +5404,89 @@ parsoid=html2wt
  a<h1>foo</h1>
 !! end
 
+!! test
+Parsoid: Row-syntax table headings followed by comment & table cells
+!! options
+parsoid=wt2html,wt2wt
+!! wikitext
+{|
+! foo || bar
+<!-- foo -->  || baz || quux
+|}
+!! html/parsoid
+<table>
+<tbody>
+<tr><th>foo </th><th>bar  </th>
+<td>baz </td>
+<td>quux</td></tr></tbody></table>
+!! end
+
+
+!!test
+Parsoid: Recover better from broken table attributes
+!!options
+parsoid=wt2html
+!!wikitext
+{| class="foo
+| class="bar" |
+foo
+|}
+!!html/parsoid
+<table class="foo">
+<tr>
+<td class="bar">
+<p>foo</p></td></tr>
+</tbody></table>
+!!end
+
+!! test
+Strip unsupported table tags
+!! options
+parsoid=html2wt
+!! html
+<table>
+<thead>
+<tr>
+<th>Month</th>
+<th>Savings</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>January</td>
+<td>$100</td>
+</tr>
+<tr>
+<td>February</td>
+<td>$80</td>
+</tr>
+</tbody>
+<tfoot>
+<tr>
+<td>Sum</td>
+<td>$180</td>
+</tr>
+</tfoot>
+</table>
+!! wikitext
+{|
+
+!Month
+!Savings
+
+|January
+|$100
+
+|-
+|February
+|$80
+
+|Sum
+|$180
+
+|}
+!! end
+
 ###
 ### Internal links
 ###
@@ -5593,6 +5669,19 @@ Link with multiple pipes
 </p>
 !! end
 
+# Note that parsoid does not munge anchor text; all non-space
+# characters are valid in HTML5 ids.
+!! test
+Anchor containing a #. (bug 63430)
+!! wikitext
+[[Main Page#And#Link]]
+!! html/php
+<p><a href="/wiki/Main_Page#And.23Link" title="Main Page">Main Page#And#Link</a>
+</p>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="./Main_Page#And%23Link">Main Page#And#Link</a></p>
+!! end
+
 !! test
 Link to namespaces
 !! wikitext
@@ -5602,6 +5691,15 @@ Link to namespaces
 </p>
 !! end
 
+!! test
+Link with space in namespace
+!! wikitext
+[[User talk:Foo bar]]
+!! html
+<p><a href="/index.php?title=User_talk:Foo_bar&amp;action=edit&amp;redlink=1" class="new" title="User talk:Foo bar (page does not exist)">User talk:Foo bar</a>
+</p>
+!! end
+
 !! article
 MemoryAlpha:AlphaTest
 !! text
@@ -6158,6 +6256,14 @@ parsoid
 <p><a rel="mw:WikiLink" href="Foo"><span about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a"}},"i":0}}]}'>a</span> b <span about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"c"}},"i":0}}]}'>c</span></a></p>
 !! end
 
+!! test
+Link with angle bracket after anchor
+!! wikitext
+[[Foo#<bar>]]
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="./Foo#%3Cbar%3E" data-parsoid='{"stx":"simple","a":{"href":"./Foo#%3Cbar%3E"},"sa":{"href":"Foo#&lt;bar>"}}'>Foo#&lt;bar></a></p>
+!! end
+
 ###
 ### Interwiki links (see maintenance/interwiki.sql)
 ###
@@ -6186,12 +6292,8 @@ Interwiki link encoding conversion (bug 1636)
 *[[Wikipedia:ro:Olteni&#0355;a]]
 *[[Wikipedia:ro:Olteni&#355;a]]
 !! html
-<ul>
-<li><a href="http://en.wikipedia.org/wiki/ro:Olteni%C5%A3a" class="extiw" title="wikipedia:ro:Olteniţa">Wikipedia:ro:Olteni&#355;a</a>
-</li>
-<li><a href="http://en.wikipedia.org/wiki/ro:Olteni%C5%A3a" class="extiw" title="wikipedia:ro:Olteniţa">Wikipedia:ro:Olteni&#355;a</a>
-</li>
-</ul>
+<ul><li><a href="http://en.wikipedia.org/wiki/ro:Olteni%C5%A3a" class="extiw" title="wikipedia:ro:Olteniţa">Wikipedia:ro:Olteni&#355;a</a></li>
+<li><a href="http://en.wikipedia.org/wiki/ro:Olteni%C5%A3a" class="extiw" title="wikipedia:ro:Olteniţa">Wikipedia:ro:Olteni&#355;a</a></li></ul>
 
 !! end
 
@@ -6356,8 +6458,7 @@ parsoid
 !! wikitext
 [[ko:]]
 !! html
-<p>
-<link rel="mw:PageProp/Language" href="http://ko.wikipedia.org/wiki/"></p>
+<p><link rel="mw:PageProp/Language" href="http://ko.wikipedia.org/wiki/"></p>
 !! end
 
 !! test
@@ -6406,6 +6507,17 @@ parsoid=wt2html,wt2wt
 <link rel="mw:PageProp/redirect" href="./%5B%5BBar%5D%5D">
 !! end
 
+!! test
+Empty redirect
+!! options
+parsoid=wt2html,wt2wt
+!! wikitext
+#REDIRECT [[]]
+!! html
+<ol>
+<li>REDIRECT [[]]</li></ol>
+!! end
+
 !! test
 Optional colon in #REDIRECT
 !! options
@@ -6567,8 +6679,11 @@ Parsoid: Broken br tag recognition
 parsoid=wt2html
 !! wikitext
 </br>
+
+<br/ >
 !! html/parsoid
 <p><br></p>
+<p><br/></p>
 !! end
 
 !! test
@@ -6705,14 +6820,9 @@ Common list
 * item 2
 *item 3
 !! html
-<ul>
-<li>Common list
-</li>
-<li> item 2
-</li>
-<li>item 3
-</li>
-</ul>
+<ul><li>Common list</li>
+<li> item 2</li>
+<li>item 3</li></ul>
 
 !! end
 
@@ -6723,14 +6833,9 @@ Numbered list
 #item 2
 # item 3
 !! html
-<ol>
-<li>Numbered list
-</li>
-<li>item 2
-</li>
-<li> item 3
-</li>
-</ol>
+<ol><li>Numbered list</li>
+<li>item 2</li>
+<li> item 3</li></ol>
 
 !! end
 
@@ -6753,67 +6858,21 @@ Mixed list
 *** Level 3
 #** Level 3, but ordered
 !! html
-<ul>
-<li>Mixed list
-<ol>
-<li> with numbers
-</li>
-</ol>
-<ul>
-<li> and bullets
-</li>
-</ul>
-<ol>
-<li> and numbers
-</li>
-</ol>
-</li>
-<li>bullets again
-<ul>
-<li>bullet level 2
-<ul>
-<li>bullet level 3
-<ol>
-<li>Number on level 4
-</li>
-</ol>
-</li>
-</ul>
-</li>
-<li>bullet level 2
-<ol>
-<li>Number on level 3
-</li>
-<li>Number on level 3
-</li>
-</ol>
-</li>
-</ul>
-<ol>
-<li>number level 2
-</li>
-</ol>
-</li>
-<li>Level 1
-<ul>
-<li><ul>
-<li> Level 3
-</li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-<ol>
-<li><ul>
-<li><ul>
-<li> Level 3, but ordered
-</li>
-</ul>
-</li>
-</ul>
-</li>
-</ol>
+<ul><li>Mixed list
+<ol><li> with numbers</li></ol>
+<ul><li> and bullets</li></ul>
+<ol><li> and numbers</li></ol></li>
+<li>bullets again
+<ul><li>bullet level 2
+<ul><li>bullet level 3
+<ol><li>Number on level 4</li></ol></li></ul></li>
+<li>bullet level 2
+<ol><li>Number on level 3</li>
+<li>Number on level 3</li></ol></li></ul>
+<ol><li>number level 2</li></ol></li>
+<li>Level 1
+<ul><li><ul><li> Level 3</li></ul></li></ul></li></ul>
+<ol><li><ul><li><ul><li> Level 3, but ordered</li></ul></li></ul></li></ol>
 
 !! end
 
@@ -6823,14 +6882,8 @@ Nested lists 1
 *foo
 **bar
 !! html
-<ul>
-<li>foo
-<ul>
-<li>bar
-</li>
-</ul>
-</li>
-</ul>
+<ul><li>foo
+<ul><li>bar</li></ul></li></ul>
 
 !! end
 
@@ -6840,15 +6893,8 @@ Nested lists 2
 **foo
 *bar
 !! html
-<ul>
-<li><ul>
-<li>foo
-</li>
-</ul>
-</li>
-<li>bar
-</li>
-</ul>
+<ul><li><ul><li>foo</li></ul></li>
+<li>bar</li></ul>
 
 !! end
 
@@ -6858,14 +6904,8 @@ Nested lists 3 (first element empty)
 *
 **bar
 !! html
-<ul>
-<li>
-<ul>
-<li>bar
-</li>
-</ul>
-</li>
-</ul>
+<ul><li>
+<ul><li>bar</li></ul></li></ul>
 
 !! end
 
@@ -6875,15 +6915,8 @@ Nested lists 4 (first element empty)
 **
 *bar
 !! html
-<ul>
-<li><ul>
-<li>
-</li>
-</ul>
-</li>
-<li>bar
-</li>
-</ul>
+<ul><li><ul><li></li></ul></li>
+<li>bar</li></ul>
 
 !! end
 
@@ -6893,15 +6926,8 @@ Nested lists 5 (both elements empty)
 **
 *
 !! html
-<ul>
-<li><ul>
-<li>
-</li>
-</ul>
-</li>
-<li>
-</li>
-</ul>
+<ul><li><ul><li></li></ul></li>
+<li></li></ul>
 
 !! end
 
@@ -6911,14 +6937,8 @@ Nested lists 6 (both elements empty)
 *
 **
 !! html
-<ul>
-<li>
-<ul>
-<li>
-</li>
-</ul>
-</li>
-</ul>
+<ul><li>
+<ul><li></li></ul></li></ul>
 
 !! end
 
@@ -6927,16 +6947,7 @@ Nested lists 7 (skip initial nesting levels)
 !! wikitext
 *** foo
 !! html
-<ul>
-<li><ul>
-<li><ul>
-<li> foo
-</li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
+<ul><li><ul><li><ul><li> foo</li></ul></li></ul></li></ul>
 
 !! end
 
@@ -6948,21 +6959,10 @@ Nested lists 8 (multiple nesting transitions)
 ** baz
 * boo
 !! html
-<ul>
-<li> foo
-<ul>
-<li><ul>
-<li> bar
-</li>
-</ul>
-</li>
-<li> baz
-</li>
-</ul>
-</li>
-<li> boo
-</li>
-</ul>
+<ul><li> foo
+<ul><li><ul><li> bar</li></ul></li>
+<li> baz</li></ul></li>
+<li> boo</li></ul>
 
 !! end
 
@@ -6973,14 +6973,9 @@ Nested lists 8 (multiple nesting transitions)
 *<!--cmt-->bar
 <!--cmt-->*baz
 !! html
-<ul>
-<li>foo
-</li>
-<li>bar
-</li>
-<li>baz
-</li>
-</ul>
+<ul><li>foo</li>
+<li>bar</li>
+<li>baz</li></ul>
 
 !! end
 
@@ -6990,12 +6985,8 @@ Nested lists 8 (multiple nesting transitions)
 *foo {{echo|bar
 }}*baz
 !! html
-<ul>
-<li>foo bar
-</li>
-<li>baz
-</li>
-</ul>
+<ul><li>foo bar</li>
+<li>baz</li></ul>
 
 !! end
 
@@ -7006,14 +6997,9 @@ List items are not parsed correctly following a <pre> block (bug 785)
 * <pre>bar</pre>
 * zar
 !! html
-<ul>
-<li> <pre>foo</pre>
-</li>
-<li> <pre>bar</pre>
-</li>
-<li> zar
-</li>
-</ul>
+<ul><li> <pre>foo</pre></li>
+<li> <pre>bar</pre></li>
+<li> zar</li></ul>
 
 !! end
 
@@ -7032,30 +7018,15 @@ List items from template
 * notSOL{{inner list}}
 * item 2
 !! html
-<ul>
-<li> item 1
-</li>
-<li> item 2
-</li>
-</ul>
-<ul>
-<li> item 0
-</li>
-<li> item 1
-</li>
-<li> item 2
-</li>
-</ul>
-<ul>
-<li> item 0
-</li>
-<li> notSOL
-</li>
-<li> item 1
-</li>
-<li> item 2
-</li>
-</ul>
+<ul><li> item 1</li>
+<li> item 2</li></ul>
+<ul><li> item 0</li>
+<li> item 1</li>
+<li> item 2</li></ul>
+<ul><li> item 0</li>
+<li> notSOL</li>
+<li> item 1</li>
+<li> item 2</li></ul>
 
 !! end
 
@@ -7068,22 +7039,10 @@ List interrupted by empty line or heading
 == A heading ==
 * Another list item
 !! html
-<ul>
-<li> foo
-</li>
-</ul>
-<ul>
-<li><ul>
-<li> bar
-</li>
-</ul>
-</li>
-</ul>
+<ul><li> foo</li></ul>
+<ul><li><ul><li> bar</li></ul></li></ul>
 <h2><span class="mw-headline" id="A_heading">A heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: A heading">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<ul>
-<li> Another list item
-</li>
-</ul>
+<ul><li> Another list item</li></ul>
 
 !!end
 
@@ -7113,16 +7072,10 @@ Single-comment whitespace lines dont break lists, and neither do multi-comment w
  <!--foo--> <!----> <!--This line NOT split the list either--> 
 *d
 !! html
-<ul>
-<li>a
-</li>
-<li>b
-</li>
-<li>c
-</li>
-<li>d
-</li>
-</ul>
+<ul><li>a</li>
+<li>b</li>
+<li>c</li>
+<li>d</li></ul>
 
 !!end
 
@@ -7138,16 +7091,10 @@ Replacing whitespace with tabs still doesn't break the list (gerrit 78327)
         either-->       
 *d
 !! html
-<ul>
-<li>a
-</li>
-<li>b
-</li>
-<li>c
-</li>
-<li>d
-</li>
-</ul>
+<ul><li>a</li>
+<li>b</li>
+<li>c</li>
+<li>d</li></ul>
 
 !!end
 
@@ -7465,36 +7412,20 @@ Magic Words LOCAL (UTC)
 * {{LOCALDOW}}
 * {{LOCALTIMESTAMP}}
 !! html
-<ul>
-<li> 01
-</li>
-<li> 1
-</li>
-<li> January
-</li>
-<li> January
-</li>
-<li> Jan
-</li>
-<li> 1
-</li>
-<li> 01
-</li>
-<li> Thursday
-</li>
-<li> 1970
-</li>
-<li> 00:02
-</li>
-<li> 00
-</li>
-<li> 1
-</li>
-<li> 4
-</li>
-<li> 19700101000203
-</li>
-</ul>
+<ul><li> 01</li>
+<li> 1</li>
+<li> January</li>
+<li> January</li>
+<li> Jan</li>
+<li> 1</li>
+<li> 01</li>
+<li> Thursday</li>
+<li> 1970</li>
+<li> 00:02</li>
+<li> 00</li>
+<li> 1</li>
+<li> 4</li>
+<li> 19700101000203</li></ul>
 
 !! end
 
@@ -7755,7 +7686,7 @@ Magic Word: {{NUMBEROFFILES}}
 !! wikitext
 {{NUMBEROFFILES}}
 !! html
-<p>7
+<p>5
 </p>
 !! end
 
@@ -8532,20 +8463,24 @@ Template:MSGNW test
 * interpreted
  but rather passed unmodified
 {{test}}
+<gallery>
+File:Foobar.jpg
+</gallery>
 !! endarticle
 
 # hmm, fix this or just deprecate msgnw and document its behavior?
 !! test
 msgnw keyword
-!! options
-disabled
 !! wikitext
 {{msgnw:MSGNW test}}
 !! html
-<p>''None'' of '''this''' should be 
-* interpreted
- but rather passed unmodified
-{{test}}
+<p>&#39;&#39;None&#39;&#39; of &#39;&#39;&#39;this&#39;&#39;&#39; should be 
+&#42; interpreted
+&#32;but rather passed unmodified
+&#123;&#123;test&#125;&#125;
+&#60;gallery&#62;
+File:Foobar.jpg
+&#60;/gallery&#62;
 </p>
 !! end
 
@@ -8871,6 +8806,44 @@ parsoid
 
 !!end
 
+###
+### Token Stream Patcher tests
+###
+### These tests won't always pass wt2wt and other modes because
+### on serialization, the table will be output on a new line.
+### For now, we are blacklisting them, and using this to test selser.
+###
+
+!!test
+1. Table tag in SOL posn. should get reparsed correctly with valid TSR
+!!options
+parsoid=wt2html,wt2wt
+!!wikitext
+{{echo|}}{| width = '100%'
+|foo
+|}
+!!html/parsoid
+<span typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":""}},"i":0}}]}'></span>
+<table width="100%">
+<tbody>
+<tr>
+<td>foo</td></tr></tbody></table>
+!!end
+
+!!test
+2. Table tag in SOL posn. should get reparsed correctly with valid TSR
+!!options
+parsoid=wt2html,wt2wt
+!!wikitext
+<includeonly>a</includeonly>{| {{{b}}}
+|c
+|}
+!!html/parsoid
+<meta typeof="mw:Includes/IncludeOnly" data-parsoid='{"src":"&lt;includeonly>a&lt;/includeonly>"}'/><meta typeof="mw:Includes/IncludeOnly/End" data-parsoid='{"src":"&lt;/includeonly>"}'/><span data-parsoid='{"fostered":true,"autoInsertedEnd":true,"autoInsertedStart":true}'>{{{b}}}</span><table about="#mwt1" typeof="mw:Param" data-parsoid='{"a":{" ":null},"sa":{" ":""},"src":"{| {{{b}}}\n|c\n|}"}'>
+<tbody><tr><td>c</td></tr>
+</tbody></table>
+!!end
+
 ###
 ### Testing parsing of templates where a template arg
 ### has the same name as the template itself.
@@ -9362,12 +9335,8 @@ unused}}}}
 *{{echo|b {{nonexistent|
 unused}}}}
 !! html
-<ul>
-<li>a <a href="/index.php?title=Template:Nonexistent&amp;action=edit&amp;redlink=1" class="new" title="Template:Nonexistent (page does not exist)">Template:Nonexistent</a>
-</li>
-<li>b <a href="/index.php?title=Template:Nonexistent&amp;action=edit&amp;redlink=1" class="new" title="Template:Nonexistent (page does not exist)">Template:Nonexistent</a>
-</li>
-</ul>
+<ul><li>a <a href="/index.php?title=Template:Nonexistent&amp;action=edit&amp;redlink=1" class="new" title="Template:Nonexistent (page does not exist)">Template:Nonexistent</a></li>
+<li>b <a href="/index.php?title=Template:Nonexistent&amp;action=edit&amp;redlink=1" class="new" title="Template:Nonexistent (page does not exist)">Template:Nonexistent</a></li></ul>
 
 !!end
 
@@ -10361,7 +10330,7 @@ parsoid=wt2html,wt2wt,html2html
 <div class="thumb tright"><div class="thumbinner" style="width:139px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/137px-Foobar.jpg" width="137" height="16" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/206px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/274px-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</div></div></div>
 
 !! html/parsoid
-<figure typeof="mw:Image/Thumb mw:ExpandedAttrs" data-mw='{"attribs":[["thumbnail",{"html":"thumb"}],["width",{"html":"&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-mw=\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;137px&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\" data-parsoid=\"{&amp;quot;dsr&amp;quot;:[24,38,null,null],&amp;quot;pi&amp;quot;:[[{&amp;quot;k&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;spc&amp;quot;:[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]}]]}\">137px&lt;/span>"}]]}'><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="16" width="137"/></a><figcaption>This is a caption</figcaption></figure>
+<figure typeof="mw:Image/Thumb mw:ExpandedAttrs" data-mw='{"attribs":[["thumbnail",{"html":"thumb"}],["width",{"html":"&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-mw=\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;137px&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\" data-parsoid=\"{&amp;quot;pi&amp;quot;:[[{&amp;quot;k&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;spc&amp;quot;:[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]}]],&amp;quot;dsr&amp;quot;:[24,38,null,null]}\">137px&lt;/span>"}]]}'><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="16" width="137"/></a><figcaption>This is a caption</figcaption></figure>
 !! end
 
 !! test
@@ -10372,7 +10341,7 @@ parsoid=wt2html,wt2wt,html2html
 <div class="thumb tright"><div class="thumbinner" style="width:139px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/137px-Foobar.jpg" width="137" height="16" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/206px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/274px-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</div></div></div>
 
 !! html/parsoid
-<figure typeof="mw:Image/Thumb mw:ExpandedAttrs" data-mw='{"attribs":[["thumbnail",{"html":"&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-mw=\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;thumb&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\" data-parsoid=\"{&amp;quot;dsr&amp;quot;:[18,32,null,null],&amp;quot;pi&amp;quot;:[[{&amp;quot;k&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;spc&amp;quot;:[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]}]]}\">thumb&lt;/span>"}],["width",{"html":"&lt;span about=\"#mwt2\" typeof=\"mw:Transclusion\" data-mw=\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;137px&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\" data-parsoid=\"{&amp;quot;dsr&amp;quot;:[33,47,null,null],&amp;quot;pi&amp;quot;:[[{&amp;quot;k&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;spc&amp;quot;:[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]}]]}\">137px&lt;/span>"}]]}'><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="16" width="137"/></a><figcaption>This is a caption</figcaption></figure>
+<figure typeof="mw:Image/Thumb mw:ExpandedAttrs" data-mw='{"attribs":[["thumbnail",{"html":"&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-mw=\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;thumb&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\" data-parsoid=\"{&amp;quot;pi&amp;quot;:[[{&amp;quot;k&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;spc&amp;quot;:[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]}]],&amp;quot;dsr&amp;quot;:[18,32,null,null]}\">thumb&lt;/span>"}],["width",{"html":"&lt;span about=\"#mwt2\" typeof=\"mw:Transclusion\" data-mw=\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;137px&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\" data-parsoid=\"{&amp;quot;pi&amp;quot;:[[{&amp;quot;k&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;spc&amp;quot;:[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]}]],&amp;quot;dsr&amp;quot;:[33,47,null,null]}\">137px&lt;/span>"}]]}'><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="16" width="137"/></a><figcaption>This is a caption</figcaption></figure>
 !! end
 
 !! test
@@ -10383,7 +10352,7 @@ parsoid=wt2html,wt2wt,html2html
 <p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" width="50" height="6" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/75px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/100px-Foobar.jpg 2x" /></a>
 </p>
 !! html/parsoid
-<p><span typeof="mw:Image mw:ExpandedAttrs" about="#mwt2" data-mw='{"attribs":[["width",{"html":"&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-mw=\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;50px&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\" data-parsoid=\"{&amp;quot;dsr&amp;quot;:[18,31,null,null],&amp;quot;pi&amp;quot;:[[{&amp;quot;k&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;spc&amp;quot;:[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]}]]}\">50px&lt;/span>"}]]}' data-parsoid='{"optList":[{"ck":"width","ak":"{{echo|50px}}"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" height="6" width="50" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"6","width":"50"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
+<p><span typeof="mw:Image mw:ExpandedAttrs" about="#mwt2" data-mw='{"attribs":[["width",{"html":"&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-mw=\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;50px&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\" data-parsoid=\"{&amp;quot;pi&amp;quot;:[[{&amp;quot;k&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;spc&amp;quot;:[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]}]],&amp;quot;dsr&amp;quot;:[18,31,null,null]}\">50px&lt;/span>"}]]}' data-parsoid='{"optList":[{"ck":"width","ak":"{{echo|50px}}"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" height="6" width="50" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"6","width":"50"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
 !! end
 
 ## Parsoid does not provide editing support for images where templates produce multiple image attributes.
@@ -10793,16 +10762,12 @@ parsoid=wt2html,wt2wt,html2html
 # Image sizing.
 # See https://www.mediawiki.org/wiki/Help:Images#Size_and_frame
 # and https://bugzilla.wikimedia.org/show_bug.cgi?id=62258
-# Foobar.jpg has actual size of 1941x220
-# Portrait.svg has actual size of 180x240
-# Portrait.png has actual size of 180x240
+# Foobar has actual size of 1941x220
 # 1. Thumbs & frameless always reduce, can't be enlarged unless it's
 #    a scalable format.
 # 2. Framed images always ignore size options; always render at default size.
 # 3. "Unspecified format" and border are the only types which can be
 #    enlarged.
-# 4. Without an explicit size specification, thumbnails are
-#    resized to a square bounding box.
 
 !! test
 Image: "unspecified format" and border enlarge
@@ -10920,55 +10885,6 @@ parsoid=wt2html,wt2wt,html2html
 <figure class="mw-default-size" typeof="mw:Image/Frame"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></figure><figure typeof="mw:Image/Frame"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></figure><figure typeof="mw:Image/Frame"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></figure><figure typeof="mw:Image/Frame"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></figure>
 !! end
 
-!! test
-Image: thumbnails of the default size use a square bounding box.
-!! options
-thumbsize=220
-!! wikitext
-[[File:Foobar.jpg|thumb|landscape thumb]]
-
-[[File:Foobar.jpg|frameless|landscape frameless]]
-
-[[File:Portrait.png|thumb|should use 220x220px bounding box]]
-
-[[File:Portrait.png|frameless|should use 220x220px bounding box]]
-
-[[File:Portrait.svg|thumb|should use 220x220px bounding box]]
-
-[[File:Portrait.svg|frameless|should use 220x220px bounding box]]
-!! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-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>landscape thumb</div></div></div>
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="landscape frameless"><img alt="landscape frameless" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>
-</p>
-<div class="thumb tright"><div class="thumbinner" style="width:167px;"><a href="/wiki/File:Portrait.png" class="image"><img alt="" src="http://example.com/images/thumb/9/93/Portrait.png/165px-Portrait.png" width="165" height="220" class="thumbimage" srcset="http://example.com/images/9/93/Portrait.png 1.5x, http://example.com/images/9/93/Portrait.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Portrait.png" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>should use 220x220px bounding box</div></div></div>
-<p><a href="/wiki/File:Portrait.png" class="image" title="should use 220x220px bounding box"><img alt="should use 220x220px bounding box" src="http://example.com/images/thumb/9/93/Portrait.png/165px-Portrait.png" width="165" height="220" srcset="http://example.com/images/9/93/Portrait.png 1.5x, http://example.com/images/9/93/Portrait.png 2x" /></a>
-</p>
-<div class="thumb tright"><div class="thumbinner" style="width:167px;"><a href="/wiki/File:Portrait.svg" class="image"><img alt="" src="http://example.com/images/thumb/f/fc/Portrait.svg/165px-Portrait.svg.png" width="165" height="220" class="thumbimage" srcset="http://example.com/images/thumb/f/fc/Portrait.svg/247px-Portrait.svg.png 1.5x, http://example.com/images/thumb/f/fc/Portrait.svg/330px-Portrait.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Portrait.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>should use 220x220px bounding box</div></div></div>
-<p><a href="/wiki/File:Portrait.svg" class="image" title="should use 220x220px bounding box"><img alt="should use 220x220px bounding box" src="http://example.com/images/thumb/f/fc/Portrait.svg/165px-Portrait.svg.png" width="165" height="220" srcset="http://example.com/images/thumb/f/fc/Portrait.svg/247px-Portrait.svg.png 1.5x, http://example.com/images/thumb/f/fc/Portrait.svg/330px-Portrait.svg.png 2x" /></a>
-</p>
-!! end
-
-!! test
-Image: bitmap thumbnails reduce only if thumb size is smaller than inherent size.
-!! options
-thumbsize=300
-!! wikitext
-[[File:Portrait.png|thumb|should use inherent 180x240px size]]
-
-[[File:Portrait.png|frameless|should use inherent 180x240px size]]
-
-[[File:Portrait.svg|thumb|will resize to 300x300px]]
-
-[[File:Portrait.svg|frameless|will resize to 300x300px]]
-!! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Portrait.png" class="image"><img alt="" src="http://example.com/images/9/93/Portrait.png" width="180" height="240" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Portrait.png" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>should use inherent 180x240px size</div></div></div>
-<p><a href="/wiki/File:Portrait.png" class="image" title="should use inherent 180x240px size"><img alt="should use inherent 180x240px size" src="http://example.com/images/9/93/Portrait.png" width="180" height="240" /></a>
-</p>
-<div class="thumb tright"><div class="thumbinner" style="width:227px;"><a href="/wiki/File:Portrait.svg" class="image"><img alt="" src="http://example.com/images/thumb/f/fc/Portrait.svg/225px-Portrait.svg.png" width="225" height="300" class="thumbimage" srcset="http://example.com/images/thumb/f/fc/Portrait.svg/337px-Portrait.svg.png 1.5x, http://example.com/images/thumb/f/fc/Portrait.svg/450px-Portrait.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Portrait.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>will resize to 300x300px</div></div></div>
-<p><a href="/wiki/File:Portrait.svg" class="image" title="will resize to 300x300px"><img alt="will resize to 300x300px" src="http://example.com/images/thumb/f/fc/Portrait.svg/225px-Portrait.svg.png" width="225" height="300" srcset="http://example.com/images/thumb/f/fc/Portrait.svg/337px-Portrait.svg.png 1.5x, http://example.com/images/thumb/f/fc/Portrait.svg/450px-Portrait.svg.png 2x" /></a>
-</p>
-!! end
-
 ###################
 
 !! test
@@ -15131,13 +15047,7 @@ Handling of &#x0A; in URLs
 !! wikitext
 ** irc://&#x0A;a
 !! html/php
-<ul>
-<li><ul>
-<li> <a rel="nofollow" class="external free" href="irc://%0Aa">irc://%0Aa</a>
-</li>
-</ul>
-</li>
-</ul>
+<ul><li><ul><li> <a rel="nofollow" class="external free" href="irc://%0Aa">irc://%0Aa</a></li></ul></li></ul>
 
 !! html/parsoid
 <ul><li><ul><li> <a rel="mw:ExtLink" href="irc://
@@ -15150,13 +15060,7 @@ Handling of %0A in URLs
 !! wikitext
 ** irc://%0Aa
 !! html/php
-<ul>
-<li><ul>
-<li> <a rel="nofollow" class="external free" href="irc://%0Aa">irc://%0Aa</a>
-</li>
-</ul>
-</li>
-</ul>
+<ul><li><ul><li> <a rel="nofollow" class="external free" href="irc://%0Aa">irc://%0Aa</a></li></ul></li></ul>
 
 !! html/parsoid
 <ul><li><ul><li> <a rel="mw:ExtLink" href="irc://%0Aa">irc://%0Aa</a></li></ul></li></ul>
@@ -15222,69 +15126,45 @@ title=[[Parser test]]
 * {{FULLPAGENAMEE}}
 * {{BASEPAGENAME}}
 * {{BASEPAGENAMEE}}
-* {{SUBPAGENAME}}
-* {{SUBPAGENAMEE}}
-* {{ROOTPAGENAME}}
-* {{ROOTPAGENAMEE}}
-* {{TALKPAGENAME}}
-* {{TALKPAGENAMEE}}
-* {{SUBJECTPAGENAME}}
-* {{SUBJECTPAGENAMEE}}
-* {{NAMESPACEE}}
-* {{NAMESPACE}}
-* {{NAMESPACENUMBER}}
-* {{TALKSPACE}}
-* {{TALKSPACEE}}
-* {{SUBJECTSPACE}}
-* {{SUBJECTSPACEE}}
-* {{Dynamic|{{NUMBEROFUSERS}}|{{NUMBEROFPAGES}}|{{CURRENTVERSION}}|{{CONTENTLANGUAGE}}|{{DIRECTIONMARK}}|{{CURRENTTIMESTAMP}}|{{NUMBEROFARTICLES}}}}
-!! html
-<ul>
-<li> Parser test
-</li>
-<li> Parser_test
-</li>
-<li> Parser test
-</li>
-<li> Parser_test
-</li>
-<li> Parser test
-</li>
-<li> Parser_test
-</li>
-<li> Parser test
-</li>
-<li> Parser_test
-</li>
-<li> Parser test
-</li>
-<li> Parser_test
-</li>
-<li> Talk:Parser test
-</li>
-<li> Talk:Parser_test
-</li>
-<li> Parser test
-</li>
-<li> Parser_test
-</li>
-<li> 
-</li>
-<li> 
-</li>
-<li> 0
-</li>
-<li> Talk
-</li>
-<li> Talk
-</li>
-<li> 
-</li>
-<li> 
-</li>
-<li> <a href="/index.php?title=Template:Dynamic&amp;action=edit&amp;redlink=1" class="new" title="Template:Dynamic (page does not exist)">Template:Dynamic</a>
-</li>
-</ul>
+* {{SUBPAGENAME}}
+* {{SUBPAGENAMEE}}
+* {{ROOTPAGENAME}}
+* {{ROOTPAGENAMEE}}
+* {{TALKPAGENAME}}
+* {{TALKPAGENAMEE}}
+* {{SUBJECTPAGENAME}}
+* {{SUBJECTPAGENAMEE}}
+* {{NAMESPACEE}}
+* {{NAMESPACE}}
+* {{NAMESPACENUMBER}}
+* {{TALKSPACE}}
+* {{TALKSPACEE}}
+* {{SUBJECTSPACE}}
+* {{SUBJECTSPACEE}}
+* {{Dynamic|{{NUMBEROFUSERS}}|{{NUMBEROFPAGES}}|{{CURRENTVERSION}}|{{CONTENTLANGUAGE}}|{{DIRECTIONMARK}}|{{CURRENTTIMESTAMP}}|{{NUMBEROFARTICLES}}}}
+!! html
+<ul><li> Parser test</li>
+<li> Parser_test</li>
+<li> Parser test</li>
+<li> Parser_test</li>
+<li> Parser test</li>
+<li> Parser_test</li>
+<li> Parser test</li>
+<li> Parser_test</li>
+<li> Parser test</li>
+<li> Parser_test</li>
+<li> Talk:Parser test</li>
+<li> Talk:Parser_test</li>
+<li> Parser test</li>
+<li> Parser_test</li>
+<li> </li>
+<li> </li>
+<li> 0</li>
+<li> Talk</li>
+<li> Talk</li>
+<li> </li>
+<li> </li>
+<li> <a href="/index.php?title=Template:Dynamic&amp;action=edit&amp;redlink=1" class="new" title="Template:Dynamic (page does not exist)">Template:Dynamic</a></li></ul>
 
 !! end
 ### Note: Above tests excludes the "{{NUMBEROFADMINS}}" magic word because it generates a MySQL error when included.
@@ -15392,6 +15272,37 @@ image:foobar.jpg|Blabla|alt=This is a foo-bar.|blabla.
 
 !! end
 
+!! test
+Gallery with link that has fragment
+!! wikitext
+<gallery>
+image:foobar.jpg|link=Main_Page
+image:foobar.jpg|link=Main_Page#section
+image:foobar.jpg|link=Main Page#section|caption
+</gallery>
+!! html
+<ul class="gallery mw-gallery-traditional">
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/Main_Page"><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/Main_Page#section"><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/Main_Page#section"><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>caption
+</p>
+                       </div>
+               </div></li>
+</ul>
+
+!! end
+
 !! test
 Gallery with wikitext inside caption
 !! wikitext
@@ -15872,17 +15783,12 @@ Definition list code coverage
 ; title : def
 ;title: def
 !! html
-<dl>
-<dt> title  &#160;</dt>
-<dd> def
-</dd>
+<dl><dt> title  &#160;</dt>
+<dd> def</dd>
 <dt> title&#160;</dt>
-<dd> def
-</dd>
+<dd> def</dd>
 <dt>title</dt>
-<dd> def
-</dd>
-</dl>
+<dd> def</dd></dl>
 
 !! end
 
@@ -16618,12 +16524,8 @@ Bug 529: Uncovered bullet
 !! wikitext
 * Foo {{bullet}}
 !! html
-<ul>
-<li> Foo 
-</li>
-<li> Bar
-</li>
-</ul>
+<ul><li> Foo </li>
+<li> Bar</li></ul>
 
 !! end
 
@@ -16638,30 +16540,8 @@ Bug 529: Uncovered bullet leaving empty list, normally removed by tidy
 !! wikitext
 ******* Foo {{bullet}}
 !! html
-<ul>
-<li><ul>
-<li><ul>
-<li><ul>
-<li><ul>
-<li><ul>
-<li><ul>
-<li> Foo 
-</li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</li>
-<li> Bar
-</li>
-</ul>
+<ul><li><ul><li><ul><li><ul><li><ul><li><ul><li><ul><li> Foo </li></ul></li></ul></li></ul></li></ul></li></ul></li></ul></li>
+<li> Bar</li></ul>
 
 !! end
 
@@ -16693,12 +16573,8 @@ Bug 529: Uncovered bullet in parser function result
 !! wikitext
 * Foo {{lc:{{bullet}} }}
 !! html
-<ul>
-<li> Foo 
-</li>
-<li> bar
-</li>
-</ul>
+<ul><li> Foo </li>
+<li> bar</li></ul>
 
 !! end
 
@@ -18102,7 +17978,7 @@ Lead
 
 
 ###
-### Parsoids-specific tests
+### Parsoid-specific tests
 ### Parsoid-PHP parser incompatibilities
 ###
 !!test
@@ -18125,6 +18001,35 @@ parsoid=wt2html,wt2wt
 </dl>
 !!end
 
+#### -----------------------------------------------------------------
+#### Parsoid-specific functionality tests
+#### -----------------------------------------------------------------
+
+# Bug 63642: Formatting elt fixup is cleaned up.
+# We know wt2wt will fail, but we expect selser to pass.
+# Due to the nature of our testing, wt2wt and selser tests will enter the
+# blacklist and we'll catch selser regressions based on changes to the
+# blacklist entries for selser tests.
+!! test
+Bad treebuilder fixup of formatting elt is cleaned up
+!! options
+parsoid=wt2html,wt2wt
+!! wikitext
+{|
+|
+<small>
+[[Image:Foobar.jpg|right|Test]]
+</small>
+|}
+!! html/parsoid
+<table>
+<tbody><tr><td>
+<p><small></small></p>
+<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a><figcaption><small>Test</small></figcaption></figure>
+<p></p></td></tr>
+</tbody></table>
+!! end
+
 #### ----------------------------------------------------------------
 #### Parsoid-only testing of Parsoid's impl of <ref> and <references>
 #### tags. Parsoid's output for these tags differs from that of the
@@ -18193,7 +18098,7 @@ A <ref>
 
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"This is a &lt;b data-parsoid=&#39;{\"dsr\":[19,40,3,3]}&#39;>&lt;a rel=\"mw:WikiLink\" href=\"./Bolded_link\" data-parsoid=&#39;{\"stx\":\"simple\",\"a\":{\"href\":\"./Bolded_link\"},\"sa\":{\"href\":\"bolded link\"},\"dsr\":[22,37,2,2]}&#39;>bolded link&lt;/a>&lt;/b> and this is a &lt;span about=\"#mwt3\" typeof=\"mw:Transclusion\" data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"transclusion\"}},\"i\":0}}]}&#39; data-parsoid=&#39;{\"dsr\":[55,76,null,null],\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]]}&#39;>transclusion&lt;/span>\n"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
+<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"This is a &lt;b data-parsoid=&#39;{\"dsr\":[19,40,3,3]}&#39;>&lt;a rel=\"mw:WikiLink\" href=\"./Bolded_link\" data-parsoid=&#39;{\"stx\":\"simple\",\"a\":{\"href\":\"./Bolded_link\"},\"sa\":{\"href\":\"bolded link\"},\"dsr\":[22,37,2,2]}&#39;>bolded link&lt;/a>&lt;/b> and this is a &lt;span about=\"#mwt3\" typeof=\"mw:Transclusion\" data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"transclusion\"}},\"i\":0}}]}&#39; data-parsoid=&#39;{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[55,76,null,null]}&#39;>transclusion&lt;/span>\n"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
 
 <ol class="references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
 <li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> This is a <b><a rel="mw:WikiLink" href="./Bolded_link">bolded link</a></b> and this is a <span about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"transclusion"}},"i":0}}]}'>transclusion</span>
@@ -18849,9 +18754,12 @@ Lists: 0. Outside nests
 <nowiki>*</nowiki>foo
 
 <nowiki>#</nowiki>foo
+
+<nowiki>;Foo:</nowiki>bar
 !! html
 <p>*foo
 </p><p>#foo
+</p><p>;Foo:bar
 </p>
 !!end
 
@@ -18874,38 +18782,14 @@ Lists: 1. Nested inside html
 
 #<nowiki>;foo</nowiki>
 !! html
-<ul>
-<li>*foo
-</li>
-</ul>
-<ul>
-<li>#foo
-</li>
-</ul>
-<ul>
-<li>:foo
-</li>
-</ul>
-<ul>
-<li>;foo
-</li>
-</ul>
-<ol>
-<li>*foo
-</li>
-</ol>
-<ol>
-<li>#foo
-</li>
-</ol>
-<ol>
-<li>:foo
-</li>
-</ol>
-<ol>
-<li>;foo
-</li>
-</ol>
+<ul><li>*foo</li></ul>
+<ul><li>#foo</li></ul>
+<ul><li>:foo</li></ul>
+<ul><li>;foo</li></ul>
+<ol><li>*foo</li></ol>
+<ol><li>#foo</li></ol>
+<ol><li>:foo</li></ol>
+<ol><li>;foo</li></ol>
 
 !!end
 
@@ -18921,24 +18805,11 @@ Lists: 2. Inside definition lists
 
 :<nowiki>:foo</nowiki>
 !! html
-<dl>
-<dt>;foo
-</dt>
-</dl>
-<dl>
-<dt>:foo
-</dt>
-</dl>
-<dl>
-<dt>:foo
-</dt>
-<dd>bar
-</dd>
-</dl>
-<dl>
-<dd>:foo
-</dd>
-</dl>
+<dl><dt>;foo</dt></dl>
+<dl><dt>:foo</dt></dl>
+<dl><dt>:foo</dt>
+<dd>bar</dd></dl>
+<dl><dd>:foo</dd></dl>
 
 !!end
 
@@ -18949,14 +18820,8 @@ Lists: 3. Only bullets at start of text should be escaped
 
 *<nowiki>*foo</nowiki>''it''*bar
 !! html
-<ul>
-<li>*foo*bar
-</li>
-</ul>
-<ul>
-<li>*foo<i>it</i>*bar
-</li>
-</ul>
+<ul><li>*foo*bar</li></ul>
+<ul><li>*foo<i>it</i>*bar</li></ul>
 
 !!end
 
@@ -19006,30 +18871,12 @@ Lists: 5. No unnecessary escapes
 
 * <s></s>: a
 !! html
-<ul>
-<li> bar <span>[[foo]]</span>
-</li>
-</ul>
-<ul>
-<li>=bar <span>[[foo]]</span>
-</li>
-</ul>
-<ul>
-<li>[[bar <span>[[foo]]</span>
-</li>
-</ul>
-<ul>
-<li>]]bar <span>[[foo]]</span>
-</li>
-</ul>
-<ul>
-<li>=bar <span>foo]]</span>=
-</li>
-</ul>
-<ul>
-<li> <s></s>: a
-</li>
-</ul>
+<ul><li> bar <span>[[foo]]</span></li></ul>
+<ul><li>=bar <span>[[foo]]</span></li></ul>
+<ul><li>[[bar <span>[[foo]]</span></li></ul>
+<ul><li>]]bar <span>[[foo]]</span></li></ul>
+<ul><li>=bar <span>foo]]</span>=</li></ul>
+<ul><li> <s></s>: a</li></ul>
 
 !!end
 
@@ -19408,6 +19255,138 @@ parsoid
 <a href="http://google.com" rel="mw:ExtLink">[google</a>
 !! end
 
+!! test
+Links 6. Add <nowiki/>s between text-nodes and url-links when required (bug 64300)
+!! html/parsoid
+<p>x<a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a>y
+<a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a>?x
+<a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a>&amp;x
+<a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a>'x
+<a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a>,x
+<a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a>.x
+<a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a>;x
+<a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a>:x
+<a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a>;x
+<a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a>!x
+<a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a>=x
+<a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a>(x)
+<a rel="mw:ExtLink" href="http://example.com(x" data-parsoid='{"stx":"url"}'>http://example.com(x</a>)
+</p>
+!! wikitext
+x<nowiki/>http://example.com<nowiki/>y
+http://example.com<nowiki/>?x
+http://example.com<nowiki/>&x
+http://example.com<nowiki/>'x
+http://example.com<nowiki/>,x
+http://example.com<nowiki/>.x
+http://example.com<nowiki/>;x
+http://example.com<nowiki/>:x
+http://example.com<nowiki/>;x
+http://example.com<nowiki/>!x
+http://example.com<nowiki/>=x
+http://example.com<nowiki/>(x)
+http://example.com(x<nowiki/>)
+!! end
+
+!! test
+Links 7a. Don't add spurious <nowiki/>s between text-nodes and url-links (bug 64300)
+!! html/parsoid
+<p>x
+<a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a>
+y
+"<a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a>"
+(<a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a>)
+(<a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a>) foo
+<a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a>,
+<a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a>, foo
+</p>
+!! wikitext
+x
+http://example.com
+y
+"http://example.com"
+(http://example.com)
+(http://example.com) foo
+http://example.com,
+http://example.com, foo
+!! end
+
+## Parsoid currently fails wt2html on this one!
+!! test
+Links 7b. Don't add spurious <nowiki/>s between text-nodes and url-links (bug 64300)
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a>.,;:!?</p>
+!! wikitext
+http://example.com.,;:!?
+!! end
+
+!! test
+Links 8. Add <nowiki/>s between text-nodes and RFC-links when required (bug 64300)
+!! html/parsoid
+<p><a href="//tools.ietf.org/html/rfc123" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>RFC 123</a>4</p>
+!! wikitext
+RFC 123<nowiki/>4
+!! end
+
+!! test
+Links 9. Don't add spurious <nowiki/>s between text-nodes and RFC-links (bug 64300)
+!! html/parsoid
+<p>x<a href="//tools.ietf.org/html/rfc123" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>RFC 123</a>y
+X<a href="//tools.ietf.org/html/rfc123" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>RFC 123</a>y
+<a href="//tools.ietf.org/html/rfc123" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>RFC 123</a>?foo
+<a href="//tools.ietf.org/html/rfc123" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>RFC 123</a>&amp;foo
+</p>
+!! wikitext
+xRFC 123y
+XRFC 123y
+RFC 123?foo
+RFC 123&foo
+!! end
+
+!! test
+Links 10. Add <nowiki/>s between text-nodes and PMID-links when required (bug 64300)
+!! html/parsoid
+<p><a href="//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>PMID 123</a>4
+!! wikitext
+PMID 123<nowiki/>4
+!! end
+
+!! test
+Links 11. Don't add spurious <nowiki/>s between text-nodes and PMID-links (bug 64300)
+!! html/parsoid
+<p>x<a href="//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>PMID 123</a>y
+X<a href="//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>PMID 123</a>y
+<a href="//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>PMID 123</a>?foo
+<a href="//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>PMID 123</a>&foo
+</p>
+!! wikitext
+xPMID 123y
+XPMID 123y
+PMID 123?foo
+PMID 123&foo
+!! end
+
+!! test
+Links 12. Add <nowiki/>s between text-nodes and ISBN-links when required (bug 64300)
+!! html/parsoid
+<p><a href="./Special:BookSources/1234567890" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>ISBN 1234567890</a>1
+<a href="./Special:BookSources/1234567890" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>ISBN 1234567890</a>x
+<a href="./Special:BookSources/1234567890" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>ISBN 1234567890</a>b
+</p>
+!! wikitext
+ISBN 1234567890<nowiki/>1
+ISBN 1234567890<nowiki/>x
+ISBN 1234567890<nowiki/>b
+!! end
+
+!! test
+Links 12. Don't add spurious <nowiki/>s between text-nodes and ISBN-links (bug 64300)
+!! html/parsoid
+<p><a href="./Special:BookSources/1234567890" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>ISBN 1234567890</a>'s
+!! wikitext
+ISBN 1234567890's
+!! end
+
 #### --------------- Quotes ---------------
 #### 1. Quotes inside <b> and <i>
 #### 2. Link fragments separated by <i> and <b> tags
         b</p>
 !! end
 
+!! test
+2. Leading whitespace in non-indent-pre contexts should not be escaped
+!! options
+parsoid
+!! wikitext
+foo <ref>''a''
+ b</ref>
+!! html
+<p>foo <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"&lt;i data-parsoid=&#39;{\"dsr\":[9,14,2,2]}&#39;>a&lt;/i>\n b"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
+!! end
+
+!! test
+3. Leading whitespace in indent-pre suppressing contexts should not be escaped
+!! options
+parsoid
+!! wikitext
+<blockquote>
+ a
+ <span>b</span>
+ c
+</blockquote>
+!! html
+<blockquote>
+<p>
+ a
+ <span>b</span>
+ c</p>
+</blockquote>
+!! end
+
+!! test
+4. Leading whitespace in indent-pre suppressing contexts should not be escaped
+!! options
+parsoid
+!! wikitext
+ [[File:Foobar.jpg|thumb|caption]]
+!! html
+!! html/parsoid
+ <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
+!! end
+
 #### --------------- Behavior Switches --------------------
 !! test
 1. Valid behavior switches should be escaped
 parsoid=html2wt
 !! wikitext
 <nowiki>__TOC__</nowiki>
+''<nowiki>__TOC__</nowiki>''
 !! html
 __TOC__
+<i>__TOC__</i>
 !! end
 
 !! test
@@ -19944,6 +19966,34 @@ Indented table with an empty td
 
 !!end
 
+!!test
+Indented block & table
+!! wikitext
+ <div>foo</div>
+ {|
+ |foo
+ |}
+!! html/parsoid
+ <div data-parsoid='{"stx":"html"}'>foo</div>
+ <table><tbody>
+ <tr data-parsoid='{"autoInsertedEnd":true,"autoInsertedStart":true}'><td data-parsoid='{"autoInsertedEnd":true}'>foo</td></tr>
+ </tbody></table>
+!!end
+
+!! test
+Indent and comment before table row
+!! wikitext
+{|
+ <!--hi-->|-
+ | there
+|}
+!! html/parsoid
+<table data-parsoid='{}'>
+ <!--hi--><tbody data-parsoid='{}'><tr data-parsoid='{"startTagSrc":"|-","autoInsertedEnd":true}'>
+ <td data-parsoid='{"autoInsertedEnd":true}'> there</td></tr>
+</tbody></table>
+!! end
+
 !!test
 Empty TR followed by a template-generated TR
 (Parsoid-specific since PHP parser doesn't handle this mixed tbl-wikitext)
@@ -20288,6 +20338,21 @@ parsoid=wt2html,wt2wt
 </table>
 !!end
 
+# Parsoid only for bug 64747
+!! test
+Properly encapsulate empty-content transclusions in fosterable positions
+!! wikitext
+<table>
+{{#if:|
+<td>foo</td>
+}}
+</table>
+!! html/parsoid
+<table about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":["&lt;table>\n",{"template":{"target":{"wt":"#if:","function":"#if"},"params":{"1":{"wt":"\n&lt;td>foo&lt;/td>\n"}},"i":0}},"\n&lt;/table>"]}' data-parsoid='{"stx":"html","pi":[[{"k":"1","spc":["","","",""]}]],"src":"&lt;table>\n{{#if:|\n&lt;td>foo&lt;/td>\n}}\n&lt;/table>"}'>
+
+</table>
+!! end
+
 !!test
 Support <object> element with .data attribute
 !!options
@@ -20489,7 +20554,7 @@ parsoid
 [[File:Foobar.jpg|thumb|upright=0.5|caption]]
 [[File:Foobar.jpg|thumb|500x500px|upright=0.5|caption]]
 !! html
-<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="19" width="170"/></a><figcaption>caption</figcaption></figure><figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="19" width="170"/></a><figcaption>caption</figcaption></figure><figure typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="57" width="500"/></a><figcaption>caption</figcaption></figure>
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="19" width="170"/></a><figcaption>caption</figcaption></figure><figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="12" width="110"/></a><figcaption>caption</figcaption></figure><figure typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="57" width="500"/></a><figcaption>caption</figcaption></figure>
 !!end
 
 !! test
@@ -20600,21 +20665,21 @@ foo
 !! end
 
 !! test
-Strip leading whitespace when handling indent-pre inducing tags
+Nowiki-wrap leading whitespace when handling indent-pre inducing tags
 !! options
 parsoid=html2wt
 !! wikitext
 foo
-<span>bar</span>
+<nowiki> </nowiki><span>bar</span>
 
 <span>foo2
-</span>bar2
+<nowiki> </nowiki></span>bar2
 
 <div>foo</div>
-<span>bar</span>
+<nowiki> </nowiki><span>bar</span>
 
 <div>
-<span>foo</span>
+<nowiki> </nowiki><span>foo</span>
 </div>
 !! html
 <p>foo</p>
index f8c4c6c..daf4bd9 100644 (file)
@@ -4,7 +4,6 @@ abstract class ResourceLoaderTestCase extends MediaWikiTestCase {
        protected static function getResourceLoaderContext() {
                $resourceLoader = new ResourceLoader();
                $request = new FauxRequest( array(
-                               'debug' => 'true',
                                'lang' => 'en',
                                'modules' => 'startup',
                                'only' => 'scripts',
@@ -17,6 +16,8 @@ abstract class ResourceLoaderTestCase extends MediaWikiTestCase {
        protected function setUp() {
                parent::setUp();
 
+               ResourceLoader::clearCache();
+
                $this->setMwGlobals( array(
                        // For ResourceLoader::inDebugMode since it doesn't have context
                        'wgResourceLoaderDebug' => true,
@@ -42,6 +43,7 @@ class ResourceLoaderTestModule extends ResourceLoaderModule {
        protected $dependencies = array();
        protected $group = null;
        protected $source = 'local';
+       protected $skipFunction = null;
        protected $targets = array( 'test' );
 
        public function __construct( $options = array() ) {
@@ -61,6 +63,10 @@ class ResourceLoaderTestModule extends ResourceLoaderModule {
        public function getSource() {
                return $this->source;
        }
+
+       public function getSkipFunction() {
+               return $this->skipFunction;
+       }
 }
 
 class ResourceLoaderFileModuleTestModule extends ResourceLoaderFileModule {
diff --git a/tests/phpunit/data/filerepo/video.png b/tests/phpunit/data/filerepo/video.png
new file mode 100644 (file)
index 0000000..d86dbe0
Binary files /dev/null and b/tests/phpunit/data/filerepo/video.png differ
diff --git a/tests/phpunit/data/filerepo/wiki.png b/tests/phpunit/data/filerepo/wiki.png
new file mode 100644 (file)
index 0000000..8c42118
Binary files /dev/null and b/tests/phpunit/data/filerepo/wiki.png differ
diff --git a/tests/phpunit/data/media/Bishzilla_blink.gif b/tests/phpunit/data/media/Bishzilla_blink.gif
new file mode 100644 (file)
index 0000000..13e5536
Binary files /dev/null and b/tests/phpunit/data/media/Bishzilla_blink.gif differ
diff --git a/tests/phpunit/data/media/Portrait.png b/tests/phpunit/data/media/Portrait.png
deleted file mode 100644 (file)
index b5a92f6..0000000
Binary files a/tests/phpunit/data/media/Portrait.png and /dev/null differ
index 57879f8..ca132a4 100644 (file)
@@ -46,3 +46,12 @@ https://commons.wikimedia.org/wiki/File:Speech_bubbles.svg
 CC BY-SA 3.0
 Jarry1250
 
+Soccer_ball_animated.svg
+https://commons.wikimedia.org/wiki/File:Soccer_ball_animated.svg
+GFDL 1.2 or later, CC-BY-SA 3.0 unported, CC-BY-SA 2.5 generic, CC-BY-SA 2.0 generic, or CC-BY-SA 1.0 generic
+Pumbaa80
+
+Bishzilla_blink.gif
+https://commons.wikimedia.org/wiki/File:Bishzilla_blink.gif
+Public domain
+Bishonen
diff --git a/tests/phpunit/data/media/Soccer_ball_animated.svg b/tests/phpunit/data/media/Soccer_ball_animated.svg
new file mode 100644 (file)
index 0000000..6bd82fc
--- /dev/null
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!DOCTYPE svg>\r
+<svg width="150" height="150" viewBox="-105 -105 210 210" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">\r
+   <defs>\r
+      <clipPath id="ball">\r
+         <circle r="100" stroke-width="0"/>\r
+      </clipPath>\r
+      <radialGradient id="shadow1" cx=".4" cy=".3" r=".8">\r
+        <stop offset="0" stop-color="white" stop-opacity="1"/>\r
+        <stop offset=".4" stop-color="white" stop-opacity="1"/>\r
+        <stop offset=".8" stop-color="#EEEEEE" stop-opacity="1"/>\r
+      </radialGradient>\r
+      <radialGradient id="shadow2" cx=".5" cy=".5" r=".5">\r
+        <stop offset="0" stop-color="white" stop-opacity="0"/>\r
+        <stop offset=".8" stop-color="white" stop-opacity="0"/>\r
+        <stop offset=".99" stop-color="black" stop-opacity=".3"/>\r
+        <stop offset="1" stop-color="black" stop-opacity="1"/>\r
+      </radialGradient>\r
+      <g id="black_stuff" stroke-linejoin="round" clip-path="url(#ball)">\r
+         <g fill="black">\r
+            <path d="M 6,-32 Q 26,-28 46,-19 Q 57,-35 64,-47 Q 50,-68 37,-76 Q 17,-75 1,-68 Q 4,-51 6,-32"/>\r
+            <path d="M -26,-2 Q -45,-8 -62,-11 Q -74,5 -76,22 Q -69,40 -50,54 Q -32,47 -17,39 Q -23,15 -26,-2"/>\r
+            <path d="M -95,22 Q -102,12 -102,-8 V 80 H -85 Q -95,45 -95,22"/>\r
+            <path d="M 55,24 Q 41,41 24,52 Q 28,65 31,79 Q 55,78 68,67 Q 78,50 80,35 Q 65,28 55,24"/>\r
+            <path d="M 0,120 L -3,95 Q -25,93 -42,82 Q -50,84 -60,81"/>\r
+            <path d="M -90,-48 Q -80,-52 -68,-49 Q -52,-71 -35,-77 Q -35,-100 -40,-100 H -100"/>\r
+            <path d="M 100,-55 L 87,-37 Q 98,-10 97,5 L 100,6"/>\r
+         </g>\r
+         <g fill="none">\r
+            <path d="M 6,-32 Q -18,-12 -26,-2\r
+                     M 46,-19 Q 54,5 55,24\r
+                     M 64,-47 Q 77,-44 87,-37\r
+                     M 37,-76 Q 39,-90 36,-100\r
+                     M 1,-68 Q -13,-77 -35,-77\r
+                     M -62,-11 Q -67,-25 -68,-49\r
+                     M -76,22 Q -85,24 -95,22\r
+                     M -50,54 Q -49,70 -42,82\r
+                     M -17,39 Q 0,48 24,52\r
+                     M 31,79 Q 20,92 -3,95\r
+                     M 68,67 L 80,80\r
+                     M 80,35 Q 90,25 97,5\r
+            "/>\r
+         </g>\r
+      </g>\r
+   </defs>\r
+   <circle r="100" fill="white" stroke="none"/>\r
+   <circle r="100" fill="url(#shadow1)" stroke="none"/>\r
+   <g><animateTransform attributeName="transform" attributeType="XML" type="rotate" from="0" to="360" begin="0s" dur="3s" repeatCount="indefinite"/>\r
+      <use xlink:href="#black_stuff" stroke="#EEE" stroke-width="7"/>\r
+      <use xlink:href="#black_stuff" stroke="#DDD" stroke-width="4"/>\r
+      <use xlink:href="#black_stuff" stroke="#999" stroke-width="2"/>\r
+      <use xlink:href="#black_stuff" stroke="black" stroke-width="1"/>\r
+   </g>\r
+   <circle r="100" fill="url(#shadow2)" stroke="none"/>\r
+</svg>\r
diff --git a/tests/phpunit/data/parser/LoremIpsum.djvu b/tests/phpunit/data/parser/LoremIpsum.djvu
new file mode 100644 (file)
index 0000000..42f47cd
Binary files /dev/null and b/tests/phpunit/data/parser/LoremIpsum.djvu differ
diff --git a/tests/phpunit/data/parser/headbg.jpg b/tests/phpunit/data/parser/headbg.jpg
new file mode 100644 (file)
index 0000000..5491c6e
Binary files /dev/null and b/tests/phpunit/data/parser/headbg.jpg differ
diff --git a/tests/phpunit/data/parser/wiki.png b/tests/phpunit/data/parser/wiki.png
new file mode 100644 (file)
index 0000000..8c42118
Binary files /dev/null and b/tests/phpunit/data/parser/wiki.png differ
diff --git a/tests/phpunit/data/upload/headbg.jpg b/tests/phpunit/data/upload/headbg.jpg
new file mode 100644 (file)
index 0000000..5491c6e
Binary files /dev/null and b/tests/phpunit/data/upload/headbg.jpg differ
index 6335d11..fac9b88 100644 (file)
@@ -87,8 +87,15 @@ class WfTimestampTest extends MediaWikiTestCase {
         * See r74778 and bug 25451
         * @dataProvider provideOldTimestamps
         */
-       public function testOldTimestamps( $input, $format, $output, $desc ) {
-               $this->assertEquals( $output, wfTimestamp( $format, $input ), $desc );
+       public function testOldTimestamps( $input, $outputType, $output, $message ) {
+               $timestamp = wfTimestamp( $outputType, $input );
+               if ( substr( $output, 0, 1 ) === '/' ) {
+                       // Bug 64946: Day of the week calculations for very old
+                       // timestamps varies from system to system.
+                       $this->assertRegExp(  $output, $timestamp, $message );
+               } else {
+                       $this->assertEquals( $output, $timestamp, $message );
+               }
        }
 
        public static function provideOldTimestamps() {
@@ -117,12 +124,12 @@ class WfTimestampTest extends MediaWikiTestCase {
                        array(
                                '0117-08-09 12:34:56',
                                TS_RFC2822,
-                               'Tue, 09 Aug 0117 12:34:56 GMT',
+                               '/, 09 Aug 0117 12:34:56 GMT$/',
                                'Death of Roman Emperor [[Trajan]]'
                        ),
 
                        /* @todo FIXME: 00 to 101 years are taken as being in [1970-2069] */
-                       array( '-58979923200', TS_RFC2822, 'Sun, 01 Jan 0101 00:00:00 GMT', '1/1/101' ),
+                       array( '-58979923200', TS_RFC2822, '/, 01 Jan 0101 00:00:00 GMT$/', '1/1/101' ),
                        array( '-62135596800', TS_RFC2822, 'Mon, 01 Jan 0001 00:00:00 GMT', 'Year 1' ),
 
                        /* It is not clear if we should generate a year 0 or not
diff --git a/tests/phpunit/includes/ImportTest.php b/tests/phpunit/includes/ImportTest.php
new file mode 100644 (file)
index 0000000..8895403
--- /dev/null
@@ -0,0 +1,100 @@
+<?php
+
+/**
+ * Test class for Import methods.
+ *
+ * @group Database
+ *
+ * @author Sebastian Brückner < sebastian.brueckner@student.hpi.uni-potsdam.de >
+ */
+class ImportTest extends MediaWikiLangTestCase {
+
+       private function getInputStreamSource( $xml ) {
+               $file = 'data:application/xml,' . $xml;
+               $status = ImportStreamSource::newFromFile( $file );
+               if ( !$status->isGood() ) {
+                       throw new MWException( "Cannot create InputStreamSource." );
+               }
+               return $status->value;
+       }
+
+       /**
+        * @covers WikiImporter::handlePage
+        * @dataProvider getRedirectXML
+        * @param string $xml
+        */
+       public function testHandlePageContainsRedirect( $xml, $redirectTitle ) {
+               $source = $this->getInputStreamSource( $xml );
+
+               $redirect = NULL;
+               $callback = function( $title, $origTitle, $revCount, $sRevCount, $pageInfo ) use ( &$redirect ) {
+                       if ( array_key_exists( 'redirect', $pageInfo ) ) {
+                               $redirect = $pageInfo['redirect'];
+                       }
+               };
+
+               $importer = new WikiImporter( $source );
+               $importer->setPageOutCallback( $callback );
+               $importer->doImport();
+
+               $this->assertEquals( $redirectTitle, $redirect );
+       }
+
+       public function getRedirectXML() {
+               return array(
+                       array(
+                               <<< EOF
+<mediawiki>
+       <page>
+               <title>Test</title>
+               <ns>0</ns>
+               <id>21</id>
+               <redirect title="Test22"/>
+               <revision>
+                       <id>20</id>
+                       <timestamp>2014-05-27T10:00:00Z</timestamp>
+                       <contributor>
+                               <username>Admin</username>
+                               <id>10</id>
+                       </contributor>
+                       <comment>Admin moved page [[Test]] to [[Test22]]</comment>
+                       <text xml:space="preserve" bytes="20">#REDIRECT [[Test22]]</text>
+                       <sha1>tq456o9x3abm7r9ozi6km8yrbbc56o6</sha1>
+                       <model>wikitext</model>
+                       <format>text/x-wiki</format>
+               </revision>
+       </page>
+</mediawiki>
+EOF
+                       ,
+                               'Test22'
+                       ),
+                       array(
+                               <<< EOF
+<mediawiki>
+       <page>
+               <title>Test</title>
+               <ns>0</ns>
+               <id>42</id>
+               <revision>
+                       <id>421</id>
+                       <timestamp>2014-05-27T11:00:00Z</timestamp>
+                       <contributor>
+                               <username>Admin</username>
+                               <id>10</id>
+                       </contributor>
+                       <text xml:space="preserve" bytes="4">Abcd</text>
+                       <sha1>n7uomjq96szt60fy5w3x7ahf7q8m8rh</sha1>
+                       <model>wikitext</model>
+                       <format>text/x-wiki</format>
+               </revision>
+       </page>
+</mediawiki>
+EOF
+                       ,
+                               NULL
+                       ),
+               );
+       }
+
+}
index 110cbac..4d62cc7 100644 (file)
@@ -82,4 +82,106 @@ class LinkerTest extends MediaWikiLangTestCase {
                        # TODO!
                );
        }
+
+       /**
+        * @dataProvider provideCasesForFormatComment
+        * @covers Linker::formatComment
+        * @covers Linker::formatAutocomments
+        * @covers Linker::formatLinksInComment
+        */
+       public function testFormatComment( $expected, $comment, $title = false, $local = false ) {
+               $this->setMwGlobals( array(
+                       'wgScript' => '/wiki/index.php',
+                       'wgArticlePath' => '/wiki/$1',
+                       'wgWellFormedXml' => true,
+               ) );
+
+               if ( $title === false ) {
+                       // We need a page title that exists
+                       $title = Title::newFromText( 'Special:BlankPage' );
+               }
+
+               $this->assertEquals(
+                       $expected,
+                       Linker::formatComment( $comment, $title, $local )
+               );
+       }
+
+       public static function provideCasesForFormatComment() {
+               return array(
+                       // Linker::formatComment
+                       array(
+                               'a&lt;script&gt;b',
+                               'a<script>b',
+                       ),
+                       array(
+                               'a—b',
+                               'a&mdash;b',
+                       ),
+                       array(
+                               "&#039;&#039;&#039;not bolded&#039;&#039;&#039;",
+                               "'''not bolded'''",
+                       ),
+                       // Linker::formatAutocomments
+                       array(
+                               '<a href="/wiki/Special:BlankPage#autocomment" title="Special:BlankPage">→</a>‎<span dir="auto"><span class="autocomment">autocomment</span></span>',
+                               "/* autocomment */",
+                       ),
+                       array(
+                               '<a href="/wiki/Special:BlankPage#linkie.3F" title="Special:BlankPage">→</a>‎<span dir="auto"><span class="autocomment"><a href="/wiki/index.php?title=Linkie%3F&amp;action=edit&amp;redlink=1" class="new" title="Linkie? (page does not exist)">linkie?</a></span></span>',
+                               "/* [[linkie?]] */",
+                       ),
+                       array(
+                               '<a href="/wiki/Special:BlankPage#autocomment" title="Special:BlankPage">→</a>‎<span dir="auto"><span class="autocomment">autocomment: </span> post</span>',
+                               "/* autocomment */ post",
+                       ),
+                       array(
+                               'pre <a href="/wiki/Special:BlankPage#autocomment" title="Special:BlankPage">→</a>‎<span dir="auto"><span class="autocomment">autocomment</span></span>',
+                               "pre /* autocomment */",
+                       ),
+                       array(
+                               'pre <a href="/wiki/Special:BlankPage#autocomment" title="Special:BlankPage">→</a>‎<span dir="auto"><span class="autocomment">autocomment: </span> post</span>',
+                               "pre /* autocomment */ post",
+                       ),
+                       array(
+                               '/* autocomment */ multiple? <a href="/wiki/Special:BlankPage#autocomment2" title="Special:BlankPage">→</a>‎<span dir="auto"><span class="autocomment">autocomment2: </span> </span>',
+                               "/* autocomment */ multiple? /* autocomment2 */ ",
+                       ),
+                       array(
+                               '<a href="#autocomment">→</a>‎<span dir="auto"><span class="autocomment">autocomment</span></span>',
+                               "/* autocomment */",
+                               false, true
+                       ),
+                       array(
+                               '‎<span dir="auto"><span class="autocomment">autocomment</span></span>',
+                               "/* autocomment */",
+                               null
+                       ),
+                       // Linker::formatLinksInComment
+                       array(
+                               'abc <a href="/wiki/index.php?title=Link&amp;action=edit&amp;redlink=1" class="new" title="Link (page does not exist)">link</a> def',
+                               "abc [[link]] def",
+                       ),
+                       array(
+                               'abc <a href="/wiki/index.php?title=Link&amp;action=edit&amp;redlink=1" class="new" title="Link (page does not exist)">text</a> def',
+                               "abc [[link|text]] def",
+                       ),
+                       array(
+                               'abc <a href="/wiki/Special:BlankPage" title="Special:BlankPage">Special:BlankPage</a> def',
+                               "abc [[Special:BlankPage|]] def",
+                       ),
+                       array(
+                               'abc <a href="/wiki/index.php?title=%C4%84%C5%9B%C5%BC&amp;action=edit&amp;redlink=1" class="new" title="Ąśż (page does not exist)">ąśż</a> def',
+                               "abc [[%C4%85%C5%9B%C5%BC]] def",
+                       ),
+                       array(
+                               'abc <a href="/wiki/Special:BlankPage#section" title="Special:BlankPage">#section</a> def',
+                               "abc [[#section]] def",
+                       ),
+                       array(
+                               'abc <a href="/wiki/index.php?title=/subpage&amp;action=edit&amp;redlink=1" class="new" title="/subpage (page does not exist)">/subpage</a> def',
+                               "abc [[/subpage]] def",
+                       ),
+               );
+       }
 }
index 1a6cfe6..3829f90 100644 (file)
@@ -355,7 +355,7 @@ class StatusTest extends MediaWikiLangTestCase {
                $testCases[ '2StringWarnings' ] = array(
                        $status,
                        "* <fooBar!>\n* <fooBar2!>\n",
-                       "<ul>\n<li> &lt;fooBar!&gt;\n</li>\n<li> &lt;fooBar2!&gt;\n</li>\n</ul>\n",
+                       "<ul><li> &lt;fooBar!&gt;</li>\n<li> &lt;fooBar2!&gt;</li></ul>\n",
                );
 
                $status = new Status();
@@ -372,7 +372,7 @@ class StatusTest extends MediaWikiLangTestCase {
                $testCases[ '2MessageWarnings' ] = array(
                        $status,
                        "* <fooBar!>\n* <fooBar2!>\n",
-                       "<ul>\n<li> &lt;fooBar!&gt;\n</li>\n<li> &lt;fooBar2!&gt;\n</li>\n</ul>\n",
+                       "<ul><li> &lt;fooBar!&gt;</li>\n<li> &lt;fooBar2!&gt;</li></ul>\n",
                );
 
                return $testCases;
index 0b368c2..f0d4c4d 100644 (file)
@@ -3,8 +3,6 @@
 class TimeAdjustTest extends MediaWikiLangTestCase {
        protected function setUp() {
                parent::setUp();
-
-               $this->iniSet( 'precision', 15 );
        }
 
        /**
@@ -18,7 +16,7 @@ class TimeAdjustTest extends MediaWikiLangTestCase {
                $this->setMwGlobals( 'wgLocalTZoffset', $localTZoffset );
 
                $this->assertEquals(
-                       strval( $expected ),
+                       $expected,
                        strval( $wgContLang->userAdjust( $date, '' ) ),
                        "User adjust {$date} by {$localTZoffset} minutes should give {$expected}"
                );
@@ -26,16 +24,16 @@ class TimeAdjustTest extends MediaWikiLangTestCase {
 
        public static function dataUserAdjust() {
                return array(
-                       array( 20061231235959, 0, 20061231235959 ),
-                       array( 20061231235959, 5, 20070101000459 ),
-                       array( 20061231235959, 15, 20070101001459 ),
-                       array( 20061231235959, 60, 20070101005959 ),
-                       array( 20061231235959, 90, 20070101012959 ),
-                       array( 20061231235959, 120, 20070101015959 ),
-                       array( 20061231235959, 540, 20070101085959 ),
-                       array( 20061231235959, -5, 20061231235459 ),
-                       array( 20061231235959, -30, 20061231232959 ),
-                       array( 20061231235959, -60, 20061231225959 ),
+                       array( '20061231235959', 0, '20061231235959' ),
+                       array( '20061231235959', 5, '20070101000459' ),
+                       array( '20061231235959', 15,'20070101001459' ),
+                       array( '20061231235959', 60, '20070101005959' ),
+                       array( '20061231235959', 90, '20070101012959' ),
+                       array( '20061231235959', 120, '20070101015959' ),
+                       array( '20061231235959', 540, '20070101085959' ),
+                       array( '20061231235959', -5, '20061231235459' ),
+                       array( '20061231235959', -30, '20061231232959' ),
+                       array( '20061231235959', -60, '20061231225959' ),
                );
        }
 }
index 37f1975..78457d2 100644 (file)
@@ -817,6 +817,22 @@ more stuff
                $this->assertEquals( $expected, is_null( $c ) ? null : trim( $c->getNativeData() ) );
        }
 
+       /**
+        * @dataProvider dataReplaceSection
+        * @covers WikiPage::replaceSectionAtRev
+        */
+       public function testReplaceSectionAtRev( $title, $model, $text, $section,
+               $with, $sectionTitle, $expected
+       ) {
+               $page = $this->createPage( $title, $text, $model );
+               $baseRevId = $page->getLatest();
+
+               $content = ContentHandler::makeContent( $with, $page->getTitle(), $page->getContentModel() );
+               $c = $page->replaceSectionAtRev( $section, $content, $sectionTitle, $baseRevId );
+
+               $this->assertEquals( $expected, is_null( $c ) ? null : trim( $c->getNativeData() ) );
+       }
+
        /* @todo FIXME: fix this!
        public function testGetUndoText() {
        $this->checkHasDiff3();
index 4ed5aa9..8c5f540 100644 (file)
@@ -30,4 +30,43 @@ class ApiMainTest extends ApiTestCase {
                $this->assertThat( $sxe, $this->isInstanceOf( "SimpleXMLElement" ) );
        }
 
+       public static function provideAssert() {
+               $anon = new User();
+               $bot = new User();
+               $bot->setName( 'Bot' );
+               $bot->addToDatabase();
+               $bot->addGroup( 'bot' );
+               $user = new User();
+               $user->setName( 'User' );
+               $user->addToDatabase();
+               return array(
+                       array( $anon, 'user', 'assertuserfailed' ),
+                       array( $user, 'user', false ),
+                       array( $user, 'bot', 'assertbotfailed' ),
+                       array( $bot, 'user', false ),
+                       array( $bot, 'bot', false ),
+               );
+       }
+
+       /**
+        * Tests the assert={user|bot} functionality
+        *
+        * @covers ApiMain::checkAsserts
+        * @dataProvider provideAssert
+        * @param User $user
+        * @param string $assert
+        * @param string|bool $error false if no error expected
+        */
+       public function testAssert( $user, $assert, $error ) {
+               try {
+                       $this->doApiRequest( array(
+                               'action' => 'query',
+                               'assert' => $assert,
+                       ), null, null, $user );
+                       $this->assertFalse( $error ); // That no error was expected
+               } catch ( UsageException $e ) {
+                       $this->assertEquals( $e->getCodeString(), $error );
+               }
+       }
+
 }
index 3276cf9..a79866e 100644 (file)
@@ -132,14 +132,14 @@ class StoreBatchTest extends MediaWikiTestCase {
                global $IP;
                $this->storecohort(
                        "Test1.png",
-                       "$IP/skins/monobook/wiki.png",
-                       "$IP/skins/monobook/video.png",
+                       "$IP/tests/phpunit/data/filerepo/wiki.png",
+                       "$IP/tests/phpunit/data/filerepo/video.png",
                        false
                );
                $this->storecohort(
                        "Test2.png",
-                       "$IP/skins/monobook/wiki.png",
-                       "$IP/skins/monobook/video.png",
+                       "$IP/tests/phpunit/data/filerepo/wiki.png",
+                       "$IP/tests/phpunit/data/filerepo/video.png",
                        true
                );
        }
diff --git a/tests/phpunit/includes/filerepo/files/FileTest.php b/tests/phpunit/includes/filerepo/files/FileTest.php
new file mode 100644 (file)
index 0000000..36b95ea
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+class FileTest extends MediaWikiMediaTestCase {
+
+       function setUp() {
+               $this->setMWGlobals( 'wgMaxAnimatedGifArea', 9000 );
+               parent::setUp();
+       }
+
+       /**
+        * @param $filename String
+        * @param $expected boolean
+        * @dataProvider providerCanAnimate
+        */
+       function testCanAnimateThumbIfAppropriate( $filename, $expected ) {
+               $file = $this->dataFile( $filename );
+               $this->assertEquals( $file->canAnimateThumbIfAppropriate(), $expected );
+       }
+
+       function providerCanAnimate() {
+               return array(
+                       array( 'nonanimated.gif', true ),
+                       array( 'jpeg-comment-utf.jpg', true ),
+                       array( 'test.tiff', true ),
+                       array( 'Animated_PNG_example_bouncing_beach_ball.png', false ),
+                       array( 'greyscale-png.png', true ),
+                       array( 'Toll_Texas_1.svg', true ),
+                       array( 'LoremIpsum.djvu', true ),
+                       array( '80x60-2layers.xcf', true ),
+                       array( 'Soccer_ball_animated.svg', false ),
+                       array( 'Bishzilla_blink.gif', false ),
+                       array( 'animated.gif', true ),
+               );
+       }
+}
index 5475a82..bb5e398 100644 (file)
@@ -202,6 +202,16 @@ class CSSMinTest extends MediaWikiTestCase {
                                'foo { /* @embed */ background: url(red.gif); }',
                                "foo { background: url($red); background: url(http://localhost/w/red.gif?timestamp)!ie; }",
                        ),
+                       array(
+                               'Can not re-embed data: URIs',
+                               "foo { /* @embed */ background: url($red); }",
+                               "foo { background: url($red); }",
+                       ),
+                       array(
+                               'Can not remap data: URIs',
+                               "foo { background: url($red); }",
+                               "foo { background: url($red); }",
+                       ),
                        array(
                                'Can not embed remote URLs',
                                'foo { /* @embed */ background: url(http://example.org/w/foo.png); }',
index ebfcba9..96347d9 100644 (file)
@@ -63,10 +63,16 @@ abstract class MediaWikiMediaTestCase extends MediaWikiTestCase {
         *
         * File must be in the path returned by getFilePath()
         * @param $name String File name
-        * @param $type String MIME type
+        * @param $type String MIME type [optional]
         * @return UnregisteredLocalFile
         */
-       protected function dataFile( $name, $type ) {
+       protected function dataFile( $name, $type = null ) {
+               if ( !$type ) {
+                       // Autodetect by file extension for the lazy.
+                       $magic = MimeMagic::singleton();
+                       $parts = explode( $name, '.' );
+                       $type = $magic->guessTypesForExtension( $parts[count( $parts ) - 1]  );
+               }
                return new UnregisteredLocalFile( false, $this->repo,
                        "mwstore://localtesting/data/$name", $type );
        }
index fa63fa6..f06bd6f 100644 (file)
@@ -116,6 +116,17 @@ class SVGMetadataExtractorTest extends MediaWikiTestCase {
                                        ),
                                )
                        ),
+                       array(
+                               "$base/Soccer_ball_animated.svg",
+                               array(
+                                       'width' => 150,
+                                       'height' => 150,
+                                       'originalWidth' => '150',
+                                       'originalHeight' => '150',
+                                       'animated' => true,
+                                       'translations' => array()
+                               ),
+                       ),
                );
        }
 
index 26efa4a..5c42fae 100644 (file)
@@ -25,6 +25,7 @@ class NewParserTest extends MediaWikiTestCase {
        public $savedGlobals = array();
        public $hooks = array();
        public $functionHooks = array();
+       public $transparentHooks = array();
 
        //Fuzz test
        public $maxFuzzTestLength = 300;
@@ -277,7 +278,7 @@ class NewParserTest extends MediaWikiTestCase {
                                        'size'        => 12345,
                                        'width'       => 240,
                                        'height'      => 180,
-                                       'bits'        => 24,
+                                       'bits'        => 0,
                                        'media_type'  => MEDIATYPE_DRAWING,
                                        'mime'        => 'image/svg+xml',
                                        'metadata'    => serialize( array() ),
@@ -285,34 +286,6 @@ class NewParserTest extends MediaWikiTestCase {
                                        'fileExists'  => true
                        ), $this->db->timestamp( '20010115123500' ), $user );
                }
-               $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Portrait.png' ) );
-               if ( !$this->db->selectField( 'image', '1', array( 'img_name' => $image->getName() ) ) ) {
-                       $image->recordUpload2( '', 'Upload of tall bitmap', 'Some tall bitmap', array(
-                                       'size'        => 12345,
-                                       'width'       => 180,
-                                       'height'      => 240,
-                                       'bits'        => 8,
-                                       'media_type'  => MEDIATYPE_BITMAP,
-                                       'mime'        => 'image/png',
-                                       'metadata'    => serialize( array() ),
-                                       'sha1'        => wfBaseConvert( '', 16, 36, 31 ),
-                                       'fileExists'  => true
-                       ), $this->db->timestamp( '20140515134200' ), $user );
-               }
-               $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Portrait.svg' ) );
-               if ( !$this->db->selectField( 'image', '1', array( 'img_name' => $image->getName() ) ) ) {
-                       $image->recordUpload2( '', 'Upload of tall SVG', 'Some tall SVG', array(
-                                       'size'        => 12345,
-                                       'width'       => 180,
-                                       'height'      => 240,
-                                       'bits'        => 24,
-                                       'media_type'  => MEDIATYPE_DRAWING,
-                                       'mime'        => 'image/svg+xml',
-                                       'metadata'    => serialize( array() ),
-                                       'sha1'        => wfBaseConvert( '', 16, 36, 31 ),
-                                       'fileExists'  => true
-                       ), $this->db->timestamp( '20140325124200' ), $user );
-               }
 
                # A DjVu file
                $image = wfLocalFile( Title::makeTitle( NS_FILE, 'LoremIpsum.djvu' ) );
@@ -321,7 +294,7 @@ class NewParserTest extends MediaWikiTestCase {
                                'size' => 3249,
                                'width' => 2480,
                                'height' => 3508,
-                               'bits' => 24,
+                               'bits' => 0,
                                'media_type' => MEDIATYPE_BITMAP,
                                'mime' => 'image/vnd.djvu',
                                'metadata' => '<?xml version="1.0" ?>
@@ -517,23 +490,19 @@ class NewParserTest extends MediaWikiTestCase {
                $backend = RepoGroup::singleton()->getLocalRepo()->getBackend();
                $backend->prepare( array( 'dir' => "$base/local-public/3/3a" ) );
                $backend->store( array(
-                       'src' => "$IP/skins/monobook/headbg.jpg", 'dst' => "$base/local-public/3/3a/Foobar.jpg"
+                       'src' => "$IP/tests/phpunit/data/parser/headbg.jpg", 'dst' => "$base/local-public/3/3a/Foobar.jpg"
                ) );
                $backend->prepare( array( 'dir' => "$base/local-public/e/ea" ) );
                $backend->store( array(
-                       'src' => "$IP/skins/monobook/wiki.png", 'dst' => "$base/local-public/e/ea/Thumb.png"
+                       'src' => "$IP/tests/phpunit/data/parser/wiki.png", 'dst' => "$base/local-public/e/ea/Thumb.png"
                ) );
                $backend->prepare( array( 'dir' => "$base/local-public/0/09" ) );
                $backend->store( array(
-                       'src' => "$IP/skins/monobook/headbg.jpg", 'dst' => "$base/local-public/0/09/Bad.jpg"
-               ) );
-               $backend->prepare( array( 'dir' => "$base/local-public/9/93" ) );
-               $backend->store( array(
-                       'src' => "$IP/tests/phpunit/data/media/Portrait.png", 'dst' => "$base/local-public/9/93/Portrait.png"
+                       'src' => "$IP/tests/phpunit/data/parser/headbg.jpg", 'dst' => "$base/local-public/0/09/Bad.jpg"
                ) );
                $backend->prepare( array( 'dir' => "$base/local-public/5/5f" ) );
                $backend->store( array(
-                       'src' => "$IP/tests/phpunit/data/media/LoremIpsum.djvu", 'dst' => "$base/local-public/5/5f/LoremIpsum.djvu"
+                       'src' => "$IP/tests/phpunit/data/parser/LoremIpsum.djvu", 'dst' => "$base/local-public/5/5f/LoremIpsum.djvu"
                ) );
 
                // No helpful SVG file to copy, so make one ourselves
@@ -545,15 +514,6 @@ class NewParserTest extends MediaWikiTestCase {
                $backend->quickCreate( array(
                        'content' => $data, 'dst' => "$base/local-public/f/ff/Foobar.svg"
                ) );
-
-               $data = '<?xml version="1.0" encoding="utf-8"?>' .
-                       '<svg xmlns="http://www.w3.org/2000/svg"' .
-                       ' version="1.1" width="180" height="240"/>';
-
-               $backend->prepare( array( 'dir' => "$base/local-public/f/fc" ) );
-               $backend->quickCreate( array(
-                       'content' => $data, 'dst' => "$base/local-public/f/fc/Portrait.svg"
-               ) );
        }
 
        /**
@@ -628,9 +588,6 @@ class NewParserTest extends MediaWikiTestCase {
                                "$base/local-thumb/5/5f/LoremIpsum.djvu/page2-3720px-LoremIpsum.djvu.jpg",
                                "$base/local-thumb/5/5f/LoremIpsum.djvu/page2-4960px-LoremIpsum.djvu.jpg",
 
-                               "$base/local-public/9/93/Portrait.png",
-                               "$base/local-thumb/9/93/Portrait.png/165px-Portrait.png",
-
                                "$base/local-public/f/ff/Foobar.svg",
                                "$base/local-thumb/f/ff/Foobar.svg/180px-Foobar.svg.png",
                                "$base/local-thumb/f/ff/Foobar.svg/2000px-Foobar.svg.png",
@@ -642,14 +599,6 @@ class NewParserTest extends MediaWikiTestCase {
                                "$base/local-thumb/f/ff/Foobar.svg/langde-270px-Foobar.svg.png",
                                "$base/local-thumb/f/ff/Foobar.svg/langde-360px-Foobar.svg.png",
 
-                               "$base/local-public/f/fc/Portrait.svg",
-                               "$base/local-thumb/f/fc/Portrait.svg/165px-Portrait.svg.png",
-                               "$base/local-thumb/f/fc/Portrait.svg/225px-Portrait.svg.png",
-                               "$base/local-thumb/f/fc/Portrait.svg/247px-Portrait.svg.png",
-                               "$base/local-thumb/f/fc/Portrait.svg/330px-Portrait.svg.png",
-                               "$base/local-thumb/f/fc/Portrait.svg/337px-Portrait.svg.png",
-                               "$base/local-thumb/f/fc/Portrait.svg/450px-Portrait.svg.png",
-
                                "$base/local-public/math/f/a/5/fa50b8b616463173474302ca3e63586b.png",
                        )
                );
@@ -997,6 +946,12 @@ class NewParserTest extends MediaWikiTestCase {
                return isset( $wgParser->mFunctionHooks[$name] );
        }
 
+       public function requireTransparentHook( $name ) {
+               global $wgParser;
+               $wgParser->firstCallInit(); // make sure hooks are loaded.
+               return isset( $wgParser->mTransparentTagHooks[$name] );
+       }
+
        //Various "cleanup" functions
 
        /**
index c73666d..c024cee 100644 (file)
@@ -56,4 +56,32 @@ class ParserOutputTest extends MediaWikiTestCase {
                $this->assertNull( $po->getExtensionData( "one" ) );
                $this->assertEquals( "Bar", $po->getExtensionData( "two" ) );
        }
+
+       /**
+        * @covers ParserOutput::setProperty
+        * @covers ParserOutput::getProperty
+        * @covers ParserOutput::unsetProperty
+        * @covers ParserOutput::getProperties
+        */
+       public function testProperties() {
+               $po = new ParserOutput();
+
+               $po->setProperty( 'foo', 'val' );
+
+               $properties = $po->getProperties();
+               $this->assertEquals( $po->getProperty( 'foo' ), 'val' );
+               $this->assertEquals( $properties['foo'], 'val' );
+
+               $po->setProperty( 'foo', 'second val' );
+
+               $properties = $po->getProperties();
+               $this->assertEquals( $po->getProperty( 'foo' ), 'second val' );
+               $this->assertEquals( $properties['foo'], 'second val' );
+
+               $po->unsetProperty( 'foo' );
+
+               $properties = $po->getProperties();
+               $this->assertEquals( $po->getProperty( 'foo' ), false );
+               $this->assertArrayNotHasKey( 'foo', $properties );
+       }
 }
diff --git a/tests/phpunit/includes/poolcounter/PoolCounterTest.php b/tests/phpunit/includes/poolcounter/PoolCounterTest.php
new file mode 100644 (file)
index 0000000..2d31d08
--- /dev/null
@@ -0,0 +1,72 @@
+<?php
+
+// We will use this class with getMockForAbstractClass to create a concrete mock class. That call will die if the
+// contructor is not public, unless we use disableOriginalConstructor(), in which case we could not test the constructor.
+abstract class PoolCounterAbstractMock extends PoolCounter {
+       public function __construct() {
+               call_user_func_array( 'parent::__construct', func_get_args() );
+       }
+}
+
+class PoolCounterTest extends MediaWikiTestCase {
+       public function testConstruct() {
+               $poolCounterConfig = array(
+                       'class' => 'PoolCounterMock',
+                       'timeout' => 10,
+                       'workers' => 10,
+                       'maxqueue' => 100,
+               );
+
+               $poolCounter = $this->getMockBuilder( 'PoolCounterAbstractMock' )
+                       ->setConstructorArgs( array( $poolCounterConfig, 'testCounter', 'someKey' ) )
+                       // don't mock anything - the proper syntax would be setMethods(null), but due to a PHPUnit bug that
+                       // does not work with getMockForAbstractClass()
+                       ->setMethods( array( 'idontexist' ) )
+                       ->getMockForAbstractClass();
+               $this->assertInstanceOf( 'PoolCounter', $poolCounter );
+       }
+
+       public function testConstructWithSlots() {
+               $poolCounterConfig = array(
+                       'class' => 'PoolCounterMock',
+                       'timeout' => 10,
+                       'workers' => 10,
+                       'slots' => 2,
+                       'maxqueue' => 100,
+               );
+
+               $poolCounter = $this->getMockBuilder( 'PoolCounterAbstractMock' )
+                       ->setConstructorArgs( array( $poolCounterConfig, 'testCounter', 'key' ) )
+                       ->setMethods( array( 'idontexist' ) ) // don't mock anything
+                       ->getMockForAbstractClass();
+               $this->assertInstanceOf( 'PoolCounter', $poolCounter );
+       }
+
+       public function testHashKeyIntoSlots() {
+               $poolCounter = $this->getMockBuilder( 'PoolCounterAbstractMock' )
+                       // don't mock anything - the proper syntax would be setMethods(null), but due to a PHPUnit bug that
+                       // does not work with getMockForAbstractClass()
+                       ->setMethods( array( 'idontexist' ) )
+                       ->disableOriginalConstructor()
+                       ->getMockForAbstractClass();
+
+               $hashKeyIntoSlots = new ReflectionMethod($poolCounter, 'hashKeyIntoSlots' );
+               $hashKeyIntoSlots->setAccessible( true );
+
+
+               $keysWithTwoSlots = $keysWithFiveSlots = array();
+               foreach ( range( 1, 100 ) as $i ) {
+                       $keysWithTwoSlots[] = $hashKeyIntoSlots->invoke( $poolCounter, 'key ' . $i, 2 );
+                       $keysWithFiveSlots[] = $hashKeyIntoSlots->invoke( $poolCounter, 'key ' . $i, 5 );
+               }
+
+               $this->assertArrayEquals( range( 0, 1 ), array_unique( $keysWithTwoSlots ) );
+               $this->assertArrayEquals( range( 0, 4 ), array_unique( $keysWithFiveSlots ) );
+
+               // make sure it is deterministic
+               $this->assertEquals(
+                       $hashKeyIntoSlots->invoke( $poolCounter, 'asdfgh', 1000 ),
+                       $hashKeyIntoSlots->invoke( $poolCounter, 'asdfgh', 1000 )
+               );
+       }
+}
index b25e9b0..fa22d34 100644 (file)
@@ -2,6 +2,52 @@
 
 class ResourceLoaderModuleTest extends ResourceLoaderTestCase {
 
+       /**
+        * @covers ResourceLoaderFileModule::getAllSkinStyleFiles
+        */
+       public function testGetAllSkinStyleFiles() {
+               $context = self::getResourceLoaderContext();
+
+               $baseParams = array(
+                       'scripts' => array(
+                               'foo.js',
+                               'bar.js',
+                       ),
+                       'styles' => array(
+                               'foo.css',
+                               'bar.css' => array( 'media' => 'print' ),
+                               'screen.less' => array( 'media' => 'screen' ),
+                               'screen-query.css' => array( 'media' => 'screen and (min-width: 400px)' ),
+                       ),
+                       'skinStyles' => array(
+                               'default' => 'quux-fallback.less',
+                               'vector' => array(
+                                       'baz-vector.css',
+                                       'quux-vector.less',
+                               ),
+                       ),
+                       'messages' => array(
+                               'hello',
+                               'world',
+                       ),
+               );
+
+               $module = new ResourceLoaderFileModule( $baseParams );
+
+               $this->assertEquals(
+                       array(
+                               'foo.css',
+                               'baz-vector.css',
+                               'quux-vector.less',
+                               'quux-fallback.less',
+                               'bar.css',
+                               'screen.less',
+                               'screen-query.css',
+                       ),
+                       array_map( 'basename', $module->getAllStyleFiles() )
+               );
+       }
+
        /**
         * @covers ResourceLoaderModule::getDefinitionSummary
         * @covers ResourceLoaderFileModule::getDefinitionSummary
index c4412de..df08972 100644 (file)
@@ -114,6 +114,67 @@ mw.loader.addSource( {
         "example"
     ]
 ] );'
+                       ) ),
+                       array( array(
+                               'msg' => 'Conditional dependency function',
+                               'modules' => array(
+                                       'test.x.core' => new ResourceLoaderTestModule(),
+                                       'test.x.polyfill' => new ResourceLoaderTestModule( array(
+                                               'skipFunction' => 'return true;'
+                                       ) ),
+                                       'test.y.polyfill' => new ResourceLoaderTestModule( array(
+                                               'skipFunction' =>
+                                                       'return !!(' .
+                                                       '    window.JSON &&' .
+                                                       '    JSON.parse &&' .
+                                                       '    JSON.stringify' .
+                                                       ');'
+                                       ) ),
+                                       'test.z.foo' => new ResourceLoaderTestModule( array(
+                                               'dependencies' => array(
+                                                       'test.x.core',
+                                                       'test.x.polyfil',
+                                                       'test.y.polyfil',
+                                               ),
+                                       ) ),
+                               ),
+                               'out' => '
+mw.loader.addSource( {
+    "local": {
+        "loadScript": "/w/load.php",
+        "apiScript": "/w/api.php"
+    }
+} );mw.loader.register( [
+    [
+        "test.x.core",
+        "1388534400"
+    ],
+    [
+        "test.x.polyfill",
+        "1388534400",
+        [],
+        null,
+        "local",
+        "return true;"
+    ],
+    [
+        "test.y.polyfill",
+        "1388534400",
+        [],
+        null,
+        "local",
+        "return !!(    window.JSON \u0026\u0026    JSON.parse \u0026\u0026    JSON.stringify);"
+    ],
+    [
+        "test.z.foo",
+        "1388534400",
+        [
+            "test.x.core",
+            "test.x.polyfil",
+            "test.y.polyfil"
+        ]
+    ]
+] );',
                        ) ),
                        array( array(
                                // This may seem like an edge case, but a plain MediaWiki core install
@@ -278,4 +339,77 @@ mw.loader.addSource( {
                );
        }
 
+       public static function provideRegistrations() {
+               return array(
+                       array( array(
+                               'test.blank' => new ResourceLoaderTestModule(),
+                               'test.min' => new ResourceLoaderTestModule( array(
+                                       'skipFunction' =>
+                                               'return !!(' .
+                                               '    window.JSON &&' .
+                                               '    JSON.parse &&' .
+                                               '    JSON.stringify' .
+                                               ');',
+                                       'dependencies' => array(
+                                               'test.blank',
+                                       ),
+                               ) ),
+                       ) )
+               );
+       }
+       /**
+        * @dataProvider provideRegistrations
+        */
+       public function testRegistrationsMinified( $modules ) {
+               $this->setMwGlobals( 'wgResourceLoaderDebug', false );
+
+               $context = self::getResourceLoaderContext();
+               $rl = $context->getResourceLoader();
+               $rl->register( $modules );
+               $this->assertEquals(
+'mw.loader.addSource({"local":{"loadScript":"/w/load.php","apiScript":"/w/api.php"}});'
+. 'mw.loader.register(['
+. '["test.blank","1388534400"],'
+. '["test.min","1388534400",["test.blank"],null,"local",'
+. '"return!!(window.JSON\u0026\u0026JSON.parse\u0026\u0026JSON.stringify);"'
+. ']]);',
+                       ResourceLoaderStartUpModule::getModuleRegistrations( $context ),
+                       'Minified output'
+               );
+       }
+
+       /**
+        * @dataProvider provideRegistrations
+        */
+       public function testRegistrationsUnminified( $modules ) {
+               $context = self::getResourceLoaderContext();
+               $rl = $context->getResourceLoader();
+               $rl->register( $modules );
+               $this->assertEquals(
+'mw.loader.addSource( {
+    "local": {
+        "loadScript": "/w/load.php",
+        "apiScript": "/w/api.php"
+    }
+} );mw.loader.register( [
+    [
+        "test.blank",
+        "1388534400"
+    ],
+    [
+        "test.min",
+        "1388534400",
+        [
+            "test.blank"
+        ],
+        null,
+        "local",
+        "return !!(    window.JSON \u0026\u0026    JSON.parse \u0026\u0026    JSON.stringify);"
+    ]
+] );',
+                       ResourceLoaderStartUpModule::getModuleRegistrations( $context ),
+                       'Unminified output'
+               );
+       }
+
 }
diff --git a/tests/phpunit/includes/specials/SpecialMIMESearchTest.php b/tests/phpunit/includes/specials/SpecialMIMESearchTest.php
new file mode 100644 (file)
index 0000000..e7bb35c
--- /dev/null
@@ -0,0 +1,44 @@
+<?php
+class SpecialMIMESearchTest extends MediaWikiTestCase {
+
+       /** @var MIMESearchPage */
+       private $page;
+
+       function setUp() {
+               $this->page = new MIMESearchPage;
+               $context = new RequestContext();
+               $context->setTitle( Title::makeTitle( NS_SPECIAL, 'MIMESearch' ) );
+               $context->setRequest( new FauxRequest() );
+               $this->page->setContext( $context );
+
+               parent::setUp();
+       }
+
+       /**
+        * @dataProvider providerMimeFiltering
+        * @param $par String subpage for special page
+        * @param $major String Major mime type we expect to look for
+        * @param $minor String Minor mime type we expect to look for
+        */
+       function testMimeFiltering( $par, $major, $minor ) {
+               $this->page->run( $par );
+               $qi = $this->page->getQueryInfo();
+               $this->assertEquals( $qi['conds']['img_major_mime'], $major );
+               if ( $minor !== null ) {
+                       $this->assertEquals( $qi['conds']['img_minor_mime'], $minor );
+               } else {
+                       $this->assertArrayNotHasKey( 'img_minor_mime', $qi['conds'] );
+               }
+               $this->assertContains( 'image', $qi['tables'] );
+       }
+
+       function providerMimeFiltering() {
+               return array(
+                       array( 'image/gif', 'image', 'gif' ),
+                       array( 'image/png', 'image', 'png' ),
+                       array( 'application/pdf', 'application', 'pdf' ),
+                       array( 'image/*', 'image', null ),
+                       array( 'multipart/*', 'multipart', null ),
+               );
+       }
+}
index 1267268..ebe347f 100644 (file)
@@ -278,38 +278,6 @@ class IPTest extends MediaWikiTestCase {
                $this->assertNull( IP::sanitizeIP( ' ' ) );
        }
 
-       /**
-        * @covers IP::toUnsigned
-        * @dataProvider provideToUnsigned
-        */
-       public function testToUnsigned( $expected, $input ) {
-               $result = IP::toUnsigned( $input );
-               $this->assertTrue( $result === false || is_string( $result ) || is_int( $result ) );
-               $this->assertEquals( $expected, $result );
-       }
-
-       /**
-        * Provider for IP::testToUnsigned()
-        */
-       public static function provideToUnsigned() {
-               return array(
-                       array( 1, '0.0.0.1' ),
-                       array( 16909060, '1.2.3.4' ),
-                       array( 2130706433, '127.0.0.1' ),
-                       array( '2147483648', '128.0.0.0' ),
-                       array( 2130706440, '127.0.0.08' ),
-                       array( 2130706441, '127.0.0.09' ),
-                       array( '3735931646', '222.173.202.254' ),
-                       array( pow( 2, 32 ) - 1, '255.255.255.255' ),
-                       array( false, 'IN.VA.LI.D' ),
-                       array( 1, '::1' ),
-                       array( '42540766452641154071740215577757643572', '2001:0db8:85a3:0000:0000:8a2e:0370:7334' ),
-                       array( '42540766452641154071740215577757643572', '2001:db8:85a3::8a2e:0370:7334' ),
-                       array( false, 'IN:VA::LI:D' ),
-                       array( false, ':::1' )
-               );
-       }
-
        /**
         * @covers IP::toHex
         * @dataProvider provideToHex
diff --git a/tests/phpunit/includes/utils/MWCryptHKDFTest.php b/tests/phpunit/includes/utils/MWCryptHKDFTest.php
new file mode 100644 (file)
index 0000000..7e37534
--- /dev/null
@@ -0,0 +1,89 @@
+<?php
+/**
+ *
+ * @group HKDF
+ */
+
+class MWCryptHKDFTest extends MediaWikiTestCase {
+
+       /**
+        * Test basic usage works
+        */
+       public function testGenerate() {
+               $a = MWCryptHKDF::generateHex( 64 );
+               $b = MWCryptHKDF::generateHex( 64 );
+
+               $this->assertTrue( strlen( $a ) == 64, "MWCryptHKDF produced fewer bytes than expected" );
+               $this->assertTrue( strlen( $b ) == 64, "MWCryptHKDF produced fewer bytes than expected" );
+               $this->assertFalse( $a == $b, "Two runs of MWCryptHKDF produced the same result." );
+       }
+
+       /**
+        * @dataProvider providerRfc5869
+        */
+       public function testRfc5869( $hash, $ikm, $salt, $info, $L, $prk, $okm ) {
+               $ikm = pack( 'H*', $ikm );
+               $salt = pack( 'H*', $salt );
+               $info = pack( 'H*', $info );
+               $okm = pack( 'H*', $okm );
+               $result = MWCryptHKDF::HKDF( $hash, $ikm, $salt, $info, $L );
+               $this->assertEquals( $okm, $result );
+       }
+
+       /**
+        * Test vectors from Appendix A on http://tools.ietf.org/html/rfc5869
+        */
+       public static function providerRfc5869() {
+
+               return array(
+                       // A.1
+                       array( 'sha256',
+                               '0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b', // ikm
+                               '000102030405060708090a0b0c', // salt
+                               'f0f1f2f3f4f5f6f7f8f9', // context
+                               42, // bytes
+                               '077709362c2e32df0ddc3f0dc47bba6390b6c73bb50f9c3122ec844ad7c2b3e5', // prk
+                               '3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865' // okm
+                       ),
+                       // A.2
+                       array( 'sha256',
+                               '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f',
+                               '606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeaf',
+                               'b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff',
+                               82,
+                               '06a6b88c5853361a06104c9ceb35b45cef760014904671014a193f40c15fc244',
+                               'b11e398dc80327a1c8e7f78c596a49344f012eda2d4efad8a050cc4c19afa97c59045a99cac7827271cb41c65e590e09da3275600c2f09b8367793a9aca3db71cc30c58179ec3e87c14c01d5c1f3434f1d87'
+                       ),
+                       // A.3
+                       array( 'sha256',
+                               '0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b', // ikm
+                               '', // salt
+                               '', // context
+                               42, // bytes
+                               '19ef24a32c717b167f33a91d6f648bdf96596776afdb6377ac434c1c293ccb04', // prk
+                               '8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d9d201395faa4b61a96c8' // okm
+                       ),
+                       // A.4
+                       array( 'sha1',
+                               '0b0b0b0b0b0b0b0b0b0b0b', // ikm
+                               '000102030405060708090a0b0c', // salt
+                               'f0f1f2f3f4f5f6f7f8f9', // context
+                               42, // bytes
+                               '9b6c18c432a7bf8f0e71c8eb88f4b30baa2ba243', // prk
+                               '085a01ea1b10f36933068b56efa5ad81a4f14b822f5b091568a9cdd4f155fda2c22e422478d305f3f896' // okm
+                       ),
+                       // A.5
+                       array( 'sha1',
+                               '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f', // ikm
+                               '606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeaf', // salt
+                               'b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff', // context
+                               82, // bytes
+                               '8adae09a2a307059478d309b26c4115a224cfaf6', // prk
+                               '0bd770a74d1160f7c9f12cd5912a06ebff6adcae899d92191fe4305673ba2ffe8fa3f1a4e5ad79f3f334b3b202b2173c486ea37ce3d397ed034c7f9dfeb15c5e927336d0441f4c4300e2cff0d0900b52d3b4' // okm
+                       ),
+               );
+
+       }
+
+
+}
index 4bc29cd..b27337b 100644 (file)
@@ -188,10 +188,10 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
                }
 
                wfMkdirParents( $dir . '/3/3a', null, __METHOD__ );
-               copy( "$IP/skins/monobook/headbg.jpg", "$dir/3/3a/Foobar.jpg" );
+               copy( "$IP/tests/phpunit/data/upload/headbg.jpg", "$dir/3/3a/Foobar.jpg" );
 
                wfMkdirParents( $dir . '/0/09', null, __METHOD__ );
-               copy( "$IP/skins/monobook/headbg.jpg", "$dir/0/09/Bad.jpg" );
+               copy( "$IP/tests/phpunit/data/upload/headbg.jpg", "$dir/0/09/Bad.jpg" );
 
                return $dir;
        }
index f6eff77..ee729e6 100644 (file)
@@ -30,15 +30,30 @@ require_once __DIR__ . '/../../../includes/Xml.php';
 $moduleImplementations = array(
        'testUsesMissing' => "
 mw.loader.implement( 'testUsesMissing', function () {
-       QUnit.ok( false, 'Module test.usesMissing script should not run.');
+       QUnit.ok( false, 'Module usesMissing script should not run.' );
        QUnit.start();
 }, {}, {});
 ",
 
        'testUsesNestedMissing' => "
 mw.loader.implement( 'testUsesNestedMissing', function () {
-       QUnit.ok( false, 'Module testUsesNestedMissing script should not run.');
+       QUnit.ok( false, 'Module testUsesNestedMissing script should not run.' );
+       QUnit.start();
+}, {}, {});
+",
+
+       'testSkipped' =>"
+mw.loader.implement( 'testSkipped', function () {
+       QUnit.ok( false, 'Module testSkipped was supposed to be skipped.' );
 }, {}, {});
+",
+
+       'testNotSkipped' =>"
+mw.loader.implement( 'testNotSkipped', function () {}, {}, {});
+",
+
+       'testUsesSkippable' =>"
+mw.loader.implement( 'testUsesSkippable', function () {}, {}, {});
 ",
 );
 
index 0f6b445..9681330 100644 (file)
                }
        } ) );
 
+       mw.loader.addSource(
+               'testloader',
+               {
+                       loadScript: QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/load.mock.php' )
+               }
+       );
+
        QUnit.test( 'Initial check', 8, function ( assert ) {
                assert.ok( window.jQuery, 'jQuery defined' );
                assert.ok( window.$, '$ defined' );
        } );
 
        QUnit.asyncTest( 'mw.loader dependency handling', 5, function ( assert ) {
-               mw.loader.addSource(
-                       'testloader',
-                       {
-                               loadScript: QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/load.mock.php' )
-                       }
-               );
-
                mw.loader.register( [
                        // [module, version, dependencies, group, source]
                        ['testMissing', '1', [], null, 'testloader'],
                );
        } );
 
+       QUnit.asyncTest( 'mw.loader skin-function handling', 5, function ( assert ) {
+               mw.loader.register( [
+                       // [module, version, dependencies, group, source, skip]
+                       ['testSkipped', '1', [], null, 'testloader', 'return true;'],
+                       ['testNotSkipped', '1', [], null, 'testloader', 'return false;'],
+                       ['testUsesSkippable', '1', ['testSkipped', 'testNotSkipped'], null, 'testloader']
+               ] );
+
+               function verifyModuleStates() {
+                       assert.equal( mw.loader.getState( 'testSkipped' ), 'ready', 'Module is ready when skipped' );
+                       assert.equal( mw.loader.getState( 'testNotSkipped' ), 'ready', 'Module is ready when not skipped but loaded' );
+                       assert.equal( mw.loader.getState( 'testUsesSkippable' ), 'ready', 'Module is ready when skippable dependencies are ready' );
+               }
+
+               mw.loader.using( ['testUsesSkippable'],
+                       function () {
+                               assert.ok( true, 'Success handler should be invoked.' );
+                               assert.ok( true ); // Dummy to match error handler and reach QUnit expect()
+
+                               verifyModuleStates();
+
+                               QUnit.start();
+                       },
+                       function ( e, badmodules ) {
+                               assert.ok( false, 'Error handler should not be invoked.' );
+                               assert.deepEqual( badmodules, [], 'Bad modules as expected.' );
+
+                               verifyModuleStates();
+
+                               QUnit.start();
+                       }
+               );
+       } );
+
        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!
index 1526679..4401ead 100644 (file)
                var a = mw.util.jsMessage( 'MediaWiki is <b>Awesome</b>.' );
                this.restoreWarnings();
                assert.ok( a, 'Basic checking of return value' );
-
-               // Clean up
-               $( '#mw-js-message' ).remove();
        } );
 
        QUnit.test( 'validateEmail', 6, function ( assert ) {
index 818b24e..d2e7f6e 100644 (file)
@@ -465,6 +465,22 @@ class TestFileIterator implements Iterator {
                                        continue;
                                }
 
+                               if ( $this->section == 'endtransparenthooks' ) {
+                                       $this->checkSection( 'transparenthooks' );
+
+                                       foreach ( explode( "\n", $this->sectionData['transparenthooks'] ) as $line ) {
+                                               $line = trim( $line );
+
+                                               if ( $line ) {
+                                                       $delayedParserTest->requireTransparentHook( $line );
+                                               }
+                                       }
+
+                                       $this->clearSection();
+
+                                       continue;
+                               }
+
                                if ( $this->section == 'end' ) {
                                        $this->checkSection( 'test' );
                                        // "input" and "result" are old section names allowed
@@ -601,6 +617,7 @@ class DelayedParserTest {
        /** Initialized on construction */
        private $hooks;
        private $fnHooks;
+       private $transparentHooks;
 
        public function __construct() {
                $this->reset();
@@ -613,6 +630,7 @@ class DelayedParserTest {
        public function reset() {
                $this->hooks = array();
                $this->fnHooks = array();
+               $this->transparentHooks = array();
        }
 
        /**
@@ -641,6 +659,14 @@ class DelayedParserTest {
                        }
                }
 
+               # Trigger delayed transparent hooks. Any failure will make us abort
+               foreach ( $this->transparentHooks as $hook ) {
+                       $ret = $parserTest->requireTransparentHook( $hook );
+                       if ( !$ret ) {
+                               return false;
+                       }
+               }
+
                # Delayed execution was successful.
                return true;
        }
@@ -663,6 +689,15 @@ class DelayedParserTest {
                $this->fnHooks[] = $fnHook;
        }
 
+       /**
+        * Similar to ParserTest object but does not run anything
+        * Use unleash() to really execute the hook function
+        * @param string $fnHook
+        */
+       public function requireTransparentHook( $hook ) {
+               $this->transparentHooks[] = $hook;
+       }
+
 }
 
 /**
@@ -674,11 +709,12 @@ class DjVuSupport {
         * Initialises DjVu tools global with default values
         */
        public function __construct() {
-               global $wgDjvuRenderer, $wgDjvuDump, $wgDjvuToXML, $wgFileExtensions;
+               global $wgDjvuRenderer, $wgDjvuDump, $wgDjvuToXML, $wgFileExtensions, $wgDjvuTxt;
 
                $wgDjvuRenderer = $wgDjvuRenderer ? $wgDjvuRenderer : '/usr/bin/ddjvu';
                $wgDjvuDump = $wgDjvuDump ? $wgDjvuDump : '/usr/bin/djvudump';
                $wgDjvuToXML = $wgDjvuToXML ? $wgDjvuToXML : '/usr/bin/djvutoxml';
+               $wgDjvuTxt = $wgDjvuTxt ? $wgDjvuTxt : '/usr/bin/djvutxt';
 
                if ( !in_array( 'djvu', $wgFileExtensions ) ) {
                        $wgFileExtensions[] = 'djvu';
@@ -691,10 +727,11 @@ class DjVuSupport {
         * @return bool
         */
        public function isEnabled() {
-               global $wgDjvuRenderer, $wgDjvuDump, $wgDjvuToXML;
+               global $wgDjvuRenderer, $wgDjvuDump, $wgDjvuToXML, $wgDjvuTxt;
 
                return is_executable( $wgDjvuRenderer )
                        && is_executable( $wgDjvuDump )
-                       && is_executable( $wgDjvuToXML );
+                       && is_executable( $wgDjvuToXML )
+                       && is_executable( $wgDjvuTxt );
        }
 }