Merge "Create PostLoginRedirect Hook for changing the redirect behavior"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 12 Jun 2014 14:24:50 +0000 (14:24 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 12 Jun 2014 14:24:50 +0000 (14:24 +0000)
767 files changed:
RELEASE-NOTES-1.23
RELEASE-NOTES-1.24
docs/hooks.txt
includes/Article.php
includes/AutoLoader.php
includes/ChangeTags.php
includes/DefaultSettings.php
includes/Defines.php
includes/EditPage.php
includes/GlobalFunctions.php
includes/ImagePage.php
includes/Import.php
includes/Linker.php
includes/MimeMagic.php
includes/OutputPage.php
includes/Preferences.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/WikiPage.php
includes/actions/RenderAction.php
includes/api/ApiBase.php
includes/api/ApiExpandTemplates.php
includes/api/ApiFormatXml.php
includes/api/ApiQueryLogEvents.php
includes/api/ApiQueryUserInfo.php
includes/api/ApiQueryWatchlist.php
includes/api/ApiResult.php
includes/api/ApiRollback.php
includes/changes/ChangesList.php
includes/changes/EnhancedChangesList.php
includes/changes/OldChangesList.php
includes/changes/RCCacheEntryFactory.php
includes/changes/RecentChange.php
includes/db/DatabaseOracle.php
includes/db/DatabasePostgres.php
includes/filebackend/SwiftFileBackend.php
includes/filerepo/file/File.php
includes/installer/Installer.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/el.json
includes/installer/i18n/es.json
includes/installer/i18n/gl.json
includes/installer/i18n/ia.json
includes/installer/i18n/id.json
includes/installer/i18n/lv.json
includes/installer/i18n/ms.json
includes/installer/i18n/ne.json
includes/installer/i18n/ro.json
includes/installer/i18n/sr-ec.json
includes/installer/i18n/sr-el.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/parser/Parser.php
includes/parser/ParserOptions.php
includes/parser/ParserOutput.php
includes/parser/Preprocessor.php
includes/parser/Preprocessor_DOM.php
includes/parser/Preprocessor_Hash.php
includes/poolcounter/PoolCounter.php
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/search/SearchEngine.php
includes/search/SearchMssql.php
includes/search/SearchMySQL.php
includes/search/SearchSqlite.php
includes/specialpage/SpecialPage.php
includes/specials/SpecialContributions.php
includes/specials/SpecialPasswordReset.php
includes/specials/SpecialRunJobs.php
includes/specials/SpecialSearch.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialUserrights.php
includes/specials/SpecialVersion.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/data/plurals.xml [changed mode: 0755->0644]
languages/i18n/af.json
languages/i18n/ar.json
languages/i18n/as.json
languages/i18n/az.json
languages/i18n/bar.json
languages/i18n/bcl.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/bn.json
languages/i18n/br.json
languages/i18n/bs.json
languages/i18n/ca.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/de.json
languages/i18n/diq.json
languages/i18n/egl.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/frp.json
languages/i18n/gd.json
languages/i18n/gl.json
languages/i18n/he.json
languages/i18n/hif-latn.json
languages/i18n/hr.json
languages/i18n/hu.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/ilo.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/ka.json
languages/i18n/kiu.json
languages/i18n/kk-cyrl.json
languages/i18n/kn.json
languages/i18n/ko.json
languages/i18n/krc.json
languages/i18n/ku-latn.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/nap.json
languages/i18n/nb.json
languages/i18n/ne.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/or.json
languages/i18n/pl.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.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/sh.json
languages/i18n/si.json
languages/i18n/sl.json
languages/i18n/so.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/sv.json
languages/i18n/ta.json
languages/i18n/te.json
languages/i18n/th.json
languages/i18n/tl.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/vi.json
languages/i18n/war.json
languages/i18n/wuu.json
languages/i18n/yi.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-watchlist-user-notificationtimestamp-index.sql [new file with mode: 0644]
maintenance/convertUserOptions.php
maintenance/dumpLinks.php
maintenance/fixDoubleRedirects.php
maintenance/generateSitemap.php
maintenance/language/listVariants.php [new file with mode: 0644]
maintenance/namespaceDupes.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.migrate.js
resources/lib/oojs-ui/i18n/be.json
resources/lib/oojs-ui/i18n/bs.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/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/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/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.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.skinning/content.parsoid.less
resources/src/mediawiki.special/mediawiki.special.unwatchedPages.js
resources/src/mediawiki/mediawiki.js
resources/src/mediawiki/mediawiki.searchSuggest.js
skins/.gitignore
skins/MonoBook.php [deleted file]
skins/Vector.php [deleted file]
skins/common/commonPrint.css
skins/monobook/MonoBook.php [new file with mode: 0644]
skins/vector/Vector.php [new file with mode: 0644]
skins/vector/collapsibleTabs.js
skins/vector/components/tabs.less
skins/vector/vector.js
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/LinkerTest.php
tests/phpunit/includes/StatusTest.php
tests/phpunit/includes/WikiPageTest.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/ResourceLoaderStartupModuleTest.php
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

index baf69c5..9d74e86 100644 (file)
@@ -472,6 +472,7 @@ changes to languages because of Bugzilla reports.
 
 ==== Removed globals ====
 * $wgBetterDirectionality (deprecated in 1.18)
+* $wgProxyKey (deprecated in 1.14)
 
 == Compatibility ==
 
index d1c941a..54e78ac 100644 (file)
@@ -14,6 +14,9 @@ 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.
 
 === New features in 1.24 ===
 * Added a new hook, "WhatLinksHereProps", to allow extensions to annotate
@@ -32,19 +35,35 @@ production.
 * (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.
+* (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 fixes in 1.24 ===
 * (bug 49116) Footer copyright notice is now always displayed in user language
@@ -82,6 +101,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 ===
 
@@ -106,6 +129,16 @@ 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.
+  All special pages should subclass SpecialPage and implement the execute() method.
+* (bug 63755) The deprecated constants RC_MOVE and RC_MOVE_OVER_REDIRECT were
+  removed.
 
 ==== Renamed classes ====
 * CLDRPluralRuleConverter_Expression to CLDRPluralRuleConverterExpression
index 87f620d..4c2fd89 100644 (file)
@@ -2196,6 +2196,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.
@@ -2518,11 +2526,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)
index 09d843d..2d3240b 100644 (file)
@@ -1328,7 +1328,7 @@ class Article implements Page {
                $outputPage = $this->getContext()->getOutput();
                $outputPage->addSubtitle( "<div id=\"mw-{$infomsg}\">" . wfMessage( $infomsg,
                        $td )->rawParams( $userlinks )->params( $revision->getID(), $tddate,
-                       $tdtime, $revision->getUser() )->parse() . "</div>" );
+                       $tdtime, $revision->getUser() )->rawParams( Linker::revComment( $revision, true, true ) )->parse() . "</div>" );
 
                $lnk = $current
                        ? wfMessage( 'currentrevisionlink' )->escaped()
@@ -1494,6 +1494,7 @@ class Article implements Page {
         * 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();
index 69f0e2f..e7411a4 100644 (file)
@@ -1113,6 +1113,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',
@@ -1179,10 +1180,10 @@ $wgAutoloadLocalClasses = array(
        'MyLocalSettingsGenerator' => 'mw-config/overrides.php',
 
        # skins
-       'MonoBookTemplate' => 'skins/MonoBook.php',
-       'SkinMonoBook' => 'skins/MonoBook.php',
-       'SkinVector' => 'skins/Vector.php',
-       'VectorTemplate' => 'skins/Vector.php',
+       'MonoBookTemplate' => 'skins/monobook/MonoBook.php',
+       'SkinMonoBook' => 'skins/monobook/MonoBook.php',
+       'SkinVector' => 'skins/vector/Vector.php',
+       'VectorTemplate' => 'skins/vector/Vector.php',
 );
 
 class AutoLoader {
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..6e96739 100644 (file)
@@ -3221,6 +3221,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 +4826,6 @@ $wgSecretKey = false;
  */
 $wgProxyList = array();
 
-/**
- * @deprecated since 1.14
- */
-$wgProxyKey = false;
-
 /** @} */ # end of proxy scanner settings
 
 /************************************************************************//**
@@ -5322,14 +5326,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.
@@ -6080,7 +6076,9 @@ $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().
  *
  * - author: A string or an array of strings. Authors can be linked using
  *    the regular wikitext link syntax. To have an internationalized version of
@@ -7073,6 +7071,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..9108783 100644 (file)
@@ -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' ) ) {
index 9cbb9d6..c95c380 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
 
 /**
index 5f385ac..60db202 100644 (file)
@@ -1301,9 +1301,9 @@ class ImageHistoryList extends ContextSource {
                // Image dimensions + size
                $row .= '<td>';
                $row .= htmlspecialchars( $file->getDimensionsString() );
-               $row .= $this->msg( 'word-separator' )->plain();
+               $row .= $this->msg( 'word-separator' )->escaped();
                $row .= '<span style="white-space: nowrap;">';
-               $row .= $this->msg( 'parentheses' )->sizeParams( $file->getSize() )->plain();
+               $row .= $this->msg( 'parentheses' )->sizeParams( $file->getSize() )->escaped();
                $row .= '</span>';
                $row .= '</td>';
 
@@ -1316,7 +1316,7 @@ class ImageHistoryList extends ContextSource {
                } else {
                        if ( $local ) {
                                $row .= Linker::userLink( $userId, $userText );
-                               $row .= $this->msg( 'word-separator' )->plain();
+                               $row .= $this->msg( 'word-separator' )->escaped();
                                $row .= '<span style="white-space: nowrap;">';
                                $row .= Linker::userToolLinks( $userId, $userText );
                                $row .= '</span>';
index 79df693..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() ) ) {
@@ -944,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..6075d8d 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;
@@ -2585,15 +2590,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 +3442,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 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..51368b1 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.
+$wgValidSkinNames['monobook'] = 'MonoBook';
+$wgValidSkinNames['vector'] = 'Vector';
+
 wfProfileOut( $fname . '-globals' );
 wfProfileIn( $fname . '-extensions' );
 
index 10502c2..84dd3de 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;
 
@@ -64,6 +63,19 @@ 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' ) ) ) {
+                                                       continue;
+                                               }
+
                                                $wgValidSkinNames[strtolower( $aSkin )] = $aSkin;
                                        }
                                }
@@ -119,8 +131,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 +172,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 +197,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 );
index 08816ad..86bd979 100644 (file)
@@ -86,12 +86,6 @@ class SkinTemplate extends Skin {
         */
        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
         *
@@ -290,26 +284,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 +514,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..a703b64 100644 (file)
@@ -1119,6 +1119,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 +1129,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 8fe948b..cedbcf9 100644 (file)
@@ -1387,6 +1387,8 @@ class WikiPage implements Page, IDBAccessObject {
         * 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
@@ -1477,7 +1479,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @throws MWException
         * @return string New complete article text, or null if error.
         *
-        * @deprecated since 1.21, use replaceSectionContent() instead
+        * @deprecated since 1.21, use replaceSectionAtRev() instead
         */
        public function replaceSection( $section, $text, $sectionTitle = '',
                $edittime = null
@@ -1528,11 +1530,41 @@ class WikiPage implements Page, IDBAccessObject {
         * @return Content New complete article content, or null if error.
         *
         * @since 1.21
+        * @deprecated since 1.24, use replaceSectionAtRev instead
         */
        public function replaceSectionContent( $section, Content $sectionContent, $sectionTitle = '',
                $edittime = null ) {
                wfProfileIn( __METHOD__ );
 
+               $baseRevId = null;
+               if ( $edittime && $section !== 'new' ) {
+                       $dbw = wfGetDB( DB_MASTER );
+                       $rev = Revision::loadFromTimestamp( $dbw, $this->mTitle, $edittime );
+                       if ( $rev ) {
+                               $baseRevId = $rev->getId();
+                       }
+               }
+
+               wfProfileOut( __METHOD__ );
+               return $this->replaceSectionAtRev( $section, $sectionContent, $sectionTitle, $baseRevId );
+       }
+
+       /**
+        * @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 $baseRevId integer|null
+        *
+        * @throws MWException
+        * @return Content New complete article content, or null if error.
+        *
+        * @since 1.24
+        */
+       public function replaceSectionAtRev( $section, Content $sectionContent,
+               $sectionTitle = '', $baseRevId = null
+       ) {
+               wfProfileIn( __METHOD__ );
+
                if ( strval( $section ) == '' ) {
                        // Whole-page edit; let the whole text through
                        $newContent = $sectionContent;
@@ -1544,15 +1576,16 @@ class WikiPage implements Page, IDBAccessObject {
                        }
 
                        // Bug 30711: always use current version when adding a new section
-                       if ( is_null( $edittime ) || $section == 'new' ) {
+                       if ( is_null( $baseRevId ) || $section == 'new' ) {
                                $oldContent = $this->getContent();
                        } else {
+                               // TODO: try DB_SLAVE first
                                $dbw = wfGetDB( DB_MASTER );
-                               $rev = Revision::loadFromTimestamp( $dbw, $this->mTitle, $edittime );
+                               $rev = Revision::loadFromId( $dbw, $baseRevId );
 
                                if ( !$rev ) {
-                                       wfDebug( "WikiPage::replaceSection asked for bogus section (page: " .
-                                               $this->getId() . "; section: $section; edittime: $edittime)\n" );
+                                       wfDebug( __METHOD__ . " asked for bogus section (page: " .
+                                               $this->getId() . "; section: $section)\n" );
                                        wfProfileOut( __METHOD__ );
                                        return null;
                                }
@@ -1566,7 +1599,6 @@ class WikiPage implements Page, IDBAccessObject {
                                return null;
                        }
 
-                       // FIXME: $oldContent might be null?
                        $newContent = $oldContent->replaceSection( $section, $sectionContent, $sectionTitle );
                }
 
@@ -2744,15 +2776,22 @@ class WikiPage implements Page, IDBAccessObject {
                        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;
@@ -2765,11 +2804,6 @@ class WikiPage implements Page, IDBAccessObject {
                        $bitfield = 'rev_deleted';
                }
 
-               // we need to remember the old content so we can use it to generate all deletion updates.
-               $content = $this->getContent( Revision::RAW );
-
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->begin( __METHOD__ );
                // For now, shunt the revision data into the archive table.
                // Text is *not* removed from the text table; bulk storage
                // is left intact to avoid breaking block-compression or
@@ -2840,7 +2874,11 @@ class WikiPage implements Page, IDBAccessObject {
                $logEntry->setTarget( $logTitle );
                $logEntry->setComment( $reason );
                $logid = $logEntry->insert();
-               $logEntry->publish( $logid );
+
+               $dbw->onTransactionPreCommitOrIdle( function() use ( $dbw, $logEntry, $logid ) {
+                       // Bug 56776: avoid deadlocks (especially from FileDeleteForm)
+                       $logEntry->publish( $logid );
+               } );
 
                if ( $commit ) {
                        $dbw->commit( __METHOD__ );
index c9b3f8f..16e407f 100644 (file)
@@ -41,7 +41,6 @@ class RenderAction extends FormlessAction {
        }
 
        public function show() {
-
                $this->page->render();
        }
 }
index cfd4d01..b649adf 100644 (file)
@@ -907,6 +907,7 @@ abstract class ApiBase extends ContextSource {
                        array(
                                array( 'invalidtitle', 'title' ),
                                array( 'nosuchpageid', 'pageid' ),
+                               array( 'code' => 'pagecannotexist', 'info' => "Namespace doesn't allow actual pages" ),
                        )
                );
        }
index 28ed5e4..eb3f87c 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,53 @@ 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 ) {
+                       $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 +133,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 +155,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 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 2d9d710..d74526b 100644 (file)
@@ -628,12 +628,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 ee5e458..e46baa6 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,7 @@ class ApiQueryUserInfo extends ApiQueryBase {
        }
 
        protected function getCurrentUserInfo() {
-               global $wgHiddenPrefs;
+               global $wgHiddenPrefs, $wgRCMaxAge;
                $user = $this->getUser();
                $result = $this->getResult();
                $vals = array();
@@ -153,6 +155,28 @@ 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;
        }
 
@@ -212,7 +236,8 @@ class ApiQueryUserInfo extends ApiQueryBase {
                                        'email',
                                        'realname',
                                        'acceptlang',
-                                       'registrationdate'
+                                       'registrationdate',
+                                       'unreadcount',
                                )
                        )
                );
@@ -237,6 +262,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..837ad28 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(
index c351561..2719f12 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
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 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 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 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 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 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..d81111b 100644 (file)
@@ -119,101 +119,53 @@ 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() {
                $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";
-                       }
-                       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..072514c 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 এপিসি] ইনস্টল হয়েছে",
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 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 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 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 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 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 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..efc02fe 100644 (file)
@@ -579,9 +579,7 @@ abstract class MediaHandler {
         * @return string
         */
        function getShortDesc( $file ) {
-               global $wgLang;
-
-               return htmlspecialchars( $wgLang->formatSize( $file->getSize() ) );
+               return self::getGeneralShortDesc( $file );
        }
 
        /**
@@ -591,10 +589,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 +601,7 @@ abstract class MediaHandler {
        static function getGeneralShortDesc( $file ) {
                global $wgLang;
 
-               return $wgLang->formatSize( $file->getSize() );
+               return htmlspecialchars( $wgLang->formatSize( $file->getSize() ) );
        }
 
        /**
@@ -616,10 +611,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 +805,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;
index d2a20df..66cfd55 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;
@@ -2327,13 +2328,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 +2378,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 +2489,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 +2505,9 @@ class Parser {
                                        }
                                        ++$commonPrefixLength;
                                }
+                               if ( !$prefixLength && $lastPrefix ) {
+                                       $output .= "\n";
+                               }
                                $lastPrefix = $prefix2;
                        }
 
@@ -2582,12 +2589,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 +3575,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 );
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 ) {
index b8e262a..dd5fc4f 100644 (file)
@@ -94,6 +94,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 +165,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..90af670 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
@@ -1467,6 +1488,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 +1585,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 +1680,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..bc2b686 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
@@ -1372,6 +1393,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 +1485,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 +1601,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 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..fa9a8f0 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:
@@ -204,6 +209,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
         */
@@ -267,6 +276,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                                case 'position':
                                case 'localBasePath':
                                case 'remoteBasePath':
+                               case 'skipFunction':
                                        $this->{$member} = (string)$option;
                                        break;
                                // Single booleans
@@ -312,22 +322,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 +420,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 +495,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 +546,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                        'targets',
                        'group',
                        'position',
+                       'skipFunction',
                        'localBasePath',
                        'remoteBasePath',
                        'debugRaw',
@@ -581,13 +617,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 +638,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 +657,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(
@@ -696,7 +732,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 3d0655b..4663ab8 100644 (file)
@@ -368,20 +368,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;
                        }
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 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 82d6177..3968187 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;
-               }
        }
 
        /**
@@ -414,7 +396,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 +405,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 );
        }
 
        /**
@@ -580,6 +555,15 @@ class SpecialPage {
                return $this->getContext()->getLanguage();
        }
 
+       /**
+        * Shortcut to get main config object
+        * @return Config
+        * @since 1.24
+        */
+       public function getConfig() {
+               return $this->getContext()->getConfig();
+       }
+
        /**
         * Return the full title, including $par
         *
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 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 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..965885e 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 );
 
@@ -373,7 +375,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 ) );
@@ -522,6 +524,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 +570,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 +975,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 +999,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 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 abb32ce..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' );
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..657999c 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' ),
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..9d3f5e9 100644 (file)
@@ -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;
        }
 
old mode 100755 (executable)
new mode 100644 (file)
index 68d3d11..5b74395 100644 (file)
        "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:",
        "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",
        "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:",
        "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 4649132..6b13368 100644 (file)
@@ -44,7 +44,8 @@
                        "وهراني",
                        "아라",
                        "Test Create account",
-                       "Kuwaity26"
+                       "Kuwaity26",
+                       "Calak"
                ]
        },
        "tog-underline": "سطر تحت الوصلات:",
        "vector-view-view": "اقرأ",
        "vector-view-viewsource": "اعرض المصدر",
        "actions": "أفعال",
+       "vector-more-actions": "مزيد",
        "namespaces": "فضاءات التسمية",
        "variants": "المتغيرات",
        "navigation-heading": "قائمة التصفح",
        "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'''.",
        "allowemail": "مكن تلقي البريد الإلكتروني من المستخدمين الآخرين",
        "prefs-searchoptions": "البحث",
        "prefs-namespaces": "أسماء النطاقات",
-       "defaultns": "أو ابحث في هذه النطاقات:",
        "default": "افتراضي",
        "prefs-files": "ملفات",
        "prefs-custom-css": "CSS مخصص",
        "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": "لا يمكنك إرسال بريد إلكتروني إلى مستخدمين آخرين على هذه الويكي",
        "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-sysop.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على الإداريين فقط */",
        "group-bureaucrat.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على البيروقراطيين فقط */",
        "common.js": "/* الجافاسكريبت الموضوع هنا سيتم تحميله لكل المستخدمين مع كل تحميل للصفحة. */",
-       "cologneblue.js": "/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة كولون بلو */",
        "monobook.js": "/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة مونوبوك */",
-       "modern.js": "/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة مودرن */",
        "vector.js": "/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة فكتور */",
        "group-autoconfirmed.js": "/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين المؤكدين تلقائيا فقط */",
        "group-bot.js": "/* أي جافاسكريبت هنا سيتم تحميلها للبوتات فقط */",
        "pageinfo-category-pages": "عدد الصفحات",
        "pageinfo-category-subcats": "عدد التصنيفات الفرعية",
        "pageinfo-category-files": "عدد الملفات",
-       "skinname-cologneblue": "كولون بلو",
        "skinname-monobook": "مونوبوك",
-       "skinname-modern": "مودرن",
        "skinname-vector": "فكتور",
        "markaspatrolleddiff": "علم بعلامة المراجعة",
        "markaspatrolledtext": "علم هذه الصفحة بعلامة المراجعة",
index c4f45d0..6ce9f9c 100644 (file)
        "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''' ফলাফল}} দেখুওৱা হৈছে।",
        "allowemail": "অন্য সদস্যৰ পৰা ই-মেইল সমৰ্থ কৰক",
        "prefs-searchoptions": "সন্ধান কৰক",
        "prefs-namespaces": "নামস্থান",
-       "defaultns": "অন্যথা এই নামস্থান সমূহত অনুসন্ধান কৰিব:",
        "default": "অবিচল",
        "prefs-files": "ফাইলসমূহ",
        "prefs-custom-css": "স্বনিৰ্ধাৰিত CSS",
        "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": "চাবলৈ একো নাই ।",
index 6290b74..f5beabd 100644 (file)
        "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 bbe10e3..c0e0311 100644 (file)
        "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:",
        "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 7b3e12e..1864d83 100644 (file)
        "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",
index f515637..538ee00 100644 (file)
@@ -13,7 +13,8 @@
                        "Wizardist",
                        "Zedlik",
                        "Тест",
-                       "아라"
+                       "아라",
+                       "Liashko"
                ]
        },
        "tog-underline": "Падкрэсьліваць спасылкі:",
        "vector-view-view": "Чытаць",
        "vector-view-viewsource": "Паказаць крыніцу",
        "actions": "Дзеяньні",
+       "vector-more-actions": "Болей",
        "namespaces": "Прасторы назваў",
        "variants": "Варыянты",
        "navigation-heading": "Навігацыйнае мэню",
        "currentrev": "Цяперашняя вэрсія",
        "currentrev-asof": "Цяперашняя вэрсія на $1",
        "revisionasof": "Вэрсія ад $1",
-       "revision-info": "Вэрсія ад $1, аўтар $2",
+       "revision-info": "Вэрсія ад $1, {{GENDER:$6|аўтар $2|аўтарка $2}}$7",
        "previousrevision": "← Папярэдняя вэрсія",
        "nextrevision": "Наступная вэрсія →",
        "currentrevisionlink": "Цяперашняя вэрсія",
        "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",
        "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-version": "(Вэрсія $1)",
        "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 6b26651..4bc2c71 100644 (file)
                        "לערי ריינהארט",
                        "아라",
                        "Unomano",
-                       "Mikalai Udodau"
+                       "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.",
        "vector-view-view": "Чытаць",
        "vector-view-viewsource": "Паказаць зыходны тэкст",
        "actions": "Дзеянні",
+       "vector-more-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": "правіць",
        "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\".'''",
        "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 (новы раздзел)",
        "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-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аÑ\8f",
+       "histlast": "найноÑ\9eÑ\88аÑ\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»",
        "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-images": "Мультымедыя",
        "searchprofile-everything": "Усё",
        "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-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-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": "РазблакаваÑ\86Ñ\8c Ñ\96Ñ\85",
-       "right-protect": "Мяняць узроўні аховы і правіць старонкі, што пад аховай",
+       "right-unblockself": "РазблакаваÑ\86Ñ\8c Ñ\81Ñ\8fбе",
+       "right-protect": "Мяняць узроўні аховы і правіць старонкі пад каскаднай аховай",
        "right-editprotected": "Правіць старонкі, што пад аховай (але без каскаднай аховы)",
        "right-editinterface": "Правіць карыстальніцкі інтэрфейс",
        "right-editusercssjs": "Правіць файлы CSS і JS іншых удзельнікаў",
        "right-editusercss": "Правіць файлы CSS іншых удзельнікаў",
        "right-edituserjs": "Правіць файлы JS іншых удзельнікаў",
+       "right-editmyusercss": "Правіць уласныя файлы CSS",
+       "right-editmyuserjs": "Правіць уласныя файлы JavaScript",
        "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": "Гэтай праўкай была створана новая старонка",
        "recentchanges-label-minor": "Гэта дробная па значэнні праўка",
        "recentchanges-label-bot": "Праўка была зробленая праграмай-робатам",
        "recentchanges-label-unpatrolled": "Праўка яшчэ не атрымала адзнакі ўхваленасці (за ёй не сочыць \"патруль\")",
-       "recentchanges-legend-newpage": "$1 - новая старонка",
+       "recentchanges-label-plusminus": "Аб'ём старонкі змяніўся на гэтую лічбу байтаў",
+       "recentchanges-legend-heading": "'''Легенда:'''",
+       "recentchanges-legend-newpage": "(гл. таксама [[Special:NewPages|спіс новых старонак]])",
        "rcnotefrom": "Ніжэй знаходзяцца змены з <b>$2</b> (паказана не больш чым <b>$1</b>).",
        "rclistfrom": "Паказаць змены з $3 $2",
        "rcshowhideminor": "$1 дробныя праўкі",
+       "rcshowhideminor-show": "Паказаць",
        "rcshowhideminor-hide": "Схаваць",
        "rcshowhidebots": "$1 робатаў",
        "rcshowhidebots-show": "Паказаць",
        "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\").",
        "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-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».",
        "uploadstash-nofiles": "У вас няма схаваных файлаў.",
        "uploadstash-badtoken": "Не атрымалася выканаць названыя дзеянні. Магчыма, скончыўся тэрмін дзеяння вашага жэтона бяспекі. Паспрабуйце яшчэ раз.",
        "uploadstash-errclear": "Ачыстка файлаў не ўдалася",
-       "uploadstash-refresh": "Абнавіць спісак файлаў",
+       "uploadstash-refresh": "Абнавіць спіс файлаў",
        "invalid-chunk-offset": "Недапушчальнае зрушэнне фрагмента",
        "img-auth-accessdenied": "Доступ забаронены",
        "img-auth-nopathinfo": "Адсутнічае PATH_INFO",
        "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>.",
        "mimetype": "Тып MIME:",
        "protectedpages-cascade": "Толькі каскадныя засцераганні",
        "protectedpages-noredirect": "Схаваць перанакіраванні",
        "protectedpagesempty": "Ніякія старонкі такім чынам не ахоўваюцца.",
+       "protectedpages-page": "Старонка",
+       "protectedpages-expiry": "Канчаецца",
+       "protectedpages-performer": "Паставіў ахову",
+       "protectedpages-params": "Тыпы аховы",
+       "protectedpages-reason": "Прычына",
+       "protectedpages-unknown-timestamp": "Невядома",
+       "protectedpages-unknown-performer": "Нявызначаны ўдзельнік",
        "protectedtitles": "Назвы пад аховай",
        "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)",
        "listusersfrom": "Паказаць удзельнікаў, пачаўшы з:",
        "listusers-submit": "Паказаць",
        "listusers-noresult": "Удзельнікі не знойдзеныя.",
-       "listusers-blocked": "(Ð\97аблакаваны)",
+       "listusers-blocked": "(заблакаваны)",
        "activeusers": "Актыўныя ўдзельнікі",
        "activeusers-intro": "Гэта пералік удзельнікаў, якія нешта рабілі за апошнія $1 {{PLURAL:$1|дзень|дзён}}.",
        "activeusers-count": "$1 {{PLURAL:$1|праўка|праўкі|правак}} за апошні{{PLURAL:$3| дзень|я $3 дзён}}",
        "listgrouprights-removegroup-self": "можа выдаліць {{PLURAL:$2|групу|групы}} са свайго ўліковага запісу: $1",
        "listgrouprights-addgroup-self-all": "Дадаць усе групы да свайго акаунта",
        "listgrouprights-removegroup-self-all": "Выдаліць усе групы са свайго акаунта",
+       "listgrouprights-namespaceprotection-namespace": "Прастора назваў",
+       "trackingcategories-nodesc": "Апісанне адсутнічае.",
        "mailnologin": "Няма эл.адрасу",
        "mailnologintext": "Трэба [[Special:UserLogin|ўвайсці ў сістэму]] і мець пацверджаны адрас эл.пошты ў сваіх [[Special:Preferences|настáўленнях]], каб слаць эл.пошту іншым удзельнікам.",
        "emailuser": "Эл.пошта ўдзельніка",
        "watchnologin": "Без прадстаўлення",
        "addwatch": "Дадаць у спіс назірання",
        "addedwatchtext": "Старонка \"[[:$1]]\" была дададзена да [[Special:Watchlist|назіраных]] вамі.\nЗмяненні, якія адбудуцца з гэтай старонкай і з Размовай пра яе, будуць паказвацца там, і старонка будзе '''вылучацца шрыфтам''' у [[Special:RecentChanges|спісе нядаўніх змяненняў]], каб лягчэй пазнаваць яе.\n\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": "Старонкі, якія былі зменены пасля вашага апошняга іх наведвання, паказаны '''абрысам шрыфту'''.",
-       "wlnote2": "Ніжэй паказаны змены за апошнія {{PLURAL:$1|гадзіну|<strong>$1</strong> гадзіны}}, па стане на $2, $3.",
+       "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_lastvisited": "Гл. $1 каб бачыць усе змены пасля вашага апошняга наведвання.",
        "enotif_lastdiff": "Гл. $1 каб бачыць гэтую мену.",
        "enotif_anon_editor": "ананімны ўдзельнік $1",
        "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 файлаў}}",
+       "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": "Не ўдалося аднавіць; магчыма, нехта іншы ўжо аднавіў старонку.",
        "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": "Шукаць",
        "sp-contributions-newbies-title": "Уклады ўдзельнікаў з новых рахункаў",
        "sp-contributions-blocklog": "блакіроўкі",
        "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Ніжэй прыведзены апошні запіс з журнала блакаванняў:",
        "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, з-пад якіх ён паспрабуе рабіць праўкі",
        "badipaddress": "Недапушчальны адрас IP",
        "blockipsuccesssub": "Паспяховае блакаванне",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] быў заблакаваны.<br />\nБлокі пералічаныя ў [[Special:BlockList|спісе IP-блокаў]].",
-       "ipb-blockingself": "Вы спрабуеце заблакіраваць сябе самога! Вы ўпэўнены, што вы жадаеце гэта зрабіць?",
+       "ipb-blockingself": "Вы спрабуеце заблакіраваць сябе самога! Вы ўпэўнены, што хочаце гэта зрабіць?",
        "ipb-confirmhideuser": "Вы намерваецеся заблакіраваць удзельніка і схаваць яго імя. Яно не будзе адлюстроўвацца ў спісах і журналах. Вы ўпэўнены, што жадаеце гэта зрабіць?",
        "ipb-edit-dropdown": "Прычыны пастаноўкі блока",
        "ipb-unblock-addr": "Зняць блок з $1",
        "unblockiptext": "У форме, што ніжэй, можна вярнуць дазвол на запіс для раней заблакаванага адрасу IP або ўдзельніка.",
        "ipusubmit": "Зняць гэты блок",
        "unblocked": "[[User:$1|$1]] быў адблакаваны",
-       "unblocked-range": "$1 быў разблакіраваны",
+       "unblocked-range": "$1 быў разблакаваны.",
        "unblocked-id": "Блок $1 быў зняты",
        "blocklist": "Заблакаваныя ўдзельнікі",
        "ipblocklist": "Заблакаваныя ўдзельнікі",
        "emaillink": "адправіць ліст",
        "autoblocker": "Аўтаматычны блок таму што вашым адрасам IP нядаўна карыстаўся \"[[User:$1|$1]]\". Блакаванне $1's патлумачана так: \"'''$2'''\"",
        "blocklogpage": "Журнал блокаў",
-       "blocklog-showlog": "{{GENDER:$1|Гэты ўдзельнік ужо блакіраваўся|Гэта ўдзельніца ўжо блакіравалася}} раней.\nНіжэй прыведзены журнал блакіровак:",
+       "blocklog-showlog": "{{GENDER:$1|Гэты ўдзельнік ужо блакаваўся|Гэта ўдзельніца ўжо блакавалася}} раней.\nЖурнал блакіровак прыведзены ніжэй:",
        "blocklog-showsuppresslog": "Гэты ўдзельнік ужо заблакаваны і скрыты. Журнал утойвання прыведзены ніжэй:",
        "blocklogentry": "паставіў блок на \"[[$1]]\", з часам трывання $2 $3",
        "reblock-logentry": "змененыя настройкі блока для [[$1]] з часам згасання $2 $3",
        "movepagetext": "Форма, што ніжэй, перанясе старонку пад новую назву, і таксама перанясе пад новую назву ўсю гісторыю старонкі.\nСтарая назва ператворыцца ў перасылку да новай.\nПерасылкі, што вялі да старой назвы, можна ўдакладніць аўтаматычна.\nКалі такое аўта-удакладненне не будзе рабіцца, трэба праверыць наяўнасць [[Special:DoubleRedirects|падвойных]] ці [[Special:BrokenRedirects|зламаных]] перасылак.\nАдказнасць за правільную працу спасылак ляжыць на тым, хто пераносіць.\n\nЗаўважце, што старонка '''не будзе''' перанесена, калі пад новай назвай ужо існуе старонка, не пустая і не перасылка і без гісторыі правак. Такім чынам, пры пераносе нельга перапісаць наяўную старонку, а магчымую памылку можна адразу выправіць, пераносячы старонку ў адваротным кірунку.\n\n'''УВАГА!'''\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": "'''Увага.''' Вы збіраецеся пераназваць старонку ўдзельніка. Калі ласка, звернеце ўвагу, што пераназвана будзе толькі старонка, удзельнік '''не''' будзе пераназваны.",
        "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": "Вам не дазволена пераносіць старонку ў старонку карыстальніка (не лічачы пад-старонак карыстальніка).",
        "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": "Разам са старонкамі, на якія ёсць спасылкі (макс. кольк. крокаў):",
        "allmessages-prefix": "Толькі назвы з такім пачаткам:",
        "allmessages-language": "Мова:",
        "allmessages-filter-submit": "Пошук",
+       "allmessages-filter-translate": "Перакласці",
        "thumbnail-more": "Павялічыць",
        "filemissing": "Адсутны файл",
        "thumbnail_error": "Памылка пры стварэнні драбніцы: $1",
        "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": "Усе версіі ўжо былі імпартаваныя раней.",
        "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",
        "pageinfo-robot-index": "Індэксуюцца",
        "pageinfo-robot-noindex": "Не індэксуюцца",
        "pageinfo-views": "Колькасць праглядаў",
-       "pageinfo-watchers": "Колькасць назіральнікаў",
+       "pageinfo-watchers": "Колькасць назіральнікаў старонкі",
+       "pageinfo-few-watchers": "Менш чым $1 {{PLURAL:$1|назіральнік|назіральнікі|назіральнікаў}}",
+       "pageinfo-redirects-name": "Колькасць перасылак на гэту старонку",
        "pageinfo-lastuser": "Апошні рэдактар",
        "pageinfo-lasttime": "Дата апошняй праўкі",
        "pageinfo-edits": "Агульная колькасць правак",
        "pageinfo-authors": "Агульная колькасць розных аўтараў",
+       "pageinfo-redirectsto": "Перасылае да",
        "skinname-monobook": "Манабук",
        "markaspatrolleddiff": "Пазначыць як ухваленае",
        "markaspatrolledtext": "Пазначыць старонку як ухваленую",
        "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 піхеляў",
        "hours": "{{PLURAL:$1|$1 гадзіна|$1 гадзіны|$1 гадзін}}",
        "days": "{{PLURAL:$1|$1 дзень|$1 дня|$1 дзён}}",
        "ago": "$1 назад",
+       "monday-at": "У панядзелак а $1",
+       "tuesday-at": "У аўторак а $1",
+       "wednesday-at": "У сераду а $1",
+       "thursday-at": "У чацвер а $1",
+       "friday-at": "У пятніцу а $1",
+       "saturday-at": "У суботу а $1",
+       "sunday-at": "У нядзелю а $1",
+       "yesterday-at": "Учора а $1",
        "bad_image_list": "Афармленне гэтага такое:\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": "[Устаўлянне з іншых вікі не дазволена]",
        "imgmultipagenext": "наступная старонка →",
        "imgmultigo": "Пераход!",
        "imgmultigoto": "На старонку $1",
+       "img-lang-default": "(прадвызначаная мова)",
        "ascending_abbrev": "да больш.",
        "descending_abbrev": "да менш.",
        "table_pager_next": "Наступная старонка",
        "watchlistedit-raw-done": "Спіс назірання абноўлены.",
        "watchlistedit-raw-added": "Дапісаны{{PLURAL:$1| 1 складнік|я $1 складнікаў}}:",
        "watchlistedit-raw-removed": "Выняты{{PLURAL:$1| 1 складнік|я $1 складнікаў}}:",
+       "watchlistedit-clear-legend": "Ачысціць спіс назірання",
        "watchlistedit-clear-done": "Ваш спіс назірання ачышчаны.",
        "watchlisttools-clear": "Ачысціць спіс назірання",
        "watchlisttools-view": "Паказаць змяненні",
        "version-hook-subscribedby": "Сюды падпісаныя",
        "version-version": "(Версія $1)",
        "version-license": "Ліцэнзія",
+       "version-ext-colheader-description": "Апісанне",
+       "version-ext-colheader-credits": "Аўтары",
+       "version-license-title": "Ліцэнзія $1",
        "version-poweredby-credits": "Пляцоўка працуе на '''[https://www.mediawiki.org/ MediaWiki]''', капірайт © 2001-$1 $2.",
        "version-poweredby-others": "іншыя",
        "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 атрымайце яе з Інтэрнэту].",
        "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": "Іншыя адмысловыя старонкі",
        "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-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 утойліва змяніў бачнасць {{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-newusers-newusers": "$1 стварыў уліковы запіс удзельніка",
        "logentry-newusers-create": "$1 стварыў уліковы запіс удзельніка",
        "logentry-newusers-create2": "$1 стварыў уліковы запіс удзельніка $3",
-       "logentry-newusers-autocreate": "Аўтаматычна створаны ўліковы запіс $1",
+       "logentry-newusers-autocreate": "Аўтаматычна створаны ўліковы запіс удзельніка $1",
        "rightsnone": "(няма)",
        "feedback-bugornote": "Калі вы гатовыя падрабязна апісаць тэхнічную праблему, калі ласка, [$1 паведаміце пра памылку].\nУ адваротным выпадку вы можаце выкарыстоўваць гэтую простую форму. Ваш каментар будзе дададзены на старонку «[$3 $2]» разам з вашым імем удзельніка і выкарыстоўваемым браўзерам.",
        "feedback-subject": "Тэма:",
        "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-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_remove_comments": "Сцерці каментарыі",
+       "expand_templates_preview": "Перадпаказ"
 }
index 1763074..9ba8a82 100644 (file)
        "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": "Истинско име:",
        "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": "Писмо до потребителя",
        "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 e5b4d77..4d5d973 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": "প্রথম সম্পাদনার ক্ষেত্রে প্রাকদর্শন দেখানো হোক",
        "vector-view-view": "পড়ুন",
        "vector-view-viewsource": "উৎস দেখুন",
        "actions": "কার্যক্রম",
+       "vector-more-actions": "আরও",
        "namespaces": "নামস্থান",
        "variants": "বিকল্পসমূহ",
        "navigation-heading": "পরিভ্রমণ মেনু",
        "jumptonavigation": "পরিভ্রমণ",
        "jumptosearch": "অনুসন্ধান",
        "view-pool-error": "দুঃখিত, সার্ভারে এ মূহুর্তে অতিরিক্ত চাপ রয়েছে।\nঅনেক বেশি সংখ্যক ব্যবহারকারী এই পাতাটি দেখার চেষ্টা করছেন।\nনতুন করে এ পাতাটি দেখার চেষ্টা করার আগে কিছুক্ষণ অপেক্ষা করুন।\n\n$1",
+       "generic-pool-error": "দুঃখিত, সার্ভারে এ মূহুর্তে অতিরিক্ত চাপ রয়েছে।\nঅনেক বেশি সংখ্যক ব্যবহারকারী এই পাতাটি দেখার চেষ্টা করছেন।\nনতুন করে এ পাতাটি দেখার চেষ্টা করার আগে কিছুক্ষণ অপেক্ষা করুন।",
        "pool-timeout": "সময় উত্তির্ণ লক-এর জন্য অপেক্ষারত",
        "pool-queuefull": "পুলের লাইন পূর্ণ",
        "pool-errorunknown": "অজানা ত্রুটি",
        "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": "দৃষ্টিপাত সীমাবদ্ধ করো",
        "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",
        "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": "ব্যবহারকারী বা আইপি ঠিকানার উপর থেকে বাধা তুলে নেওয়া হোক",
index 4a6d6ce..48f4605 100644 (file)
        "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",
        "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-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}}",
        "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",
        "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..dabd1ca 100644 (file)
@@ -17,7 +17,8 @@
                        "Seha",
                        "Smooth O",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Milicevic01"
                ]
        },
        "tog-underline": "Podvuci veze:",
        "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:",
        "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..f1ad903 100644 (file)
@@ -40,7 +40,8 @@
                        "XVEC",
                        "Àlex",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Calak"
                ]
        },
        "tog-underline": "Subratlla els enllaços:",
        "vector-view-view": "Mostra",
        "vector-view-viewsource": "Mostra el codi",
        "actions": "Accions",
+       "vector-more-actions": "Més",
        "namespaces": "Espais de noms",
        "variants": "Variants",
        "navigation-heading": "Menú de navegació",
        "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)",
        "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>}}.",
        "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",
        "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 34952fb..e1b1419 100644 (file)
        "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окху ларца.",
        "unusedtemplates": "Лелош йоцу кепаш",
        "unusedtemplatestext": "Кхузахь дагар йина «{{ns:template}}» цӀерийн меттиган агӀонаш, кхечу агӀонийн юкъа тоьхна йоцу.\nДиц ма делахь хьажа кеп агӀонашкахь лелош юй.",
        "unusedtemplateswlh": "кхин хьажоргаш",
-       "randompage": "Цахууш нисйелла агӀо",
-       "randomincategory": "Категори чу цахууш нийса елла агӀо",
+       "randompage": "Цахууш нисъелла агӀо",
+       "randomincategory": "Категори чу цахууш нисъелла  агӀо",
        "randomincategory-selectcategory": "Категори чу цахууш нийса елла агӀона чу гӀо: $1 $2.",
        "randomincategory-selectcategory-submit": "Дехьа гӀо",
        "randomredirect": "Цахууш нисделла дIасахьажор",
        "prefixindex": "Хьалха агӀонашан цӀераш хӀотто йеза",
        "prefixindex-namespace": "Хьалха агӀонашан цӀераш хӀотто еза («{{ns:$1}}»)",
        "prefixindex-strip": "Хиламийн могӀам чура префикс къайлаяккха",
-       "shortpages": "Ð\91оÑ\86оа Ñ\8fззамаÑ\88",
+       "shortpages": "Боца яззамаш",
        "longpages": "Беха яззамаш",
        "deadendpages": "Дика йоцу агIонаш",
        "protectedpages": "ГIаролла дина агIонаш",
        "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": "Бакъдан",
        "movepagetalktext": "ТӀе хӀоьттина йолу дийцаре агӀо ишта цӀе хийцина хира ю, '''цхьа йолу ханчохь, маца:'''\n\n*Йаьсса йоцу дийцаре агӀо йолуш ю оцу цӀарца йа\n*Ахьа къастаман харжам цабиняхь а къастам хӀотточехь.\n\nИшта чу ханчохь, ахьа дехьа яккха йезар ю йа куьйга хӀоттайар, нагахь иза хьашт йалахь.",
        "movearticle": "Цle хийца хlокху агlон",
        "moveuserpage-warning": "'''Тергам бе.''' Хьо декъашхочун агӀона цӀе хийца гӀерта. Дехар до, тергам бе, декъашхочун агӀона цӀе бен хийца лур яц, декъашхочун дӀаяздаран цӀе хийца лур яц.",
+       "movecategorypage-warning": "<strong>ДӀахьедар:</strong> Хьо категорин агӀон цӀе хийца гӀерта. Дехар до, терго йе, хӀокху агӀона бен цӀе хуьйцур яц, шира чу категори чура массо агӀонаш керла категори чу йохур <em>яц</em>.",
        "movenologintext": "АгӀона цӀе хийца [[Special:UserLogin|системин чугӀо]].",
        "movenotallowed": "Хьан бакъо яц керла агӀонаш кхолла.",
        "movenotallowedfile": "Хьан файлийн цӀераш хийца бакъо яц.",
        "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": "Диафрагмин дукхалла",
        "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-raw": "Йоза санна нисдé",
        "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..6fc021e 100644 (file)
        "vector-view-view": "بیخوێنەوە",
        "vector-view-viewsource": "سەرچاوەکەی ببینە",
        "actions": "کردەوەکان",
+       "vector-more-actions": "زیاتر",
        "namespaces": "شوێنناوەکان",
        "variants": "شێوەزارەکان",
        "navigation-heading": "مێنۆی ڕێدۆزی",
        "mergehistory-same-destination": "پەڕەی سەرچاوە و مەبەست نابێ یەک بن.",
        "mergehistory-reason": "هۆکار:",
        "mergelog": "لۆگی کردنەیەک",
-       "pagemerge-logentry": "[[$1]]ی لەگەڵ [[$2]] کردەیەک (پێداچوونەوەکان ھەتا $3)",
+       "pagemerge-logentry": "[[$1]]ی لەگەڵ [[$2]] کردە یەک (پێداچوونەوەکان ھەتا $3)",
        "revertmerge": "ھەڵوەشاندنەوەی کردنەیەک",
        "mergelogpagetext": "لە خوارەوە دوایین مێژووی‌لاپەڕە خستنە سەر لاپەڕەیەکی‌تر، دەبینی.",
        "history-title": "مێژووی پێداچوونەوەکانی «$1»",
        "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": "بارکردنی پەڕگەکان",
        "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": "ھۆکاری تر",
index c3c0736..3c328ec 100644 (file)
        "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)",
index 5f27285..ba9a538 100644 (file)
        "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": "Бу саифени сазламаларынъызны сайт ог бельгиленгенине къайтармакъ ичюн къуллана билесинъиз. Бу лягъу этилип оламаз.",
index b27cb20..940e4d7 100644 (file)
        "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.",
index cb3d5a9..480eb63 100644 (file)
        "vector-view-view": "Číst",
        "vector-view-viewsource": "Zobrazit zdrojový kód",
        "actions": "Akce",
+       "vector-more-actions": "Více",
        "namespaces": "Jmenné prostory",
        "variants": "Varianty",
        "navigation-heading": "Navigační menu",
        "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",
        "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",
index 7ee948e..44d5e57 100644 (file)
        "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..1c51611 100644 (file)
        "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}}",
        "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",
        "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 7a6b218..5c1d35b 100644 (file)
        "vector-view-view": "Lesen",
        "vector-view-viewsource": "Quelltext anzeigen",
        "actions": "Aktionen",
+       "vector-more-actions": "Mehr",
        "namespaces": "Namensräume",
        "variants": "Varianten",
        "navigation-heading": "Navigationsmenü",
        "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",
        "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",
        "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",
        "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..be0c356 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",
        "vector-view-view": "Bıwane",
        "vector-view-viewsource": "Çımey bıvêne",
        "actions": "Hereketi",
+       "vector-more-actions": "Zêde",
        "namespaces": "Heruna naman",
        "variants": "Varyanti",
        "navigation-heading": "Menuyê navigasyoni",
        "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",
        "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",
        "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",
        "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 938621b..e02e9ea 100644 (file)
        "vector-view-view": "Lēş",
        "vector-view-viewsource": "Guêrda la surzéia",
        "actions": "Asiòun",
+       "vector-more-actions": "Êter",
        "namespaces": "Spâsi di nòm",
        "variants": "Mudéfichi",
        "navigation-heading": "Lésta 'd navigasiòun",
        "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-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\"",
+       "toomanymatches": "Trôpi relasiòun. Cambiêr la dmânda.",
+       "titlematches": "Rapôrt int al tétol dal pàgini",
+       "textmatches": "Rapôrt 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}}",
index 87fe5ba..538aa76 100644 (file)
@@ -36,7 +36,8 @@
                        "Περίεργος",
                        "לערי ריינהארט",
                        "Kolega2357",
-                       "아라"
+                       "아라",
+                       "Calak"
                ]
        },
        "tog-underline": "Υπογράμμιση συνδέσμων:",
        "vector-view-view": "Ανάγνωση",
        "vector-view-viewsource": "Προβολή κώδικα",
        "actions": "Ενέργειες",
+       "vector-more-actions": "Περισσότερα",
        "namespaces": "Χώροι ονομάτων",
        "variants": "Παραλλαγές",
        "navigation-heading": "Μενού πλοήγησης",
        "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": "να εμφανίσετε τον κατάλογο μη παρακολουθούμενων σελίδων",
        "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",
        "pageinfo-category-pages": "Αριθμός σελίδων",
        "pageinfo-category-subcats": "Αριθμός υποκατηγοριών",
        "pageinfo-category-files": "Αριθμός αρχείων",
-       "skinname-modern": "Μοντέρνο",
        "markaspatrolleddiff": "Να σημειωθεί 'υπό παρακολούθηση'",
        "markaspatrolledtext": "Να σημειωθεί αυτό το άρθρο ως 'υπό παρακολούθηση'.",
        "markedaspatrolled": "Σημειωμένο ως 'υπό παρακολούθηση'",
index 85e1bdc..df4a05f 100644 (file)
        "vector-view-view": "Read",
        "vector-view-viewsource": "View source",
        "actions": "Actions",
+       "vector-more-actions": "More",
        "namespaces": "Namespaces",
        "variants": "Variants",
        "navigation-heading": "Navigation menu",
        "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",
        "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",
index 780cbfa..7e53eea 100644 (file)
        "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-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-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-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",
        "vector-view-view": "Leer",
        "vector-view-viewsource": "Ver código",
        "actions": "Acciones",
+       "vector-more-actions": "Más",
        "namespaces": "Espacios de nombres",
        "variants": "Variantes",
        "navigation-heading": "Menú de navegación",
        "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.",
        "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.",
        "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].",
        "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",
index d311c95..e61932e 100644 (file)
        "vector-view-view": "Vaata",
        "vector-view-viewsource": "Vaata lähteteksti",
        "actions": "Toimingud",
+       "vector-more-actions": "Veel",
        "namespaces": "Nimeruumid",
        "variants": "Variandid",
        "navigation-heading": "Navigeerimismenüü",
        "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",
        "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",
index d4b7d19..e52f495 100644 (file)
        "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",
index a206e08..ba44687 100644 (file)
        "vector-view-view": "خواندن",
        "vector-view-viewsource": "نمایش مبدأ",
        "actions": "عملکردها",
+       "vector-more-actions": "بیشتر",
        "namespaces": "فضاهای نام",
        "variants": "گویش‌ها",
        "navigation-heading": "منوی ناوبری",
        "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: تفاوت بین صفحه‌ها",
        "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": "سی‌اس‌اس شخصی",
index 69f021f..8163bad 100644 (file)
        "vector-view-view": "Lue",
        "vector-view-viewsource": "Näytä lähdekoodi",
        "actions": "Toiminnot",
+       "vector-more-actions": "Lisää",
        "namespaces": "Nimiavaruudet",
        "variants": "Kirjoitusjärjestelmät",
        "navigation-heading": "Navigointivalikko",
        "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",
        "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",
        "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",
        "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:",
index 8d195e5..c795872 100644 (file)
                        "Горан Анђелковић",
                        "לערי ריינהארט",
                        "아라",
-                       "Scoopfinder"
+                       "Scoopfinder",
+                       "Akeron"
                ]
        },
        "tog-underline": "Souligner les liens :",
        "vector-action-unprotect": "Changer la protection",
        "vector-view-create": "Créer",
        "vector-view-edit": "Modifier",
-       "vector-view-history": "Afficher l’historique",
+       "vector-view-history": "Historique",
        "vector-view-view": "Lire",
        "vector-view-viewsource": "Voir la source",
        "actions": "Actions",
+       "vector-more-actions": "Plus",
        "namespaces": "Espaces de noms",
        "variants": "Variantes",
        "navigation-heading": "Menu de navigation",
        "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",
        "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é",
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 faa032d..f02ddac 100644 (file)
        "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'''.",
index 3072722..50633b9 100644 (file)
        "vector-view-view": "Ler",
        "vector-view-viewsource": "Ver o código fonte",
        "actions": "Accións",
+       "vector-more-actions": "Máis",
        "namespaces": "Espazos de nomes",
        "variants": "Variantes",
        "navigation-heading": "Menú de navegación",
        "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",
        "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 e 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",
        "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-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 */",
        "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 ebf5c18..e917886 100644 (file)
        "vector-view-view": "קריאה",
        "vector-view-viewsource": "הצגת מקור",
        "actions": "פעולות",
+       "vector-more-actions": "עוד",
        "namespaces": "מרחבי שם",
        "variants": "גרסאות שפה",
        "navigation-heading": "תפריט הניווט",
        "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": "הגרסה האחרונה",
        "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 מותאם אישית",
        "filehist-current": "נוכחית",
        "filehist-datetime": "תאריך/שעה",
        "filehist-thumb": "תמונה ממוזערת",
-       "filehist-thumbtext": "תמונה ממוזערת לגרסה מתאריך $1",
+       "filehist-thumbtext": "תמונה ממוזערת לגרסה מ־$1",
        "filehist-nothumb": "אין תמונה ממוזערת",
        "filehist-user": "משתמש",
        "filehist-dimensions": "ממדים",
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..e747c41 100644 (file)
        "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",
        "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",
index 3267546..e163ae0 100644 (file)
@@ -33,7 +33,8 @@
                        "Terik",
                        "Tgr",
                        "Xbspiro",
-                       "아라"
+                       "아라",
+                       "Csega"
                ]
        },
        "tog-underline": "Hivatkozások aláhúzása:",
        "vector-view-view": "Olvasás",
        "vector-view-viewsource": "A lap forrása",
        "actions": "Műveletek",
+       "vector-more-actions": "Több",
        "namespaces": "Névterek",
        "variants": "Változatok",
        "navigation-heading": "Navigációs menü",
        "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",
        "searchmenu-exists": "'''A wikin már van „[[:$1]]” nevű lap'''",
        "searchmenu-new": "'''Hozd létre a(z) „[[:$1]]” nevű lapot ezen a wikin!'''",
        "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'''.",
        "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",
        "tooltip-preferences-save": "Beállítások mentése",
        "tooltip-summary": "Adj meg egy rövid összefoglalót",
        "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-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 */",
        "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 bd1d41e..ad82ee0 100644 (file)
        "vector-view-view": "Leger",
        "vector-view-viewsource": "Vider texto fonte",
        "actions": "Actiones",
+       "vector-more-actions": "Plus",
        "namespaces": "Spatios de nomines",
        "variants": "Variantes",
        "navigation-heading": "Menu de navigation",
        "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.",
        "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",
        "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}}",
        "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",
        "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..273f495 100644 (file)
@@ -33,7 +33,9 @@
                        "William Surya Permana",
                        "לערי ריינהארט",
                        "아라",
-                       "C5st4wr6ch"
+                       "C5st4wr6ch",
+                       "Raynasution",
+                       "Arifin.wijaya"
                ]
        },
        "tog-underline": "Garis bawahi pranala:",
        "vector-view-view": "Baca",
        "vector-view-viewsource": "Lihat sumber",
        "actions": "Tindakan",
+       "vector-more-actions": "Lainnya",
        "namespaces": "Ruang nama",
        "variants": "Varian",
        "navigation-heading": "Menu navigasi",
        "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.",
        "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",
        "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",
        "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 dihapus",
        "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]].",
        "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..ff43f68 100644 (file)
        "vector-view-view": "Basaen",
        "vector-view-viewsource": "Kitaen ti taudan",
        "actions": "Dagiti aramid",
+       "vector-more-actions": "Adu pay",
        "namespaces": "Dagiti nagan ti espasio",
        "variants": "Sab-sabali a pagsasao",
        "navigation-heading": "Pagdaliasatan ti pagpilian",
        "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",
        "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",
index fb5739b..ffd715b 100644 (file)
        "vector-view-view": "Leggi",
        "vector-view-viewsource": "Visualizza sorgente",
        "actions": "Azioni",
+       "vector-more-actions": "Altro",
        "namespaces": "Namespace",
        "variants": "Varianti",
        "navigation-heading": "Menu di navigazione",
        "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",
        "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",
        "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",
index e98596e..06bc350 100644 (file)
        "vector-view-view": "閲覧",
        "vector-view-viewsource": "ソースを閲覧",
        "actions": "操作",
+       "vector-more-actions": "その他",
        "namespaces": "名前空間",
        "variants": "変種",
        "navigation-heading": "案内メニュー",
        "currentrev": "最新版",
        "currentrev-asof": "$1時点における最新版",
        "revisionasof": "$1時点における版",
-       "revision-info": "$1時点における$2による版",
+       "revision-info": "$1時点における{{GENDER:$6|$2}}による版$7",
        "previousrevision": "←前の版",
        "nextrevision": "次の版→",
        "currentrevisionlink": "最新版",
        "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",
index 0712260..4d04671 100644 (file)
        "vector-view-view": "შემოწმებული სტატია",
        "vector-view-viewsource": "წყაროს ხილვა",
        "actions": "მოქმედებები",
+       "vector-more-actions": "მეტი",
        "namespaces": "სახელთა სივრცე",
        "variants": "ვარიანტები",
        "navigation-heading": "სანავიგაციო მენიუ",
        "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": "შეტყობინების სტანდარტული ტექსტი",
        "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",
        "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": "კონტროლის მოხსნა",
        "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 გამოყენებული იქნება მხოლოდ ბოტებისათვის */",
        "pageinfo-category-pages": "გვერდების რაოდენობა",
        "pageinfo-category-subcats": "ქვეკატეგორიების რაოდენობა",
        "pageinfo-category-files": "ფაილების რაოდენობა",
-       "skinname-cologneblue": "კელნის ლურჯი",
        "skinname-monobook": "მონობუკი",
-       "skinname-modern": "თანამედროვე",
        "skinname-vector": "ვექტორული",
        "markaspatrolleddiff": "მონიშნე როგორც პატრულირებული",
        "markaspatrolledtext": "მონიშნე ეს სტატია როგორც პატრულირებული",
        "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-titles": "სათაურები:",
        "watchlisttools-view": "დაკავშირებული ცვლილებების ხილვა",
        "watchlisttools-edit": "კონტროლის სიის ხილვა და რედაქტირება",
        "watchlisttools-raw": "კონტროლის სიის რედაქტირება ტექსტის ფორმატში",
        "htmlform-no": "არა",
        "htmlform-yes": "დიახ",
        "htmlform-chosen-placeholder": "აირჩიეთ პარამეტრი",
+       "htmlform-cloner-delete": "წაშლა",
        "sqlite-has-fts": "$1 სრული ტექსტის ძიების მხარდაჭერით",
        "sqlite-no-fts": "$1 სრული ტექსტის ძიების მხარდაჭერის გარეშე",
        "logentry-delete-delete": "მომხმარებელმა $1 {{GENDER:$2|წაშალა}} გვერდი: „$3“",
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..9403278 100644 (file)
        "suspicious-userlogout": "Сіздің жүйеден шығу сұранымыңыз қабылданбады, өйткені бұл бұзылған браузер немесе кэштеуші прокси арқылы жіберілгенге ұқсайды.",
        "pt-login": "Кіру",
        "pt-login-button": "Кіру",
-       "pt-createaccount": "Тіркелгі жасау",
+       "pt-createaccount": "Тіркелу",
        "pt-userlogout": "Шығу",
        "php-mail-error-unknown": "Mail() PHP-функциясындағы белгісіз қате.",
        "user-mail-no-addy": "Е-пошта мекенжайынсыз хабарлама жіберуді байқап көрді.",
        "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": "Осы бетті оқу",
        "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": "жүктеулері",
        "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 a2e70a9..cc392e1 100644 (file)
        "allowemail": "ಬೇರೆ ಸದಸ್ಯರಿಂದ ಈ-ಮೈಲ್‍ಗಳನ್ನು ಸ್ವೀಕರಿಸು",
        "prefs-searchoptions": "ಹುಡುಕು",
        "prefs-namespaces": "ನಾಮವರ್ಗಗಳು",
-       "defaultns": "ಮೂಲಸ್ಥಿತಿಯಲ್ಲಿ ಈ ಪುಟಪ್ರಬೇಧಗಳಲ್ಲಿ ಹುಡುಕಿ:",
        "default": "ಮೂಲಸ್ಥಿತಿ",
        "prefs-files": "ಫೈಲುಗಳು",
        "youremail": "ಇ-ಅಂಚೆ:",
index bda0f5b..a7cc5f3 100644 (file)
@@ -37,7 +37,8 @@
                        "לערי ריינהארט",
                        "관인생략",
                        "아라",
-                       "Keysuck"
+                       "Keysuck",
+                       "Infinity"
                ]
        },
        "tog-underline": "링크에 밑줄:",
        "vector-view-view": "읽기",
        "vector-view-viewsource": "원본 보기",
        "actions": "행위",
+       "vector-more-actions": "더 보기",
        "namespaces": "이름공간",
        "variants": "변수",
        "navigation-heading": "둘러보기 메뉴",
        "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": "(사용자 이름 삭제됨)",
        "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",
        "unusedtemplateswlh": "다른 링크",
        "randompage": "임의 문서로",
        "randompage-nopages": "{{PLURAL:$2|다음}} 이름공간에는 문서가 없습니다: $1",
-       "randomincategory": "분류에 있는 임의 문서",
+       "randomincategory": "분류 안의 임의 문서",
        "randomincategory-invalidcategory": "\"$1\"(은)는 올바른 분류 이름이 아닙니다.",
        "randomincategory-nopages": "[[:Category:$1]]에 문서가 없습니다.",
        "randomincategory-selectcategory": "분류에서 임의 문서 얻기: $1 $2",
        "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> 특수 명령이 있기 때문에 로봇이 색인하지 않습니다.",
        "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 eaed4ff..7711ae0 100644 (file)
        "vector-view-view": "Окъу",
        "vector-view-viewsource": "Кодха къара",
        "actions": "Этиуле",
+       "vector-more-actions": "Энтда",
        "namespaces": "Атланы аламы",
        "variants": "Вариантла",
        "navigation-heading": "Навигация меню",
        "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": "Сёдегей джазыу",
        "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": "Ахыр тюрлениулени джарашдырыулары",
        "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": "Къошулуучу бетигиз",
        "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 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 42633ac..09bac72 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",
        "vector-view-view": "Liesen",
        "vector-view-viewsource": "Quellcode weisen",
        "actions": "Aktiounen",
+       "vector-more-actions": "Méi",
        "namespaces": "Nummraim",
        "variants": "Varianten",
        "navigation-heading": "Navigatiounsmenü",
        "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",
        "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",
        "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",
        "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",
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..c10ba27 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í",
        "vector-view-view": "Legg",
        "vector-view-viewsource": "Varda el codes",
        "actions": "Azión",
+       "vector-more-actions": "Amò",
        "namespaces": "Namespace",
        "variants": "Variant",
        "navigation-heading": "Menù de navigasiù",
        "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",
        "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..9d75789 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": "بلگه",
        "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": "د نیسنن ای پی آی استفاده بکید",
        "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..172614c 100644 (file)
        "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.",
        "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:",
        "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..a86a3c9 100644 (file)
        "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",
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..1821119 100644 (file)
        "vector-view-view": "Читај",
        "vector-view-viewsource": "Извор",
        "actions": "Дејства",
+       "vector-more-actions": "Повеќе",
        "namespaces": "Именски простори",
        "variants": "Варијанти",
        "navigation-heading": "Навигационо мени",
        "currentrev": "Тековна преработка",
        "currentrev-asof": "Последна преработка од $1",
        "revisionasof": "Преработка од $1",
-       "revision-info": "Преработка од $1; направена од $2",
+       "revision-info": "Преработка од $1; направена од {{GENDER:$6|$2}}$7",
        "previousrevision": "← Претходна преработка",
        "nextrevision": "Следна преработка →",
        "currentrevisionlink": "Последна преработка",
        "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",
        "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 ќе се применува во верзијата за печатење */",
        "noscript.css": "/* Тука поставениот CSS се однесува на корисниците што имаат оневозможено JavaScript */",
        "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  ќе им се вчитува само на регистрираните корисници */",
        "pageinfo-category-pages": "Број на страници",
        "pageinfo-category-subcats": "Број на поткатегории",
        "pageinfo-category-files": "Број на податотеки",
-       "skinname-cologneblue": "Келнско сино",
        "skinname-monobook": "Монобук",
-       "skinname-modern": "Современо",
        "skinname-vector": "Векторско",
        "markaspatrolleddiff": "Означи како проверена верзија",
        "markaspatrolledtext": "Означи ја верзијата како проверена",
index 9c59c20..7f4c7c6 100644 (file)
        "currentrev": "ഇപ്പോഴുള്ള രൂപം",
        "currentrev-asof": "$1 -ൽ നിലവിലുള്ള രൂപം",
        "revisionasof": "$1-നു നിലവിലുണ്ടായിരുന്ന രൂപം",
-       "revision-info": "$1-നു ഉണ്ടായിരുന്ന രൂപം സൃഷ്ടിച്ചത്:- $2",
+       "revision-info": "$1-നു ഉണ്ടായിരുന്ന രൂപം സൃഷ്ടിച്ചത്:- {{GENDER:$6|$2}}$7",
        "previousrevision": "←പഴയ രൂപം",
        "nextrevision": "പുതിയ രൂപം→",
        "currentrevisionlink": "ഇപ്പോഴുള്ള രൂപം",
        "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": "സ്വന്തം സി.എസ്.എസ്.",
index a184e82..c034a61 100644 (file)
        "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|жагсааж харах]])",
        "log-title-wildcard": "Энэ текстээр эхлэсэн гарчигуудыг хайх",
        "showhideselectedlogentries": "Сонгосон логуудыг харагдуулах/нуух",
        "allpages": "Бүх хуудас",
-       "alphaindexline": "$1-с $2 хүртэл",
        "nextpage": "Дараагийн хуудас ($1)",
        "prevpage": "Өмнөх хуудас ($1)",
        "allpagesfrom": "Хамгийн эхэлж харуулах хуудас:",
index 418cbb6..123340e 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=|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": "खरे नाव:",
        "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": "या पानावर गस्त झाल्याची खूण करा",
index de5046f..02f1d2f 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",
        "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.",
        "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",
        "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",
        "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",
index 328e7c2..6767d6a 100644 (file)
        "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.",
        "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-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]])",
        "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",
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..ba7438c 100644 (file)
        "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>.",
        "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",
        "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",
index c05c0dd..c3a89be 100644 (file)
        "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",
        "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||}} नाम नभएका सदस्य",
        "pageinfo-category-pages": "पृष्ठहरूको संख्या",
        "pageinfo-category-subcats": "उपश्रेणीहरूको संख्या",
        "pageinfo-category-files": "फाइलहरूको संख्या",
-       "skinname-cologneblue": "कोलोग्ने निलो",
        "skinname-monobook": "मोनोबुक",
-       "skinname-modern": "मोडर्न",
        "skinname-vector": "भेक्टर",
        "markaspatrolleddiff": "गस्ती गरिएको(patrolled) को रुपमा चिनो लगाउने",
        "markaspatrolledtext": "यस पृष्ठलाई गस्ती गरिएको(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..faac6fd 100644 (file)
@@ -56,7 +56,8 @@
                        "Wolf Lambert",
                        "לערי ריינהארט",
                        "아라",
-                       "Mar(c)"
+                       "Mar(c)",
+                       "Calak"
                ]
        },
        "tog-underline": "Koppelingen onderstrepen:",
        "vector-view-history": "Geschiedenis weergeven",
        "vector-view-view": "Lezen",
        "vector-view-viewsource": "Brontekst bekijken",
-       "actions": "Handelingen",
+       "actions": "Acties",
+       "vector-more-actions": "Meer",
        "namespaces": "Naamruimten",
        "variants": "Varianten",
        "navigation-heading": "Navigatiemenu",
        "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'''.",
        "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",
        "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..61dc924 100644 (file)
        "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:",
        "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å:",
        "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 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..4764aa3 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}}.",
        "vector-view-view": "Czytaj",
        "vector-view-viewsource": "Tekst źródłowy",
        "actions": "Działania",
+       "vector-more-actions": "Więcej",
        "namespaces": "Przestrzenie nazw",
        "variants": "Warianty",
        "navigation-heading": "Menu nawigacyjne",
        "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",
        "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",
        "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.",
index 9593b2b..0a9e52f 100644 (file)
        "vector-view-view": "Ler",
        "vector-view-viewsource": "Ver código-fonte",
        "actions": "Ações",
+       "vector-more-actions": "Mais",
        "namespaces": "Espaços nominais",
        "variants": "Variantes",
        "navigation-heading": "Menu de navegação",
        "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'''º.",
        "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",
index 663a782..a2c3c01 100644 (file)
        "feb": "Fev.",
        "mar": "Mar.",
        "apr": "Abr.",
-       "may": "maio",
+       "may": "Maio",
        "jun": "Jun.",
        "jul": "Jul.",
        "aug": "Ago.",
        "vector-view-view": "Ler",
        "vector-view-viewsource": "Ver fonte",
        "actions": "Acções",
-       "namespaces": "Espaços nominais",
+       "vector-more-actions": "Mais",
+       "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",
        "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 está autenticado.\nA {{SITENAME}} utiliza ''cookies'' para autenticar os utilizadores.\nOs ''cookies'' estão desativados no seu navegador.\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 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-chave 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-chave passe. Para iniciar sessão, defina uma nova.",
+       "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-chave 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:",
        "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",
        "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.",
        "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}}",
        "mostlinkedtemplates": "Predefinições 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 espaço nominal em que essa marca é permitida) e, portanto, será indexada pelos bots mesmo quando normalmente não o seria.",
+       "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].",
        "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!",
        "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-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-chave 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..2dd4d63 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}}",
        "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}}",
+       "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}}",
        "namespaces": "{{Identical|Namespace}}",
        "variants": "Used by the Vector skin.",
        "navigation-heading": "Heading shown above the navigation menu (sidebar) for screen-readers (or in non-standard skins).",
        "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}}",
        "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}}",
        "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]].",
        "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}}",
        "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}}",
        "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 64676fd..4406a24 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",
        "vector-view-view": "Lectură",
        "vector-view-viewsource": "Sursă pagină",
        "actions": "Acțiuni",
+       "vector-more-actions": "Mai mult",
        "namespaces": "Spații de nume",
        "variants": "Variante",
        "navigation-heading": "Meniu de navigare",
        "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ă",
        "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",
        "tooltip-summary": "Descrieți pe scurt modificarea",
        "interlanguage-link-title": "$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}}",
        "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ă",
index dca8ad2..3b26c28 100644 (file)
        "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ò",
        "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:",
        "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-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 */",
        "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",
index 912777f..a6fa914 100644 (file)
@@ -65,7 +65,8 @@
                        "לערי ריינהארט",
                        "Meshkov.a",
                        "아라",
-                       "Eroha"
+                       "Eroha",
+                       "Niklem"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
        "vector-view-view": "Читать",
        "vector-view-viewsource": "Просмотр разметки",
        "actions": "Действия",
+       "vector-more-actions": "Ещё",
        "namespaces": "Пространства имён",
        "variants": "Варианты",
        "navigation-heading": "Навигация",
        "currentrev": "Текущая версия",
        "currentrev-asof": "Текущая версия на $1",
        "revisionasof": "Версия $1",
-       "revision-info": "Версия от $1; $2",
+       "revision-info": "Версия от $1; {{GENDER:$6|$2}}$7",
        "previousrevision": "← Предыдущая",
        "nextrevision": "Следующая →",
        "currentrevisionlink": "Текущая версия",
        "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": "Список недавно зарегистрировавшихся участников",
        "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": "У вас нет разрешения переименовывать файлы.",
        "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..9df57b7 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": "Ыстатыйа",
        "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Оттон эн оннук суруктары көрөр кыаҕыҥ суох эбит.",
        "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",
        "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": "Билэ туһунан сурук уларытыытын ыыт",
index fd8d734..35e7d41 100644 (file)
@@ -6,7 +6,8 @@
                        "Marzedu",
                        "Node ue",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Via maxima"
                ]
        },
        "tog-underline": "Sutalìnea is cullegamentos",
@@ -34,6 +35,7 @@
        "tog-oldsig": "Antiprima de sa 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-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…",
+       "morenotlisted": "Sa lista no est cumpreta",
        "mypage": "Sa pàgina mea",
        "mytalk": "Cuntierras meas",
        "anontalk": "Cuntierras pro custu IP",
        "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}}",
        "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..777e5f1 100644 (file)
        "vector-view-view": "Leggi",
        "vector-view-viewsource": "Talìa la fonti",
        "actions": "Azzioni",
+       "vector-more-actions": "Àutri cosi",
        "namespaces": "Namespace",
        "variants": "Varianti",
        "navigation-heading": "Menù di navigazzioni",
        "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.",
        "createacct-emailrequired": "Nnirizzu e-mail",
        "createacct-emailoptional": "Nnirizzu e-mail (facurtativu)",
        "createacct-email-ph": "Nzirisci lu tò nnirizzu e-mail",
        "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",
index 118f7cf..35fa869 100644 (file)
        "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 / Ваше име*",
        "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:",
        "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 bc2de72..32a18a5 100644 (file)
        "vector-view-view": "Preberi",
        "vector-view-viewsource": "Izvorno besedilo",
        "actions": "Dejanja",
+       "vector-more-actions": "Več",
        "namespaces": "Imenski prostori",
        "variants": "Različice",
        "navigation-heading": "Navigacijski meni",
        "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",
        "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",
index f90910e..dc27bbc 100644 (file)
        "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:",
index aa6d614..d6f1b07 100644 (file)
        },
        "tog-underline": "Подвлачење веза:",
        "tog-hideminor": "Сакриј мање измене у списку скорашњих измена",
-       "tog-hidepatrolled": "Сакриј прегледане измене у списку скорашњих измена",
+       "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": "Уређивање одељака десним кликом на њихове наслове",
        "vector-view-view": "Читај",
        "vector-view-viewsource": "Изворни код",
        "actions": "Радње",
+       "vector-more-actions": "Више",
        "namespaces": "Именски простори",
        "variants": "Варијанте",
        "navigation-heading": "Навигациони мени",
        "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'''Не шаљите радове заштићене ауторским правима без дозволе!'''",
        "readonlywarning": "'''Упозорење: база података је закључана ради одржавања, тако да тренутно нећете моћи да сачувате измене.'''\nМожда бисте желели сачувати текст за касније у некој текстуалној датотеци.\n\nАдминистратор који је закључао базу дао је следеће објашњење: $1",
        "protectedpagewarning": "'''Упозорење: ова страница је заштићена, тако да само администратори могу да је мењају.'''\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": "најстарије",
        "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": "Резултати претраге",
        "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",
        "allowemail": "Омогући примање е-порука од других корисника",
        "prefs-searchoptions": "Претрага",
        "prefs-namespaces": "Именски простори",
-       "defaultns": "Ако није наведено другачије, тражи у овим именским просторима:",
        "default": "подразумевано",
        "prefs-files": "Датотеке",
        "prefs-custom-css": "Прилагођени CSS",
        "mostlinked": "Странице с највише веза",
        "mostlinkedcategories": "Чланци с највише категорија",
        "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": "Немате дозволу да премештате датотеке.",
        "newimages-summary": "Ова посебна страница приказује последње послате датотеке.",
        "newimages-legend": "Филтер",
        "newimages-label": "Назив датотеке (или њен део):",
+       "newimages-showbots": "Прикажи датотеке које су послали ботови",
        "noimages": "Нема ништа.",
        "ilsubmit": "Претражи",
        "bydate": "по датуму",
        "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": "Наслови:",
index 843ac2f..6682e50 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-hidepatrolled": "Sakrij patrolirane izmene u spisku skorašnjih izmena",
        "tog-newpageshidepatrolled": "Sakrij pregledane stranice sa spiska novih stranica",
        "tog-extendwatchlist": "Proširi spisak nadgledanja za prikaz svih izmena, ne samo skorašnjih",
        "tog-usenewrc": "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",
        "vector-view-view": "Čitaj",
        "vector-view-viewsource": "Izvorni kod",
        "actions": "Radnje",
+       "vector-more-actions": "Više",
        "namespaces": "Imenski prostori",
        "variants": "Varijante",
        "navigation-heading": "Navigacioni meni",
        "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!'''",
        "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:",
        "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:",
        "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",
        "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",
        "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",
        "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",
        "mostlinked": "Stranice s najviše veza",
        "mostlinkedcategories": "Članci s najviše kategorija",
        "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.",
        "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",
        "watchlistedit-normal-submit": "Ukloni",
        "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",
index f527f8b..0eee6ab 100644 (file)
        "vector-view-view": "Visa",
        "vector-view-viewsource": "Visa källa",
        "actions": "Åtgärder",
+       "vector-more-actions": "Mer",
        "namespaces": "Namnrymder",
        "variants": "Varianter",
        "navigation-heading": "Navigeringsmeny",
        "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",
        "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",
        "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-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 */",
        "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",
        "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-license": "MediaWiki-licens",
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..f8becd3 100644 (file)
        "vector-view-view": "చదువు",
        "vector-view-viewsource": "మూలాన్ని చూపించు",
        "actions": "పనులు",
+       "vector-more-actions": "మరిన్ని",
        "namespaces": "పేరుబరులు",
        "variants": "వివిధ రూపాలు",
        "navigation-heading": "మార్గదర్శకపు మెనూ",
        "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": "ప్రస్తుత కూర్పు",
        "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",
        "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": "ఈ వ్యాసాన్ని పరీక్షించినట్లుగా గుర్తు పెట్టు",
        "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..189bc5c 100644 (file)
        "currentrev": "รุ่นปัจจุบัน",
        "currentrev-asof": "รุ่นปัจจุบัน เมื่อ $1",
        "revisionasof": "รุ่นเมื่อ $1",
-       "revision-info": "รุ่นเมื่อ $1 โดย $2",
+       "revision-info": "รุ่นเมื่อ $1 โดย {{GENDER:$6|$2}}$7",
        "previousrevision": "←รุ่นก่อนหน้า",
        "nextrevision": "รุ่นถัดไป→",
        "currentrevisionlink": "รุ่นล่าสุด",
        "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": "สไตล์ชีตปรับแต่งเอง",
        "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": "ชื่อหน้าต้นทางและปลายทางเป็นชื่อเดียวกัน ไม่สามารถเปลี่ยนชื่อได้มาใช้ชื่อเดิมได้",
index 395ba26..c90035d 100644 (file)
        "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",
index 89ee4eb..88574a1 100644 (file)
@@ -46,7 +46,8 @@
                        "Дар'я Козлова",
                        "Максим Підліснюк",
                        "Тест",
-                       "아라"
+                       "아라",
+                       "Calak"
                ]
        },
        "tog-underline": "Підкреслювати посилання:\nПідкреслювання посилань:",
        "vector-view-view": "Читати",
        "vector-view-viewsource": "Переглянути код",
        "actions": "Дії",
+       "vector-more-actions": "Більше",
        "namespaces": "Простори назв",
        "variants": "Варіанти",
        "navigation-heading": "Навігаційне меню",
        "search-interwiki-default": "Результати із $1:",
        "search-interwiki-more": "(більше)",
        "search-relatedarticle": "Пов'язаний",
-       "searcheverything-enable": "Пошук у всіх просторах назв",
        "searchrelated": "пов'язаний",
        "searchall": "усі",
        "showingresults": "Нижче {{PLURAL:$1|показане|показані|показані}} '''$1''' {{PLURAL:$1|результат|результати|результатів}}, починаючи з №&nbsp;'''$2'''",
        "allowemail": "Дозволити електронну пошту від інших користувачів",
        "prefs-searchoptions": "Пошук",
        "prefs-namespaces": "Простори назв",
-       "defaultns": "Інакше шукати в таких просторах назв:",
        "default": "за умовчанням",
        "prefs-files": "Файли",
        "prefs-custom-css": "Власний CSS",
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 c9c3699..c276426 100644 (file)
        "vector-view-view": "Đọc",
        "vector-view-viewsource": "Xem mã nguồn",
        "actions": "Tác vụ",
+       "vector-more-actions": "Khác",
        "namespaces": "Không gian tên",
        "variants": "Biến thể",
        "navigation-heading": "Trình đơn chuyển hướng",
        "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",
        "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",
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..e2bd5d9 100644 (file)
@@ -10,7 +10,8 @@
                        "Yfdyh000",
                        "乌拉跨氪",
                        "十弌",
-                       "아라"
+                       "아라",
+                       "Mywood"
                ]
        },
        "tog-underline": "鏈接下橫線:",
        "namespaces": "名字空间",
        "variants": "变量",
        "errorpagetitle": "錯誤",
-       "returnto": "转å\88°$1。",
+       "returnto": "è¿\94å\9b\9e$1。",
        "tagline": "从{{SITENAME}}来",
        "help": "幫忙",
        "search": "寻",
        "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": "其它时间:",
        "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..9340ea7 100644 (file)
        "vector-view-view": "לייענען",
        "vector-view-viewsource": "ווײַזן מקור",
        "actions": "אַקציעס",
+       "vector-more-actions": "נאך",
        "namespaces": "נאָמענטיילן",
        "variants": "װאַריאַנטן",
        "navigation-heading": "נאוויגאציע מעניו",
        "jumptonavigation": "נאַוויגאַציע",
        "jumptosearch": "זוכן",
        "view-pool-error": "אנטשולדיגט, די סערווערס זענען איבערגעפילט איצט.\nצופיל באניצער פרובירן צו ליינען דעם בלאט.\nביטע ווארטן א ביסל צייט בעפאר איר פרובירט ווידער אריינגיין אינעם בלאט.\n\n$1",
+       "generic-pool-error": "אנטשולדיגט, די סערווערס זענען איבערגעפילט איצט.\nצופיל באניצער פרובירן צו באקוקן דעם רעסורס.\nביטע ווארטן א ביסל צייט בעפאר איר פרובירט ווידער אריינטרעטן אין דעם רעסורס.",
        "pool-timeout": "אַריבער דער צײַט וואַרטן פֿאר דער שליסונג",
        "pool-queuefull": "ריי איז פֿול",
        "pool-errorunknown": "אומבאַקאַנטער פֿעלער",
        "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": "פעטליע געטראפֿן",
        "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-confirm": "זייט אזוי גוט און באשטעטיקט אז דאס איז טאקע אייער כוונה, אז איר פארשטייט די קאנסעקווענצן, און אז איר טוט דאס לויט  [[{{MediaWiki:Policy-url}}|דער פאליסי]].",
        "revdelete-suppress-text": "אונטערדרוקן זאל בלויז גענוצט ווערן '''נאר''' אין די פאלגנדע פעלער:\n* אינפארמאציע וואס קען זיין מוציא שם רע\n* אויפדעקונג פון פריוואטקייט אינפארמאציע\n*: ''היים אדרעסן, טעלעפאן נומערן, נאציאנאלע אידענטיפיקאציע נומערן, א.א.וו.''",
        "revdelete-legend": "שטעלט ווייזונג באגרענעצונגען",
        "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",
        "listgrouprights-removegroup-self": "א§ראָפנעמען {{PLURAL:$2|גרופּע |גרופּעס}} פון אייגענער קאנטע: $1",
        "listgrouprights-addgroup-self-all": "צולייגן אַלע גרופעס צו אייגענער קאנטע",
        "listgrouprights-removegroup-self-all": "אראָפנעמען אַלע גרופעס פֿון אייגענער קאנטע",
+       "listgrouprights-namespaceprotection-header": "נאמענטייל באשרענקונגען",
        "listgrouprights-namespaceprotection-namespace": "נאָמענטייל",
+       "listgrouprights-namespaceprotection-restrictedto": "רעכט(ן) וואס דערלויבט באניצער צו רעדאקטירן",
        "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": "אויפפאסענדונג…",
        "contributions-title": "בײַשטײַערונגען פֿון באַניצער $1",
        "mycontris": "בײַשטײַערונגען",
        "contribsub2": "פֿאַר {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "באניצער קאנטע \"$1\" איז נישט איינגעשריבן.",
        "nocontribs": "נישט געטראפן קיין ענדערונגען צוזאמעגעפאסט מיט די קריטעריעס.",
        "uctop": "(לויפֿיק)",
        "month": "ביז חודש:",
        "cant-move-user-page": "איר זענט נישט דערלויבט צו באַוועגן באַניצער בלעטער (אחוץ אונטערבלעטער).",
        "cant-move-to-user-page": "איר זענט נישט דערלויבט צו באַוועגן א בלאַט צו א באַניצער בלאַט (אַחוץ צו א באַניצער אונטערבלאַט).",
        "cant-move-category-page": "איר זענט נישט דערלויבט צו באוועגן קאטעגאריע בלעטער.",
+       "cant-move-to-category-page": "איר זענט נישט ערלויבט צו באוועגן א בלאט צו קאטעגאריע־בלאט.",
        "newtitle": "צו נייעם קעפל:",
        "move-watch": "אויפֿפאַסן אויף דעם בלאַט",
        "movepagebtn": "באַוועגן בלאַט",
        "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 16c064a..6ce8a9b 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个子分类。}}",
        "vector-view-view": "阅读",
        "vector-view-viewsource": "查看源代码",
        "actions": "操作",
+       "vector-more-actions": "更多",
        "namespaces": "名字空间",
        "variants": "变种",
        "navigation-heading": "导航菜单",
        "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": "请输入你要重置的用户名。",
        "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": "该编辑无法撤消,因为它不存在或已被删除。",
        "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": "当前",
+       "cur": "",
        "next": "后继",
-       "last": "å\85\88å\89\8d",
+       "last": "前",
        "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": "最旧",
        "searchprofile-images-tooltip": "搜索文件",
        "searchprofile-everything-tooltip": "搜索所有内容(包括讨论页面)",
        "searchprofile-advanced-tooltip": "在自定义名字空间中搜索",
-       "search-result-size": "$1($2字)",
+       "search-result-size": "$1($2字)",
        "search-result-category-size": "$1个成员($2个子分类,$3个文件)",
        "search-result-score": "相关度:$1%",
        "search-redirect": "(重定向自“$1”)",
        "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",
        "recentchangesdays-max": "最多$1天",
        "recentchangescount": "默认显示的编辑数:",
        "prefs-help-recentchangescount": "这包括最近更改、页面历史和日志。",
-       "prefs-help-watchlist-token2": "这是您的监视列表的网络feed密钥。\n任何拥有者均可以浏览您的监视列表,因此不要公开该密钥。\n如果有需要,[[Special:ResetTokens|您可以重置密钥]]。",
+       "prefs-help-watchlist-token2": "这是你的监视列表的网络feed的密钥。任何知道它的人均可以阅读你的监视列表,因此请不要分享它。如果需要,[[Special:ResetTokens|你可以重置它]]。",
        "savedprefs": "您的系统设置已保存。",
        "timezonelegend": "时区:",
        "localtime": "当地时间:",
        "allowemail": "启用来自其他用户的电子邮件",
        "prefs-searchoptions": "搜索",
        "prefs-namespaces": "名字空间",
-       "defaultns": "否则在这些名字空间中搜索:",
        "default": "默认",
        "prefs-files": "文件",
        "prefs-custom-css": "自定义CSS",
        "yourvariant": "内容语言变种:",
        "prefs-help-variant": "您希望用于显示该本站内容的语言变体。",
        "yournick": "新签名:",
-       "prefs-help-signature": "讨论页上留言应该使用“<nowiki>~~~~</nowiki>”签名,它会自动转换为您的签名及时间戳。",
+       "prefs-help-signature": "讨论页面上的评论应该使用“<nowiki>~~~~</nowiki>”签名,它会自动转换为您的签名及时间戳。",
        "badsig": "错误的原始签名。请检查HTML标签。",
        "badsiglength": "签名过长。请不超过$1个字符。",
        "yourgender": "您希望使用什么性别称呼?",
        "prefs-help-gender": "该设置为可选项。软件根据该值在称呼您及对他人提及您时使用适当的语法性别。该信息会被公开。",
        "email": "电子邮件",
        "prefs-help-realname": "真实姓名是选填项目。如果你选择提供它,它将会用于贡献署名。",
-       "prefs-help-email": "电子邮件是可选项,但是在您忘记密码时很有用。",
-       "prefs-help-email-others": "您也可以选择让其他用户通过您的用户页或讨论页上的链接用电子邮件联系您。其他用户联系您时您的电子邮件地址不会显示。",
+       "prefs-help-email": "电子邮件地址是选填项,但是当你忘记你的密码要重置密码时,需要该信息。",
+       "prefs-help-email-others": "你也可以选择让其他用户通过你的用户或讨论页面上的链接用电子邮件联系你。其他用户联系你时你的电子邮件地址不会显示。",
        "prefs-help-email-required": "电子邮件地址是必填项目。",
        "prefs-info": "基本信息",
        "prefs-i18n": "语言",
        "rcshowhidemine-show": "显示",
        "rcshowhidemine-hide": "隐藏",
        "rclinks": "显示过去$2天的最后$1个更改<br />$3",
-       "diff": "å·®å¼\82",
-       "hist": "å\8e\86å\8f²",
+       "diff": "异",
+       "hist": "史",
        "hide": "隐藏",
        "show": "显示",
        "minoreditletter": "小",
        "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": "未选定",
        "uncategorizedtemplates": "未归类模板",
        "unusedcategories": "未使用分类",
        "unusedimages": "未使用文件",
-       "popularpages": "热页面",
+       "popularpages": "热页面",
        "wantedcategories": "需要的分类",
        "wantedpages": "需要的页面",
        "wantedpages-badtitle": "在结果组上的无效标题:$1",
        "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": "按字母排列",
        "watchlist-details": "不计讨论页,您的监视列表中共有$1个页面。",
        "wlheader-enotif": "已启用电子邮件通知。",
        "wlheader-showupdated": "您上次访问后发生更改的页面'''加粗'''显示",
-       "wlnote2": "下面是最近{{PLURAL:$1|<strong>$1</strong>小时}}的更改,截至$2 $3。",
+       "wlnote2": "下面是过去{{PLURAL:$1|<strong>$1</strong>小时}}的更改,截至$2 $3。",
        "wlshowlast": "显示过去$1小时$2天$3",
        "watchlist-options": "监视列表选项",
        "watching": "正在监视...",
        "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>查看当前版本。",
        "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** 高流量页面",
        "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小时:1 hour,1天:1 day,1周:1 week,2周:2 weeks,1个月:1 month,3个月:3 months,6个月:6 months,1年:1 year,限期:infinite",
        "restriction-type": "权限:",
        "restriction-level": "限制级别:",
        "minimum-size": "最小尺寸",
        "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地址编辑",
        "ipbenableautoblock": "自动封禁该用户最后使用的IP地址,以及他们随后试图用于编辑的所有IP地址",
        "ipbsubmit": "封禁该用户",
        "ipbother": "其它时间:",
-       "ipboptions": "2小时:2 hours,1天:1 day,3天:3 days,1周:1 week,2周:2 weeks,1个月:1 month,3个月:3 months,6个月:6 months,1年:1 year,限期:infinite",
+       "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",
        "ipbhidename": "在编辑及列表中隐藏用户名",
        "ipbwatchuser": "监视该用户的用户页和讨论页",
        "ipb-disableusertalk": "阻止用户在封禁期间编辑自己的讨论页",
        "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": "账户创建停用",
        "export-addnstext": "从名字空间添加页面:",
        "export-addns": "添加",
        "export-download": "另存为文件",
-       "export-templates": "包模板",
+       "export-templates": "包模板",
        "export-pagelinks": "包含链接页面的搜索深度:",
        "allmessages": "系统消息",
        "allmessagesname": "名称",
        "creditspage": "页面编辑名单",
        "nocredits": "本页面没有编辑名单信息。",
        "spamprotectiontitle": "垃圾链接过滤器",
-       "spamprotectiontext": "您要保存的文本被垃圾过滤器阻止。\n这可能是由于一个链往匹配黑名单的外部站点的链接引起的。",
+       "spamprotectiontext": "您要保存的文字被垃圾信息过滤器拦截。这可能是由黑名单内外部网站链接引发的。",
        "spamprotectionmatch": "以下文本触发了我们的垃圾链接过滤器:$1",
        "spambot_username": "MediaWiki垃圾链接清理器",
        "spam_reverting": "恢复至不包含$1的链接的最后版本",
        "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": "你的电子邮件地址现在已经确认。",
        "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-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 d4f20e0..0f44ca2 100644 (file)
                        "Yuyu",
                        "乌拉跨氪",
                        "아라",
-                       "Vincent Liu"
+                       "Vincent Liu",
+                       "Mywood"
                ]
        },
        "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": "顯示隱藏分類",
        "vector-view-view": "閱讀",
        "vector-view-viewsource": "檢視原始碼",
        "actions": "動作",
+       "vector-more-actions": "更多",
        "namespaces": "命名空間",
        "variants": "變體",
        "navigation-heading": "導覽選單",
        "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": "最新修訂",
-       "cur": "ç\9b®å\89\8d",
+       "cur": "ç\8f¾",
        "next": "後筆",
-       "last": "前",
+       "last": "前",
        "page_first": "第一頁",
        "page_last": "最後頁",
        "histlegend": "比較選擇的版本差異:選要比較修訂版本的單選方塊並點選網頁底部的按鈕進行比較。<br />\n符號說明:<strong>({{int:cur}})</strong> = 與最新的修訂版本比較,<strong>({{int:last}})</strong> = 與前一筆修訂版本比較,<strong>{{int:minoreditletter}}</strong> = 小修訂。",
        "mergehistory-reason": "原因:",
        "mergelog": "合併日誌",
        "pagemerge-logentry": "已合併 [[$1]] 至 [[$2]] (修訂更新至 $3)",
-       "revertmerge": "解除合併",
+       "revertmerge": "取消合併",
        "mergelogpagetext": "以下是最近合併頁面歷史的清單。",
        "history-title": "\"$1\" 的修訂歷史",
        "difference-title": "$1:修訂間的差異",
        "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 次變更",
        "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": "上傳檔案",
        "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": "未有語言連結的頁面",
        "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": "查看最新。",
        "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": "Interwiki 連結在移動頁面中是無效的目標。",
-       "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": "損壞的 Interwiki 連結",
+       "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\"未能導入,這是因為他的頁面名稱預留了供跨維基連結( Interwiki)使用。",
-       "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.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": "全部",
        "confirm-purge-top": "要清除此頁面的快取嗎?",
        "confirm-purge-bottom": "清理一頁將會清除快取以及強迫顯示最現時之修訂版本。",
        "confirm-watch-button": "確定",
-       "confirm-watch-top": "監視此頁?",
+       "confirm-watch-top": "新增此頁面至您的監視清單?",
        "confirm-unwatch-button": "確定",
-       "confirm-unwatch-top": "å\81\9cæ­¢ç\9b£è¦\96æ­¤é \81?",
+       "confirm-unwatch-top": "å¾\9eæ\82¨ç\9a\84ç\9b£è¦\96æ¸\85å\96®ä¸­ç§»é\99¤æ­¤é \81é\9d¢?",
        "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..248df79 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
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..b233831 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',
 );
 
 /**
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..6ada6d7 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
  */
 
 /**
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
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 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 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" );
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 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 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..67696f2 100644 (file)
@@ -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 a9208db..ea7d397 100644 (file)
@@ -107,38 +107,13 @@ return array(
                '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' ),
-               ),
-               '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'],
-       ),
-
        'mediawiki.skinning.content.parsoid' => array(
                // Style Parsoid HTML+RDFa output consistent with wikitext from PHP parser
                // with the commonInterface.css styles; skinStyles should be used if your
                // skin over-rides common content styling.
                'skinStyles' => array(
                        'default' => 'resources/src/mediawiki.skinning/content.parsoid.less',
+                       'minerva' => array(),
                ),
                'targets' => array( 'desktop', 'mobile' ),
        ),
@@ -186,10 +161,14 @@ return array(
        /* 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' ),
        ),
@@ -379,13 +358,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',
@@ -394,79 +372,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',
@@ -475,12 +414,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',
@@ -489,7 +429,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',
@@ -498,6 +440,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',
@@ -519,6 +462,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',
@@ -534,6 +478,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',
@@ -555,105 +500,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',
        ),
@@ -921,7 +979,6 @@ return array(
                        'jquery.accessKeyLabel',
                        'jquery.mwExtension',
                        'mediawiki.notify',
-                       'mediawiki.toc', // bug 64765
                ),
                'position' => 'top', // For $wgPreloadJavaScriptMwUtil
                'targets' => array( 'desktop', 'mobile' ),
@@ -967,6 +1024,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(
@@ -1171,7 +1229,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(
@@ -1220,7 +1278,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 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 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 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?"
 }
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..47ff54c
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..c871f60
--- /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" 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>
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..7984007
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..cbc22a4
--- /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" style="enable-background:new 0 0 12 12;" xml:space="preserve">
+<g id="ltr" opacity="0.75">
+       <path d="M3.023,8.977 L3.023,2 L8.976,5.489 z" fill="#000000" id="arrow"/>
+</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..eebd509
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..71f73d5
--- /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" style="enable-background:new 0 0 12 12;" xml:space="preserve">
+<g id="rtl" opacity="0.75">
+       <path d="M3.023,5.489 L8.976,8.977 L8.976,2 z" fill="#000000" id="arrow"/>
+</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..b827f6d
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..a5d7f38
--- /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" 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>
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>
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..0655397 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (7b283a9dcc)
+ * OOjs UI v0.1.0-pre (c5ae888f67)
  * 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 11 2014 18:10:09 GMT-0700 (PDT)
  */
 ( function ( OO ) {
 
@@ -743,8 +743,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 +779,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 +791,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 +825,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 +866,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 +897,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 +934,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 +982,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 +1023,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 +1090,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 +1099,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 +1244,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 +1270,147 @@ 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();
+       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();
                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 +1460,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 +1561,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 +1571,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,7 +1606,6 @@ OO.ui.Dialog = function OoUiDialog( config ) {
 
        // Events
        this.$element.on( 'mousedown', false );
-       this.connect( this, { 'opening': 'onOpening' } );
 
        // Initialization
        this.$element.addClass( 'oo-ui-dialog' );
@@ -1659,11 +1691,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 +1708,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 +1716,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 +1742,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 +1923,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 +2086,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 +2100,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 +2112,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 +2187,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 +2213,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 +2238,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 +2511,6 @@ OO.ui.GroupElement = function OoUiGroupElement( $group, config ) {
        // Properties
        this.$group = $group;
        this.items = [];
-       this.$items = this.$( [] );
        this.aggregateItemEvents = {};
 };
 
@@ -2427,7 +2587,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 +2610,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 +2656,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 +2686,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 +4367,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 +4385,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 +4395,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 +4944,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 +4952,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 +4985,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 +5002,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 +5025,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 +5039,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 +5205,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 +5425,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 +5473,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 +5861,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 +6360,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 +6381,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 +6399,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 +6472,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 +6551,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 +6584,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 +6894,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 +6926,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 +6948,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 +7158,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 +7456,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 +7673,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 +8006,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 +8255,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 +8421,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 +8435,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 +8465,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 +8575,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 +8587,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..aa4d42e 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (7b283a9dcc)
+ * OOjs UI v0.1.0-pre (c5ae888f67)
  * 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 11 2014 18:10:09 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 a20a948..7a32076 100644 (file)
@@ -267,10 +267,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() );
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 7bfb642..5bd4a89 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,8 +65,9 @@ figure[typeof*='mw:Image'] {
        }
 
        &.mw-halign-center {
-               margin-left: auto;
-               margin-right: auto;
+               margin: 0 auto .5em auto;
+               clear: none;
+               float: none;
        }
 
        figcaption {
@@ -63,14 +80,45 @@ 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'] img,
+figure[typeof~='mw:Image/Frame'] img,
+.mw-image-border img {
+       border: 1px solid #cccccc;
+       margin: 4px;
+}
+
+/*
+ * 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 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..282cf6f 100644 (file)
@@ -66,6 +66,7 @@
                                .wrap(
                                        $( '<a>' )
                                                .attr( 'href', resultRenderCache.baseHref + $.param( resultRenderCache.linkParams ) )
+                                               .attr( 'title', text )
                                                .addClass( 'mw-searchSuggest-link' )
                                );
                }
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/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;
-                       }
-               }
-       }
-}
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/MonoBook.php b/skins/monobook/MonoBook.php
new file mode 100644 (file)
index 0000000..7385d0e
--- /dev/null
@@ -0,0 +1,411 @@
+<?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';
+
+       /**
+        * @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/vector/Vector.php b/skins/vector/Vector.php
new file mode 100644 (file)
index 0000000..650a52b
--- /dev/null
@@ -0,0 +1,660 @@
+<?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 $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>
+
+                       <?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;
+                       }
+               }
+       }
+}
index 9344433..e24bea9 100644 (file)
                $.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,
                        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);
+                               // 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 calculateTabDistance() < 0;
+                               return $.collapsibleTabs.calculateTabDistance() < 0;
                        }
                },
                addData: function ( $collapsible ) {
                                        }
                                } )
                        );
+               },
+               /**
+                * 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;
                }
        };
 
index 7e24ae7..9e39fbb 100644 (file)
@@ -3,8 +3,7 @@ Styling for namespace tabs (page, discussion) and views (read, edit, view histor
 */
 
 /* Navigation Labels */
-div.vectorTabs h3,
-div.vectorMenu h3 span {
+div.vectorTabs h3 {
        display: none;
 }
 
@@ -120,21 +119,8 @@ div.vectorMenu {
        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%;
+       position: relative;
 }
 
 body.rtl div.vectorMenu {
@@ -142,73 +128,82 @@ body.rtl div.vectorMenu {
        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;
+       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;
 }
 
-/* IGNORED BY IE6 */
-div#mw-head div.vectorMenu > h3 {
-       background-image: none;
+// 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#mw-head div.vectorMenu h4,
-div.vectorMenu#p-variants #mw-vector-current-variant {
-       display: inline-block;
-       float: left;
+div.vectorMenu h3 span {
+       display: block;
        font-size: 0.8em;
-       padding-left: 0.5em;
+       padding-left: 0.7em;
        padding-top: 1.375em;
+       margin-right: 20px;
        font-weight: normal;
-       border: none;
+       color: @menu-main-heading-color;
 }
 
-/* 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');
+       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;
-       background-position: bottom right;
+       .transition(background-position 250ms);
 }
 
-/* IGNORED BY IE6 */
-div.vectorMenu h3 > a {
-       display: block;
+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 {
-       position: relative;
-       display: none;
+       // 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;
-}
-
-/* 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;
+       display: none;
 }
 
 /* Enable forcing showing of the menu for accessibility */
@@ -218,15 +213,10 @@ div.vectorMenu.menuForceShow div.menu {
 }
 
 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;
 }
 
index 58ba2af..7be3535 100644 (file)
@@ -2,8 +2,14 @@
  * 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()
@@ -33,30 +39,69 @@ jQuery( function ( $ ) {
        $( '#mw-panel > .portal:first' ).addClass( 'first' );
 
        /**
-        * Collapsible tabs for Vector
+        * Collapsible tabs
         */
-       var $cactions = $( '#p-cactions' );
+       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
-       $( '#p-views ul' )
+       $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': '24px' }, 390 );
+                                               .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' }, 390, function () {
+                               $cactions.find( 'h3' ).animate( { 'width': '1px' }, 'normal', function () {
                                        $( this ).attr( 'style', '' )
                                                .parent().addClass( 'emptyPortlet' );
                                });
                        }
                } )
-               .collapsibleTabs();
+               .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 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..7e7c42f 100644 (file)
@@ -1007,7 +1007,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 +1015,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 +1035,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 +1135,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 +1231,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 +1242,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/",
index 55801aa..7276349 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
 
@@ -1215,24 +1194,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
 
@@ -1992,11 +1959,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 +2075,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 +2116,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 +2208,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 +2366,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 +2734,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 +2851,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 +2861,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 +2870,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 +2880,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 +2890,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 +2900,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 +2911,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 +2921,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 +2930,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 +2940,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 +2949,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 +2982,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 +2996,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 +3005,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 +3018,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 +3031,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 +3043,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 +3053,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 +3175,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 +3202,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 +3298,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 +3314,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 +3340,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 +3352,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 +3364,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 +3378,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 +3390,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 +3402,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 +3414,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,14 +3425,8 @@ 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
 
@@ -3517,17 +3436,8 @@ 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>
+<ul><li><ol><li><dl><dt>foo&#160;</dt>
+<dd>bar</dd></dl></li></ol></li></ul>
 
 !! end
 
@@ -3542,37 +3452,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 +3493,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 +3698,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 +4204,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,7 +4453,7 @@ 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
@@ -4916,6 +4807,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
@@ -5411,6 +5314,41 @@ 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
+
 ###
 ### Internal links
 ###
@@ -5593,6 +5531,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 +5553,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 +6118,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 +6154,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 +6320,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 +6369,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 +6541,11 @@ Parsoid: Broken br tag recognition
 parsoid=wt2html
 !! wikitext
 </br>
+
+<br/ >
 !! html/parsoid
 <p><br></p>
+<p><br/></p>
 !! end
 
 !! test
@@ -6705,14 +6682,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 +6695,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 +6720,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>
+<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>
+<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>
+<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><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 +6744,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 +6755,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 +6766,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 +6777,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 +6788,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 +6799,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 +6809,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 +6821,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 +6835,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 +6847,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 +6859,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 +6880,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 +6901,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 +6934,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 +6953,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 +7274,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 +7548,7 @@ Magic Word: {{NUMBEROFFILES}}
 !! wikitext
 {{NUMBEROFFILES}}
 !! html
-<p>7
+<p>5
 </p>
 !! end
 
@@ -8865,10 +8658,48 @@ parsoid
 
 
 <tr>
-<td>a
-</td></tr>
-</table>
+<td>a
+</td></tr>
+</table>
+
+!!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
 
 ###
@@ -9362,12 +9193,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 +10188,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 +10199,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 +10210,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 +10620,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 +10743,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 +14905,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 +14918,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>
@@ -15239,52 +15001,28 @@ title=[[Parser test]]
 * {{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>
+<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.
@@ -15872,17 +15610,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 +16351,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 +16367,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 +16400,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 +17805,7 @@ Lead
 
 
 ###
-### Parsoids-specific tests
+### Parsoid-specific tests
 ### Parsoid-PHP parser incompatibilities
 ###
 !!test
@@ -18125,6 +17828,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 +17925,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 +18581,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 +18609,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 +18632,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 +18647,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 +18698,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 +19082,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
@@ -19944,6 +19750,20 @@ 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
 Empty TR followed by a template-generated TR
 (Parsoid-specific since PHP parser doesn't handle this mixed tbl-wikitext)
@@ -20288,6 +20108,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 +20324,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
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 110cbac..9889b08 100644 (file)
@@ -82,4 +82,105 @@ 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(
+                       '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 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 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..d322e47 100644 (file)
@@ -277,7 +277,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 +285,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 +293,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 +489,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 +513,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 +587,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 +598,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",
                        )
                );
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 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'
+               );
+       }
+
 }
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 ) {